lua-ai-chat 0.0.7 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/audio/AudioRecorder.tsx","../src/components/dialogs/VideoDialog.tsx","../src/components/dialogs/ImageDialog.tsx","../src/components/dialogs/CarouselImageDialog.tsx","../src/components/dialogs/CameraDialog.tsx","../src/components/dialogs/LocationDialog.tsx","../src/components/messages/CodeBlock.tsx","../src/components/utilities/markdownStyles.ts","../src/components/utilities/createMarkdownComponents.tsx","../src/components/utilities/parseUrl.ts","../src/components/utilities/extractInlineNavigateMarkdown.ts","../src/components/messages/ChatListItem.tsx","../src/components/messages/ChatListItemGroup.tsx","../src/components/messages/DocumentsMessage.tsx","../src/components/utilities/extractDocuments.ts","../src/components/previews/AudioPreview.tsx","../src/components/previews/PaymentPreview.tsx","../src/components/utilities/extractActionButtons.ts","../src/components/utilities/extractImageCarouselImages.ts","../src/components/utilities/extractLinks.ts","../src/components/utilities/extractNavigateProperties.ts","../src/components/utilities/extractPaymentLink.ts","../src/components/utilities/extractTextFromNode.ts","../src/components/utilities/parseMessageContent.ts","../src/components/messages/ImageCarouselMessage.tsx","../src/components/messages/ImageMessage.tsx","../src/components/previews/LinkPreview.tsx","../src/components/messages/LinkListMessage.tsx","../src/components/previews/LeafletMap.tsx","../src/components/previews/MapComponent.tsx","../src/components/previews/LocationPreview.tsx","../src/components/messages/LocationMessage.tsx","../src/components/messages/NavigateMessage.tsx","../src/components/messages/VideoMessage.tsx","../src/components/messages/ChatMessage.tsx","../src/contexts/ChatContext.tsx","../src/components/messages/LoadingMessage.tsx","../src/components/messages/ActionMessage.tsx","../src/components/utilities/parseActions.ts","../src/components/messages/ChatActions.tsx","../src/components/toolbar/ChatInput.tsx","../src/services/chatApi.ts","../src/components/toolbar/FilePreviewCard.tsx","../src/components/toolbar/ToolbarImagePreview.tsx","../src/components/toolbar/ToolbarVideoPreview.tsx","../src/components/toolbar/FilePreview.tsx","../src/components/toolbar/Toolbar.tsx"],"names":["AudioRecorder","onAudioRecorded","onClose","inputMessage","isRecording","setIsRecording","useState","recordingTime","setRecordingTime","audioVisualizerData","setAudioVisualizerData","startTime","setStartTime","finalTime","setFinalTime","streamRef","useRef","mediaRecorderRef","chunksRef","audioContextRef","analyserRef","audioDataRef","animationFrameRef","isInitializingRef","isCleaningUpRef","supportedMediaTypeRef","useEffect","interval","elapsed","stream","visualize","data","v","startRecording","error","cleanup","audioTracks","videoTracks","track","supportedMediaType","type","mediaRecorder","event","stopRecording","resolve","blob","formatTime","seconds","mins","secs","jsxs","jsx","IconButton","XIcon","value","index","ArrowUp","VideoDialog","videoRef","loading","onStartRecording","onStopRecording","open","Dialog","DialogContent","VisuallyHidden","DialogTitle","ImageDialog","url","alt","CarouselImageDialog","images","initialIndex","api","setApi","current","setCurrent","onSelect","Carousel","CarouselContent","image","CarouselItem","Fragment","CarouselPrevious","CarouselNext","CameraDialog","canvasRef","onCapture","Camera","LocationDialog","locationError","currentLocation","onShare","CodeBlock","children","language","copied","setCopied","codeString","codeLanguage","Highlight","themes","className","style","tokens","getLineProps","getTokenProps","line","i","token","key","markdownStyles","createMarkdownComponents","handleListItemClick","props","src","href","createMarkdownComponents_default","parseUrl","input","pathname","queryParams","parseUrl_default","extractInlineNavigateMarkdown","match","extractInlineNavigateMarkdown_default","ChatListItem","memo","block","onCardClick","onListItemClick","onNavigate","titleMatch","imageMatch","title","imageUrl","navigationLink","contentWithoutTitleAndImage","markdownComponents","parsedUrl","ReactMarkdown","ChatListItem_default","ChatListItemGroup","group","blockIndex","ChatListItemGroup_default","getFileTypeInfo","file","DocumentsMessage","documents","document","Icon","extractDocuments","files","lines","regex","fileName","filename","mediaType","extractDocuments_default","AudioPreview","message","PaymentPreview","Button","width","height","left","top","popup","CreditCard","extractActionButtons","content","extractActionButtons_default","extractImageCarouselImages","imageRegex","extractImageCarouselImages_default","extractLinks","linkRegex","urls","extractLinks_default","extractNavigateProperties","markdown","text","extractPaymentLink","extractPaymentLink_default","extractTextFromNode","node","extractTextFromNode_default","ensureNewlineBeforeTripleColons","parseMessageContent","blocks","currentText","currentListItem","currentPayment","currentActions","currentImages","currentLinks","currentNavigate","currentDocuments","inListItem","inPayment","inActions","inImages","inLinks","inNavigate","inDocuments","parseMessageContent_default","ImageCarouselMessage","isDialogOpen","setIsDialogOpen","initialImageIndex","setInitialImageIndex","carouselRef","isDragging","setIsDragging","startX","setStartX","scrollLeft","setScrollLeft","dragDistance","setDragDistance","handleMouseDown","useCallback","handleMouseMove","x","walk","handleMouseUp","handleMouseLeave","handleImageClick","imageIndex","ImageMessage","LinkPreview","luaApiUrl","authToken","disablePreviewOnLinks","preview","setPreview","setLoading","setError","response","err","LinkListMessage","links","LeafletMap","location","position","MapContainer","TileLayer","Marker","Popup","MapComponent","LocationPreview","LocationMessage","MapPin","NavigateMessage","hasNavigated","setHasSetNavigated","VideoMessage","formatMessageTimestamp","timestamp","_file","ChatMessage","handleCardClick","headingMatch","subheadingMatch","heading","subheading","formattedMessage","renderContent","b","groupedBlocks","currentGroup","groupIndex","navigateProperties","paymentLink","MessagesContext","createContext","InputContext","LoadingContext","UnreadContext","FileUrlContext","ChatProvider","messages","setMessages","setInputMessage","loadingMessage","setLoadingMessage","hasUnreadMessages","setHasUnreadMessages","fileUrls","getFileUrl","removeFileUrl","useMessages","context","useContext","useInput","useLoadingMessage","useFileUrls","useUnreadMessages","useChat","messagesContext","inputContext","loadingContext","unreadContext","fileUrlContext","LoadingMessage","Logo","ActionMessage","buttons","onClick","button","parseActions","actionStartMarker","startIndex","endIndex","ChatActions","lastMessage","actions","ChatInput","onSend","disabled","onFilePaste","isMobile","setIsMobile","textareaRef","checkMobile","textarea","handleKeyDown","handlePaste","items","item","getAuthToken","uploadFile","cdnUrl","onProgress","reject","xhr","formData","progress","label","FilePreviewCard","onRemove","initialUrl","onUploadComplete","fileTypeInfo","isUploading","setIsUploading","uploadProgress","setUploadProgress","uploadedUrl","setUploadedUrl","uploadAttempted","fileId","ToolbarImagePreview","hasAttemptedUpload","setHasAttemptedUpload","ToolbarVideoPreview","thumbnailUrl","videoThumbnail","setVideoThumbnail","videoUrl","video","handleCanPlay","canvas","ctx","generatedThumbnail","category","FilePreview","fileMetadata","onFileUploadComplete","thumbnails","setThumbnails","existingMetadata","meta","prev","metadata","ANALYTICS_EVENTS","trackChatEvent","Toolbar","onFileClick","onCameraClick","onVideoClick","onAudioClick","onLocationClick","onSendClick","Tooltip","TooltipTrigger","Paperclip","TooltipContent","TooltipArrow","VideoCamera","Microphone"],"mappings":"0mBASO,SAASA,EAAAA,CAAc,CAC5B,eAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,aAAAC,CACF,CAAA,CAAuB,CACrB,GAAM,CAACC,CAAAA,CAAaC,CAAc,CAAA,CAAIC,QAAAA,CAAS,KAAK,CAAA,CAC9C,CAACC,CAAAA,CAAeC,CAAgB,CAAA,CAAIF,QAAAA,CAAS,CAAC,CAAA,CAC9C,CAACG,CAAAA,CAAqBC,CAAsB,CAAA,CAAIJ,QAAAA,CAAmB,EAAE,CAAA,CACrE,CAACK,CAAAA,CAAWC,CAAY,CAAA,CAAIN,QAAAA,CAAwB,IAAI,CAAA,CACxD,CAACO,CAAAA,CAAWC,CAAY,CAAA,CAAIR,QAAAA,CAAwB,IAAI,CAAA,CAExDS,CAAAA,CAAYC,MAAAA,CAA2B,IAAI,CAAA,CAC3CC,CAAAA,CAAmBD,MAAAA,CAA6B,IAAI,CAAA,CACpDE,CAAAA,CAAYF,MAAAA,CAAe,EAAE,CAAA,CAC7BG,CAAAA,CAAkBH,MAAAA,CAA4B,IAAI,CAAA,CAClDI,EAAcJ,MAAAA,CAA4B,IAAI,CAAA,CAC9CK,CAAAA,CAAeL,MAAAA,CAA0B,IAAI,EAC7CM,CAAAA,CAAoBN,MAAAA,CAAsB,IAAI,CAAA,CAC9CO,CAAAA,CAAoBP,MAAAA,CAAgB,KAAK,CAAA,CACzCQ,CAAAA,CAAkBR,MAAAA,CAAgB,KAAK,CAAA,CACvCS,CAAAA,CAAwBT,MAAAA,CAAsB,IAAI,CAAA,CAGxDU,SAAAA,CAAU,IAAM,CACd,GAAI,CAACtB,GAAe,CAACO,CAAAA,CACnB,OAGF,IAAMgB,CAAAA,CAAW,WAAA,CAAY,IAAM,CACjC,IAAMC,CAAAA,CAAU,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,CAAK,KAAI,CAAIjB,CAAAA,EAAa,GAAI,CAAA,CAC1DH,CAAAA,CAAiBoB,CAAO,EAC1B,CAAA,CAAG,GAAI,CAAA,CAEP,OAAO,IAAM,aAAA,CAAcD,CAAQ,CACrC,CAAA,CAAG,CAACvB,CAAAA,CAAaO,CAAS,CAAC,CAAA,CAG3Be,UAAU,KAAA,CACgB,SAAY,CAClC,GAAI,EAAAH,CAAAA,CAAkB,SAAWC,CAAAA,CAAgB,OAAA,CAAA,CAIjD,GAAI,CACFD,CAAAA,CAAkB,OAAA,CAAU,CAAA,CAAA,CAC5B,IAAMM,CAAAA,CAAS,MAAM,SAAA,CAAU,YAAA,CAAa,YAAA,CAAa,CACvD,MAAO,CAAA,CACT,CAAC,CAAA,CAEDd,CAAAA,CAAU,OAAA,CAAUc,CAAAA,CAGpBV,EAAgB,OAAA,CAAU,IAAI,YAAA,CAC9BC,CAAAA,CAAY,OAAA,CAAUD,CAAAA,CAAgB,QAAQ,cAAA,EAAe,CAC7DC,CAAAA,CAAY,OAAA,CAAQ,OAAA,CAAU,GAAA,CAEfD,CAAAA,CAAgB,OAAA,CAAQ,uBAAA,CAAwBU,CAAM,CAAA,CAC9D,OAAA,CAAQT,CAAAA,CAAY,OAAO,EAGlCC,CAAAA,CAAa,OAAA,CAAU,IAAI,UAAA,CACzBD,CAAAA,CAAY,OAAA,CAAQ,iBACtB,CAAA,CAGA,IAAMU,CAAAA,CAAY,IAAM,CACtB,GAAI,CAACV,CAAAA,CAAY,OAAA,EAAW,CAACC,CAAAA,CAAa,OAAA,CACxC,OAGFD,CAAAA,CAAY,OAAA,CAAQ,oBAAA,CAClBC,CAAAA,CAAa,OACf,CAAA,CACA,IAAMU,EAAAA,CAAO,MAAM,IAAA,CAAKV,CAAAA,CAAa,OAAO,CAAA,CAAE,GAAA,CAAIW,EAAAA,EAAKA,GAAI,GAAG,CAAA,CAC9DtB,CAAAA,CAAuBqB,EAAI,CAAA,CAE3BT,CAAAA,CAAkB,QAAU,qBAAA,CAAsBQ,CAAS,EAC7D,CAAA,CAEAA,CAAAA,EAAU,CAGVG,EAAAA,GACF,CAAA,MAASC,CAAAA,CAAO,CACd,OAAA,CAAQ,KAAA,CAAM,6BAAA,CAA+BA,CAAK,CAAA,CAClDhC,CAAAA,GACF,CAAA,OAAE,CACAqB,CAAAA,CAAkB,QAAU,MAC9B,CACF,CAAA,GAEgB,CAGT,IAAM,CACXY,IACF,CAAA,CAAA,CACC,EAAE,CAAA,CAEL,IAAMA,CAAAA,CAAU,IAAM,CACpB,GAAI,CAAAX,CAAAA,CAAgB,OAAA,CAIpB,GAAI,CAWF,GAVAA,CAAAA,CAAgB,OAAA,CAAU,CAAA,CAAA,CAGtBpB,CAAAA,EAAea,CAAAA,CAAiB,UAClCA,CAAAA,CAAiB,OAAA,CAAQ,IAAA,EAAK,CAC9BZ,CAAAA,CAAe,CAAA,CAAK,EACpBO,CAAAA,CAAa,IAAI,CAAA,CAAA,CAIfG,CAAAA,CAAU,OAAA,CAAS,CACrB,IAAMqB,CAAAA,CAAcrB,CAAAA,CAAU,OAAA,CAAQ,cAAA,EAAe,CAC/CsB,CAAAA,CAActB,CAAAA,CAAU,QAAQ,cAAA,EAAe,CAErDqB,CAAAA,CAAY,OAAA,CAASE,CAAAA,EAA4B,CAC/CA,EAAM,IAAA,EAAK,CACXA,CAAAA,CAAM,OAAA,CAAU,CAAA,EAClB,CAAC,EAEDD,CAAAA,CAAY,OAAA,CAASC,CAAAA,EAA4B,CAC/CA,CAAAA,CAAM,IAAA,EAAK,CACXA,CAAAA,CAAM,OAAA,CAAU,CAAA,EAClB,CAAC,EACH,CAGIhB,CAAAA,CAAkB,SACpB,oBAAA,CAAqBA,CAAAA,CAAkB,OAAO,CAAA,CAI5CH,CAAAA,CAAgB,OAAA,EAClBA,EAAgB,OAAA,CAAQ,KAAA,EAAM,CAIhCJ,CAAAA,CAAU,OAAA,CAAU,IAAA,CACpBE,EAAiB,OAAA,CAAU,IAAA,CAC3BC,CAAAA,CAAU,OAAA,CAAU,EAAC,CACrBC,CAAAA,CAAgB,OAAA,CAAU,IAAA,CAC1BC,CAAAA,CAAY,OAAA,CAAU,IAAA,CACtBC,CAAAA,CAAa,OAAA,CAAU,KACvBC,CAAAA,CAAkB,OAAA,CAAU,KAC9B,CAAA,OAAE,CACAE,CAAAA,CAAgB,QAAU,MAC5B,CACF,CAAA,CAEMS,EAAAA,CAAiB,IAAM,CAC3B,GAAI,CAAClB,CAAAA,CAAU,OAAA,CACb,OAOF,IAAMwB,CAAAA,CAHa,CAAC,YAAA,CAAc,WAAA,CAAa,WAAA,CAAa,WAAW,CAAA,CAGjC,IAAA,CAAKC,CAAAA,EACzC,cAAc,eAAA,CAAgBA,CAAI,CACpC,CAAA,CAEA,GAAI,CAACD,EAAoB,CACvB,OAAA,CAAQ,KAAA,CAAM,gDAAgD,CAAA,CAC9DrC,CAAAA,GACA,MACF,CAEAuB,CAAAA,CAAsB,OAAA,CAAUc,CAAAA,CAGhC,IAAME,CAAAA,CAAgB,IAAI,aAAA,CAAc1B,CAAAA,CAAU,OAAA,CAAS,CACzD,QAAA,CAAUwB,CACZ,CAAC,CAAA,CACDtB,CAAAA,CAAiB,OAAA,CAAUwB,CAAAA,CAC3BvB,CAAAA,CAAU,OAAA,CAAU,EAAC,CAErBuB,CAAAA,CAAc,eAAA,CAAkBC,CAAAA,EAAS,CACnCA,CAAAA,CAAM,KAAK,IAAA,CAAO,CAAA,EACpBxB,CAAAA,CAAU,OAAA,CAAQ,IAAA,CAAKwB,CAAAA,CAAM,IAAI,EAErC,CAAA,CAEAD,CAAAA,CAAc,KAAA,EAAM,CACpBpC,CAAAA,CAAe,IAAI,EACnBO,CAAAA,CAAa,IAAA,CAAK,GAAA,EAAK,CAAA,CACvBJ,CAAAA,CAAiB,CAAC,EACpB,CAAA,CAEMmC,EAAAA,CAAgB,SAAY,CAChC,GAAI,CAAC1B,CAAAA,CAAiB,OAAA,EAAW,CAACF,CAAAA,CAAU,OAAA,CAC1C,OAGFV,CAAAA,CAAe,KAAK,CAAA,CACpBS,CAAAA,CAAaP,CAAa,CAAA,CAC1BK,CAAAA,CAAa,IAAI,EACjBK,CAAAA,CAAiB,OAAA,CAAQ,IAAA,EAAK,CAG9B,MAAM,IAAI,QAAc2B,CAAAA,EAAW,CAC7B3B,CAAAA,CAAiB,OAAA,GACnBA,CAAAA,CAAiB,OAAA,CAAQ,OAAS,IAAM2B,CAAAA,EAAQ,EAEpD,CAAC,CAAA,CAGD,IAAMC,CAAAA,CAAO,IAAI,IAAA,CAAK3B,CAAAA,CAAU,OAAA,CAAS,CACvC,IAAA,CAAMO,CAAAA,CAAsB,SAAW,YACzC,CAAC,CAAA,CACDxB,CAAAA,CAAgB4C,CAAAA,CAAM1C,CAAY,EAGlCgC,CAAAA,EAAQ,CACRjC,CAAAA,GACF,CAAA,CAEM4C,EAAAA,CAAcC,GAAoB,CACtC,IAAMC,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAMD,CAAAA,CAAU,EAAE,CAAA,CAC9BE,CAAAA,CAAOF,CAAAA,CAAU,EAAA,CACvB,OAAO,CAAA,EAAGC,CAAAA,CAAK,UAAS,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAAA,EAAIC,EAC3C,QAAA,EAAS,CACT,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,EACrB,CAAA,CAOA,OACEC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qGAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAACC,UAAAA,CAAA,CACC,OAAA,CAAQ,OAAA,CACR,OAAA,CATc,SAAY,CAC9BjB,CAAAA,EAAQ,CACRjC,CAAAA,GACF,CAAA,CAOM,SAAA,CAAU,gDAEV,QAAA,CAAAiD,GAAAA,CAACE,KAAAA,CAAA,CAAM,SAAA,CAAU,2BAAA,CAA4B,MAAM,WAAA,CAAY,CAAA,CACjE,CAAA,CAEAH,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2DAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,0DAAA,EACT/C,CAAAA,CAAc,kCAAA,CAAqC,iBACrD,CAAA,CAAA,CACF,CAAA,CACA+C,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,mDAAA,CACb,SAAcL,EAAAA,CAAd1C,CAAAA,CAAyBG,CAAAA,CAA4BM,CAAAA,EAAa,CAA5B,CAAA,CACzC,GACF,CAAA,CAEAsC,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,sCAAA,CACV,aAAA,CAAY,sBAAA,CAEX,QAAA,CAAA1C,CAAAA,CAAoB,MAAA,CAAS,CAAA,EAC5B0C,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0GACZ,QAAA,CAAA1C,CAAAA,CAAoB,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAAE,IAAI,CAAC6C,CAAAA,CAAOC,CAAAA,GAC5CJ,GAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAU,gDACV,KAAA,CAAO,CAAE,MAAA,CAAQ,CAAA,EAAGG,CAAAA,CAAQ,GAAG,CAAA,CAAA,CAAI,CAAA,CAAA,CAF9BC,CAGP,CACD,CAAA,CACH,CAAA,CAEJ,CAAA,CAEAJ,GAAAA,CAACC,WAAA,CACC,OAAA,CAAST,EAAAA,CACT,SAAA,CAAU,uDAAA,CACV,aAAA,CAAY,oBAEZ,QAAA,CAAAQ,GAAAA,CAACK,OAAAA,CAAA,CAAQ,SAAA,CAAU,0BAAA,CAA2B,MAAM,OAAA,CAAQ,CAAA,CAC9D,CAAA,CAAA,CACF,CAEJ,CC7QA,SAASV,EAAAA,CAAWC,EAAiB,CACnC,IAAMC,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAMD,CAAAA,CAAU,EAAE,CAAA,CAC9BE,CAAAA,CAAOF,CAAAA,CAAU,EAAA,CACvB,OAAO,CAAA,EAAGC,CAAAA,CAAK,UAAS,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAAA,EAAIC,EAC3C,QAAA,EAAS,CACT,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,EACrB,CAEO,SAASQ,EAAAA,CAAY,CAC1B,QAAA,CAAAC,CAAAA,CACA,WAAA,CAAAtD,CAAAA,CACA,aAAA,CAAAG,CAAAA,CACA,OAAA,CAAAoD,CAAAA,CACA,gBAAA,CAAAC,CAAAA,CACA,gBAAAC,CAAAA,CACA,OAAA,CAAA3D,CAAAA,CACA,IAAA,CAAA4D,CACF,CAAA,CAAqB,CACnB,OACEX,GAAAA,CAACY,MAAAA,CAAA,CAAO,IAAA,CAAMD,CAAAA,CAAM,aAAc5D,CAAAA,CAChC,QAAA,CAAAgD,IAAAA,CAACc,aAAAA,CAAA,CACC,SAAA,CAAU,oCAAA,CACV,SAAA,CAAW,KAAA,CAEX,QAAA,CAAA,CAAAb,GAAAA,CAACc,cAAAA,CAAA,CACC,QAAA,CAAAd,IAACe,WAAAA,CAAA,EAAY,CAAA,CACf,CAAA,CAEAhB,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,wFAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,OAAA,CAAA,CACC,GAAA,CAAKO,CAAAA,CACL,SAAQ,IAAA,CACR,WAAA,CAAW,IAAA,CACX,KAAA,CAAK,IAAA,CACL,SAAA,CAAU,iEAAA,CACV,KAAA,CAAO,CAAE,eAAA,CAAiB,OAAQ,CAAA,CACpC,CAAA,CACCtD,CAAAA,EACC8C,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yIAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,mEAAA,CAAoE,CAAA,CACnFA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,4CAAA,CACb,SAAAL,EAAAA,CAAWvC,CAAa,CAAA,CAC3B,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAGA4C,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mEAAA,CACZ,QAAA,CAAC/C,CAAAA,CAuBA+C,GAAAA,CAACC,UAAAA,CAAA,CACC,aAAA,CAAY,uBAAA,CACZ,OAAA,CAASS,CAAAA,CACT,QAAA,CAAUF,CAAAA,CACV,QAAQ,WAAA,CAER,QAAA,CAAAR,GAAAA,CAACE,KAAAA,CAAA,CAAM,KAAA,CAAM,UAAU,CAAA,CACzB,CAAA,CA7BAH,IAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAASU,CAAAA,CACT,aAAA,CAAY,wBAAA,CACZ,KAAA,CAAM,IAAA,CACN,MAAA,CAAO,IAAA,CACP,OAAA,CAAQ,WAAA,CACR,KAAK,MAAA,CACL,KAAA,CAAM,4BAAA,CACN,SAAA,CAAU,gBAAA,CAEV,QAAA,CAAA,CAAAT,IAAC,MAAA,CAAA,CACC,CAAA,CAAE,GAAA,CACF,CAAA,CAAE,GAAA,CACF,KAAA,CAAM,KACN,MAAA,CAAO,IAAA,CACP,EAAA,CAAG,IAAA,CACH,MAAA,CAAO,SAAA,CACP,WAAA,CAAY,GAAA,CACd,CAAA,CACAA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,IAAI,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,KAAK,SAAA,CAAU,CAAA,CAAA,CAClE,CAAA,CAWJ,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CChGO,SAASgB,EAAAA,CAAY,CAAE,GAAA,CAAAC,CAAAA,CAAK,GAAA,CAAAC,CAAAA,CAAK,IAAA,CAAAP,CAAAA,CAAM,QAAA5D,CAAQ,CAAA,CAAqB,CACzE,OACEgD,IAAAA,CAACa,MAAAA,CAAA,CAAO,IAAA,CAAMD,CAAAA,CAAM,YAAA,CAAc5D,CAAAA,CAChC,QAAA,CAAA,CAAAiD,GAAAA,CAACc,cAAAA,CAAA,CACC,QAAA,CAAAd,GAAAA,CAACe,WAAAA,CAAA,EAAY,CAAA,CACf,CAAA,CACAf,IAACa,aAAAA,CAAA,CACC,SAAA,CAAU,oKAAA,CACV,SAAA,CAAW,KAAA,CAEX,SAAAd,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oCAAA,CAEb,QAAA,CAAA,CAAAC,GAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAASjD,CAAAA,CACT,SAAA,CAAU,oJAAA,CAEV,QAAA,CAAAiD,GAAAA,CAACE,KAAAA,CAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,iBAAA,CAAkB,CAAA,CACnD,CAAA,CAGAF,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oEAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CACC,IAAKiB,CAAAA,CACL,GAAA,CAAKC,CAAAA,CACL,SAAA,CAAU,4EAAA,CACZ,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CCjBO,SAASC,GAAoB,CAClC,MAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CAAAA,CAAe,CAAA,CACf,KAAAV,CAAAA,CACA,OAAA,CAAA5D,CACF,CAAA,CAA6B,CAC3B,GAAM,CAACuE,CAAAA,CAAKC,CAAM,CAAA,CAAIpE,QAAAA,EAAsB,CACtC,CAACqE,CAAAA,CAASC,CAAU,CAAA,CAAItE,QAAAA,CAAS,CAAC,CAAA,CAExC,OAAAoB,SAAAA,CAAU,IAAM,CACd,GAAI,CAAC+C,CAAAA,CACH,OAIED,CAAAA,CAAe,GAAKA,CAAAA,CAAeD,CAAAA,CAAO,MAAA,GAC5CE,CAAAA,CAAI,QAAA,CAASD,CAAY,CAAA,CACzBI,CAAAA,CAAWJ,CAAY,CAAA,CAAA,CAIzB,IAAMK,CAAAA,CAAW,IAAM,CACrBD,EAAWH,CAAAA,CAAI,kBAAA,EAAoB,EACrC,CAAA,CAEA,OAAAA,EAAI,EAAA,CAAG,QAAA,CAAUI,CAAQ,CAAA,CACzBA,CAAAA,EAAS,CAEF,IAAM,CACXJ,CAAAA,EAAK,GAAA,CAAI,QAAA,CAAUI,CAAQ,EAC7B,CACF,CAAA,CAAG,CAACJ,CAAAA,CAAKD,CAAAA,CAAcD,CAAAA,CAAO,MAAM,CAAC,EAGnCrB,IAAAA,CAACa,MAAAA,CAAA,CAAO,IAAA,CAAMD,CAAAA,CAAM,YAAA,CAAc5D,EAChC,QAAA,CAAA,CAAAiD,GAAAA,CAACc,cAAAA,CAAA,CACC,QAAA,CAAAd,GAAAA,CAACe,YAAA,EAAY,CAAA,CACf,CAAA,CACAf,GAAAA,CAACa,aAAAA,CAAA,CAAc,SAAA,CAAU,oBAAA,CAAqB,SAAA,CAAW,KAAA,CACvD,QAAA,CAAAd,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qCAEb,QAAA,CAAA,CAAAC,GAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAASjD,CAAAA,CACT,SAAA,CAAU,qJAEV,QAAA,CAAAiD,GAAAA,CAACE,KAAAA,CAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,UAAU,iBAAA,CAAkB,CAAA,CACnD,CAAA,CAGCkB,CAAAA,CAAO,MAAA,CAAS,CAAA,EACfrB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2HAAA,CACZ,QAAA,CAAA,CAAAyB,CAAAA,CAAU,CAAA,CAAE,KAAA,CAAIJ,EAAO,MAAA,CAAA,CAC1B,CAAA,CAIFpB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8EAAA,CACb,SAAAD,IAAAA,CAAC4B,QAAAA,CAAA,CACC,MAAA,CAAQJ,CAAAA,CACR,SAAA,CAAU,2BACV,IAAA,CAAM,CACJ,KAAA,CAAO,QAAA,CACP,IAAA,CAAMH,CAAAA,CAAO,MAAA,CAAS,CACxB,CAAA,CAEA,QAAA,CAAA,CAAApB,GAAAA,CAAC4B,eAAAA,CAAA,CACE,QAAA,CAAAR,EAAO,GAAA,CAAI,CAACS,CAAAA,CAAOzB,CAAAA,GAClBJ,GAAAA,CAAC8B,YAAAA,CAAA,CACC,SAAA,CAAU,8CAAA,CAGV,QAAA,CAAA9B,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAK6B,EAAM,GAAA,CACX,GAAA,CAAKA,CAAAA,CAAM,GAAA,EAAO,CAAA,MAAA,EAASzB,CAAAA,CAAQ,CAAC,CAAA,CAAA,CACpC,SAAA,CAAU,uFAAA,CACV,SAAA,CAAW,KAAA,CACb,CAAA,CAAA,CAPKA,CAQP,CACD,CAAA,CACH,CAAA,CAECgB,CAAAA,CAAO,MAAA,CAAS,CAAA,EACfrB,IAAAA,CAAAgC,SAAA,CACE,QAAA,CAAA,CAAA/B,GAAAA,CAACgC,gBAAAA,CAAA,CAAiB,SAAA,CAAU,gHAAgH,CAAA,CAC5IhC,GAAAA,CAACiC,YAAAA,CAAA,CAAa,SAAA,CAAU,gHAAA,CAAiH,CAAA,CAAA,CAC3I,CAAA,CAAA,CAEJ,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CClGO,SAASC,EAAAA,CAAa,CAC3B,QAAA,CAAA3B,CAAAA,CACA,SAAA,CAAA4B,EACA,SAAA,CAAAC,CAAAA,CACA,OAAA,CAAArF,CAAAA,CACA,IAAA,CAAA4D,CACF,EAAsB,CACpB,OACEZ,IAAAA,CAACa,MAAAA,CAAA,CAAO,IAAA,CAAMD,EAAM,YAAA,CAAc5D,CAAAA,CAChC,QAAA,CAAA,CAAAiD,GAAAA,CAACc,cAAAA,CAAA,CACC,QAAA,CAAAd,GAAAA,CAACe,WAAAA,CAAA,EAAY,CAAA,CACf,CAAA,CACAhB,IAAAA,CAACc,aAAAA,CAAA,CACC,SAAA,CAAU,oCAAA,CACV,SAAA,CAAW,KAAA,CAGX,QAAA,CAAA,CAAAd,IAAAA,CAAC,OAAI,SAAA,CAAU,gFAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,OAAA,CAAA,CACC,GAAA,CAAKO,EACL,QAAA,CAAQ,IAAA,CACR,WAAA,CAAW,IAAA,CACX,KAAA,CAAK,IAAA,CACL,SAAA,CAAU,iEAAA,CACV,KAAA,CAAO,CAAE,eAAA,CAAiB,OAAQ,CAAA,CACpC,CAAA,CACAP,IAAC,QAAA,CAAA,CAAO,GAAA,CAAKmC,CAAAA,CAAW,SAAA,CAAU,YAAA,CAAa,CAAA,CAAA,CACjD,EAGApC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4EAAA,CAEb,QAAA,CAAA,CAAAC,GAAAA,CAACC,WAAA,CAAW,OAAA,CAASmC,CAAAA,CAAW,aAAA,CAAY,gBAAA,CAC1C,QAAA,CAAApC,GAAAA,CAACqC,MAAAA,CAAA,CAAO,KAAA,CAAM,SAAA,CAAU,CAAA,CAC1B,CAAA,CAGArC,GAAAA,CAACC,WAAA,CAAW,OAAA,CAASlD,CAAAA,CAAS,OAAA,CAAQ,WAAA,CACpC,QAAA,CAAAiD,IAACE,KAAAA,CAAA,CAAM,KAAA,CAAM,SAAA,CAAU,CAAA,CACzB,CAAA,CAAA,CACF,GACF,CAAA,CAAA,CACF,CAEJ,CCnDO,SAASoC,EAAAA,CAAe,CAC7B,cAAAC,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,OAAA,CAAAhC,CAAAA,CACA,OAAA,CAAAiC,EACA,OAAA,CAAA1F,CACF,CAAA,CAAwB,CACtB,OACEiD,GAAAA,CAAC,OAAI,SAAA,CAAU,4GAAA,CACb,QAAA,CAAAD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uEAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wDAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,MAAG,SAAA,CAAU,+BAAA,CAAgC,QAAA,CAAA,gBAAA,CAAc,CAAA,CAC5DA,GAAAA,CAAC,QAAA,CAAA,CACC,QAASjD,CAAAA,CACT,SAAA,CAAU,2CAAA,CAEV,QAAA,CAAAiD,GAAAA,CAAC,KAAA,CAAA,CACC,UAAU,iBAAA,CACV,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,OAAA,CAAQ,WAAA,CAER,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CACC,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CACf,YAAa,CAAA,CACb,CAAA,CAAE,sBAAA,CACJ,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,EAECuC,CAAAA,CACCvC,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gEAAA,CACZ,QAAA,CAAAuC,EACH,CAAA,CACEC,CAAAA,CACFxC,GAAAA,CAAA+B,QAAAA,CAAA,CACE,QAAA,CAAAhC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,UAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yCAAyC,QAAA,CAAA,mBAAA,CAExD,CAAA,CACAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BAAA,CACZ,SAAAwC,CAAAA,CAAgB,OAAA,CACnB,CAAA,CACAzC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gCACZ,QAAA,CAAA,CAAAyC,CAAAA,CAAgB,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,CAAE,GAAA,CAAE,GAAA,CACtCA,CAAAA,CAAgB,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA,CAAA,CACtC,CAAA,CAAA,CACF,EACF,CAAA,CAEAxC,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uDAAA,CACb,QAAA,CAAAA,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sFAAA,CAAuF,CAAA,CACxG,CAAA,CAGFA,GAAAA,CAAC,OAAI,SAAA,CAAU,6BAAA,CACZ,QAAA,CAAAwC,CAAAA,EACCzC,IAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS0C,CAAAA,CACT,QAAA,CAAUjC,CAAAA,CACV,SAAA,CAAW,CAAA,mCAAA,EACTA,CAAAA,CACI,wCAAA,CACA,uCACN,CAAA,mDAAA,CAAA,CAEA,QAAA,CAAA,CAAAR,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,iBAAA,CACV,KAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,OAAA,CAAQ,WAAA,CAER,QAAA,CAAAA,IAAC,MAAA,CAAA,CACC,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CACf,WAAA,CAAa,CAAA,CACb,CAAA,CAAE,oFAAA,CACJ,CAAA,CACF,CAAA,CACCQ,CAAAA,CAAU,YAAA,CAAe,gBAAA,CAAA,CAC5B,EAEJ,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CC3FO,SAASkC,EAAAA,CAAU,CAAE,QAAA,CAAAC,CAAAA,CAAU,QAAA,CAAAC,CAAAA,CAAW,EAAG,CAAA,CAAmB,CACrE,GAAM,CAACC,CAAAA,CAAQC,CAAS,CAAA,CAAI3F,QAAAA,CAAS,KAAK,EAGpC4F,CAAAA,CAAa,OAAOJ,CAAAA,EAAa,QAAA,CAAWA,CAAAA,CAAW,MAAA,CAAOA,CAAQ,CAAA,CAGtEK,CAAAA,CAAeJ,CAAAA,EAAY,YAAA,CAQjC,OACE7C,IAAAA,CAAC,OAAI,SAAA,CAAU,wFAAA,CAEb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mGAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,2BAAA,CAA6B,QAAA,CAAAgD,CAAAA,CAAa,EAC1DhD,GAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAZW,IAAM,CACvB,SAAA,CAAU,UAAU,SAAA,CAAU+C,CAAU,CAAA,CACxCD,CAAAA,CAAU,IAAI,CAAA,CACd,WAAW,IAAMA,CAAAA,CAAU,KAAK,CAAA,CAAG,GAAI,EACzC,CAAA,CASQ,SAAA,CAAU,uGAAA,CACV,YAAA,CAAW,WAAA,CAEV,QAAA,CAAAD,CAAAA,CAAS,SAAA,CAAY,OACxB,CAAA,CAAA,CACF,CAAA,CAGA7C,GAAAA,CAACiD,SAAAA,CAAA,CACC,KAAA,CAAOC,OAAO,MAAA,CACd,IAAA,CAAMH,CAAAA,CACN,QAAA,CAAUC,CAAAA,CAET,QAAA,CAAA,CAAC,CAAE,SAAA,CAAAG,CAAAA,CAAW,KAAA,CAAAC,CAAAA,CAAO,MAAA,CAAAC,CAAAA,CAAQ,YAAA,CAAAC,CAAAA,CAAc,aAAA,CAAAC,CAAc,CAAA,GACxDvD,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,GAAGmD,CAAS,CAAA,4BAAA,CAAA,CACvB,KAAA,CAAOC,CAAAA,CAEN,QAAA,CAAAC,CAAAA,CAAO,IAAI,CAACG,CAAAA,CAAMC,CAAAA,GACjBzD,GAAAA,CAAC,KAAA,CAAA,CAAa,GAAGsD,EAAa,CAAE,IAAA,CAAAE,CAAK,CAAC,CAAA,CACnC,QAAA,CAAAA,CAAAA,CAAK,GAAA,CAAI,CAACE,CAAAA,CAAOC,CAAAA,GAChB3D,GAAAA,CAAC,MAAA,CAAA,CAAgB,GAAGuD,EAAc,CAAE,KAAA,CAAAG,CAAM,CAAC,CAAA,CAAA,CAAhCC,CAAmC,CAC/C,CAAA,CAAA,CAHOF,CAIV,CACD,CAAA,CACH,CAAA,CAEJ,CAAA,CAAA,CACF,CAEJ,CC7DO,IAAMG,CAAAA,CAAiB,CAC5B,CAAA,CAAG,oEAAA,CACH,EAAA,CAAI,0DAAA,CACJ,EAAA,CAAI,+EAAA,CACJ,EAAA,CAAI,2DAAA,CACJ,EAAA,CAAI,sBAAA,CACJ,GAAI,iCAAA,CACJ,EAAA,CAAI,yDAAA,CACJ,EAAA,CAAI,+BAAA,CACJ,CAAA,CAAG,wCACH,UAAA,CAAY,iEAAA,CACZ,GAAA,CAAK,0FAAA,CACL,IAAA,CAAM,2DAAA,CACN,IAAK,mDAAA,CACL,KAAA,CAAO,wDAAA,CACP,EAAA,CAAI,kEAAA,CACJ,EAAA,CAAI,kDACN,ECZA,IAAMC,EAAAA,CACJC,CAAAA,GACgB,CAChB,IAAA,CAAK,CACH,QAAA,CAAAnB,CAAAA,CACA,SAAA,CAAAQ,CAAAA,CACA,GAAGY,CACL,CAAA,CAGuC,CAErC,IAAMnB,EAAWO,CAAAA,EAAW,OAAA,CAAQ,WAAA,CAAa,EAAE,CAAA,EAAK,EAAA,CAGxD,OAAI,OAAOR,CAAAA,EAAa,QAAA,EAAY,CAACA,CAAAA,CAAS,QAAA,CAAS;AAAA,CAAI,EAEvD3C,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAW4D,CAAAA,CAAe,IAAA,CAAO,GAAGG,CAAAA,CACvC,QAAA,CAAApB,CAAAA,CACH,CAAA,CAMF3C,IAAC0C,EAAAA,CAAA,CAAU,SAAUE,CAAAA,CAAU,SAAA,CAAWO,EACvC,QAAA,CAAAR,CAAAA,CACH,CAEJ,CAAA,CACA,EAAE,CACA,QAAA,CAAAA,EACA,GAAGoB,CACL,EAA0E,CACxE,OACE/D,IAAC,GAAA,CAAA,CAAE,SAAA,CAAW4D,EAAe,CAAA,CAAI,GAAGG,EACjC,QAAA,CAAApB,CAAAA,CACH,CAEJ,CAAA,CACA,EAAA,CAAG,CACD,QAAA,CAAAA,EACA,GAAGoB,CACL,EAAwE,CACtE,OACE/D,IAAC,IAAA,CAAA,CAAG,SAAA,CAAW4D,EAAe,EAAA,CAAK,GAAGG,EACnC,QAAA,CAAApB,CAAAA,CACH,CAEJ,CAAA,CACA,EAAA,CAAG,CACD,QAAA,CAAAA,CAAAA,CACA,GAAGoB,CACL,EAAwE,CACtE,OACE/D,IAAC,IAAA,CAAA,CAAG,SAAA,CAAW4D,EAAe,EAAA,CAAK,GAAGG,EACnC,QAAA,CAAApB,CAAAA,CACH,CAEJ,CAAA,CACA,EAAA,CAAG,CACD,QAAA,CAAAA,CAAAA,CACA,GAAGoB,CACL,CAAA,CAAwE,CACtE,OACE/D,IAAC,IAAA,CAAA,CAAG,SAAA,CAAW4D,EAAe,EAAA,CAAK,GAAGG,EACnC,QAAA,CAAApB,CAAAA,CACH,CAEJ,CAAA,CACA,EAAA,CAAG,CACD,QAAA,CAAAA,CAAAA,CACA,GAAGoB,CACL,CAAA,CAAwE,CACtE,OACE/D,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAW4D,EAAe,EAAA,CAAK,GAAGG,EACnC,QAAA,CAAApB,CAAAA,CACH,CAEJ,CAAA,CACA,GAAA,CAAI,CAAE,GAAA,CAAAqB,CAAAA,CAAK,IAAA9C,CAAI,CAAA,CAAmC,CAChD,OACElB,GAAAA,CAAC,OACC,GAAA,CAAKgE,CAAAA,CACL,GAAA,CAAK9C,CAAAA,CACL,UAAU,8DAAA,CACZ,CAEJ,EACA,EAAA,CAAG,CACD,SAAAyB,CAAAA,CACA,GAAGoB,CACL,CAAA,CAAsE,CACpE,OACE/D,GAAAA,CAAC,IAAA,CAAA,CAAG,UAAW4D,CAAAA,CAAe,EAAA,CAAK,GAAGG,CAAAA,CACnC,QAAA,CAAApB,CAAAA,CACH,CAEJ,EACA,EAAA,CAAG,CACD,SAAAA,CAAAA,CACA,GAAGoB,CACL,CAAA,CAAsE,CACpE,OACE/D,GAAAA,CAAC,IAAA,CAAA,CAAG,UAAW4D,CAAAA,CAAe,EAAA,CAAK,GAAGG,CAAAA,CACnC,QAAA,CAAApB,EACH,CAEJ,CAAA,CACA,EAAA,CAAG,CACD,SAAAA,CAAAA,CACA,GAAGoB,CACL,CAAA,CAAmE,CACjE,OACE/D,GAAAA,CAAC,IAAA,CAAA,CACC,UAAW,CAAA,EAAG4D,CAAAA,CAAe,EAAE,CAAA,qEAAA,CAAA,CAC/B,OAAA,CAAS,IAAME,CAAAA,CAAoBnB,CAAQ,EAC1C,GAAGoB,CAAAA,CAEH,QAAA,CAAApB,CAAAA,CACH,CAEJ,CAAA,CACA,CAAA,CAAE,CACA,IAAA,CAAAsB,CAAAA,CACA,SAAAtB,CAAAA,CACA,GAAGoB,CACL,CAAA,CAG6C,CAC3C,OACE/D,GAAAA,CAAC,GAAA,CAAA,CACC,KAAMiE,CAAAA,CACN,SAAA,CAAWL,EAAe,CAAA,CAC1B,MAAA,CAAO,QAAA,CACP,GAAA,CAAI,sBACH,GAAGG,CAAAA,CAEH,SAAApB,CAAAA,CACH,CAEJ,EACA,UAAA,CAAW,CACT,SAAAA,CAAAA,CACA,GAAGoB,CACL,CAAA,CAAsE,CACpE,OACE/D,GAAAA,CAAC,YAAA,CAAA,CAAW,UAAW4D,CAAAA,CAAe,UAAA,CAAa,GAAGG,CAAAA,CACnD,SAAApB,CAAAA,CACH,CAEJ,EACA,GAAA,CAAI,CACF,SAAAA,CACF,CAAA,CAAoE,CAElE,OAAO3C,GAAAA,CAAA+B,SAAA,CAAG,QAAA,CAAAY,EAAS,CACrB,CAAA,CACA,MAAM,CACJ,QAAA,CAAAA,CAAAA,CACA,GAAGoB,CACL,CAAA,CAAsE,CACpE,OACE/D,GAAAA,CAAC,OAAA,CAAA,CAAM,UAAW4D,CAAAA,CAAe,KAAA,CAAQ,GAAGG,CAAAA,CACzC,QAAA,CAAApB,EACH,CAEJ,CAAA,CACA,GAAG,CACD,QAAA,CAAAA,EACA,GAAGoB,CACL,CAAA,CAEsD,CACpD,OACE/D,GAAAA,CAAC,IAAA,CAAA,CAAG,UAAW4D,CAAAA,CAAe,EAAA,CAAK,GAAGG,CAAAA,CACnC,QAAA,CAAApB,EACH,CAEJ,CAAA,CACA,GAAG,CACD,QAAA,CAAAA,EACA,GAAGoB,CACL,EAEoD,CAClD,OACE/D,GAAAA,CAAC,IAAA,CAAA,CAAG,UAAW4D,CAAAA,CAAe,EAAA,CAAK,GAAGG,CAAAA,CACnC,QAAA,CAAApB,EACH,CAEJ,CACF,GAEOuB,EAAAA,CAAQL,EAAAA,CCnMR,SAASM,EAAAA,CAASC,CAAAA,CAA0B,CACjD,IAAMnD,CAAAA,CAAM,IAAI,GAAA,CAAImD,CAAAA,CAAO,YAAY,CAAA,CACjCC,EAAW,kBAAA,CAAmBpD,CAAAA,CAAI,QAAQ,CAAA,CAC1CqD,CAAAA,CAAsC,EAAC,CAE7C,IAAA,GAAW,CAACX,CAAAA,CAAKxD,CAAK,IAAKc,CAAAA,CAAI,YAAA,CAAa,SAAQ,CAClDqD,CAAAA,CAAYX,CAAG,CAAA,CAAI,kBAAA,CAAmBxD,CAAK,CAAA,CAG7C,OAAO,CAAE,QAAA,CAAAkE,EAAU,WAAA,CAAAC,CAAY,CACjC,CAEA,IAAOC,GAAQJ,EAAAA,CCjBf,SAASK,GAA8BJ,CAAAA,CAAe,CACpD,IAAMK,CAAAA,CAAQL,CAAAA,CAAM,MAAM,yBAAyB,CAAA,CACnD,OAAKK,CAAAA,CAEEA,EAAM,CAAC,CAAA,CAFK,IAGrB,CAEA,IAAOC,GAAQF,EAAAA,CCDf,IAAMG,EAAAA,CAAeC,KAAK,SAAkB,CAC1C,MAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,eAAA,CAAAC,EACA,UAAA,CAAAC,CACF,EAQG,CACD,IAAMC,EAAaJ,CAAAA,CAAM,OAAA,CAAQ,MAAM,aAAa,CAAA,CAC9CK,EAAaL,CAAAA,CAAM,OAAA,CAAQ,MAAM,iBAAiB,CAAA,CAClDM,EAAQF,CAAAA,CAAaA,CAAAA,CAAW,CAAC,CAAA,CAAI,GACrCG,CAAAA,CAAWF,CAAAA,CAAaA,EAAW,CAAC,CAAA,CAAI,KAExCG,CAAAA,CAAiBX,EAAAA,CAA8BG,EAAM,OAAO,CAAA,CAE5DS,EAA8BT,CAAAA,CAAM,OAAA,CACvC,QAAQ,WAAA,CAAa,EAAE,EACvB,OAAA,CAAQ,iBAAA,CAAmB,EAAE,CAAA,CAC7B,QAAQ,gBAAA,CAAkB,EAAE,EAC5B,IAAA,EAAK,CAEFU,EAAqBrB,EAAAA,CAAyBa,CAAe,EAanE,OACEhF,IAAAA,CAAC,OAAI,OAAA,CAZqB,IAAM,CAChC,GAAIiF,CAAAA,EAAcK,EAAgB,CAChC,IAAMG,CAAAA,CAAYjB,EAAAA,CAASc,CAAc,CAAA,CACzCL,CAAAA,CAAWQ,EAAU,QAAA,CAAU,CAC7B,GAAIA,CAAAA,CAAU,WAAA,EAAe,CAAE,KAAA,CAAOA,CAAAA,CAAU,WAAY,CAC9D,CAAC,EACH,CAAA,KACEV,CAAAA,CAAYD,EAAM,OAAO,EAE7B,CAAA,CAGqC,SAAA,CAAU,uBAC3C,QAAA,CAAA,CAAA7E,GAAAA,CAAC,OAAI,SAAA,CAAU,yIAAA,CAA0I,EACzJD,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,wBAAA,CACZ,QAAA,CAAA,CAAAqF,EACCpF,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,8BAAA,CACb,QAAA,CAAAA,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAAA,CAAuB,GAAA,CAAKoF,EAAU,GAAA,CAAKD,CAAAA,CAAO,EACnE,CAAA,CACE,IAAA,CAEJpF,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oBACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,MAAG,SAAA,CAAU,0EAAA,CACX,SAAAmF,CAAAA,CACH,CAAA,CACAnF,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6DAAA,CACb,QAAA,CAAAA,IAACyF,EAAAA,CAAA,CAAc,WAAYF,CAAAA,CACxB,QAAA,CAAAD,EACH,CAAA,CACF,CAAA,CAAA,CACF,GACF,CAAA,CAAA,CACF,CAEJ,CAAC,CAAA,CAEMI,EAAAA,CAAQf,GC1Df,IAAMgB,EAAAA,CAAoBf,IAAAA,CAAK,SAAuB,CACpD,KAAA,CAAAgB,CAAAA,CACA,YAAAd,CAAAA,CACA,eAAA,CAAAC,EACA,UAAA,CAAAC,CACF,EAA2B,CACzB,OACEhF,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,aACb,QAAA,CAAAA,GAAAA,CAAC,OAAI,SAAA,CAAU,0BAAA,CACZ,QAAA,CAAA4F,CAAAA,CAAM,IAAI,CAACf,CAAAA,CAAOgB,IACjB7F,GAAAA,CAAC0F,EAAAA,CAAA,CAEC,KAAA,CAAOb,CAAAA,CACP,YAAaC,CAAAA,CACb,eAAA,CAAiBC,EACjB,UAAA,CAAYC,CAAAA,CAAAA,CAJPa,CAKP,CACD,CAAA,CACH,EACF,CAEJ,CAAC,CAAA,CAEMC,EAAAA,CAAQH,GC/Bf,SAASI,EAAAA,CAAgBC,CAAAA,CAA2B,CAElD,OAAO,CAAE,KAAM,IAAM,IAAK,CAC5B,CAMe,SAARC,GAAkC,CAAE,SAAA,CAAAC,CAAU,CAAA,CAAqB,CACxE,OAAOA,CAAAA,CAAU,IAAKC,CAAAA,EAAa,CAKjC,IAAMC,CAAAA,CAJeL,EAAAA,CACnB,IAAI,IAAA,CAAK,GAAI,EAAA,CAAI,CAAE,KAAMI,CAAAA,CAAS,SAAU,CAAC,CAC/C,CAAA,CAE0B,IAAA,CAC1B,OACEnG,IAAC,GAAA,CAAA,CAEC,aAAA,CAAY,oBACZ,IAAA,CAAMmG,CAAAA,CAAS,IACf,MAAA,CAAO,QAAA,CACP,IAAI,qBAAA,CACJ,SAAA,CAAU,yCAEV,QAAA,CAAAnG,GAAAA,CAAC,OAAI,SAAA,CAAU,iCAAA,CACb,SAAAD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wIAAA,CACb,UAAAC,GAAAA,CAACoG,CAAAA,CAAA,CAAK,SAAA,CAAU,qCAAA,CAAsC,EACtDrG,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,0CAAA,CACZ,QAAA,CAAA,CAAAoG,EAAS,QAAA,EAAY,MAAA,CACtBnG,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gCACb,QAAA,CAAAmG,CAAAA,CAAS,SAAA,CACZ,CAAA,CAAA,CACF,GACF,CAAA,CACF,CAAA,CAAA,CAjBKA,EAAS,GAkBhB,CAEJ,CAAC,CACH,CCtCA,SAASE,EAAAA,CAAiBjC,CAAAA,CAAwC,CAChE,IAAMkC,CAAAA,CAAiC,EAAC,CAGlCC,CAAAA,CAAQnC,EAAM,KAAA,CAAM;AAAA,CAAI,CAAA,CAAE,MAAA,CAAQZ,CAAAA,EAASA,CAAAA,CAAK,IAAA,EAAK,GAAM,EAAE,CAAA,CAEnE,IAAA,IAAWA,CAAAA,IAAQ+C,CAAAA,CAAO,CAExB,IAAMC,EACJ,8DAAA,CAEE/B,CAAAA,CACJ,KAAA,CAAQA,CAAAA,CAAQ+B,CAAAA,CAAM,IAAA,CAAKhD,CAAI,CAAA,IAAO,IAAA,EAAM,CAC1C,GAAM,EAAGiD,CAAAA,CAAUxF,EAAKyF,CAAAA,CAAUC,CAAS,CAAA,CAAIlC,CAAAA,CAE/C6B,CAAAA,CAAM,IAAA,CAAK,CACT,QAAA,CAAUG,CAAAA,CAAS,IAAA,EAAK,CACxB,GAAA,CAAKxF,CAAAA,CAAI,IAAA,EAAK,CACd,QAAA,CAAUyF,CAAAA,CAAS,IAAA,EAAK,CACxB,SAAA,CAAWC,CAAAA,CAAU,IAAA,EACvB,CAAC,EACH,CACF,CAEA,OAAOL,CACT,CAEA,IAAOM,EAAAA,CAAQP,EAAAA,CCxBR,SAASQ,EAAAA,CAAa,CAAE,OAAA,CAAAC,CAAQ,CAAA,CAAsB,CAC3D,OACE9G,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,+DAAA,CACV,aAAA,CAAY,eAAA,CAEZ,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4DAAA,CACb,QAAA,CAAAD,IAAAA,CAAC,OAAI,SAAA,CAAU,wEAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,OAAA,CAAA,CACC,GAAA,CAAK8G,CAAAA,CAAQ,GAAA,CACb,QAAA,CAAQ,IAAA,CACR,SAAA,CAAU,2BAAA,CACV,KAAA,CAAO,CACL,eAAA,CAAiB,aAAA,CACjB,MAAA,CAAQ,MACV,CAAA,CACF,CAAA,CACCA,CAAAA,CAAQ,WAAA,EACP9G,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+IAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BAA6B,QAAA,CAAA,cAAA,CAAY,CAAA,CAC1D,CAAA,CAAA,CAEJ,CAAA,CACF,CAAA,CACF,CAEJ,CC7BO,SAAS+G,EAAAA,CAAe,CAAE,GAAA,CAAA9F,CAAI,CAAA,CAAwB,CA8B3D,OACElB,IAAAA,CAACiH,MAAAA,CAAA,CACC,OAAA,CA/BiBzH,CAAAA,EAA4B,CAK/C,GAJAA,CAAAA,CAAM,cAAA,EAAe,CAEJ,2BAAA,CAA4B,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA,CAEvD,CAEZ,MAAA,CAAO,IAAA,CAAK0B,CAAAA,CAAK,QAAA,CAAU,qBAAqB,CAAA,CAChD,MACF,CAGA,IAAMgG,CAAAA,CAAQ,GAAA,CACRC,CAAAA,CAAS,GAAA,CACTC,CAAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAA,CAAQ,EAAIF,CAAAA,CAAQ,CAAA,CACzCG,CAAAA,CAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAS,CAAA,CAAIF,CAAAA,CAAS,CAAA,CAE1CG,CAAAA,CAAQ,MAAA,CAAO,IAAA,CACnBpG,CAAAA,CACA,SAAA,CACA,SAASgG,CAAK,CAAA,QAAA,EAAWC,CAAM,CAAA,MAAA,EAASC,CAAI,CAAA,KAAA,EAAQC,CAAG,CAAA,mDAAA,CACzD,CAAA,CAAA,CAGI,CAACC,CAAAA,EAASA,CAAAA,CAAM,MAAA,EAAU,OAAOA,EAAM,MAAA,CAAW,GAAA,GACpD,MAAA,CAAO,IAAA,CAAKpG,CAAAA,CAAK,QAAA,CAAU,qBAAqB,EAEpD,CAAA,CAKI,SAAA,CAAU,oCAAA,CAEV,QAAA,CAAA,CAAAjB,GAAAA,CAACsH,UAAAA,CAAA,CAAW,IAAA,CAAM,EAAA,CAAI,CAAA,CACtBtH,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,cAAA,CAAY,CAAA,CAAA,CACpB,CAEJ,CCzCA,IAAMuH,EAAAA,CAAwBC,CAAAA,EAEdA,CAAAA,CAAQ,KAAA,CAAM;AAAA,CAAI,CAAA,CAAE,OAAOhE,CAAAA,EAAQA,CAAAA,CAAK,MAAM,CAAA,CAIzD,MAAA,CAAOA,CAAAA,EAAQA,CAAAA,CAAK,IAAA,GAAO,UAAA,CAAW,GAAG,CAAC,CAAA,CAC1C,GAAA,CAAIA,IAAS,CACZ,IAAA,CAAMA,CAAAA,CAAK,IAAA,EAAK,CAAE,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,GAC/B,OAAA,CAASA,CAAAA,CAAK,MAAK,CAAE,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,EACpC,EAAE,CAAA,CAGCiE,EAAAA,CAAQF,GChBf,IAAMG,EAAAA,CACJF,GACmC,CACnC,IAAMG,CAAAA,CAAa,qBAAA,CACbvG,CAAAA,CAAyC,GAC3CqD,CAAAA,CAEJ,KAAA,CAAQA,EAAQkD,CAAAA,CAAW,IAAA,CAAKH,CAAO,CAAA,IAAO,IAAA,EACxC/C,CAAAA,CAAM,CAAC,CAAA,EAAKA,CAAAA,CAAM,CAAC,CAAA,EACrBrD,CAAAA,CAAO,KAAK,CACV,GAAA,CAAKqD,EAAM,CAAC,CAAA,CACZ,GAAA,CAAKA,CAAAA,CAAM,CAAC,CACd,CAAC,CAAA,CAIL,OAAOrD,CACT,CAAA,CAEOwG,EAAAA,CAAQF,GCnBf,IAAMG,EAAAA,CAAgBL,CAAAA,EAA8B,CAClD,IAAMM,CAAAA,CAAY,oBACZC,CAAAA,CAAiB,EAAC,CACpBtD,CAAAA,CAEJ,KAAA,CAAQA,CAAAA,CAAQqD,EAAU,IAAA,CAAKN,CAAO,CAAA,IAAO,IAAA,EACvC/C,CAAAA,CAAM,CAAC,GACTsD,CAAAA,CAAK,IAAA,CAAKtD,EAAM,CAAC,CAAC,EAItB,OAAOsD,CACT,CAAA,CAEOC,EAAAA,CAAQH,EAAAA,CCVR,SAASI,GAA0BC,CAAAA,CAAqC,CAC7E,IAAMzD,CAAAA,CAAQyD,CAAAA,CAAS,MAAM,0BAA0B,CAAA,CACvD,GAAI,CAACzD,CAAAA,CAAO,OAAO,KAEnB,GAAM,EAAG0D,CAAAA,CAAMlH,CAAG,EAAIwD,CAAAA,CACtB,OAAO,CAAE,IAAA,CAAA0D,CAAAA,CAAM,GAAA,CAAAlH,CAAI,CACrB,CCVA,IAAMmH,EAAAA,CAAsBZ,CAAAA,EAAmC,CAC7D,IAAMM,CAAAA,CAAY,kBAAA,CACZrD,CAAAA,CAAQ+C,CAAAA,CAAQ,KAAA,CAAMM,CAAS,CAAA,CACrC,OAAOrD,EAAQA,CAAAA,CAAM,CAAC,EAAI,IAC5B,CAAA,CAEO4D,EAAAA,CAAQD,EAAAA,CCLf,IAAME,EAAAA,CAAuBC,GACvB,OAAOA,CAAAA,EAAS,SACXA,CAAAA,CAEL,KAAA,CAAM,QAAQA,CAAI,CAAA,CACbA,CAAAA,CAAK,GAAA,CAAID,EAAmB,CAAA,CAAE,KAAK,EAAE,CAAA,CAE1C,OAAOC,CAAAA,EAAS,QAAA,EAAYA,IAAS,IAAA,EAAQ,OAAA,GAAWA,CAAAA,CACnDD,EAAAA,CAAoBC,CAAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,CAEzC,EAAA,CAGFC,EAAAA,CAAQF,EAAAA,CCff,SAASG,EAAAA,CAAgCrE,EAAuB,CAC9D,OAAOA,CAAAA,CAAM,OAAA,CAAQ,aAAA,CAAe,CAAA;AAAA,GAAA,CAAS,CAC/C,CAGA,IAAMsE,EAAAA,CACJlB,GAC8D,CAE9DA,CAAAA,CAAUA,CAAAA,CAAQ,OAAA,CAAQ,MAAA,CAAQ;AAAA,CAAI,EAEtC,IAAMmB,CAAAA,CAAS,EAAC,CACZC,EAAc,EAAA,CACdC,CAAAA,CAAkB,EAAA,CAClBC,CAAAA,CAAiB,GACjBC,CAAAA,CAAiB,EAAA,CACjBC,EAAgB,EAAA,CAChBC,CAAAA,CAAe,GACfC,CAAAA,CAAkB,EAAA,CAClBC,CAAAA,CAAmB,EAAA,CAEnBC,EAAa,KAAA,CACbC,CAAAA,CAAY,MACZC,CAAAA,CAAY,KAAA,CACZC,EAAW,KAAA,CACXC,CAAAA,CAAU,KAAA,CACVC,CAAAA,CAAa,MACbC,CAAAA,CAAc,KAAA,CAOZnD,EADmBkC,EAAAA,CAAgCjB,CAAO,EACjC,KAAA,CAAM;AAAA,CAAI,CAAA,CAEzC,QAAS/D,CAAAA,CAAI,CAAA,CAAGA,EAAI8C,CAAAA,CAAM,MAAA,CAAQ9C,IAAK,CACrC,IAAMD,EAAO+C,CAAAA,CAAM9C,CAAC,EAGpB,GAAID,CAAAA,CAAK,MAAK,GAAM,eAAA,EAAmBA,CAAAA,CAAK,IAAA,EAAK,GAAM,cAAA,CAAgB,CAEjEoF,CAAAA,CAAY,IAAA,KACdD,CAAAA,CAAO,IAAA,CAAK,CACV,IAAA,CAAM,MAAA,CACN,OAAA,CAASC,CAAAA,CAAY,IAAA,EACvB,CAAC,CAAA,CACDA,CAAAA,CAAc,IAEhBQ,CAAAA,CAAa,IAAA,CACb,QACF,CAGA,GAAI5F,CAAAA,CAAK,IAAA,EAAK,GAAM,aAAA,EAAiBA,EAAK,IAAA,EAAK,GAAM,aAAc,CAE7DoF,CAAAA,CAAY,MAAK,GACnBD,CAAAA,CAAO,IAAA,CAAK,CACV,IAAA,CAAM,MAAA,CACN,QAASC,CAAAA,CAAY,IAAA,EACvB,CAAC,CAAA,CACDA,EAAc,EAAA,CAAA,CAEhBS,CAAAA,CAAY,IAAA,CACZ,QACF,CAGA,GAAI7F,EAAK,IAAA,EAAK,GAAM,eAAiBA,CAAAA,CAAK,IAAA,KAAW,YAAA,CAAc,CAE7DoF,CAAAA,CAAY,IAAA,EAAK,GACnBD,CAAAA,CAAO,KAAK,CACV,IAAA,CAAM,OACN,OAAA,CAASC,CAAAA,CAAY,MACvB,CAAC,CAAA,CACDA,CAAAA,CAAc,EAAA,CAAA,CAEhBU,CAAAA,CAAY,KACZ,QACF,CAGA,GAAI9F,CAAAA,CAAK,IAAA,KAAW,YAAA,EAAgBA,CAAAA,CAAK,MAAK,GAAM,WAAA,CAAa,CAE3DoF,CAAAA,CAAY,IAAA,KACdD,CAAAA,CAAO,IAAA,CAAK,CACV,IAAA,CAAM,MAAA,CACN,OAAA,CAASC,CAAAA,CAAY,IAAA,EACvB,CAAC,CAAA,CACDA,CAAAA,CAAc,IAEhBW,CAAAA,CAAW,IAAA,CACX,QACF,CAGA,GAAI/F,CAAAA,CAAK,IAAA,EAAK,GAAM,WAAA,EAAeA,EAAK,IAAA,EAAK,GAAM,WAAY,CAEzDoF,CAAAA,CAAY,MAAK,GACnBD,CAAAA,CAAO,IAAA,CAAK,CACV,IAAA,CAAM,MAAA,CACN,QAASC,CAAAA,CAAY,IAAA,EACvB,CAAC,CAAA,CACDA,EAAc,EAAA,CAAA,CAEhBY,CAAAA,CAAU,IAAA,CACV,QACF,CAEA,GAAIhG,EAAK,IAAA,EAAK,GAAM,gBAAkBA,CAAAA,CAAK,IAAA,KAAW,aAAA,CAAe,CAE/DoF,CAAAA,CAAY,IAAA,EAAK,GACnBD,CAAAA,CAAO,KAAK,CACV,IAAA,CAAM,OACN,OAAA,CAASC,CAAAA,CAAY,MACvB,CAAC,CAAA,CACDA,CAAAA,CAAc,EAAA,CAAA,CAEhBa,CAAAA,CAAa,KACb,QACF,CAEA,GAAIjG,CAAAA,CAAK,IAAA,KAAW,eAAA,EAAmBA,CAAAA,CAAK,IAAA,EAAK,GAAM,cAAA,CAAgB,CAEjEoF,EAAY,IAAA,EAAK,GACnBD,EAAO,IAAA,CAAK,CACV,KAAM,MAAA,CACN,OAAA,CAASC,EAAY,IAAA,EACvB,CAAC,CAAA,CACDA,CAAAA,CAAc,IAEhBc,CAAAA,CAAc,IAAA,CACd,QACF,CAGA,GAAIlG,CAAAA,CAAK,IAAA,EAAK,GAAM,KAAA,EAAS4F,EAAY,CACvCT,CAAAA,CAAO,KAAK,CACV,IAAA,CAAM,YACN,OAAA,CAASE,CAAAA,CAAgB,IAAA,EAAK,CAC9B,UAAA,CAAY,IACd,CAAC,CAAA,CACDA,CAAAA,CAAkB,GAClBO,CAAAA,CAAa,KAAA,CACb,QACF,CAGA,GAAI5F,CAAAA,CAAK,IAAA,EAAK,GAAM,KAAA,EAAS6F,EAAW,CACtCV,CAAAA,CAAO,KAAK,CACV,IAAA,CAAM,UACN,OAAA,CAASG,CAAAA,CAAe,IAAA,EAAK,CAC7B,UAAA,CAAY,IACd,CAAC,CAAA,CACDA,CAAAA,CAAiB,GACjBO,CAAAA,CAAY,KAAA,CACZ,QACF,CAGA,GAAI7F,CAAAA,CAAK,IAAA,EAAK,GAAM,KAAA,EAAS8F,EAAW,CACtCX,CAAAA,CAAO,KAAK,CACV,IAAA,CAAM,UACN,OAAA,CAASI,CAAAA,CAAe,IAAA,EAAK,CAC7B,UAAA,CAAY,IACd,CAAC,CAAA,CACDA,CAAAA,CAAiB,GACjBO,CAAAA,CAAY,KAAA,CACZ,QACF,CAGA,GAAI9F,CAAAA,CAAK,IAAA,EAAK,GAAM,KAAA,EAAS+F,EAAU,CACrCZ,CAAAA,CAAO,KAAK,CACV,IAAA,CAAM,SACN,OAAA,CAASK,CAAAA,CAAc,MAAK,CAC5B,UAAA,CAAY,IACd,CAAC,CAAA,CACDA,EAAgB,EAAA,CAChBO,CAAAA,CAAW,MACX,QACF,CAGA,GAAI/F,CAAAA,CAAK,IAAA,EAAK,GAAM,OAASgG,CAAAA,CAAS,CACpCb,EAAO,IAAA,CAAK,CACV,KAAM,OAAA,CACN,OAAA,CAASM,CAAAA,CAAa,IAAA,EAAK,CAC3B,UAAA,CAAY,IACd,CAAC,CAAA,CACDA,EAAe,EAAA,CACfO,CAAAA,CAAU,MACV,QACF,CAGA,GAAIhG,CAAAA,CAAK,IAAA,EAAK,GAAM,OAASiG,CAAAA,CAAY,CACvCd,EAAO,IAAA,CAAK,CACV,KAAM,UAAA,CACN,OAAA,CAASO,CAAAA,CAAgB,IAAA,EAAK,CAC9B,UAAA,CAAY,IACd,CAAC,CAAA,CAEDA,EAAkB,EAAA,CAClBO,CAAAA,CAAa,MACb,QACF,CAGA,GAAIjG,CAAAA,CAAK,IAAA,EAAK,GAAM,OAASkG,CAAAA,CAAa,CACxCf,EAAO,IAAA,CAAK,CACV,KAAM,WAAA,CACN,OAAA,CAASQ,CAAAA,CAAiB,IAAA,EAAK,CAC/B,UAAA,CAAY,IACd,CAAC,CAAA,CAEDA,EAAmB,EAAA,CACnBO,CAAAA,CAAc,MACd,QACF,CAGIN,CAAAA,CACFP,CAAAA,EAAmBrF,CAAAA,CAAO;AAAA,CAAA,CACjB6F,CAAAA,CAETP,GAAkBtF,CAAAA,CAAO;AAAA,CAAA,CAChB8F,CAAAA,CAETP,GAAkBvF,CAAAA,CAAO;AAAA,CAAA,CAChB+F,CAAAA,CAETP,GAAiBxF,CAAAA,CAAO;AAAA,CAAA,CACfgG,CAAAA,CAETP,GAAgBzF,CAAAA,CAAO;AAAA,CAAA,CACdiG,CAAAA,CAETP,GAAmB1F,CAAAA,CAAO;AAAA,CAAA,CACjBkG,CAAAA,CAETP,GAAoB3F,CAAAA,CAAO;AAAA,CAAA,CAG3BoF,GAAepF,CAAAA,CAAO;AAAA,EAE1B,CAGA,OAAI4F,CAAAA,CAEFT,CAAAA,CAAO,IAAA,CAAK,CACV,IAAA,CAAM,WAAA,CACN,OAAA,CAASE,CAAAA,CAAgB,MAAK,CAC9B,UAAA,CAAY,KACd,CAAC,EACQQ,CAAAA,CAETV,CAAAA,CAAO,IAAA,CAAK,CACV,KAAM,SAAA,CACN,OAAA,CAASG,CAAAA,CAAe,IAAA,GACxB,UAAA,CAAY,KACd,CAAC,CAAA,CACQQ,EAETX,CAAAA,CAAO,IAAA,CAAK,CACV,IAAA,CAAM,SAAA,CACN,QAASI,CAAAA,CAAe,IAAA,EAAK,CAC7B,UAAA,CAAY,KACd,CAAC,CAAA,CACQQ,CAAAA,CAETZ,CAAAA,CAAO,KAAK,CACV,IAAA,CAAM,QAAA,CACN,OAAA,CAASK,EAAc,IAAA,EAAK,CAC5B,UAAA,CAAY,KACd,CAAC,CAAA,CACQQ,CAAAA,CAETb,CAAAA,CAAO,IAAA,CAAK,CACV,IAAA,CAAM,OAAA,CACN,OAAA,CAASM,CAAAA,CAAa,MAAK,CAC3B,UAAA,CAAY,KACd,CAAC,EACQQ,CAAAA,CAETd,CAAAA,CAAO,KAAK,CACV,IAAA,CAAM,WACN,OAAA,CAASO,CAAAA,CAAgB,IAAA,EAAK,CAC9B,WAAY,KACd,CAAC,CAAA,CACQQ,CAAAA,CAETf,EAAO,IAAA,CAAK,CACV,IAAA,CAAM,WAAA,CACN,QAASQ,CAAAA,CAAiB,IAAA,EAAK,CAC/B,UAAA,CAAY,KACd,CAAC,CAAA,CACQP,CAAAA,CAAY,IAAA,IACrBD,CAAAA,CAAO,IAAA,CAAK,CACV,IAAA,CAAM,OACN,OAAA,CAASC,CAAAA,CAAY,IAAA,EACvB,CAAC,CAAA,CAGID,CACT,EAEOgB,EAAAA,CAAQjB,EAAAA,CC5SA,SAARkB,GAAsC,CAC3C,MAAA,CAAAxI,CACF,CAAA,CAA8B,CAC5B,GAAM,CAACyI,CAAAA,CAAcC,CAAe,CAAA,CAAI3M,SAAS,KAAK,CAAA,CAChD,CAAC4M,CAAAA,CAAmBC,CAAoB,CAAA,CAAI7M,QAAAA,CAAS,CAAC,CAAA,CACtD8M,EAAcpM,MAAAA,CAAuB,IAAI,EACzC,CAACqM,CAAAA,CAAYC,CAAa,CAAA,CAAIhN,QAAAA,CAAS,KAAK,CAAA,CAC5C,CAACiN,CAAAA,CAAQC,CAAS,CAAA,CAAIlN,QAAAA,CAAS,CAAC,CAAA,CAChC,CAACmN,CAAAA,CAAYC,CAAa,EAAIpN,QAAAA,CAAS,CAAC,CAAA,CACxC,CAACqN,EAAcC,CAAe,CAAA,CAAItN,QAAAA,CAAS,CAAC,EAE5CuN,CAAAA,CAAkBC,WAAAA,CAAapL,CAAAA,EAA4B,CAC1D0K,EAAY,OAAA,GAIjBE,CAAAA,CAAc,IAAI,CAAA,CAClBE,EAAU9K,CAAAA,CAAM,KAAA,CAAQ0K,EAAY,OAAA,CAAQ,UAAU,EACtDM,CAAAA,CAAcN,CAAAA,CAAY,OAAA,CAAQ,UAAU,EAC5CQ,CAAAA,CAAgB,CAAC,CAAA,CAGjBlL,CAAAA,CAAM,gBAAe,EACvB,CAAA,CAAG,EAAE,EAECqL,CAAAA,CAAkBD,WAAAA,CACrBpL,GAA4B,CAC3B,GAAI,CAAC2K,CAAAA,EAAc,CAACD,CAAAA,CAAY,OAAA,CAC9B,OAGF1K,CAAAA,CAAM,cAAA,EAAe,CACrB,IAAMsL,EAAItL,CAAAA,CAAM,KAAA,CAAQ0K,CAAAA,CAAY,OAAA,CAAQ,WACtCa,CAAAA,CAAAA,CAAQD,CAAAA,CAAIT,GAAU,CAAA,CAC5BH,CAAAA,CAAY,QAAQ,UAAA,CAAaK,CAAAA,CAAaQ,CAAAA,CAG9CL,CAAAA,CAAgB,KAAK,GAAA,CAAII,CAAAA,CAAIT,CAAM,CAAC,EACtC,CAAA,CACA,CAACF,CAAAA,CAAYE,CAAAA,CAAQE,CAAU,CACjC,CAAA,CAEMS,CAAAA,CAAgBJ,WAAAA,CAAY,IAAM,CACtCR,CAAAA,CAAc,KAAK,EACrB,EAAG,EAAE,CAAA,CAECa,CAAAA,CAAmBL,YAAY,IAAM,CACzCR,CAAAA,CAAc,KAAK,EACrB,CAAA,CAAG,EAAE,CAAA,CAGCc,CAAAA,CAAmBN,YACvB,CAACO,CAAAA,CAAoB3L,CAAAA,GAA4B,CAK/C,GAAIiL,CAAAA,CAAe,CAAA,CAAiB,CAClCjL,CAAAA,CAAM,gBAAe,CACrB,MACF,CAEAyK,CAAAA,CAAqBkB,CAAU,CAAA,CAC/BpB,CAAAA,CAAgB,IAAI,EACtB,CAAA,CACA,CAACU,CAAY,CACf,CAAA,CAYA,OACEzK,KAAC,KAAA,CAAA,CACC,aAAA,CAAY,wBAAA,CACZ,SAAA,CAAU,yCAEV,QAAA,CAAA,CAAAC,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKiK,EACL,SAAA,CAAU,6CAAA,CACV,MAAO,CAAE,MAAA,CAAQC,EAAa,UAAA,CAAa,MAAO,CAAA,CAClD,WAAA,CAAaQ,EACb,WAAA,CAAaE,CAAAA,CACb,SAAA,CAAWG,CAAAA,CACX,aAAcC,CAAAA,CACd,WAAA,CAvBmBzL,CAAAA,EAA2B,CAClDA,EAAM,cAAA,EAAe,CACrBA,CAAAA,CAAM,eAAA,GACR,CAAA,CAqBM,UAAA,CAnBkBA,CAAAA,EAA2B,CACjDA,EAAM,cAAA,EAAe,CACrBA,CAAAA,CAAM,eAAA,GACR,CAAA,CAkBO,QAAA,CAAA6B,CAAAA,CAAO,GAAA,CAAI,CAACS,CAAAA,CAAOzB,CAAAA,GAClBJ,IAAC,KAAA,CAAA,CAEC,SAAA,CAAU,+CACV,OAAA,CAAST,CAAAA,EAAS0L,CAAAA,CAAiB7K,CAAAA,CAAOb,CAAK,CAAA,CAE/C,QAAA,CAAAS,GAAAA,CAAC,KAAA,CAAA,CACC,IAAK6B,CAAAA,CAAM,GAAA,CACX,GAAA,CAAKA,CAAAA,CAAM,IACX,SAAA,CAAW,KAAA,CACX,KAAA,CAAO,CAAE,WAAY,MAAO,CAAA,CAC9B,CAAA,CAAA,CATKA,CAAAA,CAAM,GAUb,CACD,CAAA,CACH,CAAA,CACA7B,GAAAA,CAACmB,GAAA,CACC,MAAA,CAAQC,CAAAA,CACR,YAAA,CAAc2I,EACd,IAAA,CAAMF,CAAAA,CACN,QAAS,IAAMC,CAAAA,CAAgB,KAAK,CAAA,CACtC,CAAA,CAAA,CACF,CAEJ,CCjHe,SAARqB,GAA8B,CAAE,OAAA,CAAArE,CAAQ,CAAA,CAAsB,CACnE,GAAM,CAAC+C,CAAAA,CAAcC,CAAe,EAAI3M,QAAAA,CAAS,KAAK,CAAA,CAEtD,OAAK2J,EAAQ,GAAA,CAKX/G,IAAAA,CAAC,KAAA,CAAA,CACC,aAAA,CAAY,gBACZ,SAAA,CAAU,yEAAA,CAEV,UAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,mCAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,KAAA,CAAA,CACC,IAAK8G,CAAAA,CAAQ,GAAA,CACb,GAAA,CAAKA,CAAAA,CAAQ,QACb,SAAA,CAAU,yDAAA,CACV,OAAA,CAAS,IAAMgD,EAAgB,IAAI,CAAA,CACrC,EACChD,CAAAA,CAAQ,WAAA,EACP9G,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+IAAA,CACb,QAAA,CAAAD,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BAAA,CAA6B,QAAA,CAAA,CAAA,cAAA,CAC7B,IACZ+G,CAAAA,CAAQ,cAAA,CAAiB,IAAA,CAAK,KAAA,CAAMA,EAAQ,cAAc,CAAA,CAAI,EAAE,GAAA,CAAA,CACnE,CAAA,CACF,GAEJ,CAAA,CACC,CAACA,CAAAA,CAAQ,WAAA,EAAeA,EAAQ,OAAA,CAAQ,MAAA,CAAS,CAAA,EAChD9G,GAAAA,CAAC,OAAI,SAAA,CAAU,2GAAA,CACZ,QAAA,CAAA8G,CAAAA,CAAQ,QACX,CAAA,CAGF9G,GAAAA,CAACgB,EAAAA,CAAA,CACC,IAAK8F,CAAAA,CAAQ,GAAA,CACb,GAAA,CAAKA,CAAAA,CAAQ,QACb,IAAA,CAAM+C,CAAAA,CACN,OAAA,CAAS,IAAMC,EAAgB,KAAK,CAAA,CACtC,CAAA,CAAA,CACF,CAAA,CApCO,IAsCX,CC5Ce,SAARsB,EAAAA,CAA6B,CAClC,GAAA,CAAAnK,EACA,SAAA,CAAAoK,CAAAA,CACA,UAAAC,CAAAA,CACA,qBAAA,CAAAC,CACF,CAAA,CAAqB,CACnB,GAAM,CAACC,EAASC,CAAU,CAAA,CAAItO,QAAAA,CAKpB,IAAI,EACR,CAACqD,CAAAA,CAASkL,CAAU,CAAA,CAAIvO,SAAS,IAAI,CAAA,CACrC,CAAC4B,CAAAA,CAAO4M,CAAQ,EAAIxO,QAAAA,CAAwB,IAAI,CAAA,CAyCtD,OAvCAoB,UAAU,IAAM,CAkCV0C,CAAAA,EAAOoK,CAAAA,EAAa,CAACE,CAAAA,EAAAA,CAjCJ,SAAY,CAC/B,GAAI,CACFG,CAAAA,CAAW,CAAA,CAAI,CAAA,CACfC,CAAAA,CAAS,IAAI,CAAA,CAEb,IAAMjI,CAAAA,CAAQ4H,CAAAA,CACd,GAAI,CAAC5H,CAAAA,CACH,MAAM,IAAI,MAAM,yBAAyB,CAAA,CAG3C,IAAMkI,CAAAA,CAAW,MAAM,KAAA,CACrB,CAAA,EAAGP,CAAS,CAAA,uBAAA,EAA0B,kBAAA,CAAmBpK,CAAG,CAAC,CAAA,CAAA,CAC7D,CACE,OAAA,CAAS,CACP,aAAA,CAAe,CAAA,OAAA,EAAUyC,CAAK,CAAA,CAChC,CACF,CACF,CAAA,CAEA,GAAI,CAACkI,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4BA,EAAS,MAAM,CAAA,CAAE,CAAA,CAG/D,IAAMhN,EAAO,MAAMgN,CAAAA,CAAS,IAAA,EAAK,CACjCH,EAAW7M,CAAI,EACjB,CAAA,MAASiN,CAAAA,CAAK,CACZ,OAAA,CAAQ,KAAA,CAAM,+BAAgCA,CAAG,CAAA,CACjDF,EAASE,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,wBAAwB,EACxE,CAAA,OAAE,CACAH,CAAAA,CAAW,KAAK,EAClB,CACF,CAAA,IAKF,EAAG,CAACzK,CAAAA,CAAKoK,CAAS,CAAC,EAEfE,CAAAA,CAEAvL,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BACb,QAAA,CAAAA,GAAAA,CAAC,GAAA,CAAA,CAAE,IAAA,CAAMiB,EAAK,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,qBAAA,CAChC,SAAAjB,GAAAA,CAACgH,MAAAA,CAAA,CAAO,OAAA,CAAQ,OAAA,CAAS,SAAA/F,CAAAA,CAAI,CAAA,CAC/B,CAAA,CACF,CAAA,CAIAT,EAEAT,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mBAAA,CACb,UAAAC,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wDAAA,CAAyD,EACxEA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+CAAA,CAAgD,GACjE,CAAA,CAIAjB,CAAAA,EAAS,CAACyM,CAAAA,CAEVxL,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAAA,IAAC,GAAA,CAAA,CAAE,IAAA,CAAMiB,CAAAA,CAAK,MAAA,CAAO,SAAS,GAAA,CAAI,qBAAA,CAChC,SAAAjB,GAAAA,CAACgH,MAAAA,CAAA,CAAO,OAAA,CAAQ,OAAA,CAAS,QAAA,CAAA/F,CAAAA,CAAI,EAC/B,CAAA,CACF,CAAA,CAKFlB,IAAAA,CAAC,GAAA,CAAA,CACC,KAAMyL,CAAAA,CAAQ,GAAA,EAAOvK,CAAAA,CACrB,MAAA,CAAO,SACP,GAAA,CAAI,qBAAA,CACJ,SAAA,CAAU,0IAAA,CAET,UAAAuK,CAAAA,CAAQ,KAAA,EACPxL,GAAAA,CAAC,KAAA,CAAA,CACC,IAAKwL,CAAAA,CAAQ,KAAA,CACb,GAAA,CAAKA,CAAAA,CAAQ,MACb,SAAA,CAAU,2DAAA,CACV,OAAA,CAASjM,CAAAA,EAAS,CAChBA,CAAAA,CAAM,aAAA,CAAc,MAAM,OAAA,CAAU,OACtC,EACF,CAAA,CAEFS,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0EACZ,QAAA,CAAAwL,CAAAA,CAAQ,KAAA,CACX,CAAA,CACCA,EAAQ,WAAA,EACPxL,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iDACZ,QAAA,CAAAwL,CAAAA,CAAQ,YACX,CAAA,CAEFxL,GAAAA,CAAC,OAAI,SAAA,CAAU,qDAAA,CACZ,QAAA,CAAA,IAAI,GAAA,CAAIwL,EAAQ,GAAA,EAAOvK,CAAG,CAAA,CAAE,QAAA,CAC/B,GACF,CAEJ,CClHe,SAAR6K,EAAAA,CAAiC,CACtC,KAAA,CAAAC,CAAAA,CACA,UAAAV,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,qBAAA,CAAAC,CACF,CAAA,CAAyB,CACvB,OACEvL,GAAAA,CAAC,OACC,aAAA,CAAY,mBAAA,CACZ,SAAA,CAAU,mCAAA,CAEV,SAAAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yDAAA,CACZ,SAAA+L,CAAAA,CAAM,GAAA,CAAI9K,CAAAA,EACTjB,GAAAA,CAACoL,GAAA,CAEC,GAAA,CAAKnK,CAAAA,CACL,SAAA,CAAWoK,EACX,SAAA,CAAWC,CAAAA,CACX,qBAAA,CAAuBC,CAAAA,CAAAA,CAJlBtK,CAKP,CACD,CAAA,CACH,EACF,CAEJ,CCvBe,SAAR+K,GAA4B,CAAE,QAAA,CAAAC,CAAS,CAAA,CAAoB,CAChE,IAAMC,CAAAA,CAA6B,CAACD,CAAAA,CAAS,SAAUA,CAAAA,CAAS,SAAS,CAAA,CAEzE,OACEjM,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wFACb,QAAA,CAAAD,IAAAA,CAACoM,aAAA,CACC,MAAA,CAAQD,CAAAA,CACR,IAAA,CAAM,GACN,eAAA,CAAiB,KAAA,CACjB,SAAA,CAAU,uBAAA,CAEV,UAAAlM,GAAAA,CAACoM,SAAAA,CAAA,CACC,WAAA,CAAY,wFACZ,GAAA,CAAI,oDAAA,CACN,CAAA,CACApM,GAAAA,CAACqM,OAAA,CAAO,QAAA,CAAUH,CAAAA,CACf,QAAA,CAAAD,EAAS,OAAA,EACRjM,GAAAA,CAACsM,KAAAA,CAAA,CACC,SAAAtM,GAAAA,CAAC,KAAA,CAAA,CAAK,QAAA,CAAAiM,CAAAA,CAAS,QAAQ,CAAA,CACzB,CAAA,CAEJ,GACF,CAAA,CACF,CAEJ,CCzBe,SAARM,GAA8B,CAAE,QAAA,CAAAN,CAAS,CAAA,CAAsB,CACpE,OACEjM,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iHACZ,QAAA,CAAAiM,CAAAA,CAAS,SAAWjM,GAAAA,CAACgM,EAAAA,CAAA,CAAW,QAAA,CAAUC,CAAAA,CAAU,CAAA,CACvD,CAEJ,CCNe,SAARO,GAAiC,CAAE,QAAA,CAAAP,CAAS,CAAA,CAAyB,CAC1E,OACEjM,GAAAA,CAAC,OAAI,SAAA,CAAU,oCAAA,CAAqC,cAAY,kBAAA,CAC9D,QAAA,CAAAA,GAAAA,CAACuM,EAAAA,CAAA,CAAa,QAAA,CAAUN,CAAAA,CAAU,CAAA,CACpC,CAEJ,CCRe,SAARQ,EAAAA,CAAiC,CAAE,OAAA,CAAA3F,CAAQ,CAAA,CAAyB,CACzE,OACE9G,GAAAA,CAAC,OACC,aAAA,CAAY,kBAAA,CACZ,SAAA,CAAU,qJAAA,CAEV,SAAAD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yEAAA,CACZ,UAAA+G,CAAAA,CAAQ,QAAA,EAAY9G,IAACwM,EAAAA,CAAA,CAAgB,SAAU1F,CAAAA,CAAQ,QAAA,CAAU,CAAA,CACjEA,CAAAA,CAAQ,aACP9G,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kJAAA,CACb,SAAAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BAAA,CAA6B,+BAE5C,CAAA,CACF,CAAA,CAEFD,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kEACb,QAAA,CAAA,CAAAC,GAAAA,CAAC0M,MAAAA,CAAA,CAAO,KAAK,OAAA,CAAQ,CAAA,CACrB1M,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,YAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,aAAA,CAAe,QAAA,CAAA8G,EAAQ,OAAA,CAAQ,CAAA,CAChD,GACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CCpBO,SAAS6F,EAAAA,CAAgB,CAAE,GAAA,CAAA1L,EAAK,UAAA,CAAA+D,CAAW,CAAA,CAAyB,CACzE,GAAM,CAAC4H,CAAAA,CAAcC,CAAkB,CAAA,CAAI1P,SAAS,KAAK,CAAA,CAEzD,OAAAoB,SAAAA,CAAU,IAAM,CACd,GAAIyG,CAAAA,EAAc,CAAC4H,EAAc,CAC/BC,CAAAA,CAAmB,IAAI,CAAA,CAEvB,IAAMrH,EAAYjB,EAAAA,CAAStD,CAAG,CAAA,CAC9B+D,CAAAA,CAAWQ,EAAU,QAAA,CAAU,CAC7B,GAAIA,CAAAA,CAAU,aAAe,CAAE,KAAA,CAAOA,CAAAA,CAAU,WAAY,CAC9D,CAAC,EACH,CACF,CAAA,CAAG,CAACoH,EAAc5H,CAAU,CAAC,CAAA,CAEtB,IACT,CClBe,SAAR8H,EAAAA,CAA8B,CAAE,OAAA,CAAAhG,CAAQ,CAAA,CAAsB,CACnE,OACE/G,IAAAA,CAAC,KAAA,CAAA,CACC,cAAY,eAAA,CACZ,SAAA,CAAU,yEAAA,CAEV,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAC,IAAC,OAAA,CAAA,CACC,GAAA,CAAK8G,CAAAA,CAAQ,GAAA,CACb,SAAQ,IAAA,CACR,SAAA,CAAU,sCAAA,CACZ,CAAA,CACCA,EAAQ,WAAA,EACP9G,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gJACb,QAAA,CAAAD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BAA6B,QAAA,CAAA,CAAA,cAAA,CAC7B,GAAA,CACZ+G,CAAAA,CAAQ,cAAA,CAAiB,KAAK,KAAA,CAAMA,CAAAA,CAAQ,cAAc,CAAA,CAAI,CAAA,CAAE,KACnE,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CACC,CAACA,EAAQ,WAAA,EAAeA,CAAAA,CAAQ,OAAA,EAC/B9G,GAAAA,CAAC,OAAI,SAAA,CAAU,2GAAA,CACZ,QAAA,CAAA8G,CAAAA,CAAQ,QACX,CAAA,CAAA,CAEJ,CAEJ,CC3BA,SAASiG,EAAAA,CAAuBC,EAA2B,CACzD,OAAO,IAAI,IAAA,CAAKA,CAAS,CAAA,CAAE,kBAAA,EAC7B,CAEA,SAASjH,EAAAA,CAAgBkH,CAAAA,CAA4B,CAEnD,OAAO,CAAE,KAAM,IAAM,IAAK,CAC5B,KAqDaC,EAAAA,CAActI,IAAAA,CAAK,SAAqB,CACnD,QAAAkC,CAAAA,CACA,QAAA,CAAApF,CAAAA,CACA,SAAA,CAAA2J,EACA,SAAA,CAAAC,CAAAA,CACA,qBAAA,CAAAC,CAAAA,CAAwB,MACxB,UAAA,CAAAvG,CACF,CAAA,CAUG,CACD,IAAMmI,CAAAA,CAAkBxC,WAAAA,CACrBnD,CAAAA,EAAoB,CAEnB,IAAM4F,CAAAA,CAAe5F,CAAAA,CAAQ,KAAA,CAAM,aAAa,EAC1C6F,CAAAA,CAAkB7F,CAAAA,CAAQ,MAAM,cAAc,CAAA,CAE9C8F,EAAUF,CAAAA,CAAeA,CAAAA,CAAa,CAAC,CAAA,CAAI,GAC3CG,CAAAA,CAAaF,CAAAA,CAAkBA,CAAAA,CAAgB,CAAC,EAAI,EAAA,CAEpDG,CAAAA,CAAmB,CAAA,EAAGF,CAAO,KAAKC,CAAU,CAAA,CAAA,CAE9C7L,GACFA,CAAAA,CAAS8L,CAAgB,EAE7B,CAAA,CACA,CAAC9L,CAAQ,CACX,EAEMoC,CAAAA,CAAsB6G,WAAAA,CACzBnD,CAAAA,EAA6B,CAC5B,GAAI,CAAC9F,CAAAA,CACH,OAEF,IAAMyG,EAAOK,EAAAA,CAAoBhB,CAAO,EAAE,IAAA,EAAK,CAC/C9F,EAASyG,CAAI,EACf,CAAA,CACA,CAACzG,CAAQ,CACX,CAAA,CAEM+L,CAAAA,CAAgB9C,WAAAA,CAAY,IAAiB,CACjD,GAAI7D,CAAAA,CAAQ,IAAA,GAAS,WACnB,OAAO9G,GAAAA,CAACyM,EAAAA,CAAA,CAAgB,QAAS3F,CAAAA,CAAS,CAAA,CAG5C,GAAIA,CAAAA,CAAQ,WAAW,UAAA,CAAW,OAAO,CAAA,CACvC,OAAIA,EAAQ,GAAA,CAER9G,GAAAA,CAAC8M,EAAAA,CAAA,CACC,QAAS,CACP,GAAA,CAAKhG,EAAQ,GAAA,CACb,OAAA,CAASA,EAAQ,OAAA,EAAW,EAAA,CAC5B,WAAA,CAAaA,CAAAA,CAAQ,YACrB,cAAA,CAAgBA,CAAAA,CAAQ,cAC1B,CAAA,CACF,EAGG,IAAA,CAGT,GAAIA,CAAAA,CAAQ,SAAA,EAAW,WAAW,OAAO,CAAA,CACvC,OAAIA,CAAAA,CAAQ,IAER9G,GAAAA,CAACmL,EAAAA,CAAA,CACC,OAAA,CAAS,CACP,GAAA,CAAKrE,CAAAA,CAAQ,GAAA,CACb,OAAA,CAASA,EAAQ,OAAA,EAAW,EAAA,CAC5B,WAAA,CAAaA,CAAAA,CAAQ,YACrB,cAAA,CAAgBA,CAAAA,CAAQ,cAC1B,CAAA,CACF,CAAA,CAGG,KAGT,GAAIA,CAAAA,CAAQ,SAAA,EAAW,UAAA,CAAW,OAAO,CAAA,CACvC,OAAO9G,GAAAA,CAAC6G,EAAAA,CAAA,CAAa,OAAA,CAASC,CAAAA,CAAS,CAAA,CAGzC,GAAIA,EAAQ,IAAA,GAAS,MAAA,EAAUA,CAAAA,CAAQ,SAAA,CAAW,CAIhD,IAAMV,CAAAA,CAHeL,EAAAA,CACnB,IAAI,KAAK,EAAC,CAAG,EAAA,CAAI,CAAE,KAAMe,CAAAA,CAAQ,SAAU,CAAC,CAC9C,EAC0B,IAAA,CAE1B,OACE9G,IAAC,GAAA,CAAA,CACC,aAAA,CAAY,oBACZ,IAAA,CAAM8G,CAAAA,CAAQ,GAAA,CACd,MAAA,CAAO,SACP,GAAA,CAAI,qBAAA,CACJ,SAAA,CAAU,wCAAA,CAEV,SAAA/G,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iCAAA,CACb,UAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,wIAAA,CACb,QAAA,CAAA,CAAAC,IAACoG,CAAAA,CAAA,CAAK,SAAA,CAAU,qCAAA,CAAsC,EACtDrG,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0CAAA,CAA2C,iBAExDC,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,SAAA8G,CAAAA,CAAQ,SAAA,CACX,GACF,CAAA,CAAA,CACF,CAAA,CACCA,EAAQ,OAAA,EACP9G,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+EACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gCACZ,QAAA,CAAA8G,CAAAA,CAAQ,OAAA,CACX,CAAA,CACF,GAEJ,CAAA,CACF,CAEJ,CAEA,GAAIA,EAAQ,IAAA,GAAS,MAAA,CACnB,OAAOA,CAAAA,CAAQ,QAGjB,GAAIA,CAAAA,CAAQ,OAAA,GAAY,KAAA,CACtB,OAAO,IAAA,CAGT,IAAM6B,CAAAA,CAASgB,EAAAA,CAAoB7C,EAAQ,OAAO,CAAA,CAC5CvB,EAAqBrB,EAAAA,CAAyBJ,CAAmB,EAEvE,OACE9D,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8DACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCACX,QAAA,CAAA,CAAA,IAAM,CAIN,GAHuB2I,CAAAA,CAAO,OAAO+E,CAAAA,EAAKA,CAAAA,CAAE,OAAS,WAAW,CAAA,CACrB,OAAS,CAAA,CAE3B,CAEvB,IAAMC,CAAAA,CAAmC,EAAC,CACtCC,CAAAA,CAA8B,EAAC,CAEnC,OAAAjF,CAAAA,CAAO,OAAA,CAAQ9D,CAAAA,EAAS,CAClBA,EAAM,IAAA,GAAS,WAAA,CACjB+I,EAAa,IAAA,CAAK/I,CAAK,GAEnB+I,CAAAA,CAAa,MAAA,CAAS,CAAA,GACxBD,CAAAA,CAAc,KAAKC,CAAY,CAAA,CAC/BA,CAAAA,CAAe,IAEjBD,CAAAA,CAAc,IAAA,CAAK,CAAC9I,CAAK,CAAC,CAAA,EAE9B,CAAC,CAAA,CAEG+I,CAAAA,CAAa,OAAS,CAAA,EACxBD,CAAAA,CAAc,IAAA,CAAKC,CAAY,EAG1BD,CAAAA,CAAc,GAAA,CAAI,CAAC/H,CAAAA,CAAOiI,IAC3BjI,CAAAA,CAAM,MAAA,CAAS,CAAA,EAAKA,CAAAA,CAAM,CAAC,CAAA,CAAE,IAAA,GAAS,YAEtC5F,GAAAA,CAAC8F,EAAAA,CAAA,CAEC,KAAA,CAAOF,CAAAA,CACP,WAAA,CAAauH,CAAAA,CACb,gBAAiBrJ,CAAAA,CACjB,UAAA,CAAYkB,CAAAA,CAAAA,CAJP6I,CAKP,EAIGjI,CAAAA,CAAM,GAAA,CAAI,CAACf,CAAAA,CAAOgB,IAAe,CACtC,GAAIhB,EAAM,IAAA,GAAS,WAAA,CACjB,OACE7E,GAAAA,CAAC0F,EAAAA,CAAA,CAEC,KAAA,CAAOb,EACP,WAAA,CAAasI,CAAAA,CACb,eAAA,CAAiBrJ,CAAAA,CACjB,WAAYkB,CAAAA,CAAAA,CAJPa,CAKP,CAAA,CAIJ,GAAIhB,EAAM,IAAA,GAAS,SAAA,CAEjB,OADgB4C,EAAAA,CAAqB5C,CAAAA,CAAM,OAAO,CAAA,CACtC,MAAA,CAAS,CAAA,EAAKA,CAAAA,CAAM,WACvB,IAAA,CAKX,GAAIA,CAAAA,CAAM,IAAA,GAAS,SAAU,CAC3B,IAAMzD,CAAAA,CAASwG,EAAAA,CAA2B/C,EAAM,OAAO,CAAA,CACvD,GAAIzD,CAAAA,CAAO,OAAS,CAAA,CAClB,OACEpB,GAAAA,CAAC4J,EAAAA,CAAA,CAEC,MAAA,CAAQxI,CAAAA,CAAAA,CADHyE,CAEP,CAGN,CAEA,GAAIhB,CAAAA,CAAM,IAAA,GAAS,OAAA,CAAS,CAC1B,IAAMkH,CAAAA,CAAQ/D,GAAanD,CAAAA,CAAM,OAAO,EACxC,OAAIkH,CAAAA,CAAM,MAAA,CAAS,CAAA,EAAKlH,EAAM,UAAA,CAE1B7E,GAAAA,CAAC8L,EAAAA,CAAA,CAEC,MAAOC,CAAAA,CACP,SAAA,CAAWV,CAAAA,EAAa,EAAA,CACxB,UAAWC,CAAAA,EAAa,EAAA,CACxB,sBAAuBC,CAAAA,CAAAA,CAJlB1F,CAKP,EAGG,IACT,CAEA,GAAIhB,CAAAA,CAAM,OAAS,UAAA,CAAY,CAC7B,IAAMiJ,CAAAA,CAAqB7F,GACzBpD,CAAAA,CAAM,OACR,CAAA,CAEA,OAAIiJ,GAAsBjJ,CAAAA,CAAM,UAAA,CAE5B7E,IAAC2M,EAAAA,CAAA,CAEC,KAAMmB,CAAAA,CAAmB,IAAA,CACzB,GAAA,CAAKA,CAAAA,CAAmB,IACxB,UAAA,CAAY9I,CAAAA,CAAAA,CAHPa,CAIP,CAAA,CAGG,IACT,CAEA,GAAIhB,CAAAA,CAAM,IAAA,GAAS,YAAa,CAC9B,IAAMqB,CAAAA,CAAYU,EAAAA,CAAiB/B,EAAM,OAAO,CAAA,CAEhD,OACE7E,GAAAA,CAACiG,GAAA,CAEC,SAAA,CAAWC,CAAAA,CAAAA,CADNL,CAEP,CAEJ,CAEA,GAAIhB,CAAAA,CAAM,IAAA,GAAS,UAAW,CAC5B,IAAMkJ,EAAc1F,EAAAA,CAAmBxD,CAAAA,CAAM,OAAO,CAAA,CACpD,OAAIkJ,CAAAA,CAEA/N,GAAAA,CAAC,OAEC,SAAA,CAAU,sDAAA,CAEV,QAAA,CAAAA,GAAAA,CAAC+G,GAAA,CAAe,GAAA,CAAKgH,CAAAA,CAAa,CAAA,CAAA,CAH7BlI,CAIP,CAAA,CAGG,IACT,CAEA,OACE7F,GAAAA,CAAC,OAEC,SAAA,CAAU,gCAAA,CAEV,QAAA,CAAAA,GAAAA,CAACyF,GAAA,CAAc,UAAA,CAAYF,CAAAA,CACxB,QAAA,CAAAV,EAAM,OAAA,CACT,CAAA,CAAA,CALKgB,CAMP,CAEJ,CAAC,CACF,CACH,CAEA,OAAO8C,CAAAA,CAAO,IAAI,CAAC9D,CAAAA,CAAOgB,CAAAA,GAAe,CACvC,GAAIhB,CAAAA,CAAM,IAAA,GAAS,WAAA,CACjB,OACE7E,IAAC0F,EAAAA,CAAA,CAEC,KAAA,CAAOb,CAAAA,CACP,YAAasI,CAAAA,CACb,eAAA,CAAiBrJ,CAAAA,CACjB,UAAA,CAAYkB,GAJPa,CAKP,CAAA,CAIJ,GAAIhB,CAAAA,CAAM,OAAS,SAAA,CAEjB,OADgB4C,EAAAA,CAAqB5C,CAAAA,CAAM,OAAO,CAAA,CACtC,MAAA,CAAS,CAAA,EAAKA,CAAAA,CAAM,WACvB,IAAA,CAKX,GAAIA,EAAM,IAAA,GAAS,QAAA,CAAU,CAC3B,IAAMzD,CAAAA,CAASwG,EAAAA,CAA2B/C,CAAAA,CAAM,OAAO,CAAA,CACvD,GAAIzD,CAAAA,CAAO,MAAA,CAAS,EAClB,OACEpB,GAAAA,CAAC4J,EAAAA,CAAA,CAAsC,OAAQxI,CAAAA,CAAAA,CAApByE,CAA4B,CAG7D,CAEA,GAAIhB,EAAM,IAAA,GAAS,UAAA,CAAY,CAC7B,IAAMiJ,EAAqB7F,EAAAA,CACzBpD,CAAAA,CAAM,OACR,CAAA,CAEA,OAAIiJ,CAAAA,EAAsBjJ,CAAAA,CAAM,UAAA,CAE5B7E,GAAAA,CAAC2M,GAAA,CAEC,IAAA,CAAMmB,EAAmB,IAAA,CACzB,GAAA,CAAKA,EAAmB,GAAA,CACxB,UAAA,CAAY9I,CAAAA,CAAAA,CAHPa,CAIP,EAGG,IACT,CAEA,GAAIhB,CAAAA,CAAM,OAAS,WAAA,CAAa,CAC9B,IAAMqB,CAAAA,CAAYU,GAAiB/B,CAAAA,CAAM,OAAO,CAAA,CAEhD,OACE7E,IAACiG,EAAAA,CAAA,CAAkC,SAAA,CAAWC,CAAAA,CAAAA,CAAvBL,CAAkC,CAE7D,CAEA,GAAIhB,CAAAA,CAAM,OAAS,OAAA,CAAS,CAC1B,IAAMkH,CAAAA,CAAQ/D,GAAanD,CAAAA,CAAM,OAAO,EACxC,OAAIkH,CAAAA,CAAM,OAAS,CAAA,EAAKlH,CAAAA,CAAM,UAAA,CAE1B7E,GAAAA,CAAC8L,GAAA,CAEC,KAAA,CAAOC,CAAAA,CACP,SAAA,CAAWV,GAAa,EAAA,CACxB,SAAA,CAAWC,CAAAA,EAAa,EAAA,CACxB,sBAAuBC,CAAAA,CAAAA,CAJlB1F,CAKP,EAGG,IACT,CAEA,GAAIhB,CAAAA,CAAM,IAAA,GAAS,SAAA,CAAW,CAC5B,IAAMkJ,CAAAA,CAAc1F,EAAAA,CAAmBxD,CAAAA,CAAM,OAAO,EACpD,OAAIkJ,CAAAA,CAEA/N,GAAAA,CAAC,KAAA,CAAA,CAEC,UAAU,+DAAA,CAEV,QAAA,CAAAA,IAAC+G,EAAAA,CAAA,CAAe,IAAKgH,CAAAA,CAAa,CAAA,CAAA,CAH7BlI,CAIP,CAAA,CAGG,IACT,CAEA,OACE7F,GAAAA,CAAC,KAAA,CAAA,CAEC,UAAU,gCAAA,CAEV,QAAA,CAAAA,GAAAA,CAACyF,EAAAA,CAAA,CAAc,UAAA,CAAYF,CAAAA,CACxB,QAAA,CAAAV,CAAAA,CAAM,QACT,CAAA,CAAA,CALKgB,CAMP,CAEJ,CAAC,CACH,CAAA,GAAG,CACL,CAAA,CACF,CAEJ,EAAG,CAACiB,CAAAA,CAASqG,CAAAA,CAAiBrJ,CAAmB,CAAC,CAAA,CAElD,OACE/D,KAAC,KAAA,CAAA,CACC,SAAA,CAAW,gDACT+G,CAAAA,CAAQ,IAAA,GAAS,MAAA,CAAS,eAAA,CAAkB,iBAC9C,CAAA,UAAA,CAAA,CAEA,QAAA,CAAA,CAAA/G,IAAAA,CAAC,KAAA,CAAA,CACC,UAAW,CAAA,SAAA,EACT+G,CAAAA,CAAQ,IAAA,GAAS,MAAA,CAAS,kBAAoB,mBAChD,CAAA,qCAAA,CAAA,CAEC,QAAA,CAAA,CAAA,CAAC,CAAC,OAAQ,OAAA,CAAS,OAAA,CAAS,MAAA,CAAQ,UAAU,EAAE,QAAA,CAC/CA,CAAAA,CAAQ,IAAA,EAAQ,EAClB,GACEA,CAAAA,CAAQ,OAAA,GAAY,KAAA,EAClB9G,GAAAA,CAAC,OACC,SAAA,CAAW,CAAA,oBAAA,EACT8G,EAAQ,IAAA,GAAS,MAAA,CACb,4KACA,iHACN,CAAA,CAAA,CACA,KAAA,CAAO,CAAE,UAAW,YAAa,CAAA,CAEhC,QAAA,CAAA2G,CAAAA,GACH,CAAA,CAEH,CAAC,MAAA,CAAQ,OAAA,CAAS,QAAS,UAAU,CAAA,CAAE,QAAA,CAAS3G,CAAAA,CAAQ,MAAQ,EAAE,CAAA,EACjE2G,CAAAA,EAAc,CAAA,CAClB,EAGAzN,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,6DAAA,EACT8G,EAAQ,IAAA,GAAS,MAAA,CACb,sBAAA,CACA,sBACN,GAEC,QAAA,CAAAiG,EAAAA,CAAuBjG,EAAQ,SAAS,CAAA,CAC3C,GACF,CAEJ,CAAC,ECjdD,IAAMkH,EAAAA,CAAkBC,aAAAA,CAMtB,MAAS,CAAA,CAELC,EAAAA,CAAeD,aAAAA,CAMnB,MAAS,EAELE,EAAAA,CAAiBF,aAAAA,CAQrB,MAAS,CAAA,CAELG,GAAgBH,aAAAA,CAMpB,MAAS,EAELI,EAAAA,CAAiBJ,aAAAA,CAMrB,MAAS,CAAA,CAiBJ,SAASK,EAAAA,CAAa,CAAE,SAAA3L,CAAS,CAAA,CAA4B,CAClE,GAAM,CAAC4L,CAAAA,CAAUC,CAAW,CAAA,CAAIrR,QAAAA,CAAoB,EAAE,CAAA,CAChD,CAACH,CAAAA,CAAcyR,CAAe,CAAA,CAAItR,QAAAA,CAAS,EAAE,CAAA,CAC7C,CAACuR,CAAAA,CAAgBC,CAAiB,CAAA,CAAIxR,QAAAA,CAC1C,IACF,CAAA,CACM,CAACyR,CAAAA,CAAmBC,CAAoB,EAAI1R,QAAAA,CAAS,KAAK,EAC1D,CAAC2R,CAAQ,EAAI3R,QAAAA,CAAS,IAAI,GAAmB,CAAA,CAE7C4R,EAAapE,WAAAA,CAChB3E,CAAAA,EAAe,CACd,GAAI,CAAC8I,CAAAA,CAAS,GAAA,CAAI9I,CAAI,CAAA,CAAG,CACvB,IAAM/E,CAAAA,CAAM,IAAI,eAAA,CAAgB+E,CAAI,EACpC8I,CAAAA,CAAS,GAAA,CAAI9I,CAAAA,CAAM/E,CAAG,EACxB,CACA,OAAO6N,CAAAA,CAAS,GAAA,CAAI9I,CAAI,CAC1B,CAAA,CACA,CAAC8I,CAAQ,CACX,CAAA,CAEME,CAAAA,CAAgBrE,YACnB3E,CAAAA,EAAe,CACd,IAAM/E,CAAAA,CAAM6N,CAAAA,CAAS,GAAA,CAAI9I,CAAI,EACzB/E,CAAAA,GACF,GAAA,CAAI,eAAA,CAAgBA,CAAG,EACvB6N,CAAAA,CAAS,MAAA,CAAO9I,CAAI,CAAA,EAExB,EACA,CAAC8I,CAAQ,CACX,CAAA,CAGA,OAAAvQ,SAAAA,CAAU,IACD,IAAM,CACXgQ,EAAS,OAAA,CAAQzH,CAAAA,EAAW,CACtBA,CAAAA,CAAQ,KAAOA,CAAAA,CAAQ,GAAA,CAAI,UAAA,CAAW,OAAO,GAC/C,GAAA,CAAI,eAAA,CAAgBA,EAAQ,GAAG,EAEnC,CAAC,CAAA,CAEDgI,CAAAA,CAAS,OAAA,CAAQ7N,CAAAA,EAAO,IAAI,eAAA,CAAgBA,CAAG,CAAC,EAClD,EACC,CAACsN,CAAAA,CAAUO,CAAQ,CAAC,EAGrB9O,GAAAA,CAACgO,EAAAA,CAAgB,SAAhB,CAAyB,KAAA,CAAO,CAAE,QAAA,CAAAO,CAAAA,CAAU,WAAA,CAAAC,CAAY,EACvD,QAAA,CAAAxO,GAAAA,CAACkO,EAAAA,CAAa,QAAA,CAAb,CAAsB,KAAA,CAAO,CAAE,YAAA,CAAAlR,CAAAA,CAAc,gBAAAyR,CAAgB,CAAA,CAC5D,SAAAzO,GAAAA,CAACmO,EAAAA,CAAe,SAAf,CACC,KAAA,CAAO,CACL,cAAA,CAAAO,EACA,iBAAA,CAAAC,CACF,CAAA,CAEA,QAAA,CAAA3O,IAACoO,EAAAA,CAAc,QAAA,CAAd,CACC,KAAA,CAAO,CACL,iBAAA,CAAAQ,CAAAA,CACA,oBAAA,CAAAC,CACF,EAEA,QAAA,CAAA7O,GAAAA,CAACqO,EAAAA,CAAe,QAAA,CAAf,CAAwB,KAAA,CAAO,CAAE,UAAA,CAAAU,CAAAA,CAAY,cAAAC,CAAc,CAAA,CACzD,QAAA,CAAArM,CAAAA,CACH,EACF,CAAA,CACF,CAAA,CACF,EACF,CAEJ,CAGO,SAASsM,EAAAA,EAAc,CAC5B,IAAMC,CAAAA,CAAUC,WAAWnB,EAAe,CAAA,CAC1C,GAAIkB,CAAAA,GAAY,OACd,MAAM,IAAI,KAAA,CAAM,gDAAgD,EAElE,OAAOA,CACT,CAEO,SAASE,EAAAA,EAAW,CACzB,IAAMF,CAAAA,CAAUC,UAAAA,CAAWjB,EAAY,EACvC,GAAIgB,CAAAA,GAAY,MAAA,CACd,MAAM,IAAI,KAAA,CAAM,6CAA6C,CAAA,CAE/D,OAAOA,CACT,CAEO,SAASG,IAAoB,CAClC,IAAMH,EAAUC,UAAAA,CAAWhB,EAAc,CAAA,CACzC,GAAIe,IAAY,MAAA,CACd,MAAM,IAAI,KAAA,CAAM,sDAAsD,CAAA,CAExE,OAAOA,CACT,CAEO,SAASI,EAAAA,EAAc,CAC5B,IAAMJ,CAAAA,CAAUC,WAAWd,EAAc,CAAA,CACzC,GAAIa,CAAAA,GAAY,OACd,MAAM,IAAI,KAAA,CAAM,gDAAgD,EAElE,OAAOA,CACT,CAEO,SAASK,IAAoB,CAClC,IAAML,EAAUC,UAAAA,CAAWf,EAAa,EACxC,GAAIc,CAAAA,GAAY,MAAA,CACd,MAAM,IAAI,KAAA,CAAM,sDAAsD,CAAA,CAExE,OAAOA,CACT,CAGO,SAASM,CAAAA,EAA2B,CACzC,IAAMC,CAAAA,CAAkBN,UAAAA,CAAWnB,EAAe,CAAA,CAC5C0B,CAAAA,CAAeP,WAAWjB,EAAY,CAAA,CACtCyB,CAAAA,CAAiBR,UAAAA,CAAWhB,EAAc,CAAA,CAC1CyB,CAAAA,CAAgBT,UAAAA,CAAWf,EAAa,EACxCyB,CAAAA,CAAiBV,UAAAA,CAAWd,EAAc,CAAA,CAEhD,GACEoB,CAAAA,GAAoB,MAAA,EACpBC,IAAiB,MAAA,EACjBC,CAAAA,GAAmB,QACnBC,CAAAA,GAAkB,MAAA,EAClBC,CAAAA,GAAmB,MAAA,CAEnB,MAAM,IAAI,KAAA,CAAM,4CAA4C,CAAA,CAG9D,OAAO,CACL,GAAGJ,CAAAA,CACH,GAAGC,EACH,GAAGC,CAAAA,CACH,GAAGC,CAAAA,CACH,GAAGC,CACL,CACF,CC/NO,SAASC,EAAAA,EAAiB,CAC/B,GAAM,CAAE,eAAApB,CAAe,CAAA,CAAIc,GAAQ,CAEnC,OAAKd,EAOH3O,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+EAAA,CACb,UAAAC,GAAAA,CAAC+P,IAAAA,CAAA,CACC,IAAA,CAAM,GACN,SAAA,CAAU,uFAAA,CACV,KAAA,CAAO,CAAE,kBAAmB,IAAK,CAAA,CACnC,EACA/P,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,8CAAA,CACZ,QAAA,CAVgB0O,CAAAA,EAAkB,kBAAA,CAWrC,GACF,CAAA,CAfO,IAiBX,CChBO,SAASsB,EAAAA,CAAc,CAAE,OAAA,CAAAC,CAAAA,CAAS,QAAAC,CAAQ,CAAA,CAAuB,CACtE,OACElQ,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gCAAA,CACb,QAAA,CAAAA,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2EAAA,CACZ,QAAA,CAAAiQ,EAAQ,GAAA,CAAI,CAACE,CAAAA,CAAsB/P,CAAAA,GAClCJ,IAACgH,MAAAA,CAAA,CAEC,OAAA,CAAQ,UAAA,CACR,UAAU,uEAAA,CACV,OAAA,CAAS,IAAMkJ,CAAAA,CAAQC,EAAO,IAAI,CAAA,CAEjC,QAAA,CAAAA,CAAAA,CAAO,MALH/P,CAMP,CACD,EACH,CAAA,CACF,CAEJ,CCvBO,IAAMgQ,EAAAA,CAAgB5I,CAAAA,EAAoC,CAC/D,IAAM6I,CAAAA,CAAoB,aAAA,CAGpBC,CAAAA,CAAa9I,CAAAA,CAAQ,QAAQ6I,CAAiB,CAAA,CAEpD,GAAIC,CAAAA,GAAe,GAAI,OAAO,GAE9B,IAAMC,CAAAA,CAAW/I,EAAQ,OAAA,CACvB,KAAA,CACA8I,CAAAA,CAAaD,CAAAA,CAAkB,MACjC,CAAA,CAEA,OAAIE,CAAAA,GAAa,EAAA,CAAW,EAAC,CAEP/I,CAAAA,CACnB,KAAA,CAAM8I,CAAAA,CAAaD,EAAkB,MAAA,CAAQE,CAAQ,EACrD,IAAA,EAAK,CAIL,QAAQ,MAAA,CAAQ;AAAA,CAAI,EACpB,KAAA,CAAM;AAAA,CAAI,CAAA,CAEc,GAAA,CAAI/M,CAAAA,EAAQA,CAAAA,CAAK,IAAA,EAAM,CAAA,CAEf,MAAA,CACjCA,CAAAA,EAAQA,CAAAA,EAAQA,CAAAA,CAAK,UAAA,CAAW,GAAG,CACrC,CAAA,CAE8B,GAAA,CAAIA,CAAAA,GAAS,CACzC,IAAA,CAAMA,CAAAA,CAAK,OAAA,CAAQ,SAAA,CAAW,EAAE,CAAA,CAAE,IAAA,EAAK,CACvC,OAAA,CAASA,CAAAA,CAAK,OAAA,CAAQ,UAAW,EAAE,CAAA,CAAE,IAAA,EACvC,CAAA,CAAE,CAGJ,EC9BO,SAASgN,EAAAA,CAAY,CAAE,QAAA,CAAA9O,CAAS,CAAA,CAAgB,CACrD,GAAM,CAAE,QAAA,CAAA6M,CAAS,CAAA,CAAIiB,CAAAA,EAAQ,CAC7B,GAAIjB,CAAAA,CAAS,MAAA,GAAW,CAAA,CACtB,OAAO,IAAA,CAGT,IAAMkC,CAAAA,CAAclC,CAAAA,CAASA,EAAS,MAAA,CAAS,CAAC,CAAA,CAC1CmC,CAAAA,CAAUN,EAAAA,CAAaK,CAAAA,CAAY,OAAO,CAAA,CAEhD,OAAOC,CAAAA,CAAQ,MAAA,GAAW,CAAA,CAAI,IAAA,CAC5B1Q,GAAAA,CAACgQ,EAAAA,CAAA,CAAc,QAASU,CAAAA,CAAS,OAAA,CAAShP,CAAAA,CAAU,CAExD,CCTA,IAAMiP,EAAAA,CAAY/L,IAAAA,CAAK,SAAmB,CACxC,MAAA,CAAAgM,EACA,QAAA,CAAAC,CAAAA,CAAW,KAAA,CACX,WAAA,CAAAC,CACF,CAAA,CAAmB,CACjB,GAAM,CAAE,YAAA,CAAA9T,CAAAA,CAAc,eAAA,CAAAyR,CAAgB,CAAA,CAAIW,EAAAA,EAAS,CAC7C,CAAC2B,CAAAA,CAAUC,CAAW,CAAA,CAAI7T,QAAAA,CAAS,KAAK,CAAA,CACxC8T,CAAAA,CAAcpT,MAAAA,CAA4B,IAAI,CAAA,CAGpDU,SAAAA,CAAU,IAAM,CACd,IAAM2S,CAAAA,CAAc,IAAM,CACxBF,CAAAA,CACE,MAAA,CAAO,UAAA,CAAW,oBAAoB,CAAA,CAAE,OAAA,EACtC,gEAAA,CAAiE,IAAA,CAC/D,SAAA,CAAU,SACZ,CACJ,EACF,CAAA,CAEA,OAAAE,CAAAA,EAAY,CACZ,OAAO,gBAAA,CAAiB,QAAA,CAAUA,CAAW,CAAA,CAEtC,IAAM,CACX,MAAA,CAAO,mBAAA,CAAoB,QAAA,CAAUA,CAAW,EAClD,CACF,CAAA,CAAG,EAAE,CAAA,CAGL3S,UAAU,IAAM,CACd,IAAM4S,CAAAA,CAAWF,CAAAA,CAAY,OAAA,CACxBE,CAAAA,GAIAN,CAAAA,GACHM,CAAAA,CAAS,KAAA,CAAM,MAAA,CAAS,MAAA,CACxBA,CAAAA,CAAS,KAAA,CAAM,MAAA,CAAS,CAAA,EAAGA,EAAS,YAAY,CAAA,EAAA,CAAA,CAAA,EAEpD,CAAA,CAAG,CAACnU,CAAY,CAAC,CAAA,CAEjB,IAAMoU,CAAAA,CAAiB7R,CAAAA,EAAoD,CACzE,GAAIA,CAAAA,CAAM,GAAA,GAAQ,OAAA,CAAS,CAOzB,GALIwR,CAAAA,EAKAxR,CAAAA,CAAM,QAAA,EAAYA,CAAAA,CAAM,OAAA,EAAWA,CAAAA,CAAM,OAAA,CAC3C,OAIFA,CAAAA,CAAM,cAAA,EAAe,CACrBqR,CAAAA,GACF,CACF,CAAA,CAGMS,CAAAA,CAAc1G,YACjBpL,CAAAA,EAAqD,CAEpD,GAAM,CAAE,KAAA,CAAA+R,CAAM,CAAA,CAAI/R,CAAAA,CAAM,aAAA,CAExB,GAAI,CAAC+R,CAAAA,EAAS,CAACR,CAAAA,CACb,OAGF,IAAMxK,EAAgB,EAAC,CAEvB,IAAA,IAAS7C,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI6N,CAAAA,CAAM,MAAA,CAAQ7N,IAAK,CACrC,IAAM8N,CAAAA,CAAOD,CAAAA,CAAM7N,CAAC,CAAA,CAGpB,GAAI8N,CAAAA,CAAK,OAAS,MAAA,CAAQ,CACxB,IAAMvL,CAAAA,CAAOuL,CAAAA,CAAK,SAAA,EAAU,CACxBvL,CAAAA,EACFM,CAAAA,CAAM,IAAA,CAAKN,CAAI,EAEnB,CACF,CAGIM,CAAAA,CAAM,MAAA,CAAS,IACjB/G,CAAAA,CAAM,cAAA,EAAe,CACrBuR,CAAAA,CAAYxK,CAAK,CAAA,EAErB,CAAA,CACA,CAACwK,CAAW,CACd,CAAA,CAEA,OACE/Q,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sDAAA,CACb,UAAAC,GAAAA,CAAC+P,IAAAA,CAAA,CACC,IAAA,CAAM,EAAA,CACN,SAAA,CAAU,4DAAA,CACZ,CAAA,CAEA/P,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,UAAA,CAAA,CACC,GAAA,CAAKiR,EACL,QAAA,CAAUJ,CAAAA,CACV,KAAA,CAAO7T,CAAAA,CACP,QAAA,CAAUuC,CAAAA,EAASkP,CAAAA,CAAgBlP,CAAAA,CAAM,MAAA,CAAO,KAAK,CAAA,CACrD,SAAA,CAAW6R,CAAAA,CACX,OAAA,CAASC,CAAAA,CACT,WAAA,CACER,EACI,yDAAA,CACA,eAAA,CAEN,SAAA,CAAW,CAAA,0LAAA,EACTA,CAAAA,CAAW,kCAAA,CAAqC,EAClD,CAAA,CAAA,CACA,IAAA,CAAM,CAAA,CACR,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CAAC,ECnID,SAASW,EAAAA,EAA8B,CACrC,OAAO,YAAA,CAAa,OAAA,CAAQ,WAAW,CACzC,CAEA,eAAsBC,CAAAA,CACpBzL,CAAAA,CACA0L,CAAAA,CACAC,CAAAA,CAC6B,CAC7B,IAAMjO,CAAAA,CAAQ8N,IAAa,CAC3B,GAAI,CAAC9N,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,qBAAqB,CAAA,CAGvC,OAAO,IAAI,OAAA,CAAQ,CAACjE,CAAAA,CAASmS,CAAAA,GAAW,CACtC,IAAMC,CAAAA,CAAM,IAAI,cAAA,CACVC,CAAAA,CAAW,IAAI,QAAA,CACrBA,CAAAA,CAAS,MAAA,CAAO,MAAA,CAAQ9L,CAAI,CAAA,CAE5B6L,CAAAA,CAAI,MAAA,CAAO,gBAAA,CAAiB,UAAA,CAAYtS,CAAAA,EAAS,CAC/C,GAAIA,CAAAA,CAAM,gBAAA,EAAoBoS,CAAAA,CAAY,CACxC,IAAMI,CAAAA,CAAYxS,CAAAA,CAAM,MAAA,CAASA,CAAAA,CAAM,KAAA,CAAS,GAAA,CAChDoS,CAAAA,CAAWI,CAAQ,EACrB,CACF,CAAC,CAAA,CAEDF,CAAAA,CAAI,gBAAA,CAAiB,MAAA,CAAQ,IAAM,CACjC,GAAIA,CAAAA,CAAI,MAAA,EAAU,GAAA,EAAOA,CAAAA,CAAI,MAAA,CAAS,GAAA,CACpC,GAAI,CACF,IAAMjG,EAAW,IAAA,CAAK,KAAA,CAAMiG,CAAAA,CAAI,YAAY,CAAA,CAC5CpS,CAAAA,CAAQmM,CAAQ,EAClB,CAAA,KAAQ,CACNgG,CAAAA,CAAO,IAAI,KAAA,CAAM,0BAA0B,CAAC,EAC9C,MAEAA,CAAAA,CAAO,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0BC,CAAAA,CAAI,MAAM,CAAA,CAAE,CAAC,EAE5D,CAAC,CAAA,CAEDA,CAAAA,CAAI,gBAAA,CAAiB,OAAA,CAAS,IAAM,CAClCD,EAAO,IAAI,KAAA,CAAM,wBAAwB,CAAC,EAC5C,CAAC,CAAA,CAEDC,CAAAA,CAAI,IAAA,CAAK,MAAA,CAAQ,CAAA,EAAGH,CAAM,CAAA,OAAA,CAAS,CAAA,CACnCG,CAAAA,CAAI,gBAAA,CAAiB,gBAAiB,CAAA,OAAA,EAAUnO,CAAK,CAAA,CAAE,CAAA,CACvDmO,CAAAA,CAAI,IAAA,CAAKC,CAAQ,EACnB,CAAC,CACH,CCxCA,SAAS/L,EAAAA,CAAgBC,CAAAA,CAA0C,CAEjE,IAAMW,CAAAA,CAAYX,CAAAA,CAAK,IAAA,CACnBgM,CAAAA,CAAQ,OAEZ,OAAIrL,CAAAA,CAAU,UAAA,CAAW,QAAQ,CAAA,CAC/BqL,CAAAA,CAAQ,OAAA,CACCrL,CAAAA,CAAU,WAAW,QAAQ,CAAA,CACtCqL,CAAAA,CAAQ,OAAA,CACCrL,CAAAA,CAAU,UAAA,CAAW,QAAQ,CAAA,GACtCqL,CAAAA,CAAQ,OAAA,CAAA,CAGH,CACL,IAAA,CAAM,IAAM,IAAA,CACZ,KAAA,CAAAA,CACF,CACF,CAYO,SAASC,EAAAA,CAAgB,CAC9B,IAAA,CAAAjM,CAAAA,CACA,QAAA,CAAAkM,CAAAA,CACA,MAAA,CAAAR,CAAAA,CACA,UAAA,CAAAS,CAAAA,CACA,gBAAA,CAAAC,CACF,CAAA,CAAyB,CACvB,IAAMC,CAAAA,CAAetM,EAAAA,CAAgBC,CAAI,CAAA,CACnCI,CAAAA,CAAOiM,CAAAA,CAAa,IAAA,CACpB,CAACC,CAAAA,CAAaC,CAAc,CAAA,CAAIpV,QAAAA,CAAS,KAAK,CAAA,CAC9C,CAACqV,CAAAA,CAAgBC,CAAiB,CAAA,CAAItV,QAAAA,CAAS,CAAC,CAAA,CAChD,CAACuV,CAAAA,CAAaC,CAAc,CAAA,CAAIxV,QAAAA,CACpCgV,CAAAA,EAAc,IAChB,CAAA,CACMS,CAAAA,CAAkB/U,MAAAA,CAAO,KAAK,CAAA,CAGpC,OAAAU,SAAAA,CAAU,IAAM,CAEd,GAAImU,CAAAA,EAAeE,CAAAA,CAAgB,OAAA,CACjC,OAAA,CAGe,SAAY,CAC3BL,CAAAA,CAAe,IAAI,CAAA,CACnBK,CAAAA,CAAgB,OAAA,CAAU,IAAA,CAE1B,GAAI,CACF,GAAM,CAAE,MAAA,CAAAC,CAAO,CAAA,CAAI,MAAMpB,CAAAA,CAAWzL,CAAAA,CAAM0L,CAAAA,CAAQK,CAAAA,EAAY,CAC5DU,CAAAA,CAAkBV,CAAQ,EAC5B,CAAC,EAEK9Q,CAAAA,CAAM,CAAA,EAAGyQ,CAAM,CAAA,CAAA,EAAImB,CAAM,CAAA,CAAA,CAC/BF,CAAAA,CAAe1R,CAAG,CAAA,CAClBsR,CAAAA,CAAe,CAAA,CAAK,CAAA,CAGhBH,CAAAA,EACFA,CAAAA,CAAiBpM,CAAAA,CAAM/E,CAAG,EAE9B,CAAA,MAASlC,CAAAA,CAAO,CACd,OAAA,CAAQ,KAAA,CAAM,yBAAA,CAA2BiH,CAAAA,CAAK,IAAA,CAAMjH,CAAK,CAAA,CACzDwT,CAAAA,CAAe,KAAK,CAAA,CACpBK,CAAAA,CAAgB,OAAA,CAAU,MAC5B,CACF,CAAA,IAGF,CAAA,CAAG,CAAC5M,CAAAA,CAAM0L,CAAAA,CAAQU,CAAAA,CAAkBM,CAAW,CAAC,CAAA,CAG9C3S,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wGAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,OAAI,SAAA,CAAU,mBAAA,CACZ,QAAA,CAAAsS,CAAAA,CACCvS,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2EAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iKAAA,CAAkK,CAAA,CACjLD,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,wDAAA,CACZ,QAAA,CAAA,CAAA,IAAA,CAAK,KAAA,CAAMyS,CAAc,CAAA,CAAE,GAAA,CAAA,CAC9B,CAAA,CAAA,CACF,CAAA,CAEAxS,GAAAA,CAACoG,CAAAA,CAAA,CAAK,SAAA,CAAU,mCAAA,CAAoC,CAAA,CAExD,CAAA,CACArG,IAAAA,CAAC,OAAI,SAAA,CAAU,2BAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,4DAAA,CACV,QAAA,CAAAgG,CAAAA,CAAK,IAAA,CACR,CAAA,CACAhG,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,+BAAA,CAAiC,QAAA,CAAAqS,EAAa,KAAA,CAAM,CAAA,CAAA,CACnE,CAAA,CACArS,GAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAASkS,CAAAA,CACT,SAAA,CAAU,yKAAA,CAEV,QAAA,CAAAlS,GAAAA,CAACE,KAAAA,CAAA,CAAM,SAAA,CAAU,iBAAA,CAAkB,CAAA,CACrC,GACF,CAEJ,CCtGe,SAAR4S,EAAAA,CAAqC,CAC1C,KAAA9M,CAAAA,CACA,QAAA,CAAAkM,CAAAA,CACA,MAAA,CAAAR,CAAAA,CACA,UAAA,CAAAS,CAAAA,CACA,gBAAA,CAAAC,CACF,CAAA,CAA6B,CAC3B,GAAM,CAAE,UAAA,CAAArD,CAAW,CAAA,CAAIS,GAAQ,CACzB,CAAC8C,CAAAA,CAAaC,CAAc,CAAA,CAAIpV,QAAAA,CAAS,KAAK,CAAA,CAC9C,CAACqV,CAAAA,CAAgBC,CAAiB,CAAA,CAAItV,QAAAA,CAAS,CAAC,CAAA,CAChD,CAACuV,CAAAA,CAAaC,CAAc,CAAA,CAAIxV,QAAAA,CACpCgV,CAAAA,EAAc,IAChB,CAAA,CACM,CAACY,CAAAA,CAAoBC,CAAqB,CAAA,CAAI7V,QAAAA,CAAS,KAAK,CAAA,CAGlEoB,SAAAA,CAAU,IAAM,CAEd,GAAI4T,GAAcY,CAAAA,CAChB,OAAA,CAGe,SAAY,CAC3BR,CAAAA,CAAe,IAAI,CAAA,CACnBS,CAAAA,CAAsB,IAAI,CAAA,CAE1B,GAAI,CACF,GAAM,CAAE,MAAA,CAAAH,CAAO,EAAI,MAAMpB,CAAAA,CAAWzL,CAAAA,CAAM0L,CAAAA,CAAQK,CAAAA,EAAY,CAC5DU,CAAAA,CAAkBV,CAAQ,EAC5B,CAAC,CAAA,CAEK9Q,CAAAA,CAAM,CAAA,EAAGyQ,CAAM,CAAA,CAAA,EAAImB,CAAM,GAC/BF,CAAAA,CAAe1R,CAAG,CAAA,CAClBsR,CAAAA,CAAe,CAAA,CAAK,CAAA,CAGhBH,CAAAA,EACFA,CAAAA,CAAiBpM,CAAAA,CAAM/E,CAAG,EAE9B,CAAA,MAASlC,CAAAA,CAAO,CACd,OAAA,CAAQ,KAAA,CAAM,iBAAkBA,CAAK,CAAA,CACrCwT,CAAAA,CAAe,KAAK,EACtB,CACF,CAAA,IAGF,CAAA,CAAG,CAACvM,CAAAA,CAAMmM,CAAAA,CAAYT,CAAAA,CAAQqB,CAAAA,CAAoBX,CAAgB,CAAC,EAGnE,IAAMhN,CAAAA,CAAWsN,CAAAA,GAAiBJ,CAAAA,CAAiC,MAAA,CAAnBvD,CAAAA,CAAW/I,CAAI,CAAA,CAAA,CAE/D,OACEjG,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gCAAA,CACZ,QAAA,CAAA,CAAAuS,CAAAA,CACCvS,IAAAA,CAAC,OAAI,SAAA,CAAU,4GAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iKAAA,CAAkK,CAAA,CACjLD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wDAAA,CACZ,QAAA,CAAA,CAAA,IAAA,CAAK,KAAA,CAAMyS,CAAc,CAAA,CAAE,KAC9B,CAAA,CAAA,CACF,CAAA,CACEpN,CAAAA,CACFpF,GAAAA,CAAC,KAAA,CAAA,CACC,aAAA,CAAY,iBAAA,CACZ,GAAA,CAAKoF,EACL,GAAA,CAAKY,CAAAA,CAAK,IAAA,CACV,SAAA,CAAU,mDAAA,CACZ,CAAA,CAEAhG,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,+FAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,mBAAA,CAAoB,QAAA,CAAA,YAAA,CAAU,CAAA,CAChD,CAAA,CAEFD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mHAAA,CACZ,QAAA,CAAA,CAAA,IAAA,CAAK,KAAA,CAAMiG,CAAAA,CAAK,KAAO,IAAA,CAAO,IAAI,CAAA,CAAE,IAAA,CAAA,CACvC,CAAA,CACAhG,GAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAMkS,CAAAA,EAAS,CACxB,SAAA,CAAU,0LAAA,CAEV,QAAA,CAAAlS,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,aAAA,CAAc,QAAA,CAAA,MAAA,CAAC,CAAA,CACjC,CAAA,CAAA,CACF,CAEJ,CCjFe,SAARiT,EAAAA,CAAqC,CAC1C,IAAA,CAAAjN,CAAAA,CACA,QAAA,CAAAkM,CAAAA,CACA,MAAA,CAAAR,CAAAA,CACA,UAAA,CAAAS,CAAAA,CACA,YAAA,CAAAe,CAAAA,CACA,gBAAA,CAAAd,CACF,CAAA,CAA6B,CAC3B,GAAM,CAAE,UAAA,CAAArD,CAAW,CAAA,CAAIS,CAAAA,EAAQ,CACzB,CAAC8C,CAAAA,CAAaC,CAAc,CAAA,CAAIpV,QAAAA,CAAS,KAAK,CAAA,CAC9C,CAACqV,CAAAA,CAAgBC,CAAiB,CAAA,CAAItV,QAAAA,CAAS,CAAC,CAAA,CAChD,CAACuV,CAAAA,CAAaC,CAAc,CAAA,CAAIxV,QAAAA,CACpCgV,CAAAA,EAAc,IAChB,CAAA,CACM,CAACY,CAAAA,CAAoBC,CAAqB,CAAA,CAAI7V,SAAS,KAAK,CAAA,CAC5D,CAACgW,CAAAA,CAAgBC,CAAiB,CAAA,CAAIjW,QAAAA,CAC1C+V,CAAAA,EAAgB,IAClB,CAAA,CAGA,OAAA3U,SAAAA,CAAU,IAAM,CACd,GAAI,CAAC2U,GAAgB,CAACC,CAAAA,CAAgB,CACpC,IAAME,CAAAA,CAAWtE,CAAAA,CAAW/I,CAAI,CAAA,CAC1BsN,EAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA,CAC5CA,CAAAA,CAAM,GAAA,CAAMD,CAAAA,CAEZ,IAAME,EAAgB,IAAM,CAC1B,GAAI,CAEFD,CAAAA,CAAM,WAAA,CAAc,CAAA,CAGpB,UAAA,CAAW,IAAM,CACf,IAAME,CAAAA,CAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,CAC9CA,EAAO,KAAA,CAAQF,CAAAA,CAAM,UAAA,CACrBE,CAAAA,CAAO,MAAA,CAASF,CAAAA,CAAM,WAAA,CACtB,IAAMG,CAAAA,CAAMD,CAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CAClC,GAAI,CAACC,CAAAA,CAAK,CACR,OAAA,CAAQ,KAAA,CAAM,8BAA8B,CAAA,CAC5C,MACF,CAGAA,CAAAA,CAAI,SAAA,CAAUH,CAAAA,CAAO,CAAA,CAAG,CAAC,CAAA,CAEzB,IAAMI,CAAAA,CAAqBF,CAAAA,CAAO,SAAA,CAAU,aAAc,EAAG,CAAA,CAC7DJ,CAAAA,CAAkBM,CAAkB,EACtC,CAAA,CAAG,GAAG,EACR,CAAA,MAAS3U,CAAAA,CAAO,CACd,OAAA,CAAQ,KAAA,CAAM,6BAAA,CAA+BA,CAAK,EACpD,QAAE,CACA,GAAA,CAAI,eAAA,CAAgBsU,CAAQ,CAAA,CAC5BC,CAAAA,CAAM,mBAAA,CAAoB,SAAA,CAAWC,CAAa,EACpD,CACF,CAAA,CAEAD,CAAAA,CAAM,gBAAA,CAAiB,SAAA,CAAWC,CAAa,EAC/CD,CAAAA,CAAM,IAAA,GACR,CACF,CAAA,CAAG,CAACtN,CAAAA,CAAMkN,CAAAA,CAAcC,CAAc,CAAC,CAAA,CAGvC5U,SAAAA,CAAU,IAAM,CAEd,GAAI4T,CAAAA,EAAcY,EAChB,OAAA,CAGe,SAAY,CAC3BR,CAAAA,CAAe,IAAI,CAAA,CACnBS,CAAAA,CAAsB,IAAI,CAAA,CAE1B,GAAI,CACF,GAAM,CAAE,MAAA,CAAAH,CAAO,CAAA,CAAI,MAAMpB,CAAAA,CAAWzL,CAAAA,CAAM0L,CAAAA,CAAQK,CAAAA,EAAY,CAC5DU,CAAAA,CAAkBV,CAAQ,EAC5B,CAAC,CAAA,CAEK9Q,CAAAA,CAAM,CAAA,EAAGyQ,CAAM,CAAA,CAAA,EAAImB,CAAM,CAAA,CAAA,CAC/BF,EAAe1R,CAAG,CAAA,CAClBsR,CAAAA,CAAe,CAAA,CAAK,CAAA,CAGhBH,CAAAA,EACFA,CAAAA,CAAiBpM,CAAAA,CAAM/E,CAAG,EAE9B,CAAA,MAASlC,CAAAA,CAAO,CACd,OAAA,CAAQ,KAAA,CAAM,gBAAA,CAAkBA,CAAK,CAAA,CACrCwT,CAAAA,CAAe,KAAK,EACtB,CACF,CAAA,IAGF,CAAA,CAAG,CAACvM,CAAAA,CAAMmM,CAAAA,CAAYT,CAAAA,CAAQqB,CAAAA,CAAoBX,CAAgB,CAAC,CAAA,CAGjErS,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gCAAA,CACZ,QAAA,CAAA,CAAAuS,CAAAA,CACCvS,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4GAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iKAAA,CAAkK,CAAA,CACjLD,IAAAA,CAAC,OAAI,SAAA,CAAU,wDAAA,CACZ,QAAA,CAAA,CAAA,IAAA,CAAK,KAAA,CAAMyS,CAAc,CAAA,CAAE,GAAA,CAAA,CAC9B,CAAA,CAAA,CACF,CAAA,CAEAzS,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAAC,KAAA,CAAA,CACC,cAAY,iBAAA,CACZ,GAAA,CACEmT,CAAAA,EACAT,CAAAA,EACA,gFAAA,CAEF,GAAA,CAAK1M,CAAAA,CAAK,IAAA,CACV,SAAA,CAAU,mEAAA,CACZ,CAAA,CACAhG,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uEAAA,CACb,QAAA,CAAAA,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iGAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAM,IAAA,CACN,MAAA,CAAO,IAAA,CACP,OAAA,CAAQ,WAAA,CACR,IAAA,CAAK,MAAA,CACL,KAAA,CAAM,4BAAA,CAEN,SAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,oBAAA,CAAqB,IAAA,CAAK,OAAA,CAAQ,CAAA,CAC5C,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAEFD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mHAAA,CACZ,QAAA,CAAA,CAAA,IAAA,CAAK,MAAMiG,CAAAA,CAAK,IAAA,CAAO,IAAA,CAAO,IAAI,CAAA,CAAE,IAAA,CAAA,CACvC,CAAA,CACAhG,GAAAA,CAAC,UACC,OAAA,CAAS,IAAMkS,CAAAA,EAAS,CACxB,SAAA,CAAU,0LAAA,CAEV,QAAA,CAAAlS,GAAAA,CAAC,QAAK,SAAA,CAAU,aAAA,CAAc,QAAA,CAAA,MAAA,CAAC,CAAA,CACjC,CAAA,CAAA,CACF,CAEJ,CCtJA,SAAS+F,EAAAA,CAAgBC,CAAAA,CAA4D,CAEnF,IAAMW,CAAAA,CAAYX,EAAK,IAAA,CACnB2N,CAAAA,CAAW,OAAA,CACX3B,CAAAA,CAAQ,MAAA,CAEZ,OAAIrL,CAAAA,CAAU,UAAA,CAAW,QAAQ,CAAA,EAC/BgN,CAAAA,CAAW,OAAA,CACX3B,CAAAA,CAAQ,OAAA,EACCrL,CAAAA,CAAU,UAAA,CAAW,QAAQ,CAAA,EACtCgN,CAAAA,CAAW,OAAA,CACX3B,CAAAA,CAAQ,OAAA,EACCrL,CAAAA,CAAU,UAAA,CAAW,QAAQ,CAAA,GACtCgN,CAAAA,CAAW,OAAA,CACX3B,CAAAA,CAAQ,OAAA,CAAA,CAGH,CACL,QAAA,CAAA2B,CAAAA,CACA,KAAM,IAAM,IAAA,CACZ,KAAA,CAAA3B,CACF,CACF,CAqBO,SAAS4B,EAAAA,CAAY,CAC1B,KAAA,CAAAtN,CAAAA,CACA,QAAA,CAAA4L,CAAAA,CACA,MAAA,CAAAR,CAAAA,CACA,YAAA,CAAAmC,EAAe,EAAC,CAChB,oBAAA,CAAAC,CACF,CAAA,CAAqB,CACnB,GAAM,CAACC,CAAAA,CAAYC,CAAa,CAAA,CAAI7W,QAAAA,CAAoC,EAAE,CAAA,CAqD1E,OAnDAoB,UAAU,IAAM,CAEd+H,CAAAA,CAAM,OAAA,CAAQ,CAACN,CAAAA,CAAM5F,CAAAA,GAAU,CAC7B,IAAMiS,CAAAA,CAAetM,EAAAA,CAAgBC,CAAI,CAAA,CAEnCiO,CAAAA,CAAmBJ,CAAAA,CAAa,IAAA,CAAKK,GAAQA,CAAAA,CAAK,IAAA,GAASlO,CAAI,CAAA,CACrE,GACEqM,CAAAA,CAAa,QAAA,GAAa,OAAA,EAC1B,CAAC0B,CAAAA,CAAW3T,CAAK,CAAA,EACjB,CAAC6T,CAAAA,CACD,CACA,IAAMZ,EAAW,GAAA,CAAI,eAAA,CAAgBrN,CAAI,CAAA,CACnCsN,CAAAA,CAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA,CAC5CA,CAAAA,CAAM,GAAA,CAAMD,CAAAA,CAEZ,IAAME,CAAAA,CAAgB,IAAM,CAC1B,GAAI,CAEFD,CAAAA,CAAM,WAAA,CAAc,CAAA,CAGpB,UAAA,CAAW,IAAM,CACf,IAAME,CAAAA,CAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,CAC9CA,CAAAA,CAAO,KAAA,CAAQF,CAAAA,CAAM,WACrBE,CAAAA,CAAO,MAAA,CAASF,CAAAA,CAAM,WAAA,CACtB,IAAMG,CAAAA,CAAMD,CAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CAClC,GAAI,CAACC,CAAAA,CAAK,CACR,OAAA,CAAQ,KAAA,CAAM,8BAA8B,CAAA,CAC5C,MACF,CAGAA,CAAAA,CAAI,SAAA,CAAUH,CAAAA,CAAO,CAAA,CAAG,CAAC,CAAA,CAEzB,IAAMJ,CAAAA,CAAeM,CAAAA,CAAO,SAAA,CAAU,YAAA,CAAc,EAAG,CAAA,CACvDQ,EAAcG,CAAAA,GAAS,CAAE,GAAGA,CAAAA,CAAM,CAAC/T,CAAK,EAAG8S,CAAa,CAAA,CAAE,EAC5D,CAAA,CAAG,GAAG,EACR,CAAA,MAASnU,CAAAA,CAAO,CACd,QAAQ,KAAA,CAAM,6BAAA,CAA+BA,CAAK,EACpD,CAAA,OAAE,CACA,GAAA,CAAI,eAAA,CAAgBsU,CAAQ,CAAA,CAC5BC,CAAAA,CAAM,mBAAA,CAAoB,SAAA,CAAWC,CAAa,EACpD,CACF,EAEAD,CAAAA,CAAM,gBAAA,CAAiB,SAAA,CAAWC,CAAa,CAAA,CAC/CD,CAAAA,CAAM,IAAA,GACR,CACF,CAAC,EACH,CAAA,CAAG,CAAChN,CAAAA,CAAOuN,CAAY,CAAC,EAEpBvN,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,IAAA,CAG7BtG,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oDAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uDAAA,CACZ,QAAA,CAAAsG,CAAAA,CAAM,GAAA,CAAI,CAACN,CAAAA,CAAM5F,CAAAA,GAAU,CAC1B,IAAMiS,CAAAA,CAAetM,EAAAA,CAAgBC,CAAI,CAAA,CACnCoO,EAAWP,CAAAA,CAAa,IAAA,CAAKK,CAAAA,EAAQA,CAAAA,CAAK,IAAA,GAASlO,CAAI,CAAA,CAE7D,OAAIM,EAAM,MAAA,CAAS,CAAA,CAEftG,GAAAA,CAAC,KAAA,CAAA,CAAgB,SAAA,CAAU,4BAAA,CACzB,QAAA,CAAAA,GAAAA,CAACiS,EAAAA,CAAA,CACC,IAAA,CAAMjM,CAAAA,CACN,QAAA,CAAU,IAAMkM,CAAAA,CAAS9R,CAAK,EAC9B,MAAA,CAAQsR,CAAAA,CACR,gBAAA,CAAkB,CAAC1L,CAAAA,CAAM/E,CAAAA,GAAQ,CAC3B6S,CAAAA,EACFA,CAAAA,CAAqB9N,CAAAA,CAAM/E,CAAG,EAElC,CAAA,CACF,CAAA,CAAA,CAVQb,CAWV,CAAA,CAKAiS,EAAa,QAAA,GAAa,OAAA,CAE1BrS,GAAAA,CAAC8S,EAAAA,CAAA,CAEC,IAAA,CAAM9M,CAAAA,CACN,QAAA,CAAU,IAAMkM,CAAAA,CAAS9R,CAAK,CAAA,CAC9B,MAAA,CAAQsR,CAAAA,CACR,UAAA,CAAY0C,CAAAA,EAAU,IACtB,gBAAA,CAAkB,CAACpO,CAAAA,CAAM/E,CAAAA,GAAQ,CAC3B6S,CAAAA,EACFA,CAAAA,CAAqB9N,CAAAA,CAAM/E,CAAG,EAElC,CAAA,CAAA,CATK+E,CAAAA,CAAK,IAUZ,CAAA,CAKAqM,CAAAA,CAAa,QAAA,GAAa,QAE1BrS,GAAAA,CAACiT,EAAAA,CAAA,CAEC,IAAA,CAAMjN,CAAAA,CACN,QAAA,CAAU,IAAMkM,CAAAA,CAAS9R,CAAK,CAAA,CAC9B,MAAA,CAAQsR,CAAAA,CACR,UAAA,CAAY0C,CAAAA,EAAU,GAAA,CACtB,YAAA,CAAcL,EAAW3T,CAAK,CAAA,CAC9B,gBAAA,CAAkB,CAAC4F,CAAAA,CAAM/E,CAAAA,GAAQ,CAC3B6S,CAAAA,EACFA,CAAAA,CAAqB9N,CAAAA,CAAM/E,CAAG,EAElC,CAAA,CAAA,CAVK+E,CAAAA,CAAK,IAWZ,CAAA,CAMFhG,IAAC,KAAA,CAAA,CAAgB,SAAA,CAAU,4BAAA,CACzB,QAAA,CAAAA,GAAAA,CAACiS,EAAAA,CAAA,CACC,IAAA,CAAMjM,CAAAA,CACN,QAAA,CAAU,IAAMkM,CAAAA,CAAS9R,CAAK,CAAA,CAC9B,MAAA,CAAQsR,CAAAA,CACR,iBAAkB,CAAC1L,CAAAA,CAAM/E,CAAAA,GAAQ,CAC3B6S,CAAAA,EACFA,CAAAA,CAAqB9N,CAAAA,CAAM/E,CAAG,EAElC,CAAA,CACF,CAAA,CAAA,CAVQb,CAWV,CAEJ,CAAC,CAAA,CACH,CAAA,CACF,CAEJ,CCzKA,IAAMiU,CAAAA,CAAmB,CACvB,KAAM,CACJ,cAAA,CAAgB,CACd,WAAA,CAAa,aAAA,CACb,MAAA,CAAQ,QAAA,CACR,KAAA,CAAO,OAAA,CACP,KAAA,CAAO,OAAA,CACP,QAAA,CAAU,UACZ,CAAA,CACA,YAAA,CAAc,cAChB,CACF,CAAA,CAEA,SAASC,EAAAA,CAAe/U,CAAAA,CAAqB,CAE3C,OAAA,CAAQ,GAAA,CAAI,kBAAA,CAAoBA,CAAK,EACvC,CAaO,SAASgV,EAAAA,CAAQ,CACtB,OAAA,CAAA/T,CAAAA,CACA,YAAAgU,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CACF,CAAA,CAAiB,CA+Bf,OACE9U,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,iHAAA,CAEb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qCAAA,CAEb,QAAA,CAAA,CAAAA,IAAAA,CAAC+U,OAAAA,CAAA,CACC,QAAA,CAAA,CAAA9U,GAAAA,CAAC+U,cAAAA,CAAA,CAAe,OAAA,CAAO,IAAA,CACrB,SAAA/U,GAAAA,CAACC,UAAAA,CAAA,CACC,SAAA,CAAU,gBAAA,CACV,OAAA,CAAQ,OAAA,CACR,OAAA,CAxCY,IAAM,CAC5BqU,EAAAA,CAAeD,CAAAA,CAAiB,IAAA,CAAK,cAAA,CAAe,WAAW,CAAA,CAC/DG,IACF,CAAA,CAsCY,QAAA,CAAUhU,CAAAA,CACV,aAAA,CAAY,oBAAA,CAEZ,QAAA,CAAAR,GAAAA,CAACgV,UAAA,CAAU,KAAA,CAAM,WAAA,CAAY,CAAA,CAC/B,CAAA,CACF,CAAA,CACAjV,IAAAA,CAACkV,cAAAA,CAAA,CACC,QAAA,CAAA,CAAAjV,GAAAA,CAACkV,YAAAA,CAAA,EAAa,CAAA,CACdlV,GAAAA,CAAC,GAAA,CAAA,CAAE,QAAA,CAAA,cAAA,CAAY,CAAA,CAAA,CACjB,CAAA,CAAA,CACF,CAAA,CAEAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CAAmC,CAAA,CAElDD,KAAC+U,OAAAA,CAAA,CACC,QAAA,CAAA,CAAA9U,GAAAA,CAAC+U,cAAAA,CAAA,CAAe,OAAA,CAAO,IAAA,CACrB,QAAA,CAAA/U,GAAAA,CAACC,UAAAA,CAAA,CACC,SAAA,CAAU,gBAAA,CACV,OAAA,CAAQ,OAAA,CACR,QAvDc,IAAM,CAC9BqU,EAAAA,CAAeD,CAAAA,CAAiB,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA,CAC1DI,CAAAA,GACF,CAAA,CAqDY,QAAA,CAAUjU,CAAAA,CACV,aAAA,CAAY,eAAA,CAEZ,QAAA,CAAAR,IAACqC,MAAAA,CAAA,CAAO,KAAA,CAAM,WAAA,CAAY,CAAA,CAC5B,CAAA,CACF,CAAA,CACAtC,IAAAA,CAACkV,cAAAA,CAAA,CACC,QAAA,CAAA,CAAAjV,GAAAA,CAACkV,YAAAA,CAAA,EAAa,CAAA,CACdlV,GAAAA,CAAC,KAAE,QAAA,CAAA,gBAAA,CAAc,CAAA,CAAA,CACnB,CAAA,CAAA,CACF,CAAA,CAEAD,IAAAA,CAAC+U,OAAAA,CAAA,CACC,QAAA,CAAA,CAAA9U,GAAAA,CAAC+U,cAAAA,CAAA,CAAe,OAAA,CAAO,IAAA,CACrB,QAAA,CAAA/U,GAAAA,CAACC,UAAAA,CAAA,CACC,SAAA,CAAU,gBAAA,CACV,OAAA,CAAQ,OAAA,CACR,OAAA,CApEa,IAAM,CAC7BqU,EAAAA,CAAeD,CAAAA,CAAiB,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA,CACzDK,CAAAA,GACF,CAAA,CAkEY,SAAUlU,CAAAA,CACV,aAAA,CAAY,cAAA,CAEZ,QAAA,CAAAR,GAAAA,CAACmV,WAAAA,CAAA,CAAY,KAAA,CAAM,WAAA,CAAY,CAAA,CACjC,CAAA,CACF,CAAA,CACApV,IAAAA,CAACkV,cAAAA,CAAA,CACC,QAAA,CAAA,CAAAjV,IAACkV,YAAAA,CAAA,EAAa,CAAA,CACdlV,GAAAA,CAAC,GAAA,CAAA,CAAE,QAAA,CAAA,cAAA,CAAY,CAAA,CAAA,CACjB,CAAA,CAAA,CACF,EAEAD,IAAAA,CAAC+U,OAAAA,CAAA,CACC,QAAA,CAAA,CAAA9U,GAAAA,CAAC+U,cAAAA,CAAA,CAAe,OAAA,CAAO,KACrB,QAAA,CAAA/U,GAAAA,CAACC,UAAAA,CAAA,CACC,SAAA,CAAU,gBAAA,CACV,OAAA,CAAQ,OAAA,CACR,OAAA,CAjFa,IAAM,CAC7BqU,EAAAA,CAAeD,CAAAA,CAAiB,IAAA,CAAK,cAAA,CAAe,KAAK,EACzDM,CAAAA,GACF,CAAA,CA+EY,QAAA,CAAUnU,CAAAA,CACV,aAAA,CAAY,cAAA,CAEZ,QAAA,CAAAR,GAAAA,CAACoV,UAAAA,CAAA,CAAW,KAAA,CAAM,WAAA,CAAY,CAAA,CAChC,CAAA,CACF,CAAA,CACArV,KAACkV,cAAAA,CAAA,CACC,QAAA,CAAA,CAAAjV,GAAAA,CAACkV,YAAAA,CAAA,EAAa,CAAA,CACdlV,GAAAA,CAAC,GAAA,CAAA,CAAE,QAAA,CAAA,sBAAA,CAAoB,CAAA,CAAA,CACzB,CAAA,CAAA,CACF,CAAA,CAEAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAmC,CAAA,CAElDD,IAAAA,CAAC+U,OAAAA,CAAA,CACC,QAAA,CAAA,CAAA9U,GAAAA,CAAC+U,cAAAA,CAAA,CAAe,OAAA,CAAO,IAAA,CACrB,QAAA,CAAA/U,GAAAA,CAACC,UAAAA,CAAA,CACC,SAAA,CAAU,gBAAA,CACV,QAAQ,OAAA,CACR,OAAA,CAhGgB,IAAM,CAChCqU,EAAAA,CAAeD,CAAAA,CAAiB,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA,CAC5DO,CAAAA,GACF,CAAA,CA8FY,QAAA,CAAUpU,CAAAA,CACV,aAAA,CAAY,kBAEZ,QAAA,CAAAR,GAAAA,CAAC0M,MAAAA,CAAA,CAAO,KAAA,CAAM,WAAA,CAAY,CAAA,CAC5B,CAAA,CACF,CAAA,CACA3M,IAAAA,CAACkV,cAAAA,CAAA,CACC,QAAA,CAAA,CAAAjV,GAAAA,CAACkV,YAAAA,CAAA,EAAa,EACdlV,GAAAA,CAAC,GAAA,CAAA,CAAE,QAAA,CAAA,gBAAA,CAAc,CAAA,CAAA,CACnB,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGAA,GAAAA,CAACC,UAAAA,CAAA,CACC,SAAA,CAAU,kBAAA,CACV,OAAA,CA5GkB,IAAM,CAC5BqU,EAAAA,CAAeD,EAAiB,IAAA,CAAK,YAAY,CAAA,CACjDQ,CAAAA,GACF,CAAA,CA0GM,QAAA,CAAUrU,CAAAA,CACV,cAAY,aAAA,CAEZ,QAAA,CAAAR,GAAAA,CAACK,OAAAA,CAAA,CAAQ,KAAA,CAAM,SAAA,CAAU,CAAA,CAC3B,GACF,CAEJ","file":"index.mjs","sourcesContent":["import { ArrowUp, IconButton, XIcon } from \"luaniverse\";\nimport { useEffect, useRef, useState } from \"react\";\n\ntype AudioRecorderProps = {\n onAudioRecorded: (audioBlob: Blob, messageText?: string) => void;\n onClose: () => void;\n inputMessage?: string;\n};\n\nexport function AudioRecorder({\n onAudioRecorded,\n onClose,\n inputMessage,\n}: AudioRecorderProps) {\n const [isRecording, setIsRecording] = useState(false);\n const [recordingTime, setRecordingTime] = useState(0);\n const [audioVisualizerData, setAudioVisualizerData] = useState<number[]>([]);\n const [startTime, setStartTime] = useState<number | null>(null);\n const [finalTime, setFinalTime] = useState<number | null>(null);\n\n const streamRef = useRef<MediaStream | null>(null);\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n const audioContextRef = useRef<AudioContext | null>(null);\n const analyserRef = useRef<AnalyserNode | null>(null);\n const audioDataRef = useRef<Uint8Array | null>(null);\n const animationFrameRef = useRef<number | null>(null);\n const isInitializingRef = useRef<boolean>(false);\n const isCleaningUpRef = useRef<boolean>(false);\n const supportedMediaTypeRef = useRef<string | null>(null);\n\n // Timer effect\n useEffect(() => {\n if (!isRecording || !startTime) {\n return;\n }\n\n const interval = setInterval(() => {\n const elapsed = Math.floor((Date.now() - startTime) / 1000);\n setRecordingTime(elapsed);\n }, 1000);\n\n return () => clearInterval(interval);\n }, [isRecording, startTime]);\n\n // Audio initialization effect\n useEffect(() => {\n const initializeAudio = async () => {\n if (isInitializingRef.current || isCleaningUpRef.current) {\n return;\n }\n\n try {\n isInitializingRef.current = true;\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n\n streamRef.current = stream;\n\n // Initialize AudioContext and Analyser\n audioContextRef.current = new AudioContext();\n analyserRef.current = audioContextRef.current.createAnalyser();\n analyserRef.current.fftSize = 256;\n\n const source = audioContextRef.current.createMediaStreamSource(stream);\n source.connect(analyserRef.current);\n\n // Initialize data array for visualization\n audioDataRef.current = new Uint8Array(\n analyserRef.current.frequencyBinCount\n );\n\n // Start visualization\n const visualize = () => {\n if (!analyserRef.current || !audioDataRef.current) {\n return;\n }\n\n analyserRef.current.getByteFrequencyData(\n audioDataRef.current as Uint8Array<ArrayBuffer>\n );\n const data = Array.from(audioDataRef.current).map(v => v / 255);\n setAudioVisualizerData(data);\n\n animationFrameRef.current = requestAnimationFrame(visualize);\n };\n\n visualize();\n\n // Start recording immediately after audio context is ready\n startRecording();\n } catch (error) {\n console.error(\"Error accessing microphone:\", error);\n onClose();\n } finally {\n isInitializingRef.current = false;\n }\n };\n\n initializeAudio();\n\n // Only run cleanup on unmount\n return () => {\n cleanup();\n };\n }, []); // Empty dependency array - only run on mount\n\n const cleanup = () => {\n if (isCleaningUpRef.current) {\n return;\n }\n\n try {\n isCleaningUpRef.current = true;\n\n // First stop any ongoing recording\n if (isRecording && mediaRecorderRef.current) {\n mediaRecorderRef.current.stop();\n setIsRecording(false);\n setStartTime(null);\n }\n\n // Then stop all tracks\n if (streamRef.current) {\n const audioTracks = streamRef.current.getAudioTracks();\n const videoTracks = streamRef.current.getVideoTracks();\n\n audioTracks.forEach((track: MediaStreamTrack) => {\n track.stop();\n track.enabled = false;\n });\n\n videoTracks.forEach((track: MediaStreamTrack) => {\n track.stop();\n track.enabled = false;\n });\n }\n\n // Cancel any pending animation frames\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n\n // Close audio context\n if (audioContextRef.current) {\n audioContextRef.current.close();\n }\n\n // Clear all refs\n streamRef.current = null;\n mediaRecorderRef.current = null;\n chunksRef.current = [];\n audioContextRef.current = null;\n analyserRef.current = null;\n audioDataRef.current = null;\n animationFrameRef.current = null;\n } finally {\n isCleaningUpRef.current = false;\n }\n };\n\n const startRecording = () => {\n if (!streamRef.current) {\n return;\n }\n\n // Get supported MIME types\n const mediaTypes = [\"audio/webm\", \"audio/mp4\", \"audio/ogg\", \"audio/wav\"];\n\n // Find the first supported MIME type\n const supportedMediaType = mediaTypes.find(type =>\n MediaRecorder.isTypeSupported(type)\n );\n\n if (!supportedMediaType) {\n console.error(\"No supported MIME type found for MediaRecorder\");\n onClose();\n return;\n }\n\n supportedMediaTypeRef.current = supportedMediaType;\n\n // Initialize MediaRecorder with supported format\n const mediaRecorder = new MediaRecorder(streamRef.current, {\n mimeType: supportedMediaType,\n });\n mediaRecorderRef.current = mediaRecorder;\n chunksRef.current = [];\n\n mediaRecorder.ondataavailable = event => {\n if (event.data.size > 0) {\n chunksRef.current.push(event.data);\n }\n };\n\n mediaRecorder.start();\n setIsRecording(true);\n setStartTime(Date.now());\n setRecordingTime(0);\n };\n\n const stopRecording = async () => {\n if (!mediaRecorderRef.current || !streamRef.current) {\n return;\n }\n\n setIsRecording(false);\n setFinalTime(recordingTime);\n setStartTime(null);\n mediaRecorderRef.current.stop();\n\n // Wait for the last chunk\n await new Promise<void>(resolve => {\n if (mediaRecorderRef.current) {\n mediaRecorderRef.current.onstop = () => resolve();\n }\n });\n\n // Create blob from chunks and pass to parent with the same MIME type used for recording\n const blob = new Blob(chunksRef.current, {\n type: supportedMediaTypeRef.current || \"audio/webm\",\n });\n onAudioRecorded(blob, inputMessage);\n\n // Clean up and close\n cleanup();\n onClose();\n };\n\n const formatTime = (seconds: number) => {\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins.toString().padStart(2, \"0\")}:${secs\n .toString()\n .padStart(2, \"0\")}`;\n };\n\n const handleClose = async () => {\n cleanup();\n onClose();\n };\n\n return (\n <div className=\"audio-recorder-container lua:bg-gray-100 lua:rounded-lg lua:p-2 lua:flex lua:items-center lua:gap-4\">\n <IconButton\n variant=\"muted\"\n onClick={handleClose}\n className=\"audio-recorder-close-button lua:flex-shrink-0\"\n >\n <XIcon className=\"audio-recorder-close-icon\" color=\"#00000099\" />\n </IconButton>\n\n <div className=\"audio-recorder-status lua:flex lua:items-center lua:gap-2\">\n <div\n className={`audio-recorder-indicator lua:w-3 lua:h-3 lua:rounded-full ${\n isRecording ? \"lua:bg-red-500 lua:animate-pulse\" : \"lua:bg-gray-400\"\n }`}\n />\n <span className=\"audio-recorder-time lua:text-gray-700 lua:text-sm\">\n {isRecording ? formatTime(recordingTime) : formatTime(finalTime || 0)}\n </span>\n </div>\n\n <div\n className=\"audio-recorder-visualizer lua:flex-1\"\n data-testid=\"audio-visualizer-bar\"\n >\n {audioVisualizerData.length > 0 && (\n <div className=\"audio-recorder-bars lua:h-8 lua:flex lua:items-center lua:w-full lua:gap-px sm:lua:gap-0.5 md:lua:gap-1\">\n {audioVisualizerData.slice(0, 50).map((value, index) => (\n <div\n key={index}\n className=\"audio-recorder-bar lua:flex-1 lua:bg-blue-500\"\n style={{ height: `${value * 100}%` }}\n />\n ))}\n </div>\n )}\n </div>\n\n <IconButton\n onClick={stopRecording}\n className=\"audio-recorder-send-button lua:flex-shrink-0 lua:mr-1\"\n data-testid=\"send-audio-button\"\n >\n <ArrowUp className=\"audio-recorder-send-icon\" color=\"white\" />\n </IconButton>\n </div>\n );\n}\n","import { VisuallyHidden } from \"@radix-ui/react-visually-hidden\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n IconButton,\n XIcon,\n} from \"luaniverse\";\nimport { RefObject } from \"react\";\n\ntype VideoDialogProps = {\n videoRef: RefObject<HTMLVideoElement>;\n isRecording: boolean;\n recordingTime: number;\n loading: boolean;\n onStartRecording: () => void;\n onStopRecording: () => void;\n onClose: () => void;\n open: boolean;\n};\n\nfunction formatTime(seconds: number) {\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins.toString().padStart(2, \"0\")}:${secs\n .toString()\n .padStart(2, \"0\")}`;\n}\n\nexport function VideoDialog({\n videoRef,\n isRecording,\n recordingTime,\n loading,\n onStartRecording,\n onStopRecording,\n onClose,\n open,\n}: VideoDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent\n className=\"lua:w-full lua:max-w-2xl lua:p-2.5\"\n showClose={false}\n >\n <VisuallyHidden>\n <DialogTitle />\n </VisuallyHidden>\n {/* Video Preview Area */}\n <div className=\"lua:relative lua:aspect-[4/3] lua:bg-black lua:rounded-xl lua:overflow-hidden lua:mb-8\">\n <video\n ref={videoRef}\n autoPlay\n playsInline\n muted\n className=\"lua:absolute lua:inset-0 lua:w-full lua:h-full lua:object-cover\"\n style={{ backgroundColor: \"black\" }}\n />\n {isRecording && (\n <div className=\"lua:absolute lua:top-4 lua:left-4 lua:flex lua:items-center lua:gap-2 lua:bg-black lua:bg-opacity-50 lua:px-3 lua:py-1 lua:rounded-full\">\n <div className=\"lua:w-2 lua:h-2 lua:rounded-full lua:bg-red-500 lua:animate-pulse\" />\n <span className=\"lua:text-sm lua:font-medium lua:text-white\">\n {formatTime(recordingTime)}\n </span>\n </div>\n )}\n </div>\n\n {/* Video Controls */}\n <div className=\"lua:flex lua:justify-center lua:items-center lua:gap-5 lua:mb-2.5\">\n {!isRecording ? (\n <svg\n onClick={onStartRecording}\n data-testid=\"start-recording-button\"\n width=\"40\"\n height=\"40\"\n viewBox=\"0 0 40 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"cursor-pointer\"\n >\n <rect\n x=\"2\"\n y=\"2\"\n width=\"36\"\n height=\"36\"\n rx=\"18\"\n stroke=\"#FF0342\"\n strokeWidth=\"4\"\n />\n <rect x=\"6\" y=\"6\" width=\"28\" height=\"28\" rx=\"14\" fill=\"#FF0342\" />\n </svg>\n ) : (\n <IconButton\n data-testid=\"stop-recording-button\"\n onClick={onStopRecording}\n disabled={loading}\n variant=\"secondary\"\n >\n <XIcon color=\"#000000\" />\n </IconButton>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","import { VisuallyHidden } from \"@radix-ui/react-visually-hidden\";\nimport { Dialog, DialogContent, DialogTitle, XIcon } from \"luaniverse\";\n\ntype ImageDialogProps = {\n url: string;\n alt?: string;\n open: boolean;\n onClose: () => void;\n};\n\nexport function ImageDialog({ url, alt, open, onClose }: ImageDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <VisuallyHidden>\n <DialogTitle />\n </VisuallyHidden>\n <DialogContent\n className=\"lua:w-full lua:fixed lua:inset-0 lua:h-full lua:max-w-none lua:p-0 lua:bg-transparent lua:shadow-none lua:translate-x-0 lua:translate-y-0 lua:m-0 lua:rounded-none\"\n showClose={false}\n >\n <div className=\"lua:relative lua:w-full lua:h-full\">\n {/* Close button */}\n <button\n onClick={onClose}\n className=\"lua:cursor-pointer lua:absolute lua:top-4 lua:left-4 lua:z-10 lua:p-2 lua:bg-black/50 lua:rounded-full lua:hover:bg-black/70 lua:transition-colors\"\n >\n <XIcon color=\"white\" className=\"lua:w-6 lua:h-6\" />\n </button>\n\n {/* Image container */}\n <div className=\"lua:w-full lua:h-full lua:flex lua:items-center lua:justify-center\">\n <img\n src={url}\n alt={alt}\n className=\"sm:lua:aspect-[16/9] lua:object-contain lua:rounded-none sm:lua:rounded-lg\"\n />\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","import { VisuallyHidden } from \"@radix-ui/react-visually-hidden\";\nimport {\n Carousel,\n type CarouselApi,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n Dialog,\n DialogContent,\n DialogTitle,\n XIcon,\n} from \"luaniverse\";\nimport { useEffect, useState } from \"react\";\n\ntype CarouselImage = { src: string; alt: string };\n\ntype CarouselImageDialogProps = {\n images: CarouselImage[];\n initialIndex?: number;\n open: boolean;\n onClose: () => void;\n};\n\nexport function CarouselImageDialog({\n images,\n initialIndex = 0,\n open,\n onClose,\n}: CarouselImageDialogProps) {\n const [api, setApi] = useState<CarouselApi>();\n const [current, setCurrent] = useState(0);\n\n useEffect(() => {\n if (!api) {\n return;\n }\n\n // Set initial slide\n if (initialIndex > 0 && initialIndex < images.length) {\n api.scrollTo(initialIndex);\n setCurrent(initialIndex);\n }\n\n // Listen for slide changes\n const onSelect = () => {\n setCurrent(api.selectedScrollSnap());\n };\n\n api.on(\"select\", onSelect);\n onSelect();\n\n return () => {\n api?.off(\"select\", onSelect);\n };\n }, [api, initialIndex, images.length]);\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <VisuallyHidden>\n <DialogTitle />\n </VisuallyHidden>\n <DialogContent className=\"lua:w-full lua:m-0\" showClose={false}>\n <div className=\"lua:relative lua:w-full lua:h-full\">\n {/* Close button */}\n <button\n onClick={onClose}\n className=\"lua:cursor-pointer lua:absolute lua:top-4 lua:left-4 lua:z-10 lua:p-2 lua:bg-black/50 lua:rounded-full lua:hover:bg-black/70 lua:transition-colors\"\n >\n <XIcon color=\"white\" className=\"lua:w-6 lua:h-6\" />\n </button>\n\n {/* Image counter */}\n {images.length > 1 && (\n <div className=\"lua:absolute lua:top-4 lua:right-4 lua:z-10 lua:px-3 lua:py-1 lua:bg-black/50 lua:rounded-full lua:text-white lua:text-sm\">\n {current + 1} / {images.length}\n </div>\n )}\n\n {/* Carousel container */}\n <div className=\"lua:w-full lua:h-full lua:flex lua:items-center lua:justify-center lua:px-16\">\n <Carousel\n setApi={setApi}\n className=\"lua:w-full lua:max-w-5xl\"\n opts={{\n align: \"center\",\n loop: images.length > 1,\n }}\n >\n <CarouselContent>\n {images.map((image, index) => (\n <CarouselItem\n className=\"lua:flex lua:items-center lua:justify-center\"\n key={index}\n >\n <img\n src={image.src}\n alt={image.alt || `Image ${index + 1}`}\n className=\"lua:max-w-full lua:max-h-screen lua:object-contain lua:rounded-none sm:lua:rounded-lg\"\n draggable={false}\n />\n </CarouselItem>\n ))}\n </CarouselContent>\n\n {images.length > 1 && (\n <>\n <CarouselPrevious className=\"lua:left-4 lua:bg-black/50 lua:border-none lua:text-white lua:hover:bg-black/70 lua:hover:text-white-white/70\" />\n <CarouselNext className=\"lua:right-4 lua:bg-black/50 lua:border-none lua:text-white lua:hover:bg-black/70 lua:hover:text-white-white/70\" />\n </>\n )}\n </Carousel>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","import { VisuallyHidden } from \"@radix-ui/react-visually-hidden\";\nimport {\n Camera,\n Dialog,\n DialogContent,\n DialogTitle,\n IconButton,\n XIcon,\n} from \"luaniverse\";\nimport { RefObject } from \"react\";\n\ntype CameraDialogProps = {\n videoRef: RefObject<HTMLVideoElement>;\n canvasRef: RefObject<HTMLCanvasElement>;\n onCapture: () => void;\n onClose: () => void;\n open: boolean;\n};\n\nexport function CameraDialog({\n videoRef,\n canvasRef,\n onCapture,\n onClose,\n open,\n}: CameraDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <VisuallyHidden>\n <DialogTitle />\n </VisuallyHidden>\n <DialogContent\n className=\"lua:w-full lua:max-w-2xl lua:p-2.5\"\n showClose={false}\n >\n {/* Camera Preview Area */}\n <div className=\"lua:relative lua:aspect-[16/9] lua:bg-black lua:rounded-xl lua:overflow-hidden\">\n <video\n ref={videoRef}\n autoPlay\n playsInline\n muted\n className=\"lua:absolute lua:inset-0 lua:w-full lua:h-full lua:object-cover\"\n style={{ backgroundColor: \"black\" }}\n />\n <canvas ref={canvasRef} className=\"lua:hidden\" />\n </div>\n\n {/* Camera Controls */}\n <div className=\"lua:flex lua:justify-center lua:items-center lua:gap-5 lua:mb-2.5 lua:mt-6\">\n {/* Capture Button */}\n <IconButton onClick={onCapture} data-testid=\"capture-button\">\n <Camera color=\"#FFFFFF\" />\n </IconButton>\n\n {/* Close Button */}\n <IconButton onClick={onClose} variant=\"secondary\">\n <XIcon color=\"#000000\" />\n </IconButton>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","type LocationDialogProps = {\n locationError: string;\n currentLocation: {\n latitude: number;\n longitude: number;\n address?: string;\n } | null;\n loading: boolean;\n onShare: () => void;\n onClose: () => void;\n};\n\nexport function LocationDialog({\n locationError,\n currentLocation,\n loading,\n onShare,\n onClose,\n}: LocationDialogProps) {\n return (\n <div className=\"lua:fixed lua:inset-0 lua:bg-black lua:bg-opacity-75 lua:flex lua:items-center lua:justify-center lua:z-50\">\n <div className=\"lua:bg-white lua:rounded-lg lua:p-4 lua:max-w-2xl lua:w-full lua:mx-4\">\n <div className=\"lua:flex lua:justify-between lua:items-center lua:mb-4\">\n <h3 className=\"lua:text-lg lua:font-semibold\">Share Location</h3>\n <button\n onClick={onClose}\n className=\"lua:text-gray-500 lua:hover:text-gray-700\"\n >\n <svg\n className=\"lua:w-6 lua:h-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n {locationError ? (\n <div className=\"lua:bg-red-50 lua:text-red-500 lua:p-4 lua:rounded-lg lua:mb-4\">\n {locationError}\n </div>\n ) : currentLocation ? (\n <>\n <div className=\"lua:mb-4\">\n <div className=\"lua:text-sm lua:text-gray-500 lua:mb-2\">\n Current Location:\n </div>\n <div className=\"lua:text-gray-700 lua:mb-2\">\n {currentLocation.address}\n </div>\n <div className=\"lua:text-sm lua:text-gray-500\">\n {currentLocation.latitude.toFixed(6)},{\" \"}\n {currentLocation.longitude.toFixed(6)}\n </div>\n </div>\n </>\n ) : (\n <div className=\"lua:flex lua:justify-center lua:items-center lua:h-48\">\n <div className=\"lua:animate-spin lua:rounded-full lua:h-8 lua:w-8 lua:border-b-2 lua:border-blue-500\"></div>\n </div>\n )}\n\n <div className=\"lua:flex lua:justify-center\">\n {currentLocation && (\n <button\n onClick={onShare}\n disabled={loading}\n className={`lua:px-4 lua:py-2 lua:rounded-full ${\n loading\n ? \"lua:bg-blue-300 lua:cursor-not-allowed\"\n : \"lua:bg-blue-500 lua:hover:bg-blue-600\"\n } lua:text-white lua:flex lua:items-center lua:gap-2`}\n >\n <svg\n className=\"lua:w-5 lua:h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\"\n />\n </svg>\n {loading ? \"Sharing...\" : \"Share Location\"}\n </button>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { Highlight, themes } from \"prism-react-renderer\";\nimport { ReactNode, useState } from \"react\";\n\ntype CodeBlockProps = {\n children: ReactNode;\n className?: string;\n language?: string;\n};\n\nexport function CodeBlock({ children, language = \"\" }: CodeBlockProps) {\n const [copied, setCopied] = useState(false);\n\n // Convert children to string if it's not already\n const codeString = typeof children === \"string\" ? children : String(children);\n\n // Default to javascript if no language is specified\n const codeLanguage = language || \"javascript\";\n\n const handleCopy = () => {\n navigator.clipboard.writeText(codeString);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n return (\n <div className=\"lua:relative lua:my-4 lua:rounded-lg lua:overflow-hidden lua:mx-4 lua:sm:mx-5 lua:grid\">\n {/* Header with language and copy button */}\n <div className=\"lua:flex lua:items-center lua:justify-between lua:bg-gray-800 lua:text-gray-200 lua:px-4 lua:py-2\">\n <span className=\"lua:text-xs lua:font-mono\">{codeLanguage}</span>\n <button\n onClick={handleCopy}\n className=\"lua:text-xs lua:bg-gray-700 lua:hover:bg-gray-600 lua:rounded lua:px-2 lua:py-1 lua:transition-colors\"\n aria-label=\"Copy code\"\n >\n {copied ? \"Copied!\" : \"Copy\"}\n </button>\n </div>\n\n {/* Code content with syntax highlighting */}\n <Highlight\n theme={themes.vsDark}\n code={codeString}\n language={codeLanguage}\n >\n {({ className, style, tokens, getLineProps, getTokenProps }) => (\n <pre\n className={`${className} lua:p-4 lua:overflow-x-auto`}\n style={style}\n >\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))}\n </div>\n ))}\n </pre>\n )}\n </Highlight>\n </div>\n );\n}\n","export const markdownStyles = {\n p: \"lua:mb-2 lua:last:mb-0 lua:mx-4 lua:sm:mx-5 lua-paragraph-markdown\",\n h1: \"lua:text-2xl lua:font-bold lua:mb-2 lua:mx-4 lua:sm:mx-5\",\n h2: \"lua:text-xl lua:font-semibold lua:mb-2 lua:text-gray-700 lua:mx-4 lua:sm:mx-5\",\n h3: \"lua:text-lg lua:font-medium lua:mb-2 lua:mx-4 lua:sm:mx-5\",\n h4: \"lua:mx-4 lua:sm:mx-5\",\n ul: \"lua:list-disc lua:pl-6 lua:mb-4\",\n ol: \"lua:list-decimal lua:pl-6 lua:mb-4 lua:mx-4 lua:sm:mx-5\",\n li: \"lua:mb-1 lua:mx-4 lua:sm:mx-5\",\n a: \"lua:text-blue-500 lua:hover:underline\",\n blockquote: \"lua:border-l-4 lua:border-gray-200 lua:pl-4 lua:italic lua:my-4\",\n pre: \"lua:contents lua:bg-gray-100 lua:rounded lua:px-1 lua:text-gray-700 lua:mx-4 lua:sm:mx-5\",\n code: \"lua:bg-gray-100 lua:rounded lua:px-1 lua:mx-4 lua:sm:mx-5\",\n img: \"lua:max-w-full lua:h-auto lua:rounded-lg lua:mb-2\",\n table: \"lua:min-w-full lua:border lua:border-gray-200 lua:my-4\",\n th: \"lua:bg-gray-100 lua:border lua:border-gray-200 lua:px-4 lua:py-2\",\n td: \"lua:border lua:border-gray-200 lua:px-4 lua:py-2\",\n};\n","import type { Components } from \"react-markdown\";\nimport { ReactNode } from \"react\";\nimport { CodeBlock } from \"../messages/CodeBlock\";\nimport { markdownStyles } from \"./markdownStyles\";\n\nconst createMarkdownComponents = (\n handleListItemClick: (content: React.ReactNode) => void\n): Components => ({\n code({\n children,\n className,\n ...props\n }: {\n className?: string;\n children?: ReactNode;\n } & React.HTMLAttributes<HTMLElement>) {\n // Extract language from className if it exists (format: language-{lang})\n const language = className?.replace(\"language-\", \"\") || \"\";\n\n // If this is an inline code block, render it normally\n if (typeof children === \"string\" && !children.includes(\"\\n\")) {\n return (\n <code className={markdownStyles.code} {...props}>\n {children}\n </code>\n );\n }\n\n // For multiline code blocks, use our custom CodeBlock component\n return (\n <CodeBlock language={language} className={className}>\n {children}\n </CodeBlock>\n );\n },\n p({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLParagraphElement>) {\n return (\n <p className={markdownStyles.p} {...props}>\n {children}\n </p>\n );\n },\n h1({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h1 className={markdownStyles.h1} {...props}>\n {children}\n </h1>\n );\n },\n h2({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h2 className={markdownStyles.h2} {...props}>\n {children}\n </h2>\n );\n },\n h3({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h3 className={markdownStyles.h3} {...props}>\n {children}\n </h3>\n );\n },\n h4({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h4 className={markdownStyles.h4} {...props}>\n {children}\n </h4>\n );\n },\n img({ src, alt }: { src?: string; alt?: string }) {\n return (\n <img\n src={src}\n alt={alt}\n className=\"lua:w-full lua:h-48 lua:object-cover lua:rounded-lg lua:mb-3\"\n />\n );\n },\n ul({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLUListElement>) {\n return (\n <ul className={markdownStyles.ul} {...props}>\n {children}\n </ul>\n );\n },\n ol({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLOListElement>) {\n return (\n <ol className={markdownStyles.ol} {...props}>\n {children}\n </ol>\n );\n },\n li({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLLIElement>) {\n return (\n <li\n className={`${markdownStyles.li} cursor-pointer hover:bg-gray-50 rounded px-2 -mx-2 transition-colors`}\n onClick={() => handleListItemClick(children)}\n {...props}\n >\n {children}\n </li>\n );\n },\n a({\n href,\n children,\n ...props\n }: {\n href?: string;\n children?: ReactNode;\n } & React.HTMLAttributes<HTMLAnchorElement>) {\n return (\n <a\n href={href}\n className={markdownStyles.a}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n {...props}\n >\n {children}\n </a>\n );\n },\n blockquote({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLQuoteElement>) {\n return (\n <blockquote className={markdownStyles.blockquote} {...props}>\n {children}\n </blockquote>\n );\n },\n pre({\n children,\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLPreElement>) {\n // For pre tags, we'll let the code component handle the rendering\n return <>{children}</>;\n },\n table({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLTableElement>) {\n return (\n <table className={markdownStyles.table} {...props}>\n {children}\n </table>\n );\n },\n th({\n children,\n ...props\n }: {\n children?: ReactNode;\n } & React.HTMLAttributes<HTMLTableHeaderCellElement>) {\n return (\n <th className={markdownStyles.th} {...props}>\n {children}\n </th>\n );\n },\n td({\n children,\n ...props\n }: {\n children?: ReactNode;\n } & React.HTMLAttributes<HTMLTableDataCellElement>) {\n return (\n <td className={markdownStyles.td} {...props}>\n {children}\n </td>\n );\n },\n});\n\nexport default createMarkdownComponents;\n","type ParsedUrl = {\n pathname: string;\n queryParams: Record<string, string>;\n};\n\nexport function parseUrl(input: string): ParsedUrl {\n const url = new URL(input, \"http://lua\"); // base required to parse relative URLs\n const pathname = decodeURIComponent(url.pathname);\n const queryParams: Record<string, string> = {};\n\n for (const [key, value] of url.searchParams.entries()) {\n queryParams[key] = decodeURIComponent(value);\n }\n\n return { pathname, queryParams };\n}\n\nexport default parseUrl;\n","function extractInlineNavigateMarkdown(input: string) {\n const match = input.match(/\\[navigate\\]\\(([^)]+)\\)/);\n if (!match) return null;\n\n return match[1];\n}\n\nexport default extractInlineNavigateMarkdown;\n","import ReactMarkdown from \"react-markdown\";\nimport { memo } from \"react\";\nimport createMarkdownComponents from \"../utilities/createMarkdownComponents\";\nimport parseUrl from \"../utilities/parseUrl\";\nimport extractInlineNavigateMarkdown from \"../utilities/extractInlineNavigateMarkdown\";\n\nconst ChatListItem = memo(function ListItem({\n block,\n onCardClick,\n onListItemClick,\n onNavigate,\n}: {\n block: any;\n onCardClick: (content: string) => void;\n onListItemClick: (content: React.ReactNode) => void;\n onNavigate?: (\n pathname: string,\n options: { query: Record<string, string> }\n ) => void;\n}) {\n const titleMatch = block.content.match(/^#\\s+(.+)$/m);\n const imageMatch = block.content.match(/!\\[.*?]\\((.*)\\)/);\n const title = titleMatch ? titleMatch[1] : \"\";\n const imageUrl = imageMatch ? imageMatch[1] : null;\n\n const navigationLink = extractInlineNavigateMarkdown(block.content);\n\n const contentWithoutTitleAndImage = block.content\n .replace(/^#\\s+.+$/m, \"\") // Remove # Title\n .replace(/!\\[.*?]\\(.*?\\)/g, \"\") // Remove images: ![alt](url)\n .replace(/\\[.*?]\\(.*?\\)/g, \"\") // Remove links: [text](url)\n .trim();\n\n const markdownComponents = createMarkdownComponents(onListItemClick);\n\n const handleListItemClick = () => {\n if (onNavigate && navigationLink) {\n const parsedUrl = parseUrl(navigationLink);\n onNavigate(parsedUrl.pathname, {\n ...(parsedUrl.queryParams && { query: parsedUrl.queryParams }),\n });\n } else {\n onCardClick(block.content);\n }\n };\n\n return (\n <div onClick={handleListItemClick} className=\"chat-list-item group\">\n <div className=\"lua:absolute lua:inset-0 lua:bg-blue-500 lua:opacity-0 group-hover:lua:opacity-5 lua:rounded-lg lua:transition-opacity lua:duration-200\"></div>\n <div className=\"chat-list-item-content\">\n {imageUrl ? (\n <div className=\"chat-list-item-image-wrapper\">\n <img className=\"chat-list-item-image\" src={imageUrl} alt={title} />\n </div>\n ) : null}\n\n <div className=\"content-container\">\n <h1 className=\"lua:text-base lua:leading-6 lua:font-semibold lua:text-gray-900 lua:mb-0\">\n {title}\n </h1>\n <div className=\"lua:text-sm lua:leading-6 lua:font-normal lua:text-gray-600\">\n <ReactMarkdown components={markdownComponents}>\n {contentWithoutTitleAndImage}\n </ReactMarkdown>\n </div>\n </div>\n </div>\n </div>\n );\n});\n\nexport default ChatListItem;\n","import { memo } from \"react\";\nimport ChatListItem from \"./ChatListItem\";\n\ntype ChatListItemGroupProps = {\n group: any[];\n onCardClick: (content: string) => void;\n onListItemClick: (content: React.ReactNode) => void;\n onNavigate?: (\n pathname: string,\n options: { query: Record<string, string> }\n ) => void;\n};\n\nconst ChatListItemGroup = memo(function ListItemGroup({\n group,\n onCardClick,\n onListItemClick,\n onNavigate,\n}: ChatListItemGroupProps) {\n return (\n <div className=\"lua:w-full\">\n <div className=\"chat-list-item-container\">\n {group.map((block, blockIndex) => (\n <ChatListItem\n key={blockIndex}\n block={block}\n onCardClick={onCardClick}\n onListItemClick={onListItemClick}\n onNavigate={onNavigate}\n />\n ))}\n </div>\n </div>\n );\n});\n\nexport default ChatListItemGroup;\n","import { ParsedMessageDocument } from \"../utilities/extractDocuments\";\n// Note: This utility function should be provided by the consuming application\n// import { getFileTypeInfo } from \"@/utils/file-utils.ts\";\n\n// Temporary implementation - should be replaced with actual utility function\nfunction getFileTypeInfo(file: File): { icon: any } {\n // This is a placeholder - the actual implementation should be provided by the consuming app\n return { icon: () => null };\n}\n\ntype DocumentsMessage = {\n documents: ParsedMessageDocument[];\n};\n\nexport default function DocumentsMessage({ documents }: DocumentsMessage) {\n return documents.map((document) => {\n const fileTypeInfo = getFileTypeInfo(\n new File([], \"\", { type: document.mediaType })\n );\n\n const Icon = fileTypeInfo.icon;\n return (\n <a\n key={document.url}\n data-testid=\"chat-file-message\"\n href={document.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"chat-file-message lua:mx-4 lua:sm:mx-5\"\n >\n <div className=\"lua:flex lua:flex-col lua:gap-8\">\n <div className=\"chat-file-card lua:flex lua:items-center lua:justify-start lua:p-3 lua:border lua:border-gray-200 lua:rounded-lg lua:bg-white lua:w-80\">\n <Icon className=\"lua:w-12 lua:h-12 lua:text-gray-500\" />\n <div className=\"lua:flex lua:flex-col lua:gap-1 lua:pl-2\">\n {document.fileName || \"File\"}\n <span className=\"lua:text-gray-500 lua:text-sm\">\n {document.mediaType}\n </span>\n </div>\n </div>\n </div>\n </a>\n );\n });\n}\n","export type ParsedMessageDocument = {\n fileName: string;\n url: string;\n filename: string;\n mediaType: string;\n};\nfunction extractDocuments(input: string): ParsedMessageDocument[] {\n const files: ParsedMessageDocument[] = [];\n\n // Split by newlines to handle multiple files\n const lines = input.split(\"\\n\").filter((line) => line.trim() !== \"\");\n\n for (const line of lines) {\n // Regex to match the pattern: [Title](URL) filename:name mime:type\n const regex =\n /\\[([^\\]]+)\\]\\(([^)]+)\\)\\s+filename:([^\\s]+)\\s+mime:([^\\s]+)/g;\n\n let match;\n while ((match = regex.exec(line)) !== null) {\n const [, fileName, url, filename, mediaType] = match;\n\n files.push({\n fileName: fileName.trim(),\n url: url.trim(),\n filename: filename.trim(),\n mediaType: mediaType.trim(),\n });\n }\n }\n\n return files;\n}\n\nexport default extractDocuments;\n","type AudioPreviewProps = {\n message: {\n audio?: string;\n content: string;\n isUploading?: boolean;\n url?: string; // TODO: check if url is provided\n };\n};\n\nexport function AudioPreview({ message }: AudioPreviewProps) {\n return (\n <div\n className=\"chat-audio-message lua:flex lua:flex-col lua:mx-4 lua:sm:mx-5\"\n data-testid=\"audio-preview\"\n >\n <div className=\"chat-audio-container audio-playback-container lua:relative\">\n <div className=\"chat-audio-controls lua:flex lua:items-center lua:gap-2 lua:min-w-full\">\n <audio\n src={message.url}\n controls\n className=\"chat-audio-player lua:h-8\"\n style={{\n backgroundColor: \"transparent\",\n border: \"none\",\n }}\n />\n {message.isUploading && (\n <div className=\"chat-audio-upload-overlay lua:absolute lua:inset-0 lua:bg-black lua:bg-opacity-50 lua:rounded-lg lua:flex lua:items-center lua:justify-center\">\n <div className=\"lua:text-white lua:text-sm\">Uploading...</div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { Button, CreditCard } from \"luaniverse\";\n\ntype PaymentPreviewProps = {\n url: string;\n};\n\nexport function PaymentPreview({ url }: PaymentPreviewProps) {\n const handleClick = (event: React.MouseEvent) => {\n event.preventDefault();\n\n const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);\n\n if (isMobile) {\n // On mobile, open in new tab\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n return;\n }\n\n // On desktop, try to open popup\n const width = 500;\n const height = 600;\n const left = window.screen.width / 2 - width / 2;\n const top = window.screen.height / 2 - height / 2;\n\n const popup = window.open(\n url,\n \"Payment\",\n `width=${width},height=${height},left=${left},top=${top},toolbar=no,menubar=no,scrollbars=yes,resizable=yes`\n );\n\n // If popup was blocked, fallback to new tab\n if (!popup || popup.closed || typeof popup.closed === \"undefined\") {\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n }\n };\n\n return (\n <Button\n onClick={handleClick}\n className=\"chat-payment-button lua:rounded-xl\"\n >\n <CreditCard size={16} />\n <span>Open payment</span>\n </Button>\n );\n}\n","// Helper function to extract action buttons from markdown content\n\nimport { ActionButton } from \"../../types/chat\";\n\nconst extractActionButtons = (content: string): ActionButton[] => {\n // Split content into lines and filter out empty lines\n const lines = content.split(\"\\n\").filter(line => line.trim());\n\n // Extract buttons from lines starting with dash\n return lines\n .filter(line => line.trim().startsWith(\"-\"))\n .map(line => ({\n text: line.trim().substring(1).trim(),\n onClick: line.trim().substring(1).trim(), // Using the text as the onClick value for now\n }));\n};\n\nexport default extractActionButtons;\n","// Helper function to extract images with alt text from markdown content\nconst extractImageCarouselImages = (\n content: string\n): { src: string; alt: string }[] => {\n const imageRegex = /!\\[(.*?)\\]\\((.*)\\)/g;\n const images: { src: string; alt: string }[] = [];\n let match;\n\n while ((match = imageRegex.exec(content)) !== null) {\n if (match[1] && match[2]) {\n images.push({\n alt: match[1],\n src: match[2],\n });\n }\n }\n\n return images;\n};\n\nexport default extractImageCarouselImages;\n","// Helper function to extract links from markdown content\nconst extractLinks = (content: string): string[] => {\n const linkRegex = /\\[.*?\\]\\((.*?)\\)/g;\n const urls: string[] = [];\n let match;\n\n while ((match = linkRegex.exec(content)) !== null) {\n if (match[1]) {\n urls.push(match[1]);\n }\n }\n\n return urls;\n};\n\nexport default extractLinks;\n","type ParsedLink = {\n text: string;\n url: string;\n};\n\nexport function extractNavigateProperties(markdown: string): ParsedLink | null {\n const match = markdown.match(/!\\[([^\\]]+)\\]\\(([^)]+)\\)/);\n if (!match) return null;\n\n const [, text, url] = match;\n return { text, url };\n}\n","// Helper function to extract payment link from markdown content\nconst extractPaymentLink = (content: string): string | null => {\n const linkRegex = /\\[.*?\\]\\((.*?)\\)/;\n const match = content.match(linkRegex);\n return match ? match[1] : null;\n};\n\nexport default extractPaymentLink;\n","import { ReactNode } from \"react\";\n\nconst extractTextFromNode = (node: ReactNode): string => {\n if (typeof node === \"string\") {\n return node;\n }\n if (Array.isArray(node)) {\n return node.map(extractTextFromNode).join(\"\");\n }\n if (typeof node === \"object\" && node !== null && \"props\" in node) {\n return extractTextFromNode(node.props.children);\n }\n return \"\";\n};\n\nexport default extractTextFromNode;\n","function ensureNewlineBeforeTripleColons(input: string): string {\n return input.replace(/([^\\n]):::/g, \"$1\\n:::\");\n}\n\n// Parse the special list-item blocks and newlines\nconst parseMessageContent = (\n content: string\n): { type: string; content: string; isComplete?: boolean }[] => {\n // Replace literal \\n with actual newlines\n content = content.replace(/\\\\n/g, \"\\n\");\n\n const blocks = [];\n let currentText = \"\";\n let currentListItem = \"\";\n let currentPayment = \"\";\n let currentActions = \"\";\n let currentImages = \"\";\n let currentLinks = \"\";\n let currentNavigate = \"\";\n let currentDocuments = \"\";\n\n let inListItem = false;\n let inPayment = false;\n let inActions = false;\n let inImages = false;\n let inLinks = false;\n let inNavigate = false;\n let inDocuments = false;\n\n // Split content into lines to process them one by one\n\n // handle navigate formatting which can sometimes be returend as\n // links\\n ![Marriott Bonvoy](https://www.marriott.com)\\n::: ::: navigate\\n![Open Booking Page](/booking?hotelId=lp1c4be&checkin=2025-07-24&checkout=2025-07-26)\\n:::\"\n const formattedContent = ensureNewlineBeforeTripleColons(content);\n const lines = formattedContent.split(\"\\n\");\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // Check for list item start marker\n if (line.trim() === \"::: list-item\" || line.trim() === \":::list-item\") {\n // If we have accumulated text, add it as a text block\n if (currentText.trim()) {\n blocks.push({\n type: \"text\",\n content: currentText.trim(),\n });\n currentText = \"\";\n }\n inListItem = true;\n continue;\n }\n\n // Check for payment start marker\n if (line.trim() === \"::: payment\" || line.trim() === \":::payment\") {\n // If we have accumulated text, add it as a text block\n if (currentText.trim()) {\n blocks.push({\n type: \"text\",\n content: currentText.trim(),\n });\n currentText = \"\";\n }\n inPayment = true;\n continue;\n }\n\n // Check for actions start marker\n if (line.trim() === \"::: actions\" || line.trim() === \":::actions\") {\n // If we have accumulated text, add it as a text block\n if (currentText.trim()) {\n blocks.push({\n type: \"text\",\n content: currentText.trim(),\n });\n currentText = \"\";\n }\n inActions = true;\n continue;\n }\n\n // Check for images start marker\n if (line.trim() === \"::: images\" || line.trim() === \":::images\") {\n // If we have accumulated text, add it as a text block\n if (currentText.trim()) {\n blocks.push({\n type: \"text\",\n content: currentText.trim(),\n });\n currentText = \"\";\n }\n inImages = true;\n continue;\n }\n\n // Check for links start marker\n if (line.trim() === \"::: links\" || line.trim() === \":::links\") {\n // If we have accumulated text, add it as a text block\n if (currentText.trim()) {\n blocks.push({\n type: \"text\",\n content: currentText.trim(),\n });\n currentText = \"\";\n }\n inLinks = true;\n continue;\n }\n\n if (line.trim() === \"::: navigate\" || line.trim() === \":::navigate\") {\n // If we have accumulated text, add it as a text block\n if (currentText.trim()) {\n blocks.push({\n type: \"text\",\n content: currentText.trim(),\n });\n currentText = \"\";\n }\n inNavigate = true;\n continue;\n }\n\n if (line.trim() === \"::: documents\" || line.trim() === \":::documents\") {\n // If we have accumulated text, add it as a text block\n if (currentText.trim()) {\n blocks.push({\n type: \"text\",\n content: currentText.trim(),\n });\n currentText = \"\";\n }\n inDocuments = true;\n continue;\n }\n\n // Check for list item end marker\n if (line.trim() === \":::\" && inListItem) {\n blocks.push({\n type: \"list-item\",\n content: currentListItem.trim(),\n isComplete: true,\n });\n currentListItem = \"\";\n inListItem = false;\n continue;\n }\n\n // Check for payment end marker\n if (line.trim() === \":::\" && inPayment) {\n blocks.push({\n type: \"payment\",\n content: currentPayment.trim(),\n isComplete: true,\n });\n currentPayment = \"\";\n inPayment = false;\n continue;\n }\n\n // Check for actions end marker\n if (line.trim() === \":::\" && inActions) {\n blocks.push({\n type: \"actions\",\n content: currentActions.trim(),\n isComplete: true,\n });\n currentActions = \"\";\n inActions = false;\n continue;\n }\n\n // Check for images end marker\n if (line.trim() === \":::\" && inImages) {\n blocks.push({\n type: \"images\",\n content: currentImages.trim(),\n isComplete: true,\n });\n currentImages = \"\";\n inImages = false;\n continue;\n }\n\n // Check for links end marker\n if (line.trim() === \":::\" && inLinks) {\n blocks.push({\n type: \"links\",\n content: currentLinks.trim(),\n isComplete: true,\n });\n currentLinks = \"\";\n inLinks = false;\n continue;\n }\n\n // Check for navigate end marker\n if (line.trim() === \":::\" && inNavigate) {\n blocks.push({\n type: \"navigate\",\n content: currentNavigate.trim(),\n isComplete: true,\n });\n\n currentNavigate = \"\";\n inNavigate = false;\n continue;\n }\n\n // Check for navigate end marker\n if (line.trim() === \":::\" && inDocuments) {\n blocks.push({\n type: \"documents\",\n content: currentDocuments.trim(),\n isComplete: true,\n });\n\n currentDocuments = \"\";\n inDocuments = false;\n continue;\n }\n\n // If we're in a list item, accumulate the content\n if (inListItem) {\n currentListItem += line + \"\\n\";\n } else if (inPayment) {\n // If we're in a payment block, accumulate the content\n currentPayment += line + \"\\n\";\n } else if (inActions) {\n // If we're in an actions block, accumulate the content\n currentActions += line + \"\\n\";\n } else if (inImages) {\n // If we're in an images block, accumulate the content\n currentImages += line + \"\\n\";\n } else if (inLinks) {\n // If we're in a links block, accumulate the content\n currentLinks += line + \"\\n\";\n } else if (inNavigate) {\n // If we're in a documents block, accumulate the content\n currentNavigate += line + \"\\n\";\n } else if (inDocuments) {\n // If we're in a navigate block, accumulate the content\n currentDocuments += line + \"\\n\";\n } else {\n // If we're not in any special block, accumulate text\n currentText += line + \"\\n\";\n }\n }\n\n // Handle any remaining content\n if (inListItem) {\n // If we're still in a list item, it's incomplete\n blocks.push({\n type: \"list-item\",\n content: currentListItem.trim(),\n isComplete: false,\n });\n } else if (inPayment) {\n // If we're still in a payment block, it's incomplete\n blocks.push({\n type: \"payment\",\n content: currentPayment.trim(),\n isComplete: false,\n });\n } else if (inActions) {\n // If we're still in an actions block, it's incomplete\n blocks.push({\n type: \"actions\",\n content: currentActions.trim(),\n isComplete: false,\n });\n } else if (inImages) {\n // If we're still in an images block, it's incomplete\n blocks.push({\n type: \"images\",\n content: currentImages.trim(),\n isComplete: false,\n });\n } else if (inLinks) {\n // If we're still in a links block, it's incomplete\n blocks.push({\n type: \"links\",\n content: currentLinks.trim(),\n isComplete: false,\n });\n } else if (inNavigate) {\n // If we're still in a navigate block, it's incomplete\n blocks.push({\n type: \"navigate\",\n content: currentNavigate.trim(),\n isComplete: false,\n });\n } else if (inDocuments) {\n // If we're still in a documents block, it's incomplete\n blocks.push({\n type: \"documents\",\n content: currentDocuments.trim(),\n isComplete: false,\n });\n } else if (currentText.trim()) {\n blocks.push({\n type: \"text\",\n content: currentText.trim(),\n });\n }\n\n return blocks;\n};\n\nexport default parseMessageContent;\n","import { useState, useRef, useCallback } from \"react\";\nimport { CarouselImageDialog } from \"../dialogs/CarouselImageDialog\";\n\ntype CarouselImage = { src: string; alt: string };\n\ntype ImageCarouselMessageProps = {\n images: CarouselImage[];\n};\nexport default function ImageCarouselMessage({\n images,\n}: ImageCarouselMessageProps) {\n const [isDialogOpen, setIsDialogOpen] = useState(false);\n const [initialImageIndex, setInitialImageIndex] = useState(0);\n const carouselRef = useRef<HTMLDivElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [startX, setStartX] = useState(0);\n const [scrollLeft, setScrollLeft] = useState(0);\n const [dragDistance, setDragDistance] = useState(0);\n\n const handleMouseDown = useCallback((event: React.MouseEvent) => {\n if (!carouselRef.current) {\n return;\n }\n\n setIsDragging(true);\n setStartX(event.pageX - carouselRef.current.offsetLeft);\n setScrollLeft(carouselRef.current.scrollLeft);\n setDragDistance(0); // Reset drag distance\n\n // Prevent text selection during drag\n event.preventDefault();\n }, []);\n\n const handleMouseMove = useCallback(\n (event: React.MouseEvent) => {\n if (!isDragging || !carouselRef.current) {\n return;\n }\n\n event.preventDefault();\n const x = event.pageX - carouselRef.current.offsetLeft;\n const walk = (x - startX) * 2; // Scroll speed multiplier\n carouselRef.current.scrollLeft = scrollLeft - walk;\n\n // Track the total distance moved\n setDragDistance(Math.abs(x - startX));\n },\n [isDragging, startX, scrollLeft]\n );\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n // Handle image click - only open dialog if we weren't dragging significantly\n const handleImageClick = useCallback(\n (imageIndex: number, event: React.MouseEvent) => {\n // Define a threshold for what constitutes a \"drag\" vs a \"click\"\n const CLICK_THRESHOLD = 5; // pixels\n\n // If we moved more than the threshold, consider it a drag and don't open dialog\n if (dragDistance > CLICK_THRESHOLD) {\n event.preventDefault();\n return;\n }\n\n setInitialImageIndex(imageIndex);\n setIsDialogOpen(true);\n },\n [dragDistance]\n );\n\n const handleDragStart = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n const handleDragOver = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n return (\n <div\n data-testid=\"image-carousel-message\"\n className=\"chat-image-carousel-message lua:w-full\"\n >\n <div\n ref={carouselRef}\n className=\"chat-image-carousel markdown-image-carousel\"\n style={{ cursor: isDragging ? \"grabbing\" : \"grab\" }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseLeave}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n >\n {images.map((image, index) => (\n <div\n key={image.src}\n className=\"chat-carousel-image-item markdown-image-item\"\n onClick={event => handleImageClick(index, event)}\n >\n <img\n src={image.src}\n alt={image.alt}\n draggable={false}\n style={{ userSelect: \"none\" }}\n />\n </div>\n ))}\n </div>\n <CarouselImageDialog\n images={images}\n initialIndex={initialImageIndex}\n open={isDialogOpen}\n onClose={() => setIsDialogOpen(false)}\n />\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { ImageDialog } from \"../dialogs/ImageDialog\";\n\ntype ImageMessageProps = {\n message: {\n url: string;\n content: string;\n isUploading?: boolean;\n uploadProgress?: number;\n };\n};\n\nexport default function ImageMessage({ message }: ImageMessageProps) {\n const [isDialogOpen, setIsDialogOpen] = useState(false);\n\n if (!message.url) {\n return null;\n }\n\n return (\n <div\n data-testid=\"image-message\"\n className=\"chat-image-message lua:flex lua:flex-col lua:w-3/5 lua:mx-4 lua:sm:mx-5\"\n >\n <div className=\"chat-image-container lua:relative\">\n <img\n src={message.url}\n alt={message.content}\n className=\"chat-image lua:rounded-lg lua:w-full lua:cursor-pointer\"\n onClick={() => setIsDialogOpen(true)}\n />\n {message.isUploading && (\n <div className=\"chat-image-upload-overlay lua:absolute lua:inset-0 lua:bg-black lua:bg-opacity-50 lua:rounded-lg lua:flex lua:items-center lua:justify-center\">\n <div className=\"lua:text-white lua:text-sm\">\n Uploading...{\" \"}\n {message.uploadProgress ? Math.round(message.uploadProgress) : 0}%\n </div>\n </div>\n )}\n </div>\n {!message.isUploading && message.content.length > 0 && (\n <div className=\"chat-image-caption lua:w-full lua:bg-gray-100 lua:text-gray-800 lua:rounded-2xl lua:px-4 lua:p-3 lua:mt-8\">\n {message.content}\n </div>\n )}\n\n <ImageDialog\n url={message.url}\n alt={message.content}\n open={isDialogOpen}\n onClose={() => setIsDialogOpen(false)}\n />\n </div>\n );\n}\n","import { Button } from \"luaniverse\";\nimport { useEffect, useState } from \"react\";\n\ntype LinkPreviewProps = {\n url: string;\n luaApiUrl: string;\n authToken: string;\n disablePreviewOnLinks: boolean;\n};\n\nexport default function LinkPreview({\n url,\n luaApiUrl,\n authToken,\n disablePreviewOnLinks,\n}: LinkPreviewProps) {\n const [preview, setPreview] = useState<{\n title: string;\n description: string;\n image: string;\n url: string;\n } | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const fetchPreview = async () => {\n try {\n setLoading(true);\n setError(null);\n\n const token = authToken;\n if (!token) {\n throw new Error(\"No auth token available\");\n }\n\n const response = await fetch(\n `${luaApiUrl}/chat/url-metadata?url=${encodeURIComponent(url)}`,\n {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch preview: ${response.status}`);\n }\n\n const data = await response.json();\n setPreview(data);\n } catch (err) {\n console.error(\"Error fetching link preview:\", err);\n setError(err instanceof Error ? err.message : \"Failed to load preview\");\n } finally {\n setLoading(false);\n }\n };\n\n if (url && luaApiUrl && !disablePreviewOnLinks) {\n fetchPreview();\n }\n }, [url, luaApiUrl]);\n\n if (disablePreviewOnLinks) {\n return (\n <div className=\"lua:mb-5 lua:mx-[-30px]\">\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n <Button variant=\"muted\">{url}</Button>\n </a>\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className=\"lua:animate-pulse\">\n <div className=\"lua:bg-gray-300 lua:h-4 lua:w-3/4 lua:mb-2 lua:rounded\"></div>\n <div className=\"lua:bg-gray-300 lua:h-3 lua:w-1/2 lua:rounded\"></div>\n </div>\n );\n }\n\n if (error || !preview) {\n return (\n <div className=\"lua:mb-5 lua:mx-[-30px]\">\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n <Button variant=\"muted\">{url}</Button>\n </a>\n </div>\n );\n }\n\n return (\n <a\n href={preview.url || url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"lua:block lua:border lua:border-gray-200 lua:rounded-lg lua:p-3 lua:hover:bg-gray-50 lua:transition-colors lua:no-underline lua:max-w-sm\"\n >\n {preview.image && (\n <img\n src={preview.image}\n alt={preview.title}\n className=\"lua:w-full lua:h-32 lua:object-cover lua:rounded lua:mb-2\"\n onError={event => {\n event.currentTarget.style.display = \"none\";\n }}\n />\n )}\n <div className=\"lua:text-sm lua:font-medium lua:text-gray-900 lua:mb-1 lua:line-clamp-2\">\n {preview.title}\n </div>\n {preview.description && (\n <div className=\"lua:text-xs lua:text-gray-600 lua:line-clamp-2\">\n {preview.description}\n </div>\n )}\n <div className=\"lua:text-xs lua:text-gray-400 lua:mt-1 lua:truncate\">\n {new URL(preview.url || url).hostname}\n </div>\n </a>\n );\n}\n","import LinkPreview from \"../previews/LinkPreview\";\n\ntype LinkListMessageProps = {\n links: string[];\n luaApiUrl: string;\n authToken: string;\n disablePreviewOnLinks: boolean;\n};\n\nexport default function LinkListMessage({\n links,\n luaApiUrl,\n authToken,\n disablePreviewOnLinks,\n}: LinkListMessageProps) {\n return (\n <div\n data-testid=\"link-list-message\"\n className=\"chat-link-list-message lua:w-full\"\n >\n <div className=\"chat-links-container lua:space-y-2 lua:mx-4 lua:sm:mx-5\">\n {links.map(url => (\n <LinkPreview\n key={url}\n url={url}\n luaApiUrl={luaApiUrl}\n authToken={authToken}\n disablePreviewOnLinks={disablePreviewOnLinks}\n />\n ))}\n </div>\n </div>\n );\n}\n","import { MapContainer, TileLayer, Marker, Popup } from \"react-leaflet\";\n\ntype LeafletMapProps = {\n location: {\n latitude: number;\n longitude: number;\n address?: string;\n };\n};\n\nexport default function LeafletMap({ location }: LeafletMapProps) {\n const position: [number, number] = [location.latitude, location.longitude];\n\n return (\n <div className=\"lua:w-full lua:h-48 lua:rounded-lg lua:overflow-hidden lua:border lua:border-gray-200\">\n <MapContainer\n center={position}\n zoom={15}\n scrollWheelZoom={false}\n className=\"lua:w-full lua:h-full\"\n >\n <TileLayer\n attribution='&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\n url=\"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\"\n />\n <Marker position={position}>\n {location.address && (\n <Popup>\n <div>{location.address}</div>\n </Popup>\n )}\n </Marker>\n </MapContainer>\n </div>\n );\n}\n\n// CSS for Leaflet should be imported by the consuming application\n// Add to your main CSS or index.html:\n// <link rel=\"stylesheet\" href=\"https://unpkg.com/leaflet@1.9.4/dist/leaflet.css\" />\n","import LeafletMap from \"./LeafletMap\";\n\ntype MapComponentProps = {\n location: {\n latitude: number;\n longitude: number;\n address?: string;\n };\n};\n\nexport default function MapComponent({ location }: MapComponentProps) {\n return (\n <div className=\"lua:w-full lua:h-full lua:bg-gray-200 lua:rounded-lg lua:flex lua:items-center lua:justify-center lua:flex-col\">\n {location.address && <LeafletMap location={location} />}\n </div>\n );\n}\n","import MapComponent from \"./MapComponent\";\n\ntype LocationPreviewProps = {\n location: {\n latitude: number;\n longitude: number;\n address?: string;\n };\n};\n\nexport default function LocationPreview({ location }: LocationPreviewProps) {\n return (\n <div className=\"lua:w-full lua:h-60 lua:rounded-lg\" data-testid=\"location-preview\">\n <MapComponent location={location} />\n </div>\n );\n}\n","import { MapPin } from \"luaniverse\";\nimport LocationPreview from \"../previews/LocationPreview\";\nimport { ChatMessageProps } from \"./ChatMessage\";\n\ntype LocationMessageProps = {\n message: ChatMessageProps;\n};\n\nexport default function LocationMessage({ message }: LocationMessageProps) {\n return (\n <div\n data-testid=\"location-message\"\n className=\"chat-location-message lua:flex lua:flex-col lua:w-11/12 sm:lua:w-3/5 lua:bg-gray-100 lua:text-gray-800 lua:rounded-2xl lua:p-3 lua:mx-4 lua:sm:mx-5\"\n >\n <div className=\"chat-location-preview-container location-preview-container lua:relative\">\n {message.location && <LocationPreview location={message.location} />}\n {message.isUploading && (\n <div className=\"chat-location-upload-overlay lua:absolute lua:inset-0 lua:bg-black lua:bg-opacity-50 lua:rounded-lg lua:flex lua:items-center lua:justify-center\">\n <div className=\"lua:text-white lua:text-sm\">\n Sharing location...\n </div>\n </div>\n )}\n <div className=\"chat-location-info lua:flex lua:items-center lua:gap-2 lua:mt-3\">\n <MapPin fill=\"black\" />\n <div className=\"lua:flex-1\">\n <div className=\"lua:text-sm\">{message.content}</div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport parseUrl from \"../utilities/parseUrl\";\n\ntype NavigateMessageProps = {\n text: string;\n url: string;\n onNavigate?: (\n pathname: string,\n options: { query: Record<string, string> }\n ) => void;\n};\n\nexport function NavigateMessage({ url, onNavigate }: NavigateMessageProps) {\n const [hasNavigated, setHasSetNavigated] = useState(false);\n\n useEffect(() => {\n if (onNavigate && !hasNavigated) {\n setHasSetNavigated(true);\n\n const parsedUrl = parseUrl(url);\n onNavigate(parsedUrl.pathname, {\n ...(parsedUrl.queryParams && { query: parsedUrl.queryParams }),\n });\n }\n }, [hasNavigated, onNavigate]);\n\n return null;\n}\n","type VideoMessageProps = {\n message: {\n url: string;\n content: string;\n isUploading?: boolean;\n uploadProgress?: number;\n };\n};\n\nexport default function VideoMessage({ message }: VideoMessageProps) {\n return (\n <div\n data-testid=\"video-message\"\n className=\"chat-video-message lua:flex lua:flex-col lua:w-3/5 lua:mx-4 lua:sm:mx-5\"\n >\n <div className=\"chat-video-container lua:relative\">\n <video\n src={message.url}\n controls\n className=\"chat-video lua:rounded-lg lua:w-full\"\n />\n {message.isUploading && (\n <div className=\"chat-video-upload-overlay lua:absolute lua:inset-0 lua:bg-black lua:bg-opacity-50 lua:rounded-lg lua:flex lua:items-center lua:justify-center\">\n <div className=\"lua:text-white lua:text-sm\">\n Uploading...{\" \"}\n {message.uploadProgress ? Math.round(message.uploadProgress) : 0}%\n </div>\n </div>\n )}\n </div>\n {!message.isUploading && message.content && (\n <div className=\"chat-video-caption lua:w-full lua:bg-gray-100 lua:text-gray-800 lua:rounded-2xl lua:px-4 lua:p-3 lua:mt-8\">\n {message.content}\n </div>\n )}\n </div>\n );\n}\n","import { memo, ReactNode, useCallback } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport ChatListItemGroup from \"./ChatListItemGroup\";\nimport DocumentsMessage from \"./DocumentsMessage\";\nimport extractDocuments from \"../utilities/extractDocuments\";\n// Note: These utility functions should be provided by the consuming application\n// import { formatMessageTimestamp } from \"../../../utils/date-utils\";\n// import { getFileTypeInfo } from \"../../../utils/file-utils\";\n\n// Temporary implementations - should be replaced with actual utility functions\nfunction formatMessageTimestamp(timestamp: string): string {\n return new Date(timestamp).toLocaleTimeString();\n}\n\nfunction getFileTypeInfo(_file: File): { icon: any } {\n // This is a placeholder - the actual implementation should be provided by the consuming app\n return { icon: () => null };\n}\nimport { AudioPreview } from \"../previews/AudioPreview\";\nimport { PaymentPreview } from \"../previews/PaymentPreview\";\nimport createMarkdownComponents from \"../utilities/createMarkdownComponents\";\nimport extractActionButtons from \"../utilities/extractActionButtons\";\nimport extractImageCarouselImages from \"../utilities/extractImageCarouselImages\";\nimport extractLinks from \"../utilities/extractLinks\";\nimport { extractNavigateProperties } from \"../utilities/extractNavigateProperties\";\nimport extractPaymentLink from \"../utilities/extractPaymentLink\";\nimport extractTextFromNode from \"../utilities/extractTextFromNode\";\nimport parseMessageContent from \"../utilities/parseMessageContent\";\nimport ChatListItem from \"./ChatListItem\";\nimport ImageCarouselMessage from \"./ImageCarouselMessage\";\nimport ImageMessage from \"./ImageMessage\";\nimport LinkListMessage from \"./LinkListMessage\";\nimport LocationMessage from \"./LocationMessage\";\nimport { NavigateMessage } from \"./NavigateMessage\";\nimport VideoMessage from \"./VideoMessage\";\n\nexport type ChatMessageProps = {\n id: string;\n role: \"user\" | \"assistant\";\n content: string;\n type?:\n | \"text\"\n | \"image\"\n | \"video\"\n | \"audio\"\n | \"location\"\n | \"actions\"\n | \"links\"\n | \"tool\"\n | \"payment\"\n | \"file\";\n image?: string;\n video?: string;\n audio?: string;\n mediaType?: string;\n text?: string;\n location?: {\n latitude: number;\n longitude: number;\n address?: string;\n };\n url?: string;\n waitingMessage?: string;\n isUploading?: boolean;\n uploadProgress?: number;\n createdAt: string;\n onSelect?: (text: string) => void;\n luaApiUrl?: string;\n};\n\nexport const ChatMessage = memo(function ChatMessage({\n message,\n onSelect,\n luaApiUrl,\n authToken,\n disablePreviewOnLinks = false,\n onNavigate,\n}: {\n message: ChatMessageProps;\n onSelect?: (text: string) => void;\n luaApiUrl?: string;\n authToken?: string;\n disablePreviewOnLinks?: boolean;\n onNavigate?: (\n pathname: string,\n options: { query: Record<string, string> }\n ) => void;\n}) {\n const handleCardClick = useCallback(\n (content: string) => {\n // Extract the heading (h1) and subheading (h2) from the content\n const headingMatch = content.match(/^#\\s+(.+)$/m);\n const subheadingMatch = content.match(/^##\\s+(.+)$/m);\n\n const heading = headingMatch ? headingMatch[1] : \"\";\n const subheading = subheadingMatch ? subheadingMatch[1] : \"\";\n\n const formattedMessage = `${heading}. ${subheading}`;\n\n if (onSelect) {\n onSelect(formattedMessage);\n }\n },\n [onSelect]\n );\n\n const handleListItemClick = useCallback(\n (content: React.ReactNode) => {\n if (!onSelect) {\n return;\n }\n const text = extractTextFromNode(content).trim();\n onSelect(text);\n },\n [onSelect]\n );\n\n const renderContent = useCallback((): ReactNode => {\n if (message.type === \"location\") {\n return <LocationMessage message={message} />;\n }\n\n if (message.mediaType?.startsWith(\"video\")) {\n if (message.url) {\n return (\n <VideoMessage\n message={{\n url: message.url,\n content: message.content || \"\",\n isUploading: message.isUploading,\n uploadProgress: message.uploadProgress,\n }}\n />\n );\n }\n return null;\n }\n\n if (message.mediaType?.startsWith(\"image\")) {\n if (message.url) {\n return (\n <ImageMessage\n message={{\n url: message.url,\n content: message.content || \"\",\n isUploading: message.isUploading,\n uploadProgress: message.uploadProgress,\n }}\n />\n );\n }\n return null;\n }\n\n if (message.mediaType?.startsWith(\"audio\")) {\n return <AudioPreview message={message} />;\n }\n\n if (message.type === \"file\" && message.mediaType) {\n const fileTypeInfo = getFileTypeInfo(\n new File([], \"\", { type: message.mediaType })\n );\n const Icon = fileTypeInfo.icon;\n\n return (\n <a\n data-testid=\"chat-file-message\"\n href={message.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"chat-file-message lua:mx-4 lua:sm:mx-5\"\n >\n <div className=\"lua:flex lua:flex-col lua:gap-8\">\n <div className=\"chat-file-card lua:flex lua:items-center lua:justify-start lua:p-3 lua:border lua:border-gray-200 lua:rounded-lg lua:bg-white lua:w-80\">\n <Icon className=\"lua:w-12 lua:h-12 lua:text-gray-500\" />\n <div className=\"lua:flex lua:flex-col lua:gap-1 lua:pl-2\">\n File\n <span className=\"lua:text-gray-500 lua:text-sm\">\n {message.mediaType}\n </span>\n </div>\n </div>\n {message.content && (\n <div className=\"chat-file-content lua:bg-gray-100 lua:rounded-2xl lua:px-4 lua:py-2 lua:w-80\">\n <div className=\"lua:text-sm lua:text-gray-900\">\n {message.content}\n </div>\n </div>\n )}\n </div>\n </a>\n );\n }\n\n if (message.role === \"user\") {\n return message.content;\n }\n\n if (message.content === \"...\") {\n return null;\n }\n\n const blocks = parseMessageContent(message.content);\n const markdownComponents = createMarkdownComponents(handleListItemClick);\n\n return (\n <div className=\"chat-markdown-content lua:prose lua:prose-sm lua:max-w-none\">\n <div className=\"lua:flex lua:flex-wrap lua:gap-4\">\n {(() => {\n const listItemBlocks = blocks.filter(b => b.type === \"list-item\");\n const hasListItemSequence = listItemBlocks.length > 1;\n\n if (hasListItemSequence) {\n // Group consecutive list items together\n const groupedBlocks: (typeof blocks)[] = [];\n let currentGroup: typeof blocks = [];\n\n blocks.forEach(block => {\n if (block.type === \"list-item\") {\n currentGroup.push(block);\n } else {\n if (currentGroup.length > 0) {\n groupedBlocks.push(currentGroup);\n currentGroup = [];\n }\n groupedBlocks.push([block]);\n }\n });\n\n if (currentGroup.length > 0) {\n groupedBlocks.push(currentGroup);\n }\n\n return groupedBlocks.map((group, groupIndex) => {\n if (group.length > 1 && group[0].type === \"list-item\") {\n return (\n <ChatListItemGroup\n key={groupIndex}\n group={group}\n onCardClick={handleCardClick}\n onListItemClick={handleListItemClick}\n onNavigate={onNavigate}\n />\n );\n }\n\n return group.map((block, blockIndex) => {\n if (block.type === \"list-item\") {\n return (\n <ChatListItem\n key={blockIndex}\n block={block}\n onCardClick={handleCardClick}\n onListItemClick={handleListItemClick}\n onNavigate={onNavigate}\n />\n );\n }\n\n if (block.type === \"actions\") {\n const buttons = extractActionButtons(block.content);\n if (buttons.length > 0 && block.isComplete) {\n return null;\n }\n return null;\n }\n\n if (block.type === \"images\") {\n const images = extractImageCarouselImages(block.content);\n if (images.length > 0) {\n return (\n <ImageCarouselMessage\n key={blockIndex}\n images={images}\n />\n );\n }\n }\n\n if (block.type === \"links\") {\n const links = extractLinks(block.content);\n if (links.length > 0 && block.isComplete) {\n return (\n <LinkListMessage\n key={blockIndex}\n links={links}\n luaApiUrl={luaApiUrl || \"\"}\n authToken={authToken || \"\"}\n disablePreviewOnLinks={disablePreviewOnLinks}\n />\n );\n }\n return null;\n }\n\n if (block.type === \"navigate\") {\n const navigateProperties = extractNavigateProperties(\n block.content\n );\n\n if (navigateProperties && block.isComplete) {\n return (\n <NavigateMessage\n key={blockIndex}\n text={navigateProperties.text}\n url={navigateProperties.url}\n onNavigate={onNavigate}\n />\n );\n }\n return null;\n }\n\n if (block.type === \"documents\") {\n const documents = extractDocuments(block.content);\n\n return (\n <DocumentsMessage\n key={blockIndex}\n documents={documents}\n />\n );\n }\n\n if (block.type === \"payment\") {\n const paymentLink = extractPaymentLink(block.content);\n if (paymentLink) {\n return (\n <div\n key={blockIndex}\n className=\"chat-payment-message lua:w-full lua:mx-4 lua:sm:mx-5\"\n >\n <PaymentPreview url={paymentLink} />\n </div>\n );\n }\n return null;\n }\n\n return (\n <div\n key={blockIndex}\n className=\"chat-markdown-block lua:w-full\"\n >\n <ReactMarkdown components={markdownComponents}>\n {block.content}\n </ReactMarkdown>\n </div>\n );\n });\n });\n }\n\n return blocks.map((block, blockIndex) => {\n if (block.type === \"list-item\") {\n return (\n <ChatListItem\n key={blockIndex}\n block={block}\n onCardClick={handleCardClick}\n onListItemClick={handleListItemClick}\n onNavigate={onNavigate}\n />\n );\n }\n\n if (block.type === \"actions\") {\n const buttons = extractActionButtons(block.content);\n if (buttons.length > 0 && block.isComplete) {\n return null;\n }\n return null;\n }\n\n if (block.type === \"images\") {\n const images = extractImageCarouselImages(block.content);\n if (images.length > 0) {\n return (\n <ImageCarouselMessage key={blockIndex} images={images} />\n );\n }\n }\n\n if (block.type === \"navigate\") {\n const navigateProperties = extractNavigateProperties(\n block.content\n );\n\n if (navigateProperties && block.isComplete) {\n return (\n <NavigateMessage\n key={blockIndex}\n text={navigateProperties.text}\n url={navigateProperties.url}\n onNavigate={onNavigate}\n />\n );\n }\n return null;\n }\n\n if (block.type === \"documents\") {\n const documents = extractDocuments(block.content);\n\n return (\n <DocumentsMessage key={blockIndex} documents={documents} />\n );\n }\n\n if (block.type === \"links\") {\n const links = extractLinks(block.content);\n if (links.length > 0 && block.isComplete) {\n return (\n <LinkListMessage\n key={blockIndex}\n links={links}\n luaApiUrl={luaApiUrl || \"\"}\n authToken={authToken || \"\"}\n disablePreviewOnLinks={disablePreviewOnLinks}\n />\n );\n }\n return null;\n }\n\n if (block.type === \"payment\") {\n const paymentLink = extractPaymentLink(block.content);\n if (paymentLink) {\n return (\n <div\n key={blockIndex}\n className=\"chat-payment-message lua:w-full lua:mx-4 lua:sm:mx-5 lua:mb-5\"\n >\n <PaymentPreview url={paymentLink} />\n </div>\n );\n }\n return null;\n }\n\n return (\n <div\n key={blockIndex}\n className=\"chat-markdown-block lua:w-full\"\n >\n <ReactMarkdown components={markdownComponents}>\n {block.content}\n </ReactMarkdown>\n </div>\n );\n });\n })()}\n </div>\n </div>\n );\n }, [message, handleCardClick, handleListItemClick]);\n\n return (\n <div\n className={`chat-message-container lua:flex lua:flex-col ${\n message.role === \"user\" ? \"lua:items-end\" : \"lua:items-start\"\n } lua:gap-1`}\n >\n <div\n className={`lua:flex ${\n message.role === \"user\" ? \"lua:justify-end\" : \"lua:justify-start\"\n } lua:items-start lua:gap-2 lua:w-full`}\n >\n {![\"file\", \"image\", \"video\", \"tool\", \"location\"].includes(\n message.type || \"\"\n ) &&\n message.content !== \"...\" && (\n <div\n className={`chat-message-bubble ${\n message.role === \"user\"\n ? \"chat-message-bubble-user lua:max-w-full md:lua:max-w-3/5 lua:bg-gray-100 lua:text-gray-800 lua:rounded-2xl lua:px-4 lua:py-3 lua:mx-4 lua:sm:mx-5 lua:whitespace-pre-wrap\"\n : \"chat-message-bubble-agent lua:w-full lua:bg-white lua:text-gray-800 lua:rounded-lg lua:py-3 lua:rounded-bl-none\"\n }`}\n style={{ wordBreak: \"break-word\" }}\n >\n {renderContent()}\n </div>\n )}\n {[\"file\", \"image\", \"video\", \"location\"].includes(message.type || \"\") &&\n renderContent()}\n </div>\n\n {/* Message timestamp */}\n <div\n className={`lua-message-timestamp lua:text-xs lua:text-gray-400 lua:px-1 ${\n message.role === \"user\"\n ? \"lua:mr-4 sm:lua:mr-5\"\n : \"lua:ml-4 sm:lua:ml-5\"\n }`}\n >\n {formatMessageTimestamp(message.createdAt)}\n </div>\n </div>\n );\n});\n","import {\n createContext,\n useContext,\n useState,\n ReactNode,\n useEffect,\n useCallback,\n} from \"react\";\n\ntype Message = {\n id: string;\n role: \"user\" | \"assistant\";\n content: string;\n type?: \"text\" | \"image\" | \"video\" | \"audio\" | \"location\" | \"tool\" | \"file\";\n url?: string;\n image?: string;\n video?: string;\n audio?: string;\n location?: {\n latitude: number;\n longitude: number;\n address?: string;\n };\n waitingMessage?: string;\n isUploading?: boolean;\n createdAt: string;\n data?: string;\n mediaType?: string;\n uploadProgress?: number;\n};\n\ntype LoadingMessage = string | null;\n\n// Split context into multiple contexts to avoid unnecessary re-renders\nconst MessagesContext = createContext<\n | {\n messages: Message[];\n setMessages: React.Dispatch<React.SetStateAction<Message[]>>;\n }\n | undefined\n>(undefined);\n\nconst InputContext = createContext<\n | {\n inputMessage: string;\n setInputMessage: React.Dispatch<React.SetStateAction<string>>;\n }\n | undefined\n>(undefined);\n\nconst LoadingContext = createContext<\n | {\n loadingMessage: LoadingMessage | null;\n setLoadingMessage: React.Dispatch<\n React.SetStateAction<LoadingMessage | null>\n >;\n }\n | undefined\n>(undefined);\n\nconst UnreadContext = createContext<\n | {\n hasUnreadMessages: boolean;\n setHasUnreadMessages: React.Dispatch<React.SetStateAction<boolean>>;\n }\n | undefined\n>(undefined);\n\nconst FileUrlContext = createContext<\n | {\n getFileUrl: (file: File) => string;\n removeFileUrl: (file: File) => void;\n }\n | undefined\n>(undefined);\n\ntype ChatContextType = {\n messages: Message[];\n setMessages: React.Dispatch<React.SetStateAction<Message[]>>;\n inputMessage: string;\n setInputMessage: React.Dispatch<React.SetStateAction<string>>;\n loadingMessage: LoadingMessage | null;\n setLoadingMessage: React.Dispatch<\n React.SetStateAction<LoadingMessage | null>\n >;\n hasUnreadMessages: boolean;\n setHasUnreadMessages: React.Dispatch<React.SetStateAction<boolean>>;\n getFileUrl: (file: File) => string;\n removeFileUrl: (file: File) => void;\n};\n\nexport function ChatProvider({ children }: { children: ReactNode }) {\n const [messages, setMessages] = useState<Message[]>([]);\n const [inputMessage, setInputMessage] = useState(\"\");\n const [loadingMessage, setLoadingMessage] = useState<LoadingMessage | null>(\n null\n );\n const [hasUnreadMessages, setHasUnreadMessages] = useState(false);\n const [fileUrls] = useState(new Map<File, string>());\n\n const getFileUrl = useCallback(\n (file: File) => {\n if (!fileUrls.has(file)) {\n const url = URL.createObjectURL(file);\n fileUrls.set(file, url);\n }\n return fileUrls.get(file)!;\n },\n [fileUrls]\n );\n\n const removeFileUrl = useCallback(\n (file: File) => {\n const url = fileUrls.get(file);\n if (url) {\n URL.revokeObjectURL(url);\n fileUrls.delete(file);\n }\n },\n [fileUrls]\n );\n\n // Clean up any blob URLs when messages change\n useEffect(() => {\n return () => {\n messages.forEach(message => {\n if (message.url && message.url.startsWith(\"blob:\")) {\n URL.revokeObjectURL(message.url);\n }\n });\n // Clean up all file URLs when the provider unmounts\n fileUrls.forEach(url => URL.revokeObjectURL(url));\n };\n }, [messages, fileUrls]);\n\n return (\n <MessagesContext.Provider value={{ messages, setMessages }}>\n <InputContext.Provider value={{ inputMessage, setInputMessage }}>\n <LoadingContext.Provider\n value={{\n loadingMessage,\n setLoadingMessage,\n }}\n >\n <UnreadContext.Provider\n value={{\n hasUnreadMessages,\n setHasUnreadMessages,\n }}\n >\n <FileUrlContext.Provider value={{ getFileUrl, removeFileUrl }}>\n {children}\n </FileUrlContext.Provider>\n </UnreadContext.Provider>\n </LoadingContext.Provider>\n </InputContext.Provider>\n </MessagesContext.Provider>\n );\n}\n\n// Specific context hooks\nexport function useMessages() {\n const context = useContext(MessagesContext);\n if (context === undefined) {\n throw new Error(\"useMessages must be used within a ChatProvider\");\n }\n return context;\n}\n\nexport function useInput() {\n const context = useContext(InputContext);\n if (context === undefined) {\n throw new Error(\"useInput must be used within a ChatProvider\");\n }\n return context;\n}\n\nexport function useLoadingMessage() {\n const context = useContext(LoadingContext);\n if (context === undefined) {\n throw new Error(\"useLoadingMessage must be used within a ChatProvider\");\n }\n return context;\n}\n\nexport function useFileUrls() {\n const context = useContext(FileUrlContext);\n if (context === undefined) {\n throw new Error(\"useFileUrls must be used within a ChatProvider\");\n }\n return context;\n}\n\nexport function useUnreadMessages() {\n const context = useContext(UnreadContext);\n if (context === undefined) {\n throw new Error(\"useUnreadMessages must be used within a ChatProvider\");\n }\n return context;\n}\n\n// Combined hook for backward compatibility\nexport function useChat(): ChatContextType {\n const messagesContext = useContext(MessagesContext);\n const inputContext = useContext(InputContext);\n const loadingContext = useContext(LoadingContext);\n const unreadContext = useContext(UnreadContext);\n const fileUrlContext = useContext(FileUrlContext);\n\n if (\n messagesContext === undefined ||\n inputContext === undefined ||\n loadingContext === undefined ||\n unreadContext === undefined ||\n fileUrlContext === undefined\n ) {\n throw new Error(\"useChat must be used within a ChatProvider\");\n }\n\n return {\n ...messagesContext,\n ...inputContext,\n ...loadingContext,\n ...unreadContext,\n ...fileUrlContext,\n };\n}\n","import { Logo } from \"luaniverse\";\nimport { useChat } from \"../../contexts/ChatContext\";\n\nexport function LoadingMessage() {\n const { loadingMessage } = useChat();\n\n if (!loadingMessage) {\n return null;\n }\n\n const displayMessage = loadingMessage || \"Lua is typing...\";\n\n return (\n <div className=\"chat-loading-message lua:flex lua:items-center lua:gap-2 lua:mx-4 lua:sm:mx-5\">\n <Logo\n size={24}\n className=\"chat-loading-logo lua:w-6 lua:h-6 lua:rounded-full lua:flex-shrink-0 lua:animate-spin\"\n style={{ animationDuration: \"3s\" }}\n />\n <div className=\"chat-loading-text lua:text-sm lua:opacity-40\">\n {displayMessage}\n </div>\n </div>\n );\n}\n","import { Button } from \"luaniverse\";\nimport { ActionButton } from \"../../types/chat\";\n\ntype ActionMessageProps = {\n buttons: ActionButton[];\n onClick: (text: string) => void;\n};\n\nexport function ActionMessage({ buttons, onClick }: ActionMessageProps) {\n return (\n <div className=\"chat-action-message lua:w-full\">\n <div className=\"chat-action-buttons lua:flex lua:gap-2 lua:flex-wrap lua:mx-4 lua:sm:mx-5\">\n {buttons.map((button: ActionButton, index: number) => (\n <Button\n key={index}\n variant=\"tertiary\"\n className=\"chat-action-button lua:font-normal lua:rounded-lg lua:py-2 lua:h-auto\"\n onClick={() => onClick(button.text)}\n >\n {button.text}\n </Button>\n ))}\n </div>\n </div>\n );\n}\n","import { ActionButton } from \"../../types/chat\";\n\nexport const parseActions = (content: string): ActionButton[] => {\n const actionStartMarker = \"::: actions\";\n const actionEndMarker = \":::\";\n\n const startIndex = content.indexOf(actionStartMarker);\n\n if (startIndex === -1) return [];\n\n const endIndex = content.indexOf(\n actionEndMarker,\n startIndex + actionStartMarker.length\n );\n\n if (endIndex === -1) return [];\n\n const actionContent = content\n .slice(startIndex + actionStartMarker.length, endIndex)\n .trim();\n\n // Handle escaped newlines and split by actual newlines\n const lines = actionContent\n .replace(/\\\\n/g, \"\\n\") // Replace escaped newlines with actual newlines\n .split(\"\\n\");\n\n const trimmedLines = lines.map(line => line.trim());\n\n const filteredLines = trimmedLines.filter(\n line => line && line.startsWith(\"-\")\n );\n\n const buttons = filteredLines.map(line => ({\n text: line.replace(/^-[\\s]?/, \"\").trim(),\n onClick: line.replace(/^-[\\s]?/, \"\").trim(),\n }));\n\n return buttons;\n};\n","import { useChat } from \"../../contexts/ChatContext\";\nimport { parseActions } from \"../utilities/parseActions\";\nimport { ActionMessage } from \"./ActionMessage\";\n\ntype ChatActions = {\n onSelect: (text: string) => void;\n};\n\nexport function ChatActions({ onSelect }: ChatActions) {\n const { messages } = useChat();\n if (messages.length === 0) {\n return null;\n }\n\n const lastMessage = messages[messages.length - 1];\n const actions = parseActions(lastMessage.content);\n\n return actions.length === 0 ? null : (\n <ActionMessage buttons={actions} onClick={onSelect} />\n );\n}\n","import { Logo } from \"luaniverse\";\nimport { memo, useCallback, useEffect, useRef, useState } from \"react\";\nimport { useInput } from \"../../contexts/ChatContext\";\n\ntype ChatInputProps = {\n loading: boolean;\n disabled: boolean;\n onSend: () => void;\n onFilePaste?: (files: File[]) => void;\n};\n\nconst ChatInput = memo(function ChatInput({\n onSend,\n disabled = false,\n onFilePaste,\n}: ChatInputProps) {\n const { inputMessage, setInputMessage } = useInput();\n const [isMobile, setIsMobile] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // Detect if user is on mobile\n useEffect(() => {\n const checkMobile = () => {\n setIsMobile(\n window.matchMedia(\"(max-width: 768px)\").matches ||\n /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n )\n );\n };\n\n checkMobile();\n window.addEventListener(\"resize\", checkMobile);\n\n return () => {\n window.removeEventListener(\"resize\", checkMobile);\n };\n }, []);\n\n // Handle chat input height\n useEffect(() => {\n const textarea = textareaRef.current;\n if (!textarea) {\n return;\n }\n\n if (!disabled) {\n textarea.style.height = \"auto\";\n textarea.style.height = `${textarea.scrollHeight}px`;\n }\n }, [inputMessage]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === \"Enter\") {\n // On mobile, always allow new line on Enter\n if (isMobile) {\n return;\n }\n\n // On desktop: If Shift or Command/Ctrl is pressed with Enter, allow new line\n if (event.shiftKey || event.metaKey || event.ctrlKey) {\n return;\n }\n\n // Otherwise on desktop, prevent default (which would add a new line) and send message\n event.preventDefault();\n onSend();\n }\n };\n\n // Handle clipboard paste events\n const handlePaste = useCallback(\n (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n // Check if the clipboard contains files\n const { items } = event.clipboardData;\n\n if (!items || !onFilePaste) {\n return;\n }\n\n const files: File[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n\n // Check if the clipboard item is a file\n if (item.kind === \"file\") {\n const file = item.getAsFile();\n if (file) {\n files.push(file);\n }\n }\n }\n\n // If we have files, pass them to the parent component\n if (files.length > 0) {\n event.preventDefault(); // Prevent default paste behavior when we have files\n onFilePaste(files);\n }\n },\n [onFilePaste]\n );\n\n return (\n <div className=\"lua:flex lua:gap-3 lua:py-2 lua:px-3 lua:items-start\">\n <Logo\n size={32}\n className=\"lua:w-8 lua:h-8 lua:rounded-full lua:flex-shrink-0 lua:m-1\"\n />\n\n <div className=\"lua:flex-1 lua:flex\">\n <textarea\n ref={textareaRef}\n disabled={disabled}\n value={inputMessage}\n onChange={event => setInputMessage(event.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={\n disabled\n ? \"This conversation's chat window has already been closed\"\n : \"Reply to user\"\n }\n className={`lua:w-full lua:pl-0 lua:pr-4 lua:py-2 lua:resize-none lua:overflow-y-auto lua:border-none lua:focus:outline-none lua:focus:ring-0 lua:text-gray-700 lua:min-h-10 lua:max-h-48 lua:bg-white${\n disabled ? \" lua:cursor-not-allowed lua:h-14\" : \"\"\n }`}\n rows={1}\n />\n </div>\n </div>\n );\n});\n\nexport { ChatInput };\n","function getAuthToken(): string | null {\n return localStorage.getItem(\"authToken\");\n}\n\nexport async function uploadFile(\n file: File,\n cdnUrl: string,\n onProgress?: (progress: number) => void\n): Promise<{ fileId: string }> {\n const token = getAuthToken();\n if (!token) {\n throw new Error(\"No auth token found\");\n }\n\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n const formData = new FormData();\n formData.append(\"file\", file);\n\n xhr.upload.addEventListener(\"progress\", event => {\n if (event.lengthComputable && onProgress) {\n const progress = (event.loaded / event.total) * 100;\n onProgress(progress);\n }\n });\n\n xhr.addEventListener(\"load\", () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const response = JSON.parse(xhr.responseText);\n resolve(response);\n } catch {\n reject(new Error(`Failed to parse response`));\n }\n } else {\n reject(new Error(`Failed to upload file: ${xhr.status}`));\n }\n });\n\n xhr.addEventListener(\"error\", () => {\n reject(new Error(\"Network error occurred\"));\n });\n\n xhr.open(\"POST\", `${cdnUrl}/upload`);\n xhr.setRequestHeader(\"Authorization\", `Bearer ${token}`);\n xhr.send(formData);\n });\n}\n","import { XIcon } from \"luaniverse\";\nimport { useEffect, useRef, useState } from \"react\";\n\n// Note: This utility function should be provided by the consuming application\n// import { getFileTypeInfo } from \"../../../utils/file-utils\";\n\n// Temporary implementation - should be replaced with actual utility function\nfunction getFileTypeInfo(file: File): { icon: any; label: string } {\n // This is a placeholder - the actual implementation should be provided by the consuming app\n const mediaType = file.type;\n let label = \"File\";\n\n if (mediaType.startsWith(\"image/\")) {\n label = \"Image\";\n } else if (mediaType.startsWith(\"video/\")) {\n label = \"Video\";\n } else if (mediaType.startsWith(\"audio/\")) {\n label = \"Audio\";\n }\n\n return {\n icon: () => null,\n label,\n };\n}\n\nimport { uploadFile } from \"../../services/chatApi\";\n\ntype FilePreviewCardProps = {\n file: File;\n onRemove: () => void;\n cdnUrl: string;\n initialUrl?: string;\n onUploadComplete?: (file: File, url: string) => void;\n};\n\nexport function FilePreviewCard({\n file,\n onRemove,\n cdnUrl,\n initialUrl,\n onUploadComplete,\n}: FilePreviewCardProps) {\n const fileTypeInfo = getFileTypeInfo(file);\n const Icon = fileTypeInfo.icon;\n const [isUploading, setIsUploading] = useState(false);\n const [uploadProgress, setUploadProgress] = useState(0);\n const [uploadedUrl, setUploadedUrl] = useState<string | null>(\n initialUrl || null\n );\n const uploadAttempted = useRef(false);\n\n // Start upload when component mounts\n useEffect(() => {\n // Skip upload if we already have a URL or have already attempted\n if (uploadedUrl || uploadAttempted.current) {\n return;\n }\n\n const doUpload = async () => {\n setIsUploading(true);\n uploadAttempted.current = true;\n\n try {\n const { fileId } = await uploadFile(file, cdnUrl, progress => {\n setUploadProgress(progress);\n });\n\n const url = `${cdnUrl}/${fileId}`;\n setUploadedUrl(url);\n setIsUploading(false);\n\n // Notify parent component about the successful upload\n if (onUploadComplete) {\n onUploadComplete(file, url);\n }\n } catch (error) {\n console.error(\"Upload failed for file:\", file.name, error);\n setIsUploading(false);\n uploadAttempted.current = false; // Allow retry on failure\n }\n };\n\n doUpload();\n }, [file, cdnUrl, onUploadComplete, uploadedUrl]);\n\n return (\n <div className=\"lua:flex lua:items-center lua:gap-4 lua:p-3 lua:bg-white lua:border lua:border-gray-200 lua:rounded-lg\">\n <div className=\"lua:flex-shrink-0\">\n {isUploading ? (\n <div className=\"lua:w-8 lua:h-8 lua:flex lua:flex-col lua:items-center lua:justify-center\">\n <div className=\"lua:w-6 lua:h-6 lua:border-2 lua:border-t-blue-500 lua:border-r-transparent lua:border-b-transparent lua:border-l-transparent lua:rounded-full lua:animate-spin\" />\n <div className=\"lua:mt-1 lua:text-xs lua:text-gray-600 lua:font-medium\">\n {Math.round(uploadProgress)}%\n </div>\n </div>\n ) : (\n <Icon className=\"lua:w-8 lua:h-8 lua:text-gray-600\" />\n )}\n </div>\n <div className=\"lua:flex-grow lua:min-w-0\">\n <p className=\"lua:text-sm lua:font-medium lua:text-gray-900 lua:truncate\">\n {file.name}\n </p>\n <p className=\"lua:text-xs lua:text-gray-500\">{fileTypeInfo.label}</p>\n </div>\n <button\n onClick={onRemove}\n className=\"lua:flex-shrink-0 lua:w-6 lua:h-6 lua:flex lua:items-center lua:justify-center lua:rounded-full lua:bg-black lua:text-white lua:hover:bg-gray-800 lua:transition-colors\"\n >\n <XIcon className=\"lua:w-4 lua:h-4\" />\n </button>\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useChat } from \"../../contexts/ChatContext\";\nimport { uploadFile } from \"../../services/chatApi\";\n\ntype ToolbarImagePreviewProps = {\n file: File;\n onRemove: () => void;\n cdnUrl: string;\n initialUrl?: string;\n onUploadComplete?: (file: File, url: string) => void;\n};\n\nexport default function ToolbarImagePreview({\n file,\n onRemove,\n cdnUrl,\n initialUrl,\n onUploadComplete,\n}: ToolbarImagePreviewProps) {\n const { getFileUrl } = useChat();\n const [isUploading, setIsUploading] = useState(false);\n const [uploadProgress, setUploadProgress] = useState(0);\n const [uploadedUrl, setUploadedUrl] = useState<string | null>(\n initialUrl || null\n );\n const [hasAttemptedUpload, setHasAttemptedUpload] = useState(false);\n\n // Start upload when component mounts\n useEffect(() => {\n // Skip upload if we already have a URL or have already attempted\n if (initialUrl || hasAttemptedUpload) {\n return;\n }\n\n const doUpload = async () => {\n setIsUploading(true);\n setHasAttemptedUpload(true);\n\n try {\n const { fileId } = await uploadFile(file, cdnUrl, progress => {\n setUploadProgress(progress);\n });\n\n const url = `${cdnUrl}/${fileId}`;\n setUploadedUrl(url);\n setIsUploading(false);\n\n // Notify parent component about the successful upload\n if (onUploadComplete) {\n onUploadComplete(file, url);\n }\n } catch (error) {\n console.error(\"Upload failed:\", error);\n setIsUploading(false);\n }\n };\n\n doUpload();\n }, [file, initialUrl, cdnUrl, hasAttemptedUpload, onUploadComplete]);\n\n // Use either the uploaded URL or the file preview\n const imageUrl = uploadedUrl || (!isUploading ? getFileUrl(file) : undefined);\n\n return (\n <div className=\"lua:relative lua:flex-shrink-0\">\n {isUploading ? (\n <div className=\"lua:w-32 lua:h-32 lua:bg-gray-100 lua:rounded-lg lua:flex lua:flex-col lua:items-center lua:justify-center\">\n <div className=\"lua:w-8 lua:h-8 lua:border-2 lua:border-t-blue-500 lua:border-r-transparent lua:border-b-transparent lua:border-l-transparent lua:rounded-full lua:animate-spin\" />\n <div className=\"lua:mt-2 lua:text-xs lua:text-gray-600 lua:font-medium\">\n {Math.round(uploadProgress)}%\n </div>\n </div>\n ) : imageUrl ? (\n <img\n data-testid=\"image-thumbnail\"\n src={imageUrl}\n alt={file.name}\n className=\"lua:w-32 lua:h-32 lua:object-cover lua:rounded-lg\"\n />\n ) : (\n <div className=\"lua:w-32 lua:h-32 lua:bg-gray-200 lua:rounded-lg lua:flex lua:items-center lua:justify-center\">\n <span className=\"lua:text-gray-500\">No preview</span>\n </div>\n )}\n <div className=\"lua:absolute lua:bottom-1 lua:left-1 lua:px-1.5 lua:py-0.5 lua:rounded lua:bg-black/50 lua:text-white lua:text-xs\">\n {Math.floor(file.size / 1024 / 1024)}MB\n </div>\n <button\n onClick={() => onRemove()}\n className=\"lua:absolute lua:top-1 lua:right-1 lua:w-6 lua:h-6 lua:flex lua:items-center lua:justify-center lua:rounded-full lua:bg-black lua:text-white lua:hover:bg-gray-800 lua:transition-colors\"\n >\n <span className=\"lua:text-sm\">×</span>\n </button>\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\n\nimport { useChat } from \"../../contexts/ChatContext\";\nimport { uploadFile } from \"../../services/chatApi\";\n\ntype ToolbarVideoPreviewProps = {\n file: File;\n onRemove: () => void;\n cdnUrl: string;\n initialUrl?: string;\n thumbnailUrl?: string;\n onUploadComplete?: (file: File, url: string) => void;\n};\n\nexport default function ToolbarVideoPreview({\n file,\n onRemove,\n cdnUrl,\n initialUrl,\n thumbnailUrl,\n onUploadComplete,\n}: ToolbarVideoPreviewProps) {\n const { getFileUrl } = useChat();\n const [isUploading, setIsUploading] = useState(false);\n const [uploadProgress, setUploadProgress] = useState(0);\n const [uploadedUrl, setUploadedUrl] = useState<string | null>(\n initialUrl || null\n );\n const [hasAttemptedUpload, setHasAttemptedUpload] = useState(false);\n const [videoThumbnail, setVideoThumbnail] = useState<string | null>(\n thumbnailUrl || null\n );\n\n // Generate thumbnail if not provided\n useEffect(() => {\n if (!thumbnailUrl && !videoThumbnail) {\n const videoUrl = getFileUrl(file);\n const video = document.createElement(\"video\");\n video.src = videoUrl;\n\n const handleCanPlay = () => {\n try {\n // Seek to the first frame\n video.currentTime = 0;\n\n // Wait a bit for the frame to be ready\n setTimeout(() => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n console.error(\"Could not get canvas context\");\n return;\n }\n\n // Draw the video frame\n ctx.drawImage(video, 0, 0);\n\n const generatedThumbnail = canvas.toDataURL(\"image/jpeg\", 0.8);\n setVideoThumbnail(generatedThumbnail);\n }, 100);\n } catch (error) {\n console.error(\"Error generating thumbnail:\", error);\n } finally {\n URL.revokeObjectURL(videoUrl);\n video.removeEventListener(\"canplay\", handleCanPlay);\n }\n };\n\n video.addEventListener(\"canplay\", handleCanPlay);\n video.load();\n }\n }, [file, thumbnailUrl, videoThumbnail]);\n\n // Start upload when component mounts\n useEffect(() => {\n // Skip upload if we already have a URL or have already attempted\n if (initialUrl || hasAttemptedUpload) {\n return;\n }\n\n const doUpload = async () => {\n setIsUploading(true);\n setHasAttemptedUpload(true);\n\n try {\n const { fileId } = await uploadFile(file, cdnUrl, progress => {\n setUploadProgress(progress);\n });\n\n const url = `${cdnUrl}/${fileId}`;\n setUploadedUrl(url);\n setIsUploading(false);\n\n // Notify parent component about the successful upload\n if (onUploadComplete) {\n onUploadComplete(file, url);\n }\n } catch (error) {\n console.error(\"Upload failed:\", error);\n setIsUploading(false);\n }\n };\n\n doUpload();\n }, [file, initialUrl, cdnUrl, hasAttemptedUpload, onUploadComplete]);\n\n return (\n <div className=\"lua:relative lua:flex-shrink-0\">\n {isUploading ? (\n <div className=\"lua:w-32 lua:h-32 lua:bg-gray-100 lua:rounded-lg lua:flex lua:flex-col lua:items-center lua:justify-center\">\n <div className=\"lua:w-8 lua:h-8 lua:border-2 lua:border-t-blue-500 lua:border-r-transparent lua:border-b-transparent lua:border-l-transparent lua:rounded-full lua:animate-spin\" />\n <div className=\"lua:mt-2 lua:text-xs lua:text-gray-600 lua:font-medium\">\n {Math.round(uploadProgress)}%\n </div>\n </div>\n ) : (\n <div className=\"lua:relative\">\n <img\n data-testid=\"video-thumbnail\"\n src={\n videoThumbnail ||\n uploadedUrl ||\n \"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n }\n alt={file.name}\n className=\"lua:w-32 lua:h-32 lua:object-cover lua:rounded-lg lua:bg-gray-100\"\n />\n <div className=\"lua:absolute lua:inset-0 lua:flex lua:items-center lua:justify-center\">\n <div className=\"lua:w-10 lua:h-10 lua:rounded-full lua:bg-black/50 lua:flex lua:items-center lua:justify-center\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M5 3L19 12L5 21V3Z\" fill=\"white\" />\n </svg>\n </div>\n </div>\n </div>\n )}\n <div className=\"lua:absolute lua:bottom-1 lua:left-1 lua:px-1.5 lua:py-0.5 lua:rounded lua:bg-black/50 lua:text-white lua:text-xs\">\n {Math.floor(file.size / 1024 / 1024)}MB\n </div>\n <button\n onClick={() => onRemove()}\n className=\"lua:absolute lua:top-1 lua:right-1 lua:w-6 lua:h-6 lua:flex lua:items-center lua:justify-center lua:rounded-full lua:bg-black lua:text-white lua:hover:bg-gray-800 lua:transition-colors\"\n >\n <span className=\"lua:text-sm\">×</span>\n </button>\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\n// Note: This utility function should be provided by the consuming application\n// import { getFileTypeInfo } from \"../../../utils/file-utils\";\n\n// Temporary implementation - should be replaced with actual utility function\nfunction getFileTypeInfo(file: File): { category: string; icon: any; label: string } {\n // This is a placeholder - the actual implementation should be provided by the consuming app\n const mediaType = file.type;\n let category = 'other';\n let label = 'File';\n \n if (mediaType.startsWith('image/')) {\n category = 'image';\n label = 'Image';\n } else if (mediaType.startsWith('video/')) {\n category = 'video';\n label = 'Video';\n } else if (mediaType.startsWith('audio/')) {\n category = 'audio';\n label = 'Audio';\n }\n \n return {\n category,\n icon: () => null,\n label\n };\n}\nimport { FilePreviewCard } from \"./FilePreviewCard\";\nimport ToolbarImagePreview from \"./ToolbarImagePreview\";\nimport ToolbarVideoPreview from \"./ToolbarVideoPreview\";\n\nexport type FileMetadata = {\n file: File;\n url: string;\n type: \"image\" | \"video\" | \"audio\" | \"document\" | \"archive\" | \"other\";\n mediaType: string;\n propertyName: \"image\" | \"data\";\n};\n\ntype FilePreviewProps = {\n files: File[];\n onRemove: (index: number) => void;\n cdnUrl: string;\n fileMetadata?: FileMetadata[];\n onFileUploadComplete?: (file: File, url: string) => void;\n};\n\nexport function FilePreview({\n files,\n onRemove,\n cdnUrl,\n fileMetadata = [],\n onFileUploadComplete,\n}: FilePreviewProps) {\n const [thumbnails, setThumbnails] = useState<{ [key: number]: string }>({});\n\n useEffect(() => {\n // Create thumbnails for video files\n files.forEach((file, index) => {\n const fileTypeInfo = getFileTypeInfo(file);\n // Skip if we already have a thumbnail or if there's metadata for this file\n const existingMetadata = fileMetadata.find(meta => meta.file === file);\n if (\n fileTypeInfo.category === \"video\" &&\n !thumbnails[index] &&\n !existingMetadata\n ) {\n const videoUrl = URL.createObjectURL(file);\n const video = document.createElement(\"video\");\n video.src = videoUrl;\n\n const handleCanPlay = () => {\n try {\n // Seek to the first frame\n video.currentTime = 0;\n\n // Wait a bit for the frame to be ready\n setTimeout(() => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n console.error(\"Could not get canvas context\");\n return;\n }\n\n // Draw the video frame\n ctx.drawImage(video, 0, 0);\n\n const thumbnailUrl = canvas.toDataURL(\"image/jpeg\", 0.8);\n setThumbnails(prev => ({ ...prev, [index]: thumbnailUrl }));\n }, 100);\n } catch (error) {\n console.error(\"Error generating thumbnail:\", error);\n } finally {\n URL.revokeObjectURL(videoUrl);\n video.removeEventListener(\"canplay\", handleCanPlay);\n }\n };\n\n video.addEventListener(\"canplay\", handleCanPlay);\n video.load();\n }\n });\n }, [files, fileMetadata]);\n\n if (files.length === 0) return null;\n\n return (\n <div className=\"lua:px-4 lua:py-2 lua:border-b lua:border-gray-200\">\n <div className=\"lua:flex lua:gap-2 lua:overflow-x-auto scrollbar-hide\">\n {files.map((file, index) => {\n const fileTypeInfo = getFileTypeInfo(file);\n const metadata = fileMetadata.find(meta => meta.file === file);\n\n if (files.length > 1) {\n return (\n <div key={index} className=\"lua:flex-shrink-0 lua:w-64\">\n <FilePreviewCard\n file={file}\n onRemove={() => onRemove(index)}\n cdnUrl={cdnUrl}\n onUploadComplete={(file, url) => {\n if (onFileUploadComplete) {\n onFileUploadComplete(file, url);\n }\n }}\n />\n </div>\n );\n }\n\n // For images, show the image preview\n if (fileTypeInfo.category === \"image\") {\n return (\n <ToolbarImagePreview\n key={file.name}\n file={file}\n onRemove={() => onRemove(index)}\n cdnUrl={cdnUrl}\n initialUrl={metadata?.url}\n onUploadComplete={(file, url) => {\n if (onFileUploadComplete) {\n onFileUploadComplete(file, url);\n }\n }}\n />\n );\n }\n\n // For videos, show the video preview with upload functionality\n if (fileTypeInfo.category === \"video\") {\n return (\n <ToolbarVideoPreview\n key={file.name}\n file={file}\n onRemove={() => onRemove(index)}\n cdnUrl={cdnUrl}\n initialUrl={metadata?.url}\n thumbnailUrl={thumbnails[index]}\n onUploadComplete={(file, url) => {\n if (onFileUploadComplete) {\n onFileUploadComplete(file, url);\n }\n }}\n />\n );\n }\n\n // For other files, show the file preview card\n return (\n <div key={index} className=\"lua:flex-shrink-0 lua:w-64\">\n <FilePreviewCard\n file={file}\n onRemove={() => onRemove(index)}\n cdnUrl={cdnUrl}\n onUploadComplete={(file, url) => {\n if (onFileUploadComplete) {\n onFileUploadComplete(file, url);\n }\n }}\n />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import {\n ArrowUp,\n Camera,\n IconButton,\n MapPin,\n Microphone,\n Paperclip,\n Tooltip,\n TooltipArrow,\n TooltipContent,\n TooltipTrigger,\n VideoCamera,\n} from \"luaniverse\";\n\n// Note: Analytics functions should be provided by the consuming application\n// import {\n// ANALYTICS_EVENTS,\n// trackChatEvent,\n// } from \"../../../utils/auth/analytics\";\n\n// Temporary implementations - should be replaced with actual analytics functions\nconst ANALYTICS_EVENTS = {\n CHAT: {\n TOOLBAR_ACTION: {\n FILE_UPLOAD: \"file_upload\",\n CAMERA: \"camera\",\n VIDEO: \"video\",\n AUDIO: \"audio\",\n LOCATION: \"location\",\n },\n MESSAGE_SENT: \"message_sent\",\n },\n};\n\nfunction trackChatEvent(event: string): void {\n // This is a placeholder - the actual implementation should be provided by the consuming app\n console.log(\"Analytics event:\", event);\n}\n\ntype ToolbarProps = {\n loading: boolean;\n onFileClick: () => void;\n onCameraClick: () => void;\n onVideoClick: () => void;\n onAudioClick: () => void;\n onLocationClick: () => void;\n onSendClick: () => void;\n uploadProgress: number;\n};\n\nexport function Toolbar({\n loading,\n onFileClick,\n onCameraClick,\n onVideoClick,\n onAudioClick,\n onLocationClick,\n onSendClick,\n}: ToolbarProps) {\n const handleFileClick = () => {\n trackChatEvent(ANALYTICS_EVENTS.CHAT.TOOLBAR_ACTION.FILE_UPLOAD);\n onFileClick();\n };\n\n const handleCameraClick = () => {\n trackChatEvent(ANALYTICS_EVENTS.CHAT.TOOLBAR_ACTION.CAMERA);\n onCameraClick();\n };\n\n const handleVideoClick = () => {\n trackChatEvent(ANALYTICS_EVENTS.CHAT.TOOLBAR_ACTION.VIDEO);\n onVideoClick();\n };\n\n const handleAudioClick = () => {\n trackChatEvent(ANALYTICS_EVENTS.CHAT.TOOLBAR_ACTION.AUDIO);\n onAudioClick();\n };\n\n const handleLocationClick = () => {\n trackChatEvent(ANALYTICS_EVENTS.CHAT.TOOLBAR_ACTION.LOCATION);\n onLocationClick();\n };\n\n const handleSendClick = () => {\n trackChatEvent(ANALYTICS_EVENTS.CHAT.MESSAGE_SENT);\n onSendClick();\n };\n\n return (\n <div className=\"lua:flex lua:items-center lua:justify-between lua:border-t lua:border-gray-200 lua:bg-gray-50 lua:px-3 lua:py-2\">\n {/* Widget Icons */}\n <div className=\"lua:flex lua:items-center lua:gap-2\">\n {/*File Upload*/}\n <Tooltip>\n <TooltipTrigger asChild>\n <IconButton\n className=\"lua:rounded-lg\"\n variant=\"muted\"\n onClick={handleFileClick}\n disabled={loading}\n data-testid=\"file-upload-button\"\n >\n <Paperclip color=\"#00000099\" />\n </IconButton>\n </TooltipTrigger>\n <TooltipContent>\n <TooltipArrow />\n <p>Attach files</p>\n </TooltipContent>\n </Tooltip>\n {/* Divider */}\n <div className=\"lua:w-px lua:h-5 lua:bg-gray-200\" />\n {/* Camera */}\n <Tooltip>\n <TooltipTrigger asChild>\n <IconButton\n className=\"lua:rounded-lg\"\n variant=\"muted\"\n onClick={handleCameraClick}\n disabled={loading}\n data-testid=\"camera-button\"\n >\n <Camera color=\"#00000099\" />\n </IconButton>\n </TooltipTrigger>\n <TooltipContent>\n <TooltipArrow />\n <p>Take a picture</p>\n </TooltipContent>\n </Tooltip>\n {/* Video */}\n <Tooltip>\n <TooltipTrigger asChild>\n <IconButton\n className=\"lua:rounded-lg\"\n variant=\"muted\"\n onClick={handleVideoClick}\n disabled={loading}\n data-testid=\"video-button\"\n >\n <VideoCamera color=\"#00000099\" />\n </IconButton>\n </TooltipTrigger>\n <TooltipContent>\n <TooltipArrow />\n <p>Record video</p>\n </TooltipContent>\n </Tooltip>\n {/* Microphone */}\n <Tooltip>\n <TooltipTrigger asChild>\n <IconButton\n className=\"lua:rounded-lg\"\n variant=\"muted\"\n onClick={handleAudioClick}\n disabled={loading}\n data-testid=\"audio-button\"\n >\n <Microphone color=\"#00000099\" />\n </IconButton>\n </TooltipTrigger>\n <TooltipContent>\n <TooltipArrow />\n <p>Record voice message</p>\n </TooltipContent>\n </Tooltip>\n {/* Divider */}\n <div className=\"lua:w-px lua:h-5 lua:bg-gray-200\" />\n {/* Location */}\n <Tooltip>\n <TooltipTrigger asChild>\n <IconButton\n className=\"lua:rounded-lg\"\n variant=\"muted\"\n onClick={handleLocationClick}\n disabled={loading}\n data-testid=\"location-button\"\n >\n <MapPin color=\"#00000099\" />\n </IconButton>\n </TooltipTrigger>\n <TooltipContent>\n <TooltipArrow />\n <p>Share location</p>\n </TooltipContent>\n </Tooltip>\n </div>\n\n {/* Send Button */}\n <IconButton\n className=\"lua:rounded-full\"\n onClick={handleSendClick}\n disabled={loading}\n data-testid=\"send-button\"\n >\n <ArrowUp color=\"#FFFFFF\" />\n </IconButton>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/audio/AudioRecorder.tsx","../src/components/dialogs/VideoDialog.tsx","../src/components/dialogs/ImageDialog.tsx","../src/components/dialogs/CarouselImageDialog.tsx","../src/components/dialogs/CameraDialog.tsx","../src/components/dialogs/LocationDialog.tsx","../src/components/utilities/extractDocuments.ts","../src/components/messages/CodeBlock.tsx","../src/components/utilities/markdownStyles.ts","../src/components/utilities/createMarkdownComponents.tsx","../src/components/utilities/parseUrl.ts","../src/components/utilities/extractInlineNavigateMarkdown.ts","../src/components/messages/ChatListItem.tsx","../src/components/messages/ChatListItemGroup.tsx","../src/components/messages/DocumentsMessage.tsx","../src/components/previews/AudioPreview.tsx","../src/components/previews/PaymentPreview.tsx","../src/components/utilities/extractActionButtons.ts","../src/components/utilities/extractImageCarouselImages.ts","../src/components/utilities/extractLinks.ts","../src/components/utilities/extractNavigateProperties.ts","../src/components/utilities/extractPaymentLink.ts","../src/components/utilities/extractTextFromNode.ts","../src/components/utilities/parseMessageContent.ts","../src/components/utilities/sanitizeHtml.ts","../src/components/messages/ImageCarouselMessage.tsx","../src/components/messages/ImageMessage.tsx","../src/components/previews/LinkPreview.tsx","../src/components/messages/LinkListMessage.tsx","../src/components/previews/LeafletMap.tsx","../src/components/previews/MapComponent.tsx","../src/components/previews/LocationPreview.tsx","../src/components/messages/LocationMessage.tsx","../src/components/messages/NavigateMessage.tsx","../src/components/messages/VideoMessage.tsx","../src/components/messages/ChatMessage.tsx","../src/contexts/ChatContext.tsx","../src/components/messages/LoadingMessage.tsx","../src/components/messages/ActionMessage.tsx","../src/components/utilities/parseActions.ts","../src/components/messages/ChatActions.tsx","../src/components/toolbar/ChatInput.tsx","../src/services/chatApi.ts","../src/components/toolbar/FilePreviewCard.tsx","../src/components/toolbar/ToolbarImagePreview.tsx","../src/components/toolbar/ToolbarVideoPreview.tsx","../src/components/toolbar/FilePreview.tsx","../src/components/toolbar/Toolbar.tsx"],"names":["AudioRecorder","onAudioRecorded","onClose","inputMessage","isRecording","setIsRecording","useState","recordingTime","setRecordingTime","audioVisualizerData","setAudioVisualizerData","startTime","setStartTime","finalTime","setFinalTime","streamRef","useRef","mediaRecorderRef","chunksRef","audioContextRef","analyserRef","audioDataRef","animationFrameRef","isInitializingRef","isCleaningUpRef","supportedMediaTypeRef","useEffect","interval","elapsed","stream","visualize","data","v","startRecording","error","cleanup","audioTracks","videoTracks","track","supportedMediaType","type","mediaRecorder","event","stopRecording","resolve","blob","formatTime","seconds","mins","secs","jsxs","jsx","IconButton","XIcon","value","index","ArrowUp","VideoDialog","videoRef","loading","onStartRecording","onStopRecording","open","Dialog","DialogContent","VisuallyHidden","DialogTitle","ImageDialog","url","alt","CarouselImageDialog","images","initialIndex","api","setApi","current","setCurrent","onSelect","Carousel","CarouselContent","image","CarouselItem","Fragment","CarouselPrevious","CarouselNext","CameraDialog","canvasRef","onCapture","Camera","LocationDialog","locationError","currentLocation","onShare","extractDocuments","input","files","lines","line","regex","match","fileName","filename","mediaType","extractDocuments_default","CodeBlock","children","language","copied","setCopied","codeString","codeLanguage","Highlight","themes","className","style","tokens","getLineProps","getTokenProps","i","token","key","markdownStyles","createMarkdownComponents","handleListItemClick","props","src","href","createMarkdownComponents_default","parseUrl","pathname","queryParams","parseUrl_default","extractInlineNavigateMarkdown","extractInlineNavigateMarkdown_default","ChatListItem","memo","block","onCardClick","onListItemClick","onNavigate","titleMatch","imageMatch","title","imageUrl","navigationLink","contentWithoutTitleAndImage","markdownComponents","parsedUrl","ReactMarkdown","ChatListItem_default","ChatListItemGroup","group","blockIndex","ChatListItemGroup_default","getFileTypeInfo","file","DocumentsMessage","documents","document","Icon","AudioPreview","message","PaymentPreview","Button","width","height","left","top","popup","CreditCard","extractActionButtons","content","extractActionButtons_default","extractImageCarouselImages","imageRegex","extractImageCarouselImages_default","extractLinks","linkRegex","urls","extractLinks_default","extractNavigateProperties","markdown","text","extractPaymentLink","extractPaymentLink_default","extractTextFromNode","node","extractTextFromNode_default","ensureNewlineBeforeTripleColons","parseMessageContent","blocks","currentText","currentListItem","currentPayment","currentActions","currentImages","currentLinks","currentNavigate","currentDocuments","inListItem","inPayment","inActions","inImages","inLinks","inNavigate","inDocuments","parseMessageContent_default","areHtmlTagsBalanced","html","selfClosingTags","tagStack","tagRegex","fullTag","tagName","detectHtmlContent","sanitizeHtml","config","DOMPurify","ImageCarouselMessage","isDialogOpen","setIsDialogOpen","initialImageIndex","setInitialImageIndex","carouselRef","isDragging","setIsDragging","startX","setStartX","scrollLeft","setScrollLeft","dragDistance","setDragDistance","handleMouseDown","useCallback","handleMouseMove","x","walk","handleMouseUp","handleMouseLeave","handleImageClick","imageIndex","ImageMessage","LinkPreview","luaApiUrl","authToken","disablePreviewOnLinks","preview","setPreview","setLoading","setError","response","err","LinkListMessage","links","LeafletMap","location","position","MapContainer","TileLayer","Marker","Popup","MapComponent","LocationPreview","LocationMessage","MapPin","NavigateMessage","hasNavigated","setHasSetNavigated","VideoMessage","formatMessageTimestamp","timestamp","_file","ChatMessage","handleCardClick","headingMatch","subheadingMatch","heading","subheading","formattedMessage","renderContent","htmlDetection","sanitizedHtml","b","groupedBlocks","currentGroup","groupIndex","navigateProperties","paymentLink","MessagesContext","createContext","InputContext","LoadingContext","UnreadContext","FileUrlContext","ChatProvider","messages","setMessages","setInputMessage","loadingMessage","setLoadingMessage","hasUnreadMessages","setHasUnreadMessages","fileUrls","getFileUrl","removeFileUrl","useMessages","context","useContext","useInput","useLoadingMessage","useFileUrls","useUnreadMessages","useChat","messagesContext","inputContext","loadingContext","unreadContext","fileUrlContext","LoadingMessage","Logo","ActionMessage","buttons","onClick","button","parseActions","actionStartMarker","startIndex","endIndex","ChatActions","lastMessage","actions","ChatInput","onSend","disabled","onFilePaste","isMobile","setIsMobile","textareaRef","checkMobile","textarea","handleKeyDown","handlePaste","items","item","getAuthToken","uploadFile","cdnUrl","onProgress","reject","xhr","formData","progress","label","FilePreviewCard","onRemove","initialUrl","onUploadComplete","fileTypeInfo","isUploading","setIsUploading","uploadProgress","setUploadProgress","uploadedUrl","setUploadedUrl","uploadAttempted","fileId","ToolbarImagePreview","hasAttemptedUpload","setHasAttemptedUpload","ToolbarVideoPreview","thumbnailUrl","videoThumbnail","setVideoThumbnail","videoUrl","video","handleCanPlay","canvas","ctx","generatedThumbnail","category","FilePreview","fileMetadata","onFileUploadComplete","thumbnails","setThumbnails","existingMetadata","meta","prev","metadata","ANALYTICS_EVENTS","trackChatEvent","Toolbar","onFileClick","onCameraClick","onVideoClick","onAudioClick","onLocationClick","onSendClick","Tooltip","TooltipTrigger","Paperclip","TooltipContent","TooltipArrow","VideoCamera","Microphone"],"mappings":"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","file":"index.mjs","sourcesContent":["import { ArrowUp, IconButton, XIcon } from \"luaniverse\";\nimport { useEffect, useRef, useState } from \"react\";\n\ntype AudioRecorderProps = {\n onAudioRecorded: (audioBlob: Blob, messageText?: string) => void;\n onClose: () => void;\n inputMessage?: string;\n};\n\nexport function AudioRecorder({\n onAudioRecorded,\n onClose,\n inputMessage,\n}: AudioRecorderProps) {\n const [isRecording, setIsRecording] = useState(false);\n const [recordingTime, setRecordingTime] = useState(0);\n const [audioVisualizerData, setAudioVisualizerData] = useState<number[]>([]);\n const [startTime, setStartTime] = useState<number | null>(null);\n const [finalTime, setFinalTime] = useState<number | null>(null);\n\n const streamRef = useRef<MediaStream | null>(null);\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n const audioContextRef = useRef<AudioContext | null>(null);\n const analyserRef = useRef<AnalyserNode | null>(null);\n const audioDataRef = useRef<Uint8Array | null>(null);\n const animationFrameRef = useRef<number | null>(null);\n const isInitializingRef = useRef<boolean>(false);\n const isCleaningUpRef = useRef<boolean>(false);\n const supportedMediaTypeRef = useRef<string | null>(null);\n\n // Timer effect\n useEffect(() => {\n if (!isRecording || !startTime) {\n return;\n }\n\n const interval = setInterval(() => {\n const elapsed = Math.floor((Date.now() - startTime) / 1000);\n setRecordingTime(elapsed);\n }, 1000);\n\n return () => clearInterval(interval);\n }, [isRecording, startTime]);\n\n // Audio initialization effect\n useEffect(() => {\n const initializeAudio = async () => {\n if (isInitializingRef.current || isCleaningUpRef.current) {\n return;\n }\n\n try {\n isInitializingRef.current = true;\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n\n streamRef.current = stream;\n\n // Initialize AudioContext and Analyser\n audioContextRef.current = new AudioContext();\n analyserRef.current = audioContextRef.current.createAnalyser();\n analyserRef.current.fftSize = 256;\n\n const source = audioContextRef.current.createMediaStreamSource(stream);\n source.connect(analyserRef.current);\n\n // Initialize data array for visualization\n audioDataRef.current = new Uint8Array(\n analyserRef.current.frequencyBinCount\n );\n\n // Start visualization\n const visualize = () => {\n if (!analyserRef.current || !audioDataRef.current) {\n return;\n }\n\n analyserRef.current.getByteFrequencyData(\n audioDataRef.current as Uint8Array<ArrayBuffer>\n );\n const data = Array.from(audioDataRef.current).map(v => v / 255);\n setAudioVisualizerData(data);\n\n animationFrameRef.current = requestAnimationFrame(visualize);\n };\n\n visualize();\n\n // Start recording immediately after audio context is ready\n startRecording();\n } catch (error) {\n console.error(\"Error accessing microphone:\", error);\n onClose();\n } finally {\n isInitializingRef.current = false;\n }\n };\n\n initializeAudio();\n\n // Only run cleanup on unmount\n return () => {\n cleanup();\n };\n }, []); // Empty dependency array - only run on mount\n\n const cleanup = () => {\n if (isCleaningUpRef.current) {\n return;\n }\n\n try {\n isCleaningUpRef.current = true;\n\n // First stop any ongoing recording\n if (isRecording && mediaRecorderRef.current) {\n mediaRecorderRef.current.stop();\n setIsRecording(false);\n setStartTime(null);\n }\n\n // Then stop all tracks\n if (streamRef.current) {\n const audioTracks = streamRef.current.getAudioTracks();\n const videoTracks = streamRef.current.getVideoTracks();\n\n audioTracks.forEach((track: MediaStreamTrack) => {\n track.stop();\n track.enabled = false;\n });\n\n videoTracks.forEach((track: MediaStreamTrack) => {\n track.stop();\n track.enabled = false;\n });\n }\n\n // Cancel any pending animation frames\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n\n // Close audio context\n if (audioContextRef.current) {\n audioContextRef.current.close();\n }\n\n // Clear all refs\n streamRef.current = null;\n mediaRecorderRef.current = null;\n chunksRef.current = [];\n audioContextRef.current = null;\n analyserRef.current = null;\n audioDataRef.current = null;\n animationFrameRef.current = null;\n } finally {\n isCleaningUpRef.current = false;\n }\n };\n\n const startRecording = () => {\n if (!streamRef.current) {\n return;\n }\n\n // Get supported MIME types\n const mediaTypes = [\"audio/webm\", \"audio/mp4\", \"audio/ogg\", \"audio/wav\"];\n\n // Find the first supported MIME type\n const supportedMediaType = mediaTypes.find(type =>\n MediaRecorder.isTypeSupported(type)\n );\n\n if (!supportedMediaType) {\n console.error(\"No supported MIME type found for MediaRecorder\");\n onClose();\n return;\n }\n\n supportedMediaTypeRef.current = supportedMediaType;\n\n // Initialize MediaRecorder with supported format\n const mediaRecorder = new MediaRecorder(streamRef.current, {\n mimeType: supportedMediaType,\n });\n mediaRecorderRef.current = mediaRecorder;\n chunksRef.current = [];\n\n mediaRecorder.ondataavailable = event => {\n if (event.data.size > 0) {\n chunksRef.current.push(event.data);\n }\n };\n\n mediaRecorder.start();\n setIsRecording(true);\n setStartTime(Date.now());\n setRecordingTime(0);\n };\n\n const stopRecording = async () => {\n if (!mediaRecorderRef.current || !streamRef.current) {\n return;\n }\n\n setIsRecording(false);\n setFinalTime(recordingTime);\n setStartTime(null);\n mediaRecorderRef.current.stop();\n\n // Wait for the last chunk\n await new Promise<void>(resolve => {\n if (mediaRecorderRef.current) {\n mediaRecorderRef.current.onstop = () => resolve();\n }\n });\n\n // Create blob from chunks and pass to parent with the same MIME type used for recording\n const blob = new Blob(chunksRef.current, {\n type: supportedMediaTypeRef.current || \"audio/webm\",\n });\n onAudioRecorded(blob, inputMessage);\n\n // Clean up and close\n cleanup();\n onClose();\n };\n\n const formatTime = (seconds: number) => {\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins.toString().padStart(2, \"0\")}:${secs\n .toString()\n .padStart(2, \"0\")}`;\n };\n\n const handleClose = async () => {\n cleanup();\n onClose();\n };\n\n return (\n <div className=\"audio-recorder-container lua:bg-gray-100 lua:rounded-lg lua:p-2 lua:flex lua:items-center lua:gap-4\">\n <IconButton\n variant=\"muted\"\n onClick={handleClose}\n className=\"audio-recorder-close-button lua:flex-shrink-0\"\n >\n <XIcon className=\"audio-recorder-close-icon\" color=\"#00000099\" />\n </IconButton>\n\n <div className=\"audio-recorder-status lua:flex lua:items-center lua:gap-2\">\n <div\n className={`audio-recorder-indicator lua:w-3 lua:h-3 lua:rounded-full ${\n isRecording ? \"lua:bg-red-500 lua:animate-pulse\" : \"lua:bg-gray-400\"\n }`}\n />\n <span className=\"audio-recorder-time lua:text-gray-700 lua:text-sm\">\n {isRecording ? formatTime(recordingTime) : formatTime(finalTime || 0)}\n </span>\n </div>\n\n <div\n className=\"audio-recorder-visualizer lua:flex-1\"\n data-testid=\"audio-visualizer-bar\"\n >\n {audioVisualizerData.length > 0 && (\n <div className=\"audio-recorder-bars lua:h-8 lua:flex lua:items-center lua:w-full lua:gap-px sm:lua:gap-0.5 lua:md:gap-1\">\n {audioVisualizerData.slice(0, 50).map((value, index) => (\n <div\n key={index}\n className=\"audio-recorder-bar lua:flex-1 lua:bg-blue-500\"\n style={{ height: `${value * 100}%` }}\n />\n ))}\n </div>\n )}\n </div>\n\n <IconButton\n onClick={stopRecording}\n className=\"audio-recorder-send-button lua:flex-shrink-0 lua:mr-1\"\n data-testid=\"send-audio-button\"\n >\n <ArrowUp className=\"audio-recorder-send-icon\" color=\"white\" />\n </IconButton>\n </div>\n );\n}\n","import { VisuallyHidden } from \"@radix-ui/react-visually-hidden\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n IconButton,\n XIcon,\n} from \"luaniverse\";\nimport { RefObject } from \"react\";\n\ntype VideoDialogProps = {\n videoRef: RefObject<HTMLVideoElement>;\n isRecording: boolean;\n recordingTime: number;\n loading: boolean;\n onStartRecording: () => void;\n onStopRecording: () => void;\n onClose: () => void;\n open: boolean;\n};\n\nfunction formatTime(seconds: number) {\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins.toString().padStart(2, \"0\")}:${secs\n .toString()\n .padStart(2, \"0\")}`;\n}\n\nexport function VideoDialog({\n videoRef,\n isRecording,\n recordingTime,\n loading,\n onStartRecording,\n onStopRecording,\n onClose,\n open,\n}: VideoDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent\n className=\"lua:w-full lua:max-w-2xl lua:p-2.5\"\n showClose={false}\n >\n <VisuallyHidden>\n <DialogTitle />\n </VisuallyHidden>\n {/* Video Preview Area */}\n <div className=\"lua:relative lua:aspect-[4/3] lua:bg-black lua:rounded-xl lua:overflow-hidden lua:mb-8\">\n <video\n ref={videoRef}\n autoPlay\n playsInline\n muted\n className=\"lua:absolute lua:inset-0 lua:w-full lua:h-full lua:object-cover\"\n style={{ backgroundColor: \"black\" }}\n />\n {isRecording && (\n <div className=\"lua:absolute lua:top-4 lua:left-4 lua:flex lua:items-center lua:gap-2 lua:bg-black lua:bg-opacity-50 lua:px-3 lua:py-1 lua:rounded-full\">\n <div className=\"lua:w-2 lua:h-2 lua:rounded-full lua:bg-red-500 lua:animate-pulse\" />\n <span className=\"lua:text-sm lua:font-medium lua:text-white\">\n {formatTime(recordingTime)}\n </span>\n </div>\n )}\n </div>\n\n {/* Video Controls */}\n <div className=\"lua:flex lua:justify-center lua:items-center lua:gap-5 lua:mb-2.5\">\n {!isRecording ? (\n <svg\n onClick={onStartRecording}\n data-testid=\"start-recording-button\"\n width=\"40\"\n height=\"40\"\n viewBox=\"0 0 40 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"cursor-pointer\"\n >\n <rect\n x=\"2\"\n y=\"2\"\n width=\"36\"\n height=\"36\"\n rx=\"18\"\n stroke=\"#FF0342\"\n strokeWidth=\"4\"\n />\n <rect x=\"6\" y=\"6\" width=\"28\" height=\"28\" rx=\"14\" fill=\"#FF0342\" />\n </svg>\n ) : (\n <IconButton\n data-testid=\"stop-recording-button\"\n onClick={onStopRecording}\n disabled={loading}\n variant=\"secondary\"\n >\n <XIcon color=\"#000000\" />\n </IconButton>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","import { VisuallyHidden } from \"@radix-ui/react-visually-hidden\";\nimport { Dialog, DialogContent, DialogTitle, XIcon } from \"luaniverse\";\n\ntype ImageDialogProps = {\n url: string;\n alt?: string;\n open: boolean;\n onClose: () => void;\n};\n\nexport function ImageDialog({ url, alt, open, onClose }: ImageDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <VisuallyHidden>\n <DialogTitle />\n </VisuallyHidden>\n <DialogContent\n className=\"lua:w-full lua:fixed lua:inset-0 lua:h-full lua:max-w-none lua:p-0 lua:bg-transparent lua:shadow-none lua:translate-x-0 lua:translate-y-0 lua:m-0 lua:rounded-none\"\n showClose={false}\n >\n <div className=\"lua:relative lua:w-full lua:h-full\">\n {/* Close button */}\n <button\n onClick={onClose}\n className=\"lua:cursor-pointer lua:absolute lua:top-4 lua:left-4 lua:z-10 lua:p-2 lua:bg-black/50 lua:rounded-full lua:hover:bg-black/70 lua:transition-colors\"\n >\n <XIcon color=\"white\" className=\"lua:w-6 lua:h-6\" />\n </button>\n\n {/* Image container */}\n <div className=\"lua:w-full lua:h-full lua:flex lua:items-center lua:justify-center\">\n <img\n src={url}\n alt={alt}\n className=\"sm:lua:aspect-[16/9] lua:object-contain lua:rounded-none sm:lua:rounded-lg\"\n />\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","import { VisuallyHidden } from \"@radix-ui/react-visually-hidden\";\nimport {\n Carousel,\n type CarouselApi,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n Dialog,\n DialogContent,\n DialogTitle,\n XIcon,\n} from \"luaniverse\";\nimport { useEffect, useState } from \"react\";\n\ntype CarouselImage = { src: string; alt: string };\n\ntype CarouselImageDialogProps = {\n images: CarouselImage[];\n initialIndex?: number;\n open: boolean;\n onClose: () => void;\n};\n\nexport function CarouselImageDialog({\n images,\n initialIndex = 0,\n open,\n onClose,\n}: CarouselImageDialogProps) {\n const [api, setApi] = useState<CarouselApi>();\n const [current, setCurrent] = useState(0);\n\n useEffect(() => {\n if (!api) {\n return;\n }\n\n // Set initial slide\n if (initialIndex > 0 && initialIndex < images.length) {\n api.scrollTo(initialIndex);\n setCurrent(initialIndex);\n }\n\n // Listen for slide changes\n const onSelect = () => {\n setCurrent(api.selectedScrollSnap());\n };\n\n api.on(\"select\", onSelect);\n onSelect();\n\n return () => {\n api?.off(\"select\", onSelect);\n };\n }, [api, initialIndex, images.length]);\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <VisuallyHidden>\n <DialogTitle />\n </VisuallyHidden>\n <DialogContent className=\"lua:w-full lua:m-0\" showClose={false}>\n <div className=\"lua:relative lua:w-full lua:h-full\">\n {/* Close button */}\n <button\n onClick={onClose}\n className=\"lua:cursor-pointer lua:absolute lua:top-4 lua:left-4 lua:z-10 lua:p-2 lua:bg-black/50 lua:rounded-full lua:hover:bg-black/70 lua:transition-colors\"\n >\n <XIcon color=\"white\" className=\"lua:w-6 lua:h-6\" />\n </button>\n\n {/* Image counter */}\n {images.length > 1 && (\n <div className=\"lua:absolute lua:top-4 lua:right-4 lua:z-10 lua:px-3 lua:py-1 lua:bg-black/50 lua:rounded-full lua:text-white lua:text-sm\">\n {current + 1} / {images.length}\n </div>\n )}\n\n {/* Carousel container */}\n <div className=\"lua:w-full lua:h-full lua:flex lua:items-center lua:justify-center lua:px-16\">\n <Carousel\n setApi={setApi}\n className=\"lua:w-full lua:max-w-5xl\"\n opts={{\n align: \"center\",\n loop: images.length > 1,\n }}\n >\n <CarouselContent>\n {images.map((image, index) => (\n <CarouselItem\n className=\"lua:flex lua:items-center lua:justify-center\"\n key={index}\n >\n <img\n src={image.src}\n alt={image.alt || `Image ${index + 1}`}\n className=\"lua:max-w-full lua:max-h-screen lua:object-contain lua:rounded-none sm:lua:rounded-lg\"\n draggable={false}\n />\n </CarouselItem>\n ))}\n </CarouselContent>\n\n {images.length > 1 && (\n <>\n <CarouselPrevious className=\"lua:left-4 lua:bg-black/50 lua:border-none lua:text-white lua:hover:bg-black/70 lua:hover:text-white-white/70\" />\n <CarouselNext className=\"lua:right-4 lua:bg-black/50 lua:border-none lua:text-white lua:hover:bg-black/70 lua:hover:text-white-white/70\" />\n </>\n )}\n </Carousel>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","import { VisuallyHidden } from \"@radix-ui/react-visually-hidden\";\nimport {\n Camera,\n Dialog,\n DialogContent,\n DialogTitle,\n IconButton,\n XIcon,\n} from \"luaniverse\";\nimport { RefObject } from \"react\";\n\ntype CameraDialogProps = {\n videoRef: RefObject<HTMLVideoElement>;\n canvasRef: RefObject<HTMLCanvasElement>;\n onCapture: () => void;\n onClose: () => void;\n open: boolean;\n};\n\nexport function CameraDialog({\n videoRef,\n canvasRef,\n onCapture,\n onClose,\n open,\n}: CameraDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <VisuallyHidden>\n <DialogTitle />\n </VisuallyHidden>\n <DialogContent\n className=\"lua:w-full lua:max-w-2xl lua:p-2.5\"\n showClose={false}\n >\n {/* Camera Preview Area */}\n <div className=\"lua:relative lua:aspect-[16/9] lua:bg-black lua:rounded-xl lua:overflow-hidden\">\n <video\n ref={videoRef}\n autoPlay\n playsInline\n muted\n className=\"lua:absolute lua:inset-0 lua:w-full lua:h-full lua:object-cover\"\n style={{ backgroundColor: \"black\" }}\n />\n <canvas ref={canvasRef} className=\"lua:hidden\" />\n </div>\n\n {/* Camera Controls */}\n <div className=\"lua:flex lua:justify-center lua:items-center lua:gap-5 lua:mb-2.5 lua:mt-6\">\n {/* Capture Button */}\n <IconButton onClick={onCapture} data-testid=\"capture-button\">\n <Camera color=\"#FFFFFF\" />\n </IconButton>\n\n {/* Close Button */}\n <IconButton onClick={onClose} variant=\"secondary\">\n <XIcon color=\"#000000\" />\n </IconButton>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","type LocationDialogProps = {\n locationError: string;\n currentLocation: {\n latitude: number;\n longitude: number;\n address?: string;\n } | null;\n loading: boolean;\n onShare: () => void;\n onClose: () => void;\n};\n\nexport function LocationDialog({\n locationError,\n currentLocation,\n loading,\n onShare,\n onClose,\n}: LocationDialogProps) {\n return (\n <div className=\"lua:fixed lua:inset-0 lua:bg-black lua:bg-opacity-75 lua:flex lua:items-center lua:justify-center lua:z-50\">\n <div className=\"lua:bg-white lua:rounded-lg lua:p-4 lua:max-w-2xl lua:w-full lua:mx-4\">\n <div className=\"lua:flex lua:justify-between lua:items-center lua:mb-4\">\n <h3 className=\"lua:text-lg lua:font-semibold\">Share Location</h3>\n <button\n onClick={onClose}\n className=\"lua:text-gray-500 lua:hover:text-gray-700\"\n >\n <svg\n className=\"lua:w-6 lua:h-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n {locationError ? (\n <div className=\"lua:bg-red-50 lua:text-red-500 lua:p-4 lua:rounded-lg lua:mb-4\">\n {locationError}\n </div>\n ) : currentLocation ? (\n <>\n <div className=\"lua:mb-4\">\n <div className=\"lua:text-sm lua:text-gray-500 lua:mb-2\">\n Current Location:\n </div>\n <div className=\"lua:text-gray-700 lua:mb-2\">\n {currentLocation.address}\n </div>\n <div className=\"lua:text-sm lua:text-gray-500\">\n {currentLocation.latitude.toFixed(6)},{\" \"}\n {currentLocation.longitude.toFixed(6)}\n </div>\n </div>\n </>\n ) : (\n <div className=\"lua:flex lua:justify-center lua:items-center lua:h-48\">\n <div className=\"lua:animate-spin lua:rounded-full lua:h-8 lua:w-8 lua:border-b-2 lua:border-blue-500\"></div>\n </div>\n )}\n\n <div className=\"lua:flex lua:justify-center\">\n {currentLocation && (\n <button\n onClick={onShare}\n disabled={loading}\n className={`lua:px-4 lua:py-2 lua:rounded-full ${\n loading\n ? \"lua:bg-blue-300 lua:cursor-not-allowed\"\n : \"lua:bg-blue-500 lua:hover:bg-blue-600\"\n } lua:text-white lua:flex lua:items-center lua:gap-2`}\n >\n <svg\n className=\"lua:w-5 lua:h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\"\n />\n </svg>\n {loading ? \"Sharing...\" : \"Share Location\"}\n </button>\n )}\n </div>\n </div>\n </div>\n );\n}\n","export type ParsedMessageDocument = {\n fileName: string;\n url: string;\n filename: string;\n mediaType: string;\n};\nfunction extractDocuments(input: string): ParsedMessageDocument[] {\n const files: ParsedMessageDocument[] = [];\n\n // Split by newlines to handle multiple files\n const lines = input.split(\"\\n\").filter((line) => line.trim() !== \"\");\n\n for (const line of lines) {\n // Regex to match the pattern: [Title](URL) filename:name mime:type\n const regex =\n /\\[([^\\]]+)\\]\\(([^)]+)\\)\\s+filename:([^\\s]+)\\s+mime:([^\\s]+)/g;\n\n let match;\n while ((match = regex.exec(line)) !== null) {\n const [, fileName, url, filename, mediaType] = match;\n\n files.push({\n fileName: fileName.trim(),\n url: url.trim(),\n filename: filename.trim(),\n mediaType: mediaType.trim(),\n });\n }\n }\n\n return files;\n}\n\nexport default extractDocuments;\n","import { Highlight, themes } from \"prism-react-renderer\";\nimport { ReactNode, useState } from \"react\";\n\ntype CodeBlockProps = {\n children: ReactNode;\n className?: string;\n language?: string;\n};\n\nexport function CodeBlock({ children, language = \"\" }: CodeBlockProps) {\n const [copied, setCopied] = useState(false);\n\n // Convert children to string if it's not already\n const codeString = typeof children === \"string\" ? children : String(children);\n\n // Default to javascript if no language is specified\n const codeLanguage = language || \"javascript\";\n\n const handleCopy = () => {\n navigator.clipboard.writeText(codeString);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n return (\n <div className=\"lua:relative lua:my-4 lua:rounded-lg lua:overflow-hidden lua:mx-4 lua:sm:mx-5 lua:grid\">\n {/* Header with language and copy button */}\n <div className=\"lua:flex lua:items-center lua:justify-between lua:bg-gray-800 lua:text-gray-200 lua:px-4 lua:py-2\">\n <span className=\"lua:text-xs lua:font-mono\">{codeLanguage}</span>\n <button\n onClick={handleCopy}\n className=\"lua:text-xs lua:bg-gray-700 lua:hover:bg-gray-600 lua:rounded lua:px-2 lua:py-1 lua:transition-colors\"\n aria-label=\"Copy code\"\n >\n {copied ? \"Copied!\" : \"Copy\"}\n </button>\n </div>\n\n {/* Code content with syntax highlighting */}\n <Highlight\n theme={themes.vsDark}\n code={codeString}\n language={codeLanguage}\n >\n {({ className, style, tokens, getLineProps, getTokenProps }) => (\n <pre\n className={`${className} lua:p-4 lua:overflow-x-auto`}\n style={style}\n >\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))}\n </div>\n ))}\n </pre>\n )}\n </Highlight>\n </div>\n );\n}\n","export const markdownStyles = {\n p: \"lua:mb-2 lua:last:mb-0 lua:mx-4 lua:sm:mx-5 lua-paragraph-markdown\",\n h1: \"lua:text-2xl lua:font-bold lua:mb-2 lua:mx-4 lua:sm:mx-5\",\n h2: \"lua:text-xl lua:font-semibold lua:mb-2 lua:text-gray-700 lua:mx-4 lua:sm:mx-5\",\n h3: \"lua:text-lg lua:font-medium lua:mb-2 lua:mx-4 lua:sm:mx-5\",\n h4: \"lua:mx-4 lua:sm:mx-5\",\n ul: \"lua:list-disc lua:pl-6 lua:mb-4\",\n ol: \"lua:list-decimal lua:pl-6 lua:mb-4 lua:mx-4 lua:sm:mx-5\",\n li: \"lua:mb-1 lua:mx-4 lua:sm:mx-5\",\n a: \"lua:text-blue-500 lua:hover:underline\",\n blockquote: \"lua:border-l-4 lua:border-gray-200 lua:pl-4 lua:italic lua:my-4\",\n pre: \"lua:contents lua:bg-gray-100 lua:rounded lua:px-1 lua:text-gray-700 lua:mx-4 lua:sm:mx-5\",\n code: \"lua:bg-gray-100 lua:rounded lua:px-1 lua:mx-4 lua:sm:mx-5\",\n img: \"lua:max-w-full lua:h-auto lua:rounded-lg lua:mb-2\",\n table: \"lua:min-w-full lua:border lua:border-gray-200 lua:my-4\",\n th: \"lua:bg-gray-100 lua:border lua:border-gray-200 lua:px-4 lua:py-2\",\n td: \"lua:border lua:border-gray-200 lua:px-4 lua:py-2\",\n};\n","import type { Components } from \"react-markdown\";\nimport { ReactNode } from \"react\";\nimport { CodeBlock } from \"../messages/CodeBlock\";\nimport { markdownStyles } from \"./markdownStyles\";\n\nconst createMarkdownComponents = (\n handleListItemClick: (content: React.ReactNode) => void\n): Components => ({\n code({\n children,\n className,\n ...props\n }: {\n className?: string;\n children?: ReactNode;\n } & React.HTMLAttributes<HTMLElement>) {\n // Extract language from className if it exists (format: language-{lang})\n const language = className?.replace(\"language-\", \"\") || \"\";\n\n // If this is an inline code block, render it normally\n if (typeof children === \"string\" && !children.includes(\"\\n\")) {\n return (\n <code className={markdownStyles.code} {...props}>\n {children}\n </code>\n );\n }\n\n // For multiline code blocks, use our custom CodeBlock component\n return (\n <CodeBlock language={language} className={className}>\n {children}\n </CodeBlock>\n );\n },\n p({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLParagraphElement>) {\n return (\n <p className={markdownStyles.p} {...props}>\n {children}\n </p>\n );\n },\n h1({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h1 className={markdownStyles.h1} {...props}>\n {children}\n </h1>\n );\n },\n h2({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h2 className={markdownStyles.h2} {...props}>\n {children}\n </h2>\n );\n },\n h3({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h3 className={markdownStyles.h3} {...props}>\n {children}\n </h3>\n );\n },\n h4({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h4 className={markdownStyles.h4} {...props}>\n {children}\n </h4>\n );\n },\n img({ src, alt }: { src?: string; alt?: string }) {\n return (\n <img\n src={src}\n alt={alt}\n className=\"lua:w-full lua:h-48 lua:object-cover lua:rounded-lg lua:mb-3\"\n />\n );\n },\n ul({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLUListElement>) {\n return (\n <ul className={markdownStyles.ul} {...props}>\n {children}\n </ul>\n );\n },\n ol({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLOListElement>) {\n return (\n <ol className={markdownStyles.ol} {...props}>\n {children}\n </ol>\n );\n },\n li({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLLIElement>) {\n return (\n <li\n className={`${markdownStyles.li} cursor-pointer hover:bg-gray-50 rounded px-2 -mx-2 transition-colors`}\n onClick={() => handleListItemClick(children)}\n {...props}\n >\n {children}\n </li>\n );\n },\n a({\n href,\n children,\n ...props\n }: {\n href?: string;\n children?: ReactNode;\n } & React.HTMLAttributes<HTMLAnchorElement>) {\n return (\n <a\n href={href}\n className={markdownStyles.a}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n {...props}\n >\n {children}\n </a>\n );\n },\n blockquote({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLQuoteElement>) {\n return (\n <blockquote className={markdownStyles.blockquote} {...props}>\n {children}\n </blockquote>\n );\n },\n pre({\n children,\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLPreElement>) {\n // For pre tags, we'll let the code component handle the rendering\n return <>{children}</>;\n },\n table({\n children,\n ...props\n }: { children?: ReactNode } & React.HTMLAttributes<HTMLTableElement>) {\n return (\n <table className={markdownStyles.table} {...props}>\n {children}\n </table>\n );\n },\n th({\n children,\n ...props\n }: {\n children?: ReactNode;\n } & React.HTMLAttributes<HTMLTableHeaderCellElement>) {\n return (\n <th className={markdownStyles.th} {...props}>\n {children}\n </th>\n );\n },\n td({\n children,\n ...props\n }: {\n children?: ReactNode;\n } & React.HTMLAttributes<HTMLTableDataCellElement>) {\n return (\n <td className={markdownStyles.td} {...props}>\n {children}\n </td>\n );\n },\n});\n\nexport default createMarkdownComponents;\n","type ParsedUrl = {\n pathname: string;\n queryParams: Record<string, string>;\n};\n\nexport function parseUrl(input: string): ParsedUrl {\n const url = new URL(input, \"http://lua\"); // base required to parse relative URLs\n const pathname = decodeURIComponent(url.pathname);\n const queryParams: Record<string, string> = {};\n\n for (const [key, value] of url.searchParams.entries()) {\n queryParams[key] = decodeURIComponent(value);\n }\n\n return { pathname, queryParams };\n}\n\nexport default parseUrl;\n","function extractInlineNavigateMarkdown(input: string) {\n const match = input.match(/\\[navigate\\]\\(([^)]+)\\)/);\n if (!match) return null;\n\n return match[1];\n}\n\nexport default extractInlineNavigateMarkdown;\n","import ReactMarkdown from \"react-markdown\";\nimport { memo } from \"react\";\nimport createMarkdownComponents from \"../utilities/createMarkdownComponents\";\nimport parseUrl from \"../utilities/parseUrl\";\nimport extractInlineNavigateMarkdown from \"../utilities/extractInlineNavigateMarkdown\";\n\nconst ChatListItem = memo(function ListItem({\n block,\n onCardClick,\n onListItemClick,\n onNavigate,\n}: {\n block: any;\n onCardClick: (content: string) => void;\n onListItemClick: (content: React.ReactNode) => void;\n onNavigate?: (\n pathname: string,\n options: { query: Record<string, string> }\n ) => void;\n}) {\n const titleMatch = block.content.match(/^#\\s+(.+)$/m);\n const imageMatch = block.content.match(/!\\[.*?]\\((.*)\\)/);\n const title = titleMatch ? titleMatch[1] : \"\";\n const imageUrl = imageMatch ? imageMatch[1] : null;\n\n const navigationLink = extractInlineNavigateMarkdown(block.content);\n\n const contentWithoutTitleAndImage = block.content\n .replace(/^#\\s+.+$/m, \"\") // Remove # Title\n .replace(/!\\[.*?]\\(.*?\\)/g, \"\") // Remove images: ![alt](url)\n .replace(/\\[.*?]\\(.*?\\)/g, \"\") // Remove links: [text](url)\n .trim();\n\n const markdownComponents = createMarkdownComponents(onListItemClick);\n\n const handleListItemClick = () => {\n if (onNavigate && navigationLink) {\n const parsedUrl = parseUrl(navigationLink);\n onNavigate(parsedUrl.pathname, {\n ...(parsedUrl.queryParams && { query: parsedUrl.queryParams }),\n });\n } else {\n onCardClick(block.content);\n }\n };\n\n return (\n <div onClick={handleListItemClick} className=\"chat-list-item group\">\n <div className=\"lua:absolute lua:inset-0 lua:bg-blue-500 lua:opacity-0 group-hover:lua:opacity-5 lua:rounded-lg lua:transition-opacity lua:duration-200\"></div>\n <div className=\"chat-list-item-content\">\n {imageUrl ? (\n <div className=\"chat-list-item-image-wrapper\">\n <img className=\"chat-list-item-image\" src={imageUrl} alt={title} />\n </div>\n ) : null}\n\n <div className=\"content-container\">\n <h1 className=\"lua:text-base lua:leading-6 lua:font-semibold lua:text-gray-900 lua:mb-0\">\n {title}\n </h1>\n <div className=\"lua:text-sm lua:leading-6 lua:font-normal lua:text-gray-600\">\n <ReactMarkdown components={markdownComponents}>\n {contentWithoutTitleAndImage}\n </ReactMarkdown>\n </div>\n </div>\n </div>\n </div>\n );\n});\n\nexport default ChatListItem;\n","import { memo } from \"react\";\nimport ChatListItem from \"./ChatListItem\";\n\ntype ChatListItemGroupProps = {\n group: any[];\n onCardClick: (content: string) => void;\n onListItemClick: (content: React.ReactNode) => void;\n onNavigate?: (\n pathname: string,\n options: { query: Record<string, string> }\n ) => void;\n};\n\nconst ChatListItemGroup = memo(function ListItemGroup({\n group,\n onCardClick,\n onListItemClick,\n onNavigate,\n}: ChatListItemGroupProps) {\n return (\n <div className=\"lua:w-full\">\n <div className=\"chat-list-item-container\">\n {group.map((block, blockIndex) => (\n <ChatListItem\n key={blockIndex}\n block={block}\n onCardClick={onCardClick}\n onListItemClick={onListItemClick}\n onNavigate={onNavigate}\n />\n ))}\n </div>\n </div>\n );\n});\n\nexport default ChatListItemGroup;\n","import { ParsedMessageDocument } from \"../utilities/extractDocuments\";\n// Note: This utility function should be provided by the consuming application\n// import { getFileTypeInfo } from \"@/utils/file-utils.ts\";\n\n// Temporary implementation - should be replaced with actual utility function\nfunction getFileTypeInfo(file: File): { icon: any } {\n // This is a placeholder - the actual implementation should be provided by the consuming app\n return { icon: () => null };\n}\n\ntype DocumentsMessage = {\n documents: ParsedMessageDocument[];\n};\n\nexport default function DocumentsMessage({ documents }: DocumentsMessage) {\n return documents.map((document) => {\n const fileTypeInfo = getFileTypeInfo(\n new File([], \"\", { type: document.mediaType })\n );\n\n const Icon = fileTypeInfo.icon;\n return (\n <a\n key={document.url}\n data-testid=\"chat-file-message\"\n href={document.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"chat-file-message lua:mx-4 lua:sm:mx-5\"\n >\n <div className=\"lua:flex lua:flex-col lua:gap-8\">\n <div className=\"chat-file-card lua:flex lua:items-center lua:justify-start lua:p-3 lua:border lua:border-gray-200 lua:rounded-lg lua:bg-white lua:w-80\">\n <Icon className=\"lua:w-12 lua:h-12 lua:text-gray-500\" />\n <div className=\"lua:flex lua:flex-col lua:gap-1 lua:pl-2\">\n {document.fileName || \"File\"}\n <span className=\"lua:text-gray-500 lua:text-sm\">\n {document.mediaType}\n </span>\n </div>\n </div>\n </div>\n </a>\n );\n });\n}\n","type AudioPreviewProps = {\n message: {\n audio?: string;\n content: string;\n isUploading?: boolean;\n url?: string; // TODO: check if url is provided\n };\n};\n\nexport function AudioPreview({ message }: AudioPreviewProps) {\n return (\n <div\n className=\"chat-audio-message lua:flex lua:flex-col lua:mx-4 lua:sm:mx-5\"\n data-testid=\"audio-preview\"\n >\n <div className=\"chat-audio-container audio-playback-container lua:relative\">\n <div className=\"chat-audio-controls lua:flex lua:items-center lua:gap-2 lua:min-w-full\">\n <audio\n src={message.url}\n controls\n className=\"chat-audio-player lua:h-8\"\n style={{\n backgroundColor: \"transparent\",\n border: \"none\",\n }}\n />\n {message.isUploading && (\n <div className=\"chat-audio-upload-overlay lua:absolute lua:inset-0 lua:bg-black lua:bg-opacity-50 lua:rounded-lg lua:flex lua:items-center lua:justify-center\">\n <div className=\"lua:text-white lua:text-sm\">Uploading...</div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { Button, CreditCard } from \"luaniverse\";\n\ntype PaymentPreviewProps = {\n url: string;\n};\n\nexport function PaymentPreview({ url }: PaymentPreviewProps) {\n const handleClick = (event: React.MouseEvent) => {\n event.preventDefault();\n\n const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);\n\n if (isMobile) {\n // On mobile, open in new tab\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n return;\n }\n\n // On desktop, try to open popup\n const width = 500;\n const height = 600;\n const left = window.screen.width / 2 - width / 2;\n const top = window.screen.height / 2 - height / 2;\n\n const popup = window.open(\n url,\n \"Payment\",\n `width=${width},height=${height},left=${left},top=${top},toolbar=no,menubar=no,scrollbars=yes,resizable=yes`\n );\n\n // If popup was blocked, fallback to new tab\n if (!popup || popup.closed || typeof popup.closed === \"undefined\") {\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n }\n };\n\n return (\n <Button\n onClick={handleClick}\n className=\"chat-payment-button lua:rounded-xl\"\n >\n <CreditCard size={16} />\n <span>Open payment</span>\n </Button>\n );\n}\n","// Helper function to extract action buttons from markdown content\n\nimport { ActionButton } from \"../../types/chat\";\n\nconst extractActionButtons = (content: string): ActionButton[] => {\n // Split content into lines and filter out empty lines\n const lines = content.split(\"\\n\").filter(line => line.trim());\n\n // Extract buttons from lines starting with dash\n return lines\n .filter(line => line.trim().startsWith(\"-\"))\n .map(line => ({\n text: line.trim().substring(1).trim(),\n onClick: line.trim().substring(1).trim(), // Using the text as the onClick value for now\n }));\n};\n\nexport default extractActionButtons;\n","// Helper function to extract images with alt text from markdown content\nconst extractImageCarouselImages = (\n content: string\n): { src: string; alt: string }[] => {\n const imageRegex = /!\\[(.*?)\\]\\((.*)\\)/g;\n const images: { src: string; alt: string }[] = [];\n let match;\n\n while ((match = imageRegex.exec(content)) !== null) {\n if (match[1] && match[2]) {\n images.push({\n alt: match[1],\n src: match[2],\n });\n }\n }\n\n return images;\n};\n\nexport default extractImageCarouselImages;\n","// Helper function to extract links from markdown content\nconst extractLinks = (content: string): string[] => {\n const linkRegex = /\\[.*?\\]\\((.*?)\\)/g;\n const urls: string[] = [];\n let match;\n\n while ((match = linkRegex.exec(content)) !== null) {\n if (match[1]) {\n urls.push(match[1]);\n }\n }\n\n return urls;\n};\n\nexport default extractLinks;\n","type ParsedLink = {\n text: string;\n url: string;\n};\n\nexport function extractNavigateProperties(markdown: string): ParsedLink | null {\n const match = markdown.match(/!\\[([^\\]]+)\\]\\(([^)]+)\\)/);\n if (!match) return null;\n\n const [, text, url] = match;\n return { text, url };\n}\n","// Helper function to extract payment link from markdown content\nconst extractPaymentLink = (content: string): string | null => {\n const linkRegex = /\\[.*?\\]\\((.*?)\\)/;\n const match = content.match(linkRegex);\n return match ? match[1] : null;\n};\n\nexport default extractPaymentLink;\n","import { ReactNode } from \"react\";\n\nconst extractTextFromNode = (node: ReactNode): string => {\n if (typeof node === \"string\") {\n return node;\n }\n if (Array.isArray(node)) {\n return node.map(extractTextFromNode).join(\"\");\n }\n if (typeof node === \"object\" && node !== null && \"props\" in node) {\n return extractTextFromNode(node.props.children);\n }\n return \"\";\n};\n\nexport default extractTextFromNode;\n","function ensureNewlineBeforeTripleColons(input: string): string {\n return input.replace(/([^\\n]):::/g, \"$1\\n:::\");\n}\n\n// Parse the special list-item blocks and newlines\nconst parseMessageContent = (\n content: string\n): { type: string; content: string; isComplete?: boolean }[] => {\n // Replace literal \\n with actual newlines\n content = content.replace(/\\\\n/g, \"\\n\");\n\n const blocks = [];\n let currentText = \"\";\n let currentListItem = \"\";\n let currentPayment = \"\";\n let currentActions = \"\";\n let currentImages = \"\";\n let currentLinks = \"\";\n let currentNavigate = \"\";\n let currentDocuments = \"\";\n\n let inListItem = false;\n let inPayment = false;\n let inActions = false;\n let inImages = false;\n let inLinks = false;\n let inNavigate = false;\n let inDocuments = false;\n\n // Split content into lines to process them one by one\n\n // handle navigate formatting which can sometimes be returend as\n // links\\n ![Marriott Bonvoy](https://www.marriott.com)\\n::: ::: navigate\\n![Open Booking Page](/booking?hotelId=lp1c4be&checkin=2025-07-24&checkout=2025-07-26)\\n:::\"\n const formattedContent = ensureNewlineBeforeTripleColons(content);\n const lines = formattedContent.split(\"\\n\");\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // Check for list item start marker\n if (line.trim() === \"::: list-item\" || line.trim() === \":::list-item\") {\n // If we have accumulated text, add it as a text block\n if (currentText.trim()) {\n blocks.push({\n type: \"text\",\n content: currentText.trim(),\n });\n currentText = \"\";\n }\n inListItem = true;\n continue;\n }\n\n // Check for payment start marker\n if (line.trim() === \"::: payment\" || line.trim() === \":::payment\") {\n // If we have accumulated text, add it as a text block\n if (currentText.trim()) {\n blocks.push({\n type: \"text\",\n content: currentText.trim(),\n });\n currentText = \"\";\n }\n inPayment = true;\n continue;\n }\n\n // Check for actions start marker\n if (line.trim() === \"::: actions\" || line.trim() === \":::actions\") {\n // If we have accumulated text, add it as a text block\n if (currentText.trim()) {\n blocks.push({\n type: \"text\",\n content: currentText.trim(),\n });\n currentText = \"\";\n }\n inActions = true;\n continue;\n }\n\n // Check for images start marker\n if (line.trim() === \"::: images\" || line.trim() === \":::images\") {\n // If we have accumulated text, add it as a text block\n if (currentText.trim()) {\n blocks.push({\n type: \"text\",\n content: currentText.trim(),\n });\n currentText = \"\";\n }\n inImages = true;\n continue;\n }\n\n // Check for links start marker\n if (line.trim() === \"::: links\" || line.trim() === \":::links\") {\n // If we have accumulated text, add it as a text block\n if (currentText.trim()) {\n blocks.push({\n type: \"text\",\n content: currentText.trim(),\n });\n currentText = \"\";\n }\n inLinks = true;\n continue;\n }\n\n if (line.trim() === \"::: navigate\" || line.trim() === \":::navigate\") {\n // If we have accumulated text, add it as a text block\n if (currentText.trim()) {\n blocks.push({\n type: \"text\",\n content: currentText.trim(),\n });\n currentText = \"\";\n }\n inNavigate = true;\n continue;\n }\n\n if (line.trim() === \"::: documents\" || line.trim() === \":::documents\") {\n // If we have accumulated text, add it as a text block\n if (currentText.trim()) {\n blocks.push({\n type: \"text\",\n content: currentText.trim(),\n });\n currentText = \"\";\n }\n inDocuments = true;\n continue;\n }\n\n // Check for list item end marker\n if (line.trim() === \":::\" && inListItem) {\n blocks.push({\n type: \"list-item\",\n content: currentListItem.trim(),\n isComplete: true,\n });\n currentListItem = \"\";\n inListItem = false;\n continue;\n }\n\n // Check for payment end marker\n if (line.trim() === \":::\" && inPayment) {\n blocks.push({\n type: \"payment\",\n content: currentPayment.trim(),\n isComplete: true,\n });\n currentPayment = \"\";\n inPayment = false;\n continue;\n }\n\n // Check for actions end marker\n if (line.trim() === \":::\" && inActions) {\n blocks.push({\n type: \"actions\",\n content: currentActions.trim(),\n isComplete: true,\n });\n currentActions = \"\";\n inActions = false;\n continue;\n }\n\n // Check for images end marker\n if (line.trim() === \":::\" && inImages) {\n blocks.push({\n type: \"images\",\n content: currentImages.trim(),\n isComplete: true,\n });\n currentImages = \"\";\n inImages = false;\n continue;\n }\n\n // Check for links end marker\n if (line.trim() === \":::\" && inLinks) {\n blocks.push({\n type: \"links\",\n content: currentLinks.trim(),\n isComplete: true,\n });\n currentLinks = \"\";\n inLinks = false;\n continue;\n }\n\n // Check for navigate end marker\n if (line.trim() === \":::\" && inNavigate) {\n blocks.push({\n type: \"navigate\",\n content: currentNavigate.trim(),\n isComplete: true,\n });\n\n currentNavigate = \"\";\n inNavigate = false;\n continue;\n }\n\n // Check for navigate end marker\n if (line.trim() === \":::\" && inDocuments) {\n blocks.push({\n type: \"documents\",\n content: currentDocuments.trim(),\n isComplete: true,\n });\n\n currentDocuments = \"\";\n inDocuments = false;\n continue;\n }\n\n // If we're in a list item, accumulate the content\n if (inListItem) {\n currentListItem += line + \"\\n\";\n } else if (inPayment) {\n // If we're in a payment block, accumulate the content\n currentPayment += line + \"\\n\";\n } else if (inActions) {\n // If we're in an actions block, accumulate the content\n currentActions += line + \"\\n\";\n } else if (inImages) {\n // If we're in an images block, accumulate the content\n currentImages += line + \"\\n\";\n } else if (inLinks) {\n // If we're in a links block, accumulate the content\n currentLinks += line + \"\\n\";\n } else if (inNavigate) {\n // If we're in a documents block, accumulate the content\n currentNavigate += line + \"\\n\";\n } else if (inDocuments) {\n // If we're in a navigate block, accumulate the content\n currentDocuments += line + \"\\n\";\n } else {\n // If we're not in any special block, accumulate text\n currentText += line + \"\\n\";\n }\n }\n\n // Handle any remaining content\n if (inListItem) {\n // If we're still in a list item, it's incomplete\n blocks.push({\n type: \"list-item\",\n content: currentListItem.trim(),\n isComplete: false,\n });\n } else if (inPayment) {\n // If we're still in a payment block, it's incomplete\n blocks.push({\n type: \"payment\",\n content: currentPayment.trim(),\n isComplete: false,\n });\n } else if (inActions) {\n // If we're still in an actions block, it's incomplete\n blocks.push({\n type: \"actions\",\n content: currentActions.trim(),\n isComplete: false,\n });\n } else if (inImages) {\n // If we're still in an images block, it's incomplete\n blocks.push({\n type: \"images\",\n content: currentImages.trim(),\n isComplete: false,\n });\n } else if (inLinks) {\n // If we're still in a links block, it's incomplete\n blocks.push({\n type: \"links\",\n content: currentLinks.trim(),\n isComplete: false,\n });\n } else if (inNavigate) {\n // If we're still in a navigate block, it's incomplete\n blocks.push({\n type: \"navigate\",\n content: currentNavigate.trim(),\n isComplete: false,\n });\n } else if (inDocuments) {\n // If we're still in a documents block, it's incomplete\n blocks.push({\n type: \"documents\",\n content: currentDocuments.trim(),\n isComplete: false,\n });\n } else if (currentText.trim()) {\n blocks.push({\n type: \"text\",\n content: currentText.trim(),\n });\n }\n\n return blocks;\n};\n\nexport default parseMessageContent;\n","import DOMPurify, { Config } from \"dompurify\";\n\n/**\n * Checks if HTML tags are balanced (all opening tags have corresponding closing tags)\n * This is used to detect if HTML content is complete during streaming\n * @param html - The HTML content to check\n * @returns true if all tags are balanced\n */\nfunction areHtmlTagsBalanced(html: string) {\n const selfClosingTags = new Set([\"br\", \"hr\", \"img\", \"input\", \"meta\", \"link\"]);\n const tagStack: string[] = [];\n const tagRegex = /<\\/?([a-z][a-z0-9]*)[^>]*>/gi;\n let match = tagRegex.exec(html);\n\n while (match !== null) {\n const fullTag = match[0];\n const tagName = match[1].toLowerCase();\n\n if (selfClosingTags.has(tagName) || fullTag.endsWith(\"/>\")) {\n match = tagRegex.exec(html);\n continue;\n }\n\n if (fullTag.startsWith(\"</\")) {\n if (tagStack.length === 0) {\n return false;\n }\n const poppedTag = tagStack.pop();\n if (poppedTag !== tagName) {\n return false;\n }\n } else {\n tagStack.push(tagName);\n }\n\n match = tagRegex.exec(html);\n }\n\n return tagStack.length === 0;\n}\n\nexport function detectHtmlContent(content: string): {\n isHtml: boolean;\n isComplete: boolean;\n} {\n const htmlTagPattern = /^\\s*<[a-z]+[\\s>]/i;\n const appearsToBeHtml = htmlTagPattern.test(content.trim());\n\n if (!appearsToBeHtml) {\n return { isHtml: false, isComplete: false };\n }\n\n const isComplete = areHtmlTagsBalanced(content);\n return { isHtml: true, isComplete };\n}\n\nexport function sanitizeHtml(html: string): string {\n if (typeof window === \"undefined\") {\n return \"\";\n }\n\n const config: Config = {\n ALLOWED_TAGS: [\"div\", \"b\", \"ol\", \"ul\", \"li\", \"a\", \"br\"],\n ALLOWED_ATTR: [\"style\", \"href\", \"target\", \"rel\"],\n ALLOW_DATA_ATTR: false,\n ALLOWED_URI_REGEXP:\n /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|data):|[^a-z]|[a-z+.-]+(?:[^a-z+.\\-:]|$))/i,\n };\n\n return DOMPurify.sanitize(html, config);\n}\n","import { useState, useRef, useCallback } from \"react\";\nimport { CarouselImageDialog } from \"../dialogs/CarouselImageDialog\";\n\ntype CarouselImage = { src: string; alt: string };\n\ntype ImageCarouselMessageProps = {\n images: CarouselImage[];\n};\nexport default function ImageCarouselMessage({\n images,\n}: ImageCarouselMessageProps) {\n const [isDialogOpen, setIsDialogOpen] = useState(false);\n const [initialImageIndex, setInitialImageIndex] = useState(0);\n const carouselRef = useRef<HTMLDivElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [startX, setStartX] = useState(0);\n const [scrollLeft, setScrollLeft] = useState(0);\n const [dragDistance, setDragDistance] = useState(0);\n\n const handleMouseDown = useCallback((event: React.MouseEvent) => {\n if (!carouselRef.current) {\n return;\n }\n\n setIsDragging(true);\n setStartX(event.pageX - carouselRef.current.offsetLeft);\n setScrollLeft(carouselRef.current.scrollLeft);\n setDragDistance(0); // Reset drag distance\n\n // Prevent text selection during drag\n event.preventDefault();\n }, []);\n\n const handleMouseMove = useCallback(\n (event: React.MouseEvent) => {\n if (!isDragging || !carouselRef.current) {\n return;\n }\n\n event.preventDefault();\n const x = event.pageX - carouselRef.current.offsetLeft;\n const walk = (x - startX) * 2; // Scroll speed multiplier\n carouselRef.current.scrollLeft = scrollLeft - walk;\n\n // Track the total distance moved\n setDragDistance(Math.abs(x - startX));\n },\n [isDragging, startX, scrollLeft]\n );\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n // Handle image click - only open dialog if we weren't dragging significantly\n const handleImageClick = useCallback(\n (imageIndex: number, event: React.MouseEvent) => {\n // Define a threshold for what constitutes a \"drag\" vs a \"click\"\n const CLICK_THRESHOLD = 5; // pixels\n\n // If we moved more than the threshold, consider it a drag and don't open dialog\n if (dragDistance > CLICK_THRESHOLD) {\n event.preventDefault();\n return;\n }\n\n setInitialImageIndex(imageIndex);\n setIsDialogOpen(true);\n },\n [dragDistance]\n );\n\n const handleDragStart = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n const handleDragOver = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n return (\n <div\n data-testid=\"image-carousel-message\"\n className=\"chat-image-carousel-message lua:w-full\"\n >\n <div\n ref={carouselRef}\n className=\"chat-image-carousel markdown-image-carousel\"\n style={{ cursor: isDragging ? \"grabbing\" : \"grab\" }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseLeave}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n >\n {images.map((image, index) => (\n <div\n key={image.src}\n className=\"chat-carousel-image-item markdown-image-item\"\n onClick={event => handleImageClick(index, event)}\n >\n <img\n src={image.src}\n alt={image.alt}\n draggable={false}\n style={{ userSelect: \"none\" }}\n />\n </div>\n ))}\n </div>\n <CarouselImageDialog\n images={images}\n initialIndex={initialImageIndex}\n open={isDialogOpen}\n onClose={() => setIsDialogOpen(false)}\n />\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { ImageDialog } from \"../dialogs/ImageDialog\";\n\ntype ImageMessageProps = {\n message: {\n url: string;\n content: string;\n isUploading?: boolean;\n uploadProgress?: number;\n };\n};\n\nexport default function ImageMessage({ message }: ImageMessageProps) {\n const [isDialogOpen, setIsDialogOpen] = useState(false);\n\n if (!message.url) {\n return null;\n }\n\n return (\n <div\n data-testid=\"image-message\"\n className=\"chat-image-message lua:flex lua:flex-col lua:w-3/5 lua:mx-4 lua:sm:mx-5\"\n >\n <div className=\"chat-image-container lua:relative\">\n <img\n src={message.url}\n alt={message.content}\n className=\"chat-image lua:rounded-lg lua:w-full lua:cursor-pointer\"\n onClick={() => setIsDialogOpen(true)}\n />\n {message.isUploading && (\n <div className=\"chat-image-upload-overlay lua:absolute lua:inset-0 lua:bg-black lua:bg-opacity-50 lua:rounded-lg lua:flex lua:items-center lua:justify-center\">\n <div className=\"lua:text-white lua:text-sm\">\n Uploading...{\" \"}\n {message.uploadProgress ? Math.round(message.uploadProgress) : 0}%\n </div>\n </div>\n )}\n </div>\n {!message.isUploading && message.content.length > 0 && (\n <div className=\"chat-image-caption lua:w-full lua:bg-gray-100 lua:text-gray-800 lua:rounded-2xl lua:px-4 lua:p-3 lua:mt-8\">\n {message.content}\n </div>\n )}\n\n <ImageDialog\n url={message.url}\n alt={message.content}\n open={isDialogOpen}\n onClose={() => setIsDialogOpen(false)}\n />\n </div>\n );\n}\n","import { Button } from \"luaniverse\";\nimport { useEffect, useState } from \"react\";\n\ntype LinkPreviewProps = {\n url: string;\n luaApiUrl: string;\n authToken: string;\n disablePreviewOnLinks: boolean;\n};\n\nexport default function LinkPreview({\n url,\n luaApiUrl,\n authToken,\n disablePreviewOnLinks,\n}: LinkPreviewProps) {\n const [preview, setPreview] = useState<{\n title: string;\n description: string;\n image: string;\n url: string;\n } | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const fetchPreview = async () => {\n try {\n setLoading(true);\n setError(null);\n\n const token = authToken;\n if (!token) {\n throw new Error(\"No auth token available\");\n }\n\n const response = await fetch(\n `${luaApiUrl}/chat/url-metadata?url=${encodeURIComponent(url)}`,\n {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch preview: ${response.status}`);\n }\n\n const data = await response.json();\n setPreview(data);\n } catch (err) {\n console.error(\"Error fetching link preview:\", err);\n setError(err instanceof Error ? err.message : \"Failed to load preview\");\n } finally {\n setLoading(false);\n }\n };\n\n if (url && luaApiUrl && !disablePreviewOnLinks) {\n fetchPreview();\n }\n }, [url, luaApiUrl]);\n\n if (disablePreviewOnLinks) {\n return (\n <div className=\"lua:mb-5 lua:mx-[-30px]\">\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n <Button variant=\"muted\">{url}</Button>\n </a>\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className=\"lua:animate-pulse\">\n <div className=\"lua:bg-gray-300 lua:h-4 lua:w-3/4 lua:mb-2 lua:rounded\"></div>\n <div className=\"lua:bg-gray-300 lua:h-3 lua:w-1/2 lua:rounded\"></div>\n </div>\n );\n }\n\n if (error || !preview) {\n return (\n <div className=\"lua:mb-5 lua:mx-[-30px]\">\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n <Button variant=\"muted\">{url}</Button>\n </a>\n </div>\n );\n }\n\n return (\n <a\n href={preview.url || url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"lua:block lua:border lua:border-gray-200 lua:rounded-lg lua:p-3 lua:hover:bg-gray-50 lua:transition-colors lua:no-underline lua:max-w-sm\"\n >\n {preview.image && (\n <img\n src={preview.image}\n alt={preview.title}\n className=\"lua:w-full lua:h-32 lua:object-cover lua:rounded lua:mb-2\"\n onError={event => {\n event.currentTarget.style.display = \"none\";\n }}\n />\n )}\n <div className=\"lua:text-sm lua:font-medium lua:text-gray-900 lua:mb-1 lua:line-clamp-2\">\n {preview.title}\n </div>\n {preview.description && (\n <div className=\"lua:text-xs lua:text-gray-600 lua:line-clamp-2\">\n {preview.description}\n </div>\n )}\n <div className=\"lua:text-xs lua:text-gray-400 lua:mt-1 lua:truncate\">\n {new URL(preview.url || url).hostname}\n </div>\n </a>\n );\n}\n","import LinkPreview from \"../previews/LinkPreview\";\n\ntype LinkListMessageProps = {\n links: string[];\n luaApiUrl: string;\n authToken: string;\n disablePreviewOnLinks: boolean;\n};\n\nexport default function LinkListMessage({\n links,\n luaApiUrl,\n authToken,\n disablePreviewOnLinks,\n}: LinkListMessageProps) {\n return (\n <div\n data-testid=\"link-list-message\"\n className=\"chat-link-list-message lua:w-full\"\n >\n <div className=\"chat-links-container lua:space-y-2 lua:mx-4 lua:sm:mx-5\">\n {links.map(url => (\n <LinkPreview\n key={url}\n url={url}\n luaApiUrl={luaApiUrl}\n authToken={authToken}\n disablePreviewOnLinks={disablePreviewOnLinks}\n />\n ))}\n </div>\n </div>\n );\n}\n","import { MapContainer, TileLayer, Marker, Popup } from \"react-leaflet\";\n\ntype LeafletMapProps = {\n location: {\n latitude: number;\n longitude: number;\n address?: string;\n };\n};\n\nexport default function LeafletMap({ location }: LeafletMapProps) {\n const position: [number, number] = [location.latitude, location.longitude];\n\n return (\n <div className=\"lua:w-full lua:h-48 lua:rounded-lg lua:overflow-hidden lua:border lua:border-gray-200\">\n <MapContainer\n center={position}\n zoom={15}\n scrollWheelZoom={false}\n className=\"lua:w-full lua:h-full\"\n >\n <TileLayer\n attribution='&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\n url=\"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\"\n />\n <Marker position={position}>\n {location.address && (\n <Popup>\n <div>{location.address}</div>\n </Popup>\n )}\n </Marker>\n </MapContainer>\n </div>\n );\n}\n\n// CSS for Leaflet should be imported by the consuming application\n// Add to your main CSS or index.html:\n// <link rel=\"stylesheet\" href=\"https://unpkg.com/leaflet@1.9.4/dist/leaflet.css\" />\n","import LeafletMap from \"./LeafletMap\";\n\ntype MapComponentProps = {\n location: {\n latitude: number;\n longitude: number;\n address?: string;\n };\n};\n\nexport default function MapComponent({ location }: MapComponentProps) {\n return (\n <div className=\"lua:w-full lua:h-full lua:bg-gray-200 lua:rounded-lg lua:flex lua:items-center lua:justify-center lua:flex-col\">\n {location.address && <LeafletMap location={location} />}\n </div>\n );\n}\n","import MapComponent from \"./MapComponent\";\n\ntype LocationPreviewProps = {\n location: {\n latitude: number;\n longitude: number;\n address?: string;\n };\n};\n\nexport default function LocationPreview({ location }: LocationPreviewProps) {\n return (\n <div className=\"lua:w-full lua:h-60 lua:rounded-lg\" data-testid=\"location-preview\">\n <MapComponent location={location} />\n </div>\n );\n}\n","import { MapPin } from \"luaniverse\";\nimport LocationPreview from \"../previews/LocationPreview\";\nimport { ChatMessageProps } from \"./ChatMessage\";\n\ntype LocationMessageProps = {\n message: ChatMessageProps;\n};\n\nexport default function LocationMessage({ message }: LocationMessageProps) {\n return (\n <div\n data-testid=\"location-message\"\n className=\"chat-location-message lua:flex lua:flex-col lua:w-11/12 sm:lua:w-3/5 lua:bg-gray-100 lua:text-gray-800 lua:rounded-2xl lua:p-3 lua:mx-4 lua:sm:mx-5\"\n >\n <div className=\"chat-location-preview-container location-preview-container lua:relative\">\n {message.location && <LocationPreview location={message.location} />}\n {message.isUploading && (\n <div className=\"chat-location-upload-overlay lua:absolute lua:inset-0 lua:bg-black lua:bg-opacity-50 lua:rounded-lg lua:flex lua:items-center lua:justify-center\">\n <div className=\"lua:text-white lua:text-sm\">\n Sharing location...\n </div>\n </div>\n )}\n <div className=\"chat-location-info lua:flex lua:items-center lua:gap-2 lua:mt-3\">\n <MapPin fill=\"black\" />\n <div className=\"lua:flex-1\">\n <div className=\"lua:text-sm\">{message.content}</div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport parseUrl from \"../utilities/parseUrl\";\n\ntype NavigateMessageProps = {\n text: string;\n url: string;\n onNavigate?: (\n pathname: string,\n options: { query: Record<string, string> }\n ) => void;\n};\n\nexport function NavigateMessage({ url, onNavigate }: NavigateMessageProps) {\n const [hasNavigated, setHasSetNavigated] = useState(false);\n\n useEffect(() => {\n if (onNavigate && !hasNavigated) {\n setHasSetNavigated(true);\n\n const parsedUrl = parseUrl(url);\n onNavigate(parsedUrl.pathname, {\n ...(parsedUrl.queryParams && { query: parsedUrl.queryParams }),\n });\n }\n }, [hasNavigated, onNavigate]);\n\n return null;\n}\n","type VideoMessageProps = {\n message: {\n url: string;\n content: string;\n isUploading?: boolean;\n uploadProgress?: number;\n };\n};\n\nexport default function VideoMessage({ message }: VideoMessageProps) {\n return (\n <div\n data-testid=\"video-message\"\n className=\"chat-video-message lua:flex lua:flex-col lua:w-3/5 lua:mx-4 lua:sm:mx-5\"\n >\n <div className=\"chat-video-container lua:relative\">\n <video\n src={message.url}\n controls\n className=\"chat-video lua:rounded-lg lua:w-full\"\n />\n {message.isUploading && (\n <div className=\"chat-video-upload-overlay lua:absolute lua:inset-0 lua:bg-black lua:bg-opacity-50 lua:rounded-lg lua:flex lua:items-center lua:justify-center\">\n <div className=\"lua:text-white lua:text-sm\">\n Uploading...{\" \"}\n {message.uploadProgress ? Math.round(message.uploadProgress) : 0}%\n </div>\n </div>\n )}\n </div>\n {!message.isUploading && message.content && (\n <div className=\"chat-video-caption lua:w-full lua:bg-gray-100 lua:text-gray-800 lua:rounded-2xl lua:px-4 lua:p-3 lua:mt-8\">\n {message.content}\n </div>\n )}\n </div>\n );\n}\n","import { memo, ReactNode, useCallback } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport extractDocuments from \"../utilities/extractDocuments\";\nimport ChatListItemGroup from \"./ChatListItemGroup\";\nimport DocumentsMessage from \"./DocumentsMessage\";\n\n// Note: These utility functions should be provided by the consuming application\n// import { formatMessageTimestamp } from \"../../../utils/date-utils\";\n// import { getFileTypeInfo } from \"../../../utils/file-utils\";\n\n// Temporary implementations - should be replaced with actual utility functions\nfunction formatMessageTimestamp(timestamp: string): string {\n return new Date(timestamp).toLocaleTimeString();\n}\n\nfunction getFileTypeInfo(_file: File): { icon: any } {\n // This is a placeholder - the actual implementation should be provided by the consuming app\n return { icon: () => null };\n}\n\nimport { AudioPreview } from \"../previews/AudioPreview\";\nimport { PaymentPreview } from \"../previews/PaymentPreview\";\nimport createMarkdownComponents from \"../utilities/createMarkdownComponents\";\nimport extractActionButtons from \"../utilities/extractActionButtons\";\nimport extractImageCarouselImages from \"../utilities/extractImageCarouselImages\";\nimport extractLinks from \"../utilities/extractLinks\";\nimport { extractNavigateProperties } from \"../utilities/extractNavigateProperties\";\nimport extractPaymentLink from \"../utilities/extractPaymentLink\";\nimport extractTextFromNode from \"../utilities/extractTextFromNode\";\nimport parseMessageContent from \"../utilities/parseMessageContent\";\nimport { detectHtmlContent, sanitizeHtml } from \"../utilities/sanitizeHtml\";\nimport ChatListItem from \"./ChatListItem\";\nimport ImageCarouselMessage from \"./ImageCarouselMessage\";\nimport ImageMessage from \"./ImageMessage\";\nimport LinkListMessage from \"./LinkListMessage\";\nimport LocationMessage from \"./LocationMessage\";\nimport { NavigateMessage } from \"./NavigateMessage\";\nimport VideoMessage from \"./VideoMessage\";\n\nexport type ChatMessageProps = {\n id: string;\n role: \"user\" | \"assistant\";\n content: string;\n type?:\n | \"text\"\n | \"image\"\n | \"video\"\n | \"audio\"\n | \"location\"\n | \"actions\"\n | \"links\"\n | \"tool\"\n | \"payment\"\n | \"file\";\n image?: string;\n video?: string;\n audio?: string;\n mediaType?: string;\n text?: string;\n location?: {\n latitude: number;\n longitude: number;\n address?: string;\n };\n url?: string;\n waitingMessage?: string;\n isUploading?: boolean;\n uploadProgress?: number;\n createdAt: string;\n onSelect?: (text: string) => void;\n luaApiUrl?: string;\n};\n\nexport const ChatMessage = memo(function ChatMessage({\n message,\n onSelect,\n luaApiUrl,\n authToken,\n disablePreviewOnLinks = false,\n onNavigate,\n}: {\n message: ChatMessageProps;\n onSelect?: (text: string) => void;\n luaApiUrl?: string;\n authToken?: string;\n disablePreviewOnLinks?: boolean;\n onNavigate?: (\n pathname: string,\n options: { query: Record<string, string> }\n ) => void;\n}) {\n const handleCardClick = useCallback(\n (content: string) => {\n // Extract the heading (h1) and subheading (h2) from the content\n const headingMatch = content.match(/^#\\s+(.+)$/m);\n const subheadingMatch = content.match(/^##\\s+(.+)$/m);\n\n const heading = headingMatch ? headingMatch[1] : \"\";\n const subheading = subheadingMatch ? subheadingMatch[1] : \"\";\n\n const formattedMessage = `${heading}. ${subheading}`;\n\n if (onSelect) {\n onSelect(formattedMessage);\n }\n },\n [onSelect]\n );\n\n const handleListItemClick = useCallback(\n (content: React.ReactNode) => {\n if (!onSelect) {\n return;\n }\n const text = extractTextFromNode(content).trim();\n onSelect(text);\n },\n [onSelect]\n );\n\n const renderContent = useCallback((): ReactNode => {\n if (message.type === \"location\") {\n return <LocationMessage message={message} />;\n }\n\n if (message.mediaType?.startsWith(\"video\")) {\n if (message.url) {\n return (\n <VideoMessage\n message={{\n url: message.url,\n content: message.content || \"\",\n isUploading: message.isUploading,\n uploadProgress: message.uploadProgress,\n }}\n />\n );\n }\n return null;\n }\n\n if (message.mediaType?.startsWith(\"image\")) {\n if (message.url) {\n return (\n <ImageMessage\n message={{\n url: message.url,\n content: message.content || \"\",\n isUploading: message.isUploading,\n uploadProgress: message.uploadProgress,\n }}\n />\n );\n }\n return null;\n }\n\n if (message.mediaType?.startsWith(\"audio\")) {\n return <AudioPreview message={message} />;\n }\n\n if (message.type === \"file\" && message.mediaType) {\n const fileTypeInfo = getFileTypeInfo(\n new File([], \"\", { type: message.mediaType })\n );\n const Icon = fileTypeInfo.icon;\n\n return (\n <a\n data-testid=\"chat-file-message\"\n href={message.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"chat-file-message lua:mx-4 lua:sm:mx-5\"\n >\n <div className=\"lua:flex lua:flex-col lua:gap-8\">\n <div className=\"chat-file-card lua:flex lua:items-center lua:justify-start lua:p-3 lua:border lua:border-gray-200 lua:rounded-lg lua:bg-white lua:w-80\">\n <Icon className=\"lua:w-12 lua:h-12 lua:text-gray-500\" />\n <div className=\"lua:flex lua:flex-col lua:gap-1 lua:pl-2\">\n File\n <span className=\"lua:text-gray-500 lua:text-sm\">\n {message.mediaType}\n </span>\n </div>\n </div>\n {message.content && (\n <div className=\"chat-file-content lua:bg-gray-100 lua:rounded-2xl lua:px-4 lua:py-2 lua:w-80\">\n <div className=\"lua:text-sm lua:text-gray-900\">\n {message.content}\n </div>\n </div>\n )}\n </div>\n </a>\n );\n }\n\n if (message.role === \"user\") {\n return message.content;\n }\n\n if (message.content === \"...\") {\n return null;\n }\n\n const htmlDetection = detectHtmlContent(message.content);\n if (htmlDetection.isHtml) {\n if (htmlDetection.isComplete) {\n const sanitizedHtml = sanitizeHtml(message.content);\n return (\n <div\n className=\"chat-html-content lua:prose lua:prose-sm lua:max-w-none\"\n dangerouslySetInnerHTML={{ __html: sanitizedHtml }}\n />\n );\n }\n // If HTML is incomplete (streaming), show a loading indicator\n // This prevents showing raw HTML tags during streaming\n return (\n <div className=\"lua:flex lua:items-center lua:gap-2 lua:text-gray-500\">\n <div className=\"lua:animate-pulse\">●●●</div>\n </div>\n );\n }\n\n const blocks = parseMessageContent(message.content);\n const markdownComponents = createMarkdownComponents(handleListItemClick);\n\n return (\n <div className=\"chat-markdown-content lua:prose lua:prose-sm lua:max-w-none\">\n <div className=\"lua:flex lua:flex-wrap lua:gap-4\">\n {(() => {\n const listItemBlocks = blocks.filter(b => b.type === \"list-item\");\n const hasListItemSequence = listItemBlocks.length > 1;\n\n if (hasListItemSequence) {\n // Group consecutive list items together\n const groupedBlocks: (typeof blocks)[] = [];\n let currentGroup: typeof blocks = [];\n\n blocks.forEach(block => {\n if (block.type === \"list-item\") {\n currentGroup.push(block);\n } else {\n if (currentGroup.length > 0) {\n groupedBlocks.push(currentGroup);\n currentGroup = [];\n }\n groupedBlocks.push([block]);\n }\n });\n\n if (currentGroup.length > 0) {\n groupedBlocks.push(currentGroup);\n }\n\n return groupedBlocks.map((group, groupIndex) => {\n if (group.length > 1 && group[0].type === \"list-item\") {\n return (\n <ChatListItemGroup\n key={groupIndex}\n group={group}\n onCardClick={handleCardClick}\n onListItemClick={handleListItemClick}\n onNavigate={onNavigate}\n />\n );\n }\n\n return group.map((block, blockIndex) => {\n if (block.type === \"list-item\") {\n return (\n <ChatListItem\n key={blockIndex}\n block={block}\n onCardClick={handleCardClick}\n onListItemClick={handleListItemClick}\n onNavigate={onNavigate}\n />\n );\n }\n\n if (block.type === \"actions\") {\n const buttons = extractActionButtons(block.content);\n if (buttons.length > 0 && block.isComplete) {\n return null;\n }\n return null;\n }\n\n if (block.type === \"images\") {\n const images = extractImageCarouselImages(block.content);\n if (images.length > 0) {\n return (\n <ImageCarouselMessage\n key={blockIndex}\n images={images}\n />\n );\n }\n }\n\n if (block.type === \"links\") {\n const links = extractLinks(block.content);\n if (links.length > 0 && block.isComplete) {\n return (\n <LinkListMessage\n key={blockIndex}\n links={links}\n luaApiUrl={luaApiUrl || \"\"}\n authToken={authToken || \"\"}\n disablePreviewOnLinks={disablePreviewOnLinks}\n />\n );\n }\n return null;\n }\n\n if (block.type === \"navigate\") {\n const navigateProperties = extractNavigateProperties(\n block.content\n );\n\n if (navigateProperties && block.isComplete) {\n return (\n <NavigateMessage\n key={blockIndex}\n text={navigateProperties.text}\n url={navigateProperties.url}\n onNavigate={onNavigate}\n />\n );\n }\n return null;\n }\n\n if (block.type === \"documents\") {\n const documents = extractDocuments(block.content);\n\n return (\n <DocumentsMessage\n key={blockIndex}\n documents={documents}\n />\n );\n }\n\n if (block.type === \"payment\") {\n const paymentLink = extractPaymentLink(block.content);\n if (paymentLink) {\n return (\n <div\n key={blockIndex}\n className=\"chat-payment-message lua:w-full lua:mx-4 lua:sm:mx-5\"\n >\n <PaymentPreview url={paymentLink} />\n </div>\n );\n }\n return null;\n }\n\n return (\n <div\n key={blockIndex}\n className=\"chat-markdown-block lua:w-full\"\n >\n <ReactMarkdown components={markdownComponents}>\n {block.content}\n </ReactMarkdown>\n </div>\n );\n });\n });\n }\n\n return blocks.map((block, blockIndex) => {\n if (block.type === \"list-item\") {\n return (\n <ChatListItem\n key={blockIndex}\n block={block}\n onCardClick={handleCardClick}\n onListItemClick={handleListItemClick}\n onNavigate={onNavigate}\n />\n );\n }\n\n if (block.type === \"actions\") {\n const buttons = extractActionButtons(block.content);\n if (buttons.length > 0 && block.isComplete) {\n return null;\n }\n return null;\n }\n\n if (block.type === \"images\") {\n const images = extractImageCarouselImages(block.content);\n if (images.length > 0) {\n return (\n <ImageCarouselMessage key={blockIndex} images={images} />\n );\n }\n }\n\n if (block.type === \"navigate\") {\n const navigateProperties = extractNavigateProperties(\n block.content\n );\n\n if (navigateProperties && block.isComplete) {\n return (\n <NavigateMessage\n key={blockIndex}\n text={navigateProperties.text}\n url={navigateProperties.url}\n onNavigate={onNavigate}\n />\n );\n }\n return null;\n }\n\n if (block.type === \"documents\") {\n const documents = extractDocuments(block.content);\n\n return (\n <DocumentsMessage key={blockIndex} documents={documents} />\n );\n }\n\n if (block.type === \"links\") {\n const links = extractLinks(block.content);\n if (links.length > 0 && block.isComplete) {\n return (\n <LinkListMessage\n key={blockIndex}\n links={links}\n luaApiUrl={luaApiUrl || \"\"}\n authToken={authToken || \"\"}\n disablePreviewOnLinks={disablePreviewOnLinks}\n />\n );\n }\n return null;\n }\n\n if (block.type === \"payment\") {\n const paymentLink = extractPaymentLink(block.content);\n if (paymentLink) {\n return (\n <div\n key={blockIndex}\n className=\"chat-payment-message lua:w-full lua:mx-4 lua:sm:mx-5 lua:mb-5\"\n >\n <PaymentPreview url={paymentLink} />\n </div>\n );\n }\n return null;\n }\n\n return (\n <div\n key={blockIndex}\n className=\"chat-markdown-block lua:w-full\"\n >\n <ReactMarkdown components={markdownComponents}>\n {block.content}\n </ReactMarkdown>\n </div>\n );\n });\n })()}\n </div>\n </div>\n );\n }, [message, handleCardClick, handleListItemClick]);\n\n return (\n <div\n className={`chat-message-container lua:flex lua:flex-col ${\n message.role === \"user\" ? \"lua:items-end\" : \"lua:items-start\"\n } lua:gap-1`}\n >\n <div\n className={`lua:flex ${\n message.role === \"user\" ? \"lua:justify-end\" : \"lua:justify-start\"\n } lua:items-start lua:gap-2 lua:w-full`}\n >\n {![\"file\", \"image\", \"video\", \"tool\", \"location\"].includes(\n message.type || \"\"\n ) &&\n message.content !== \"...\" && (\n <div\n className={`chat-message-bubble ${\n message.role === \"user\"\n ? \"chat-message-bubble-user lua:max-w-full lua:md:max-w-3/5 lua:bg-gray-100 lua:text-gray-800 lua:rounded-2xl lua:px-4 lua:py-3 lua:mx-4 lua:sm:mx-5 lua:whitespace-pre-wrap\"\n : \"chat-message-bubble-agent lua:w-full lua:bg-white lua:text-gray-800 lua:rounded-lg lua:py-3 lua:rounded-bl-none\"\n }`}\n style={{ wordBreak: \"break-word\" }}\n >\n {renderContent()}\n </div>\n )}\n {[\"file\", \"image\", \"video\", \"location\"].includes(message.type || \"\") &&\n renderContent()}\n </div>\n\n {/* Message timestamp */}\n <div\n className={`lua-message-timestamp lua:text-xs lua:text-gray-400 lua:px-1 ${\n message.role === \"user\"\n ? \"lua:mr-4 sm:lua:mr-5\"\n : \"lua:ml-4 sm:lua:ml-5\"\n }`}\n >\n {formatMessageTimestamp(message.createdAt)}\n </div>\n </div>\n );\n});\n","import {\n createContext,\n useContext,\n useState,\n ReactNode,\n useEffect,\n useCallback,\n} from \"react\";\n\ntype Message = {\n id: string;\n role: \"user\" | \"assistant\";\n content: string;\n type?: \"text\" | \"image\" | \"video\" | \"audio\" | \"location\" | \"tool\" | \"file\";\n url?: string;\n image?: string;\n video?: string;\n audio?: string;\n location?: {\n latitude: number;\n longitude: number;\n address?: string;\n };\n waitingMessage?: string;\n isUploading?: boolean;\n createdAt: string;\n data?: string;\n mediaType?: string;\n uploadProgress?: number;\n};\n\ntype LoadingMessage = string | null;\n\n// Split context into multiple contexts to avoid unnecessary re-renders\nconst MessagesContext = createContext<\n | {\n messages: Message[];\n setMessages: React.Dispatch<React.SetStateAction<Message[]>>;\n }\n | undefined\n>(undefined);\n\nconst InputContext = createContext<\n | {\n inputMessage: string;\n setInputMessage: React.Dispatch<React.SetStateAction<string>>;\n }\n | undefined\n>(undefined);\n\nconst LoadingContext = createContext<\n | {\n loadingMessage: LoadingMessage | null;\n setLoadingMessage: React.Dispatch<\n React.SetStateAction<LoadingMessage | null>\n >;\n }\n | undefined\n>(undefined);\n\nconst UnreadContext = createContext<\n | {\n hasUnreadMessages: boolean;\n setHasUnreadMessages: React.Dispatch<React.SetStateAction<boolean>>;\n }\n | undefined\n>(undefined);\n\nconst FileUrlContext = createContext<\n | {\n getFileUrl: (file: File) => string;\n removeFileUrl: (file: File) => void;\n }\n | undefined\n>(undefined);\n\ntype ChatContextType = {\n messages: Message[];\n setMessages: React.Dispatch<React.SetStateAction<Message[]>>;\n inputMessage: string;\n setInputMessage: React.Dispatch<React.SetStateAction<string>>;\n loadingMessage: LoadingMessage | null;\n setLoadingMessage: React.Dispatch<\n React.SetStateAction<LoadingMessage | null>\n >;\n hasUnreadMessages: boolean;\n setHasUnreadMessages: React.Dispatch<React.SetStateAction<boolean>>;\n getFileUrl: (file: File) => string;\n removeFileUrl: (file: File) => void;\n};\n\nexport function ChatProvider({ children }: { children: ReactNode }) {\n const [messages, setMessages] = useState<Message[]>([]);\n const [inputMessage, setInputMessage] = useState(\"\");\n const [loadingMessage, setLoadingMessage] = useState<LoadingMessage | null>(\n null\n );\n const [hasUnreadMessages, setHasUnreadMessages] = useState(false);\n const [fileUrls] = useState(new Map<File, string>());\n\n const getFileUrl = useCallback(\n (file: File) => {\n if (!fileUrls.has(file)) {\n const url = URL.createObjectURL(file);\n fileUrls.set(file, url);\n }\n return fileUrls.get(file)!;\n },\n [fileUrls]\n );\n\n const removeFileUrl = useCallback(\n (file: File) => {\n const url = fileUrls.get(file);\n if (url) {\n URL.revokeObjectURL(url);\n fileUrls.delete(file);\n }\n },\n [fileUrls]\n );\n\n // Clean up any blob URLs when messages change\n useEffect(() => {\n return () => {\n messages.forEach(message => {\n if (message.url && message.url.startsWith(\"blob:\")) {\n URL.revokeObjectURL(message.url);\n }\n });\n // Clean up all file URLs when the provider unmounts\n fileUrls.forEach(url => URL.revokeObjectURL(url));\n };\n }, [messages, fileUrls]);\n\n return (\n <MessagesContext.Provider value={{ messages, setMessages }}>\n <InputContext.Provider value={{ inputMessage, setInputMessage }}>\n <LoadingContext.Provider\n value={{\n loadingMessage,\n setLoadingMessage,\n }}\n >\n <UnreadContext.Provider\n value={{\n hasUnreadMessages,\n setHasUnreadMessages,\n }}\n >\n <FileUrlContext.Provider value={{ getFileUrl, removeFileUrl }}>\n {children}\n </FileUrlContext.Provider>\n </UnreadContext.Provider>\n </LoadingContext.Provider>\n </InputContext.Provider>\n </MessagesContext.Provider>\n );\n}\n\n// Specific context hooks\nexport function useMessages() {\n const context = useContext(MessagesContext);\n if (context === undefined) {\n throw new Error(\"useMessages must be used within a ChatProvider\");\n }\n return context;\n}\n\nexport function useInput() {\n const context = useContext(InputContext);\n if (context === undefined) {\n throw new Error(\"useInput must be used within a ChatProvider\");\n }\n return context;\n}\n\nexport function useLoadingMessage() {\n const context = useContext(LoadingContext);\n if (context === undefined) {\n throw new Error(\"useLoadingMessage must be used within a ChatProvider\");\n }\n return context;\n}\n\nexport function useFileUrls() {\n const context = useContext(FileUrlContext);\n if (context === undefined) {\n throw new Error(\"useFileUrls must be used within a ChatProvider\");\n }\n return context;\n}\n\nexport function useUnreadMessages() {\n const context = useContext(UnreadContext);\n if (context === undefined) {\n throw new Error(\"useUnreadMessages must be used within a ChatProvider\");\n }\n return context;\n}\n\n// Combined hook for backward compatibility\nexport function useChat(): ChatContextType {\n const messagesContext = useContext(MessagesContext);\n const inputContext = useContext(InputContext);\n const loadingContext = useContext(LoadingContext);\n const unreadContext = useContext(UnreadContext);\n const fileUrlContext = useContext(FileUrlContext);\n\n if (\n messagesContext === undefined ||\n inputContext === undefined ||\n loadingContext === undefined ||\n unreadContext === undefined ||\n fileUrlContext === undefined\n ) {\n throw new Error(\"useChat must be used within a ChatProvider\");\n }\n\n return {\n ...messagesContext,\n ...inputContext,\n ...loadingContext,\n ...unreadContext,\n ...fileUrlContext,\n };\n}\n","import { Logo } from \"luaniverse\";\nimport { useChat } from \"../../contexts/ChatContext\";\n\nexport function LoadingMessage() {\n const { loadingMessage } = useChat();\n\n if (!loadingMessage) {\n return null;\n }\n\n const displayMessage = loadingMessage || \"Lua is typing...\";\n\n return (\n <div className=\"chat-loading-message lua:flex lua:items-center lua:gap-2 lua:mx-4 lua:sm:mx-5\">\n <Logo\n size={24}\n className=\"chat-loading-logo lua:w-6 lua:h-6 lua:rounded-full lua:flex-shrink-0 lua:animate-spin\"\n style={{ animationDuration: \"3s\" }}\n />\n <div className=\"chat-loading-text lua:text-sm lua:opacity-40\">\n {displayMessage}\n </div>\n </div>\n );\n}\n","import { Button } from \"luaniverse\";\nimport { ActionButton } from \"../../types/chat\";\n\ntype ActionMessageProps = {\n buttons: ActionButton[];\n onClick: (text: string) => void;\n};\n\nexport function ActionMessage({ buttons, onClick }: ActionMessageProps) {\n return (\n <div className=\"chat-action-message lua:w-full\">\n <div className=\"chat-action-buttons lua:flex lua:gap-2 lua:flex-wrap lua:mx-4 lua:sm:mx-5\">\n {buttons.map((button: ActionButton, index: number) => (\n <Button\n key={index}\n variant=\"tertiary\"\n className=\"chat-action-button lua:font-normal lua:rounded-lg lua:py-2 lua:h-auto\"\n onClick={() => onClick(button.text)}\n >\n {button.text}\n </Button>\n ))}\n </div>\n </div>\n );\n}\n","import { ActionButton } from \"../../types/chat\";\n\nexport const parseActions = (content: string): ActionButton[] => {\n const actionStartMarker = \"::: actions\";\n const actionEndMarker = \":::\";\n\n const startIndex = content.indexOf(actionStartMarker);\n\n if (startIndex === -1) return [];\n\n const endIndex = content.indexOf(\n actionEndMarker,\n startIndex + actionStartMarker.length\n );\n\n if (endIndex === -1) return [];\n\n const actionContent = content\n .slice(startIndex + actionStartMarker.length, endIndex)\n .trim();\n\n // Handle escaped newlines and split by actual newlines\n const lines = actionContent\n .replace(/\\\\n/g, \"\\n\") // Replace escaped newlines with actual newlines\n .split(\"\\n\");\n\n const trimmedLines = lines.map(line => line.trim());\n\n const filteredLines = trimmedLines.filter(\n line => line && line.startsWith(\"-\")\n );\n\n const buttons = filteredLines.map(line => ({\n text: line.replace(/^-[\\s]?/, \"\").trim(),\n onClick: line.replace(/^-[\\s]?/, \"\").trim(),\n }));\n\n return buttons;\n};\n","import { useChat } from \"../../contexts/ChatContext\";\nimport { parseActions } from \"../utilities/parseActions\";\nimport { ActionMessage } from \"./ActionMessage\";\n\ntype ChatActions = {\n onSelect: (text: string) => void;\n};\n\nexport function ChatActions({ onSelect }: ChatActions) {\n const { messages } = useChat();\n if (messages.length === 0) {\n return null;\n }\n\n const lastMessage = messages[messages.length - 1];\n const actions = parseActions(lastMessage.content);\n\n return actions.length === 0 ? null : (\n <ActionMessage buttons={actions} onClick={onSelect} />\n );\n}\n","import { Logo } from \"luaniverse\";\nimport { memo, useCallback, useEffect, useRef, useState } from \"react\";\nimport { useInput } from \"../../contexts/ChatContext\";\n\ntype ChatInputProps = {\n loading: boolean;\n disabled: boolean;\n onSend: () => void;\n onFilePaste?: (files: File[]) => void;\n};\n\nconst ChatInput = memo(function ChatInput({\n onSend,\n disabled = false,\n onFilePaste,\n}: ChatInputProps) {\n const { inputMessage, setInputMessage } = useInput();\n const [isMobile, setIsMobile] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // Detect if user is on mobile\n useEffect(() => {\n const checkMobile = () => {\n setIsMobile(\n window.matchMedia(\"(max-width: 768px)\").matches ||\n /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n )\n );\n };\n\n checkMobile();\n window.addEventListener(\"resize\", checkMobile);\n\n return () => {\n window.removeEventListener(\"resize\", checkMobile);\n };\n }, []);\n\n // Handle chat input height\n useEffect(() => {\n const textarea = textareaRef.current;\n if (!textarea) {\n return;\n }\n\n if (!disabled) {\n textarea.style.height = \"auto\";\n textarea.style.height = `${textarea.scrollHeight}px`;\n }\n }, [inputMessage]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === \"Enter\") {\n // On mobile, always allow new line on Enter\n if (isMobile) {\n return;\n }\n\n // On desktop: If Shift or Command/Ctrl is pressed with Enter, allow new line\n if (event.shiftKey || event.metaKey || event.ctrlKey) {\n return;\n }\n\n // Otherwise on desktop, prevent default (which would add a new line) and send message\n event.preventDefault();\n onSend();\n }\n };\n\n // Handle clipboard paste events\n const handlePaste = useCallback(\n (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n // Check if the clipboard contains files\n const { items } = event.clipboardData;\n\n if (!items || !onFilePaste) {\n return;\n }\n\n const files: File[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n\n // Check if the clipboard item is a file\n if (item.kind === \"file\") {\n const file = item.getAsFile();\n if (file) {\n files.push(file);\n }\n }\n }\n\n // If we have files, pass them to the parent component\n if (files.length > 0) {\n event.preventDefault(); // Prevent default paste behavior when we have files\n onFilePaste(files);\n }\n },\n [onFilePaste]\n );\n\n return (\n <div className=\"lua:flex lua:gap-3 lua:py-2 lua:px-3 lua:items-start\">\n <Logo\n size={32}\n className=\"lua:w-8 lua:h-8 lua:rounded-full lua:flex-shrink-0 lua:m-1\"\n />\n\n <div className=\"lua:flex-1 lua:flex\">\n <textarea\n ref={textareaRef}\n disabled={disabled}\n value={inputMessage}\n onChange={event => setInputMessage(event.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={\n disabled\n ? \"This conversation's chat window has already been closed\"\n : \"Reply to user\"\n }\n className={`lua:w-full lua:pl-0 lua:pr-4 lua:py-2 lua:resize-none lua:overflow-y-auto lua:border-none lua:focus:outline-none lua:focus:ring-0 lua:text-gray-700 lua:min-h-10 lua:max-h-48 lua:bg-white${\n disabled ? \" lua:cursor-not-allowed lua:h-14\" : \"\"\n }`}\n rows={1}\n />\n </div>\n </div>\n );\n});\n\nexport { ChatInput };\n","function getAuthToken(): string | null {\n return localStorage.getItem(\"authToken\");\n}\n\nexport async function uploadFile(\n file: File,\n cdnUrl: string,\n onProgress?: (progress: number) => void\n): Promise<{ fileId: string }> {\n const token = getAuthToken();\n if (!token) {\n throw new Error(\"No auth token found\");\n }\n\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n const formData = new FormData();\n formData.append(\"file\", file);\n\n xhr.upload.addEventListener(\"progress\", event => {\n if (event.lengthComputable && onProgress) {\n const progress = (event.loaded / event.total) * 100;\n onProgress(progress);\n }\n });\n\n xhr.addEventListener(\"load\", () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const response = JSON.parse(xhr.responseText);\n resolve(response);\n } catch {\n reject(new Error(`Failed to parse response`));\n }\n } else {\n reject(new Error(`Failed to upload file: ${xhr.status}`));\n }\n });\n\n xhr.addEventListener(\"error\", () => {\n reject(new Error(\"Network error occurred\"));\n });\n\n xhr.open(\"POST\", `${cdnUrl}/upload`);\n xhr.setRequestHeader(\"Authorization\", `Bearer ${token}`);\n xhr.send(formData);\n });\n}\n","import { XIcon } from \"luaniverse\";\nimport { useEffect, useRef, useState } from \"react\";\n\n// Note: This utility function should be provided by the consuming application\n// import { getFileTypeInfo } from \"../../../utils/file-utils\";\n\n// Temporary implementation - should be replaced with actual utility function\nfunction getFileTypeInfo(file: File): { icon: any; label: string } {\n // This is a placeholder - the actual implementation should be provided by the consuming app\n const mediaType = file.type;\n let label = \"File\";\n\n if (mediaType.startsWith(\"image/\")) {\n label = \"Image\";\n } else if (mediaType.startsWith(\"video/\")) {\n label = \"Video\";\n } else if (mediaType.startsWith(\"audio/\")) {\n label = \"Audio\";\n }\n\n return {\n icon: () => null,\n label,\n };\n}\n\nimport { uploadFile } from \"../../services/chatApi\";\n\ntype FilePreviewCardProps = {\n file: File;\n onRemove: () => void;\n cdnUrl: string;\n initialUrl?: string;\n onUploadComplete?: (file: File, url: string) => void;\n};\n\nexport function FilePreviewCard({\n file,\n onRemove,\n cdnUrl,\n initialUrl,\n onUploadComplete,\n}: FilePreviewCardProps) {\n const fileTypeInfo = getFileTypeInfo(file);\n const Icon = fileTypeInfo.icon;\n const [isUploading, setIsUploading] = useState(false);\n const [uploadProgress, setUploadProgress] = useState(0);\n const [uploadedUrl, setUploadedUrl] = useState<string | null>(\n initialUrl || null\n );\n const uploadAttempted = useRef(false);\n\n // Start upload when component mounts\n useEffect(() => {\n // Skip upload if we already have a URL or have already attempted\n if (uploadedUrl || uploadAttempted.current) {\n return;\n }\n\n const doUpload = async () => {\n setIsUploading(true);\n uploadAttempted.current = true;\n\n try {\n const { fileId } = await uploadFile(file, cdnUrl, progress => {\n setUploadProgress(progress);\n });\n\n const url = `${cdnUrl}/${fileId}`;\n setUploadedUrl(url);\n setIsUploading(false);\n\n // Notify parent component about the successful upload\n if (onUploadComplete) {\n onUploadComplete(file, url);\n }\n } catch (error) {\n console.error(\"Upload failed for file:\", file.name, error);\n setIsUploading(false);\n uploadAttempted.current = false; // Allow retry on failure\n }\n };\n\n doUpload();\n }, [file, cdnUrl, onUploadComplete, uploadedUrl]);\n\n return (\n <div className=\"lua:flex lua:items-center lua:gap-4 lua:p-3 lua:bg-white lua:border lua:border-gray-200 lua:rounded-lg\">\n <div className=\"lua:flex-shrink-0\">\n {isUploading ? (\n <div className=\"lua:w-8 lua:h-8 lua:flex lua:flex-col lua:items-center lua:justify-center\">\n <div className=\"lua:w-6 lua:h-6 lua:border-2 lua:border-t-blue-500 lua:border-r-transparent lua:border-b-transparent lua:border-l-transparent lua:rounded-full lua:animate-spin\" />\n <div className=\"lua:mt-1 lua:text-xs lua:text-gray-600 lua:font-medium\">\n {Math.round(uploadProgress)}%\n </div>\n </div>\n ) : (\n <Icon className=\"lua:w-8 lua:h-8 lua:text-gray-600\" />\n )}\n </div>\n <div className=\"lua:flex-grow lua:min-w-0\">\n <p className=\"lua:text-sm lua:font-medium lua:text-gray-900 lua:truncate\">\n {file.name}\n </p>\n <p className=\"lua:text-xs lua:text-gray-500\">{fileTypeInfo.label}</p>\n </div>\n <button\n onClick={onRemove}\n className=\"lua:flex-shrink-0 lua:w-6 lua:h-6 lua:flex lua:items-center lua:justify-center lua:rounded-full lua:bg-black lua:text-white lua:hover:bg-gray-800 lua:transition-colors\"\n >\n <XIcon className=\"lua:w-4 lua:h-4\" />\n </button>\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useChat } from \"../../contexts/ChatContext\";\nimport { uploadFile } from \"../../services/chatApi\";\n\ntype ToolbarImagePreviewProps = {\n file: File;\n onRemove: () => void;\n cdnUrl: string;\n initialUrl?: string;\n onUploadComplete?: (file: File, url: string) => void;\n};\n\nexport default function ToolbarImagePreview({\n file,\n onRemove,\n cdnUrl,\n initialUrl,\n onUploadComplete,\n}: ToolbarImagePreviewProps) {\n const { getFileUrl } = useChat();\n const [isUploading, setIsUploading] = useState(false);\n const [uploadProgress, setUploadProgress] = useState(0);\n const [uploadedUrl, setUploadedUrl] = useState<string | null>(\n initialUrl || null\n );\n const [hasAttemptedUpload, setHasAttemptedUpload] = useState(false);\n\n // Start upload when component mounts\n useEffect(() => {\n // Skip upload if we already have a URL or have already attempted\n if (initialUrl || hasAttemptedUpload) {\n return;\n }\n\n const doUpload = async () => {\n setIsUploading(true);\n setHasAttemptedUpload(true);\n\n try {\n const { fileId } = await uploadFile(file, cdnUrl, progress => {\n setUploadProgress(progress);\n });\n\n const url = `${cdnUrl}/${fileId}`;\n setUploadedUrl(url);\n setIsUploading(false);\n\n // Notify parent component about the successful upload\n if (onUploadComplete) {\n onUploadComplete(file, url);\n }\n } catch (error) {\n console.error(\"Upload failed:\", error);\n setIsUploading(false);\n }\n };\n\n doUpload();\n }, [file, initialUrl, cdnUrl, hasAttemptedUpload, onUploadComplete]);\n\n // Use either the uploaded URL or the file preview\n const imageUrl = uploadedUrl || (!isUploading ? getFileUrl(file) : undefined);\n\n return (\n <div className=\"lua:relative lua:flex-shrink-0\">\n {isUploading ? (\n <div className=\"lua:w-32 lua:h-32 lua:bg-gray-100 lua:rounded-lg lua:flex lua:flex-col lua:items-center lua:justify-center\">\n <div className=\"lua:w-8 lua:h-8 lua:border-2 lua:border-t-blue-500 lua:border-r-transparent lua:border-b-transparent lua:border-l-transparent lua:rounded-full lua:animate-spin\" />\n <div className=\"lua:mt-2 lua:text-xs lua:text-gray-600 lua:font-medium\">\n {Math.round(uploadProgress)}%\n </div>\n </div>\n ) : imageUrl ? (\n <img\n data-testid=\"image-thumbnail\"\n src={imageUrl}\n alt={file.name}\n className=\"lua:w-32 lua:h-32 lua:object-cover lua:rounded-lg\"\n />\n ) : (\n <div className=\"lua:w-32 lua:h-32 lua:bg-gray-200 lua:rounded-lg lua:flex lua:items-center lua:justify-center\">\n <span className=\"lua:text-gray-500\">No preview</span>\n </div>\n )}\n <div className=\"lua:absolute lua:bottom-1 lua:left-1 lua:px-1.5 lua:py-0.5 lua:rounded lua:bg-black/50 lua:text-white lua:text-xs\">\n {Math.floor(file.size / 1024 / 1024)}MB\n </div>\n <button\n onClick={() => onRemove()}\n className=\"lua:absolute lua:top-1 lua:right-1 lua:w-6 lua:h-6 lua:flex lua:items-center lua:justify-center lua:rounded-full lua:bg-black lua:text-white lua:hover:bg-gray-800 lua:transition-colors\"\n >\n <span className=\"lua:text-sm\">×</span>\n </button>\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\n\nimport { useChat } from \"../../contexts/ChatContext\";\nimport { uploadFile } from \"../../services/chatApi\";\n\ntype ToolbarVideoPreviewProps = {\n file: File;\n onRemove: () => void;\n cdnUrl: string;\n initialUrl?: string;\n thumbnailUrl?: string;\n onUploadComplete?: (file: File, url: string) => void;\n};\n\nexport default function ToolbarVideoPreview({\n file,\n onRemove,\n cdnUrl,\n initialUrl,\n thumbnailUrl,\n onUploadComplete,\n}: ToolbarVideoPreviewProps) {\n const { getFileUrl } = useChat();\n const [isUploading, setIsUploading] = useState(false);\n const [uploadProgress, setUploadProgress] = useState(0);\n const [uploadedUrl, setUploadedUrl] = useState<string | null>(\n initialUrl || null\n );\n const [hasAttemptedUpload, setHasAttemptedUpload] = useState(false);\n const [videoThumbnail, setVideoThumbnail] = useState<string | null>(\n thumbnailUrl || null\n );\n\n // Generate thumbnail if not provided\n useEffect(() => {\n if (!thumbnailUrl && !videoThumbnail) {\n const videoUrl = getFileUrl(file);\n const video = document.createElement(\"video\");\n video.src = videoUrl;\n\n const handleCanPlay = () => {\n try {\n // Seek to the first frame\n video.currentTime = 0;\n\n // Wait a bit for the frame to be ready\n setTimeout(() => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n console.error(\"Could not get canvas context\");\n return;\n }\n\n // Draw the video frame\n ctx.drawImage(video, 0, 0);\n\n const generatedThumbnail = canvas.toDataURL(\"image/jpeg\", 0.8);\n setVideoThumbnail(generatedThumbnail);\n }, 100);\n } catch (error) {\n console.error(\"Error generating thumbnail:\", error);\n } finally {\n URL.revokeObjectURL(videoUrl);\n video.removeEventListener(\"canplay\", handleCanPlay);\n }\n };\n\n video.addEventListener(\"canplay\", handleCanPlay);\n video.load();\n }\n }, [file, thumbnailUrl, videoThumbnail]);\n\n // Start upload when component mounts\n useEffect(() => {\n // Skip upload if we already have a URL or have already attempted\n if (initialUrl || hasAttemptedUpload) {\n return;\n }\n\n const doUpload = async () => {\n setIsUploading(true);\n setHasAttemptedUpload(true);\n\n try {\n const { fileId } = await uploadFile(file, cdnUrl, progress => {\n setUploadProgress(progress);\n });\n\n const url = `${cdnUrl}/${fileId}`;\n setUploadedUrl(url);\n setIsUploading(false);\n\n // Notify parent component about the successful upload\n if (onUploadComplete) {\n onUploadComplete(file, url);\n }\n } catch (error) {\n console.error(\"Upload failed:\", error);\n setIsUploading(false);\n }\n };\n\n doUpload();\n }, [file, initialUrl, cdnUrl, hasAttemptedUpload, onUploadComplete]);\n\n return (\n <div className=\"lua:relative lua:flex-shrink-0\">\n {isUploading ? (\n <div className=\"lua:w-32 lua:h-32 lua:bg-gray-100 lua:rounded-lg lua:flex lua:flex-col lua:items-center lua:justify-center\">\n <div className=\"lua:w-8 lua:h-8 lua:border-2 lua:border-t-blue-500 lua:border-r-transparent lua:border-b-transparent lua:border-l-transparent lua:rounded-full lua:animate-spin\" />\n <div className=\"lua:mt-2 lua:text-xs lua:text-gray-600 lua:font-medium\">\n {Math.round(uploadProgress)}%\n </div>\n </div>\n ) : (\n <div className=\"lua:relative\">\n <img\n data-testid=\"video-thumbnail\"\n src={\n videoThumbnail ||\n uploadedUrl ||\n \"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n }\n alt={file.name}\n className=\"lua:w-32 lua:h-32 lua:object-cover lua:rounded-lg lua:bg-gray-100\"\n />\n <div className=\"lua:absolute lua:inset-0 lua:flex lua:items-center lua:justify-center\">\n <div className=\"lua:w-10 lua:h-10 lua:rounded-full lua:bg-black/50 lua:flex lua:items-center lua:justify-center\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M5 3L19 12L5 21V3Z\" fill=\"white\" />\n </svg>\n </div>\n </div>\n </div>\n )}\n <div className=\"lua:absolute lua:bottom-1 lua:left-1 lua:px-1.5 lua:py-0.5 lua:rounded lua:bg-black/50 lua:text-white lua:text-xs\">\n {Math.floor(file.size / 1024 / 1024)}MB\n </div>\n <button\n onClick={() => onRemove()}\n className=\"lua:absolute lua:top-1 lua:right-1 lua:w-6 lua:h-6 lua:flex lua:items-center lua:justify-center lua:rounded-full lua:bg-black lua:text-white lua:hover:bg-gray-800 lua:transition-colors\"\n >\n <span className=\"lua:text-sm\">×</span>\n </button>\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\n// Note: This utility function should be provided by the consuming application\n// import { getFileTypeInfo } from \"../../../utils/file-utils\";\n\n// Temporary implementation - should be replaced with actual utility function\nfunction getFileTypeInfo(file: File): { category: string; icon: any; label: string } {\n // This is a placeholder - the actual implementation should be provided by the consuming app\n const mediaType = file.type;\n let category = 'other';\n let label = 'File';\n \n if (mediaType.startsWith('image/')) {\n category = 'image';\n label = 'Image';\n } else if (mediaType.startsWith('video/')) {\n category = 'video';\n label = 'Video';\n } else if (mediaType.startsWith('audio/')) {\n category = 'audio';\n label = 'Audio';\n }\n \n return {\n category,\n icon: () => null,\n label\n };\n}\nimport { FilePreviewCard } from \"./FilePreviewCard\";\nimport ToolbarImagePreview from \"./ToolbarImagePreview\";\nimport ToolbarVideoPreview from \"./ToolbarVideoPreview\";\n\nexport type FileMetadata = {\n file: File;\n url: string;\n type: \"image\" | \"video\" | \"audio\" | \"document\" | \"archive\" | \"other\";\n mediaType: string;\n propertyName: \"image\" | \"data\";\n};\n\ntype FilePreviewProps = {\n files: File[];\n onRemove: (index: number) => void;\n cdnUrl: string;\n fileMetadata?: FileMetadata[];\n onFileUploadComplete?: (file: File, url: string) => void;\n};\n\nexport function FilePreview({\n files,\n onRemove,\n cdnUrl,\n fileMetadata = [],\n onFileUploadComplete,\n}: FilePreviewProps) {\n const [thumbnails, setThumbnails] = useState<{ [key: number]: string }>({});\n\n useEffect(() => {\n // Create thumbnails for video files\n files.forEach((file, index) => {\n const fileTypeInfo = getFileTypeInfo(file);\n // Skip if we already have a thumbnail or if there's metadata for this file\n const existingMetadata = fileMetadata.find(meta => meta.file === file);\n if (\n fileTypeInfo.category === \"video\" &&\n !thumbnails[index] &&\n !existingMetadata\n ) {\n const videoUrl = URL.createObjectURL(file);\n const video = document.createElement(\"video\");\n video.src = videoUrl;\n\n const handleCanPlay = () => {\n try {\n // Seek to the first frame\n video.currentTime = 0;\n\n // Wait a bit for the frame to be ready\n setTimeout(() => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n console.error(\"Could not get canvas context\");\n return;\n }\n\n // Draw the video frame\n ctx.drawImage(video, 0, 0);\n\n const thumbnailUrl = canvas.toDataURL(\"image/jpeg\", 0.8);\n setThumbnails(prev => ({ ...prev, [index]: thumbnailUrl }));\n }, 100);\n } catch (error) {\n console.error(\"Error generating thumbnail:\", error);\n } finally {\n URL.revokeObjectURL(videoUrl);\n video.removeEventListener(\"canplay\", handleCanPlay);\n }\n };\n\n video.addEventListener(\"canplay\", handleCanPlay);\n video.load();\n }\n });\n }, [files, fileMetadata]);\n\n if (files.length === 0) return null;\n\n return (\n <div className=\"lua:px-4 lua:py-2 lua:border-b lua:border-gray-200\">\n <div className=\"lua:flex lua:gap-2 lua:overflow-x-auto scrollbar-hide\">\n {files.map((file, index) => {\n const fileTypeInfo = getFileTypeInfo(file);\n const metadata = fileMetadata.find(meta => meta.file === file);\n\n if (files.length > 1) {\n return (\n <div key={index} className=\"lua:flex-shrink-0 lua:w-64\">\n <FilePreviewCard\n file={file}\n onRemove={() => onRemove(index)}\n cdnUrl={cdnUrl}\n onUploadComplete={(file, url) => {\n if (onFileUploadComplete) {\n onFileUploadComplete(file, url);\n }\n }}\n />\n </div>\n );\n }\n\n // For images, show the image preview\n if (fileTypeInfo.category === \"image\") {\n return (\n <ToolbarImagePreview\n key={file.name}\n file={file}\n onRemove={() => onRemove(index)}\n cdnUrl={cdnUrl}\n initialUrl={metadata?.url}\n onUploadComplete={(file, url) => {\n if (onFileUploadComplete) {\n onFileUploadComplete(file, url);\n }\n }}\n />\n );\n }\n\n // For videos, show the video preview with upload functionality\n if (fileTypeInfo.category === \"video\") {\n return (\n <ToolbarVideoPreview\n key={file.name}\n file={file}\n onRemove={() => onRemove(index)}\n cdnUrl={cdnUrl}\n initialUrl={metadata?.url}\n thumbnailUrl={thumbnails[index]}\n onUploadComplete={(file, url) => {\n if (onFileUploadComplete) {\n onFileUploadComplete(file, url);\n }\n }}\n />\n );\n }\n\n // For other files, show the file preview card\n return (\n <div key={index} className=\"lua:flex-shrink-0 lua:w-64\">\n <FilePreviewCard\n file={file}\n onRemove={() => onRemove(index)}\n cdnUrl={cdnUrl}\n onUploadComplete={(file, url) => {\n if (onFileUploadComplete) {\n onFileUploadComplete(file, url);\n }\n }}\n />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import {\n ArrowUp,\n Camera,\n IconButton,\n MapPin,\n Microphone,\n Paperclip,\n Tooltip,\n TooltipArrow,\n TooltipContent,\n TooltipTrigger,\n VideoCamera,\n} from \"luaniverse\";\n\n// Note: Analytics functions should be provided by the consuming application\n// import {\n// ANALYTICS_EVENTS,\n// trackChatEvent,\n// } from \"../../../utils/auth/analytics\";\n\n// Temporary implementations - should be replaced with actual analytics functions\nconst ANALYTICS_EVENTS = {\n CHAT: {\n TOOLBAR_ACTION: {\n FILE_UPLOAD: \"file_upload\",\n CAMERA: \"camera\",\n VIDEO: \"video\",\n AUDIO: \"audio\",\n LOCATION: \"location\",\n },\n MESSAGE_SENT: \"message_sent\",\n },\n};\n\nfunction trackChatEvent(event: string): void {\n // This is a placeholder - the actual implementation should be provided by the consuming app\n console.log(\"Analytics event:\", event);\n}\n\ntype ToolbarProps = {\n loading: boolean;\n onFileClick: () => void;\n onCameraClick: () => void;\n onVideoClick: () => void;\n onAudioClick: () => void;\n onLocationClick: () => void;\n onSendClick: () => void;\n uploadProgress: number;\n};\n\nexport function Toolbar({\n loading,\n onFileClick,\n onCameraClick,\n onVideoClick,\n onAudioClick,\n onLocationClick,\n onSendClick,\n}: ToolbarProps) {\n const handleFileClick = () => {\n trackChatEvent(ANALYTICS_EVENTS.CHAT.TOOLBAR_ACTION.FILE_UPLOAD);\n onFileClick();\n };\n\n const handleCameraClick = () => {\n trackChatEvent(ANALYTICS_EVENTS.CHAT.TOOLBAR_ACTION.CAMERA);\n onCameraClick();\n };\n\n const handleVideoClick = () => {\n trackChatEvent(ANALYTICS_EVENTS.CHAT.TOOLBAR_ACTION.VIDEO);\n onVideoClick();\n };\n\n const handleAudioClick = () => {\n trackChatEvent(ANALYTICS_EVENTS.CHAT.TOOLBAR_ACTION.AUDIO);\n onAudioClick();\n };\n\n const handleLocationClick = () => {\n trackChatEvent(ANALYTICS_EVENTS.CHAT.TOOLBAR_ACTION.LOCATION);\n onLocationClick();\n };\n\n const handleSendClick = () => {\n trackChatEvent(ANALYTICS_EVENTS.CHAT.MESSAGE_SENT);\n onSendClick();\n };\n\n return (\n <div className=\"lua:flex lua:items-center lua:justify-between lua:border-t lua:border-gray-200 lua:bg-gray-50 lua:px-3 lua:py-2\">\n {/* Widget Icons */}\n <div className=\"lua:flex lua:items-center lua:gap-2\">\n {/*File Upload*/}\n <Tooltip>\n <TooltipTrigger asChild>\n <IconButton\n className=\"lua:rounded-lg\"\n variant=\"muted\"\n onClick={handleFileClick}\n disabled={loading}\n data-testid=\"file-upload-button\"\n >\n <Paperclip color=\"#00000099\" />\n </IconButton>\n </TooltipTrigger>\n <TooltipContent>\n <TooltipArrow />\n <p>Attach files</p>\n </TooltipContent>\n </Tooltip>\n {/* Divider */}\n <div className=\"lua:w-px lua:h-5 lua:bg-gray-200\" />\n {/* Camera */}\n <Tooltip>\n <TooltipTrigger asChild>\n <IconButton\n className=\"lua:rounded-lg\"\n variant=\"muted\"\n onClick={handleCameraClick}\n disabled={loading}\n data-testid=\"camera-button\"\n >\n <Camera color=\"#00000099\" />\n </IconButton>\n </TooltipTrigger>\n <TooltipContent>\n <TooltipArrow />\n <p>Take a picture</p>\n </TooltipContent>\n </Tooltip>\n {/* Video */}\n <Tooltip>\n <TooltipTrigger asChild>\n <IconButton\n className=\"lua:rounded-lg\"\n variant=\"muted\"\n onClick={handleVideoClick}\n disabled={loading}\n data-testid=\"video-button\"\n >\n <VideoCamera color=\"#00000099\" />\n </IconButton>\n </TooltipTrigger>\n <TooltipContent>\n <TooltipArrow />\n <p>Record video</p>\n </TooltipContent>\n </Tooltip>\n {/* Microphone */}\n <Tooltip>\n <TooltipTrigger asChild>\n <IconButton\n className=\"lua:rounded-lg\"\n variant=\"muted\"\n onClick={handleAudioClick}\n disabled={loading}\n data-testid=\"audio-button\"\n >\n <Microphone color=\"#00000099\" />\n </IconButton>\n </TooltipTrigger>\n <TooltipContent>\n <TooltipArrow />\n <p>Record voice message</p>\n </TooltipContent>\n </Tooltip>\n {/* Divider */}\n <div className=\"lua:w-px lua:h-5 lua:bg-gray-200\" />\n {/* Location */}\n <Tooltip>\n <TooltipTrigger asChild>\n <IconButton\n className=\"lua:rounded-lg\"\n variant=\"muted\"\n onClick={handleLocationClick}\n disabled={loading}\n data-testid=\"location-button\"\n >\n <MapPin color=\"#00000099\" />\n </IconButton>\n </TooltipTrigger>\n <TooltipContent>\n <TooltipArrow />\n <p>Share location</p>\n </TooltipContent>\n </Tooltip>\n </div>\n\n {/* Send Button */}\n <IconButton\n className=\"lua:rounded-full\"\n onClick={handleSendClick}\n disabled={loading}\n data-testid=\"send-button\"\n >\n <ArrowUp color=\"#FFFFFF\" />\n </IconButton>\n </div>\n );\n}\n"]}