@werxt/livekit-components-react 2.9.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +36 -0
  3. package/dist/assets/icons/CameraDisabledIcon.d.ts +11 -0
  4. package/dist/assets/icons/CameraDisabledIcon.d.ts.map +1 -0
  5. package/dist/assets/icons/CameraIcon.d.ts +11 -0
  6. package/dist/assets/icons/CameraIcon.d.ts.map +1 -0
  7. package/dist/assets/icons/ChatCloseIcon.d.ts +11 -0
  8. package/dist/assets/icons/ChatCloseIcon.d.ts.map +1 -0
  9. package/dist/assets/icons/ChatIcon.d.ts +11 -0
  10. package/dist/assets/icons/ChatIcon.d.ts.map +1 -0
  11. package/dist/assets/icons/Chevron.d.ts +11 -0
  12. package/dist/assets/icons/Chevron.d.ts.map +1 -0
  13. package/dist/assets/icons/FocusToggleIcon.d.ts +11 -0
  14. package/dist/assets/icons/FocusToggleIcon.d.ts.map +1 -0
  15. package/dist/assets/icons/GearIcon.d.ts +11 -0
  16. package/dist/assets/icons/GearIcon.d.ts.map +1 -0
  17. package/dist/assets/icons/LeaveIcon.d.ts +11 -0
  18. package/dist/assets/icons/LeaveIcon.d.ts.map +1 -0
  19. package/dist/assets/icons/LockLockedIcon.d.ts +11 -0
  20. package/dist/assets/icons/LockLockedIcon.d.ts.map +1 -0
  21. package/dist/assets/icons/MicDisabledIcon.d.ts +11 -0
  22. package/dist/assets/icons/MicDisabledIcon.d.ts.map +1 -0
  23. package/dist/assets/icons/MicIcon.d.ts +11 -0
  24. package/dist/assets/icons/MicIcon.d.ts.map +1 -0
  25. package/dist/assets/icons/QualityExcellentIcon.d.ts +11 -0
  26. package/dist/assets/icons/QualityExcellentIcon.d.ts.map +1 -0
  27. package/dist/assets/icons/QualityGoodIcon.d.ts +11 -0
  28. package/dist/assets/icons/QualityGoodIcon.d.ts.map +1 -0
  29. package/dist/assets/icons/QualityPoorIcon.d.ts +11 -0
  30. package/dist/assets/icons/QualityPoorIcon.d.ts.map +1 -0
  31. package/dist/assets/icons/QualityUnknownIcon.d.ts +11 -0
  32. package/dist/assets/icons/QualityUnknownIcon.d.ts.map +1 -0
  33. package/dist/assets/icons/ScreenShareIcon.d.ts +11 -0
  34. package/dist/assets/icons/ScreenShareIcon.d.ts.map +1 -0
  35. package/dist/assets/icons/ScreenShareStopIcon.d.ts +11 -0
  36. package/dist/assets/icons/ScreenShareStopIcon.d.ts.map +1 -0
  37. package/dist/assets/icons/SpinnerIcon.d.ts +11 -0
  38. package/dist/assets/icons/SpinnerIcon.d.ts.map +1 -0
  39. package/dist/assets/icons/UnfocusToggleIcon.d.ts +11 -0
  40. package/dist/assets/icons/UnfocusToggleIcon.d.ts.map +1 -0
  41. package/dist/assets/icons/index.d.ts +20 -0
  42. package/dist/assets/icons/index.d.ts.map +1 -0
  43. package/dist/assets/icons/util.d.ts +11 -0
  44. package/dist/assets/icons/util.d.ts.map +1 -0
  45. package/dist/assets/images/ParticipantPlaceholder.d.ts +11 -0
  46. package/dist/assets/images/ParticipantPlaceholder.d.ts.map +1 -0
  47. package/dist/assets/images/index.d.ts +2 -0
  48. package/dist/assets/images/index.d.ts.map +1 -0
  49. package/dist/components/ChatEntry.d.ts +35 -0
  50. package/dist/components/ChatEntry.d.ts.map +1 -0
  51. package/dist/components/ConnectionState.d.ts +23 -0
  52. package/dist/components/ConnectionState.d.ts.map +1 -0
  53. package/dist/components/ConnectionStateToast.d.ts +13 -0
  54. package/dist/components/ConnectionStateToast.d.ts.map +1 -0
  55. package/dist/components/LiveKitRoom.d.ts +92 -0
  56. package/dist/components/LiveKitRoom.d.ts.map +1 -0
  57. package/dist/components/ParticipantLoop.d.ts +28 -0
  58. package/dist/components/ParticipantLoop.d.ts.map +1 -0
  59. package/dist/components/RoomAudioRenderer.d.ts +29 -0
  60. package/dist/components/RoomAudioRenderer.d.ts.map +1 -0
  61. package/dist/components/RoomName.d.ts +20 -0
  62. package/dist/components/RoomName.d.ts.map +1 -0
  63. package/dist/components/SessionProvider.d.ts +13 -0
  64. package/dist/components/SessionProvider.d.ts.map +1 -0
  65. package/dist/components/Toast.d.ts +14 -0
  66. package/dist/components/Toast.d.ts.map +1 -0
  67. package/dist/components/TrackLoop.d.ts +26 -0
  68. package/dist/components/TrackLoop.d.ts.map +1 -0
  69. package/dist/components/controls/ChatToggle.d.ts +19 -0
  70. package/dist/components/controls/ChatToggle.d.ts.map +1 -0
  71. package/dist/components/controls/ClearPinButton.d.ts +20 -0
  72. package/dist/components/controls/ClearPinButton.d.ts.map +1 -0
  73. package/dist/components/controls/DisconnectButton.d.ts +19 -0
  74. package/dist/components/controls/DisconnectButton.d.ts.map +1 -0
  75. package/dist/components/controls/FocusToggle.d.ts +21 -0
  76. package/dist/components/controls/FocusToggle.d.ts.map +1 -0
  77. package/dist/components/controls/MediaDeviceSelect.d.ts +40 -0
  78. package/dist/components/controls/MediaDeviceSelect.d.ts.map +1 -0
  79. package/dist/components/controls/PaginationControl.d.ts +9 -0
  80. package/dist/components/controls/PaginationControl.d.ts.map +1 -0
  81. package/dist/components/controls/PaginationIndicator.d.ts +7 -0
  82. package/dist/components/controls/PaginationIndicator.d.ts.map +1 -0
  83. package/dist/components/controls/SettingsMenuToggle.d.ts +13 -0
  84. package/dist/components/controls/SettingsMenuToggle.d.ts.map +1 -0
  85. package/dist/components/controls/StartAudio.d.ts +24 -0
  86. package/dist/components/controls/StartAudio.d.ts.map +1 -0
  87. package/dist/components/controls/StartMediaButton.d.ts +22 -0
  88. package/dist/components/controls/StartMediaButton.d.ts.map +1 -0
  89. package/dist/components/controls/TrackToggle.d.ts +32 -0
  90. package/dist/components/controls/TrackToggle.d.ts.map +1 -0
  91. package/dist/components/index.d.ts +30 -0
  92. package/dist/components/index.d.ts.map +1 -0
  93. package/dist/components/layout/CarouselLayout.d.ts +27 -0
  94. package/dist/components/layout/CarouselLayout.d.ts.map +1 -0
  95. package/dist/components/layout/FocusLayout.d.ts +25 -0
  96. package/dist/components/layout/FocusLayout.d.ts.map +1 -0
  97. package/dist/components/layout/GridLayout.d.ts +26 -0
  98. package/dist/components/layout/GridLayout.d.ts.map +1 -0
  99. package/dist/components/layout/LayoutContextProvider.d.ts +12 -0
  100. package/dist/components/layout/LayoutContextProvider.d.ts.map +1 -0
  101. package/dist/components/layout/index.d.ts +4 -0
  102. package/dist/components/layout/index.d.ts.map +1 -0
  103. package/dist/components/participant/AudioTrack.d.ts +33 -0
  104. package/dist/components/participant/AudioTrack.d.ts.map +1 -0
  105. package/dist/components/participant/AudioVisualizer.d.ts +22 -0
  106. package/dist/components/participant/AudioVisualizer.d.ts.map +1 -0
  107. package/dist/components/participant/BarVisualizer.d.ts +77 -0
  108. package/dist/components/participant/BarVisualizer.d.ts.map +1 -0
  109. package/dist/components/participant/ConnectionQualityIndicator.d.ts +16 -0
  110. package/dist/components/participant/ConnectionQualityIndicator.d.ts.map +1 -0
  111. package/dist/components/participant/ParticipantAudioTile.d.ts +14 -0
  112. package/dist/components/participant/ParticipantAudioTile.d.ts.map +1 -0
  113. package/dist/components/participant/ParticipantName.d.ts +17 -0
  114. package/dist/components/participant/ParticipantName.d.ts.map +1 -0
  115. package/dist/components/participant/ParticipantTile.d.ts +49 -0
  116. package/dist/components/participant/ParticipantTile.d.ts.map +1 -0
  117. package/dist/components/participant/TrackMutedIndicator.d.ts +19 -0
  118. package/dist/components/participant/TrackMutedIndicator.d.ts.map +1 -0
  119. package/dist/components/participant/VideoTrack.d.ts +23 -0
  120. package/dist/components/participant/VideoTrack.d.ts.map +1 -0
  121. package/dist/components/participant/animationSequences/connectingSequence.d.ts +2 -0
  122. package/dist/components/participant/animationSequences/connectingSequence.d.ts.map +1 -0
  123. package/dist/components/participant/animationSequences/listeningSequence.d.ts +2 -0
  124. package/dist/components/participant/animationSequences/listeningSequence.d.ts.map +1 -0
  125. package/dist/components/participant/animationSequences/thinkingSequence.d.ts +2 -0
  126. package/dist/components/participant/animationSequences/thinkingSequence.d.ts.map +1 -0
  127. package/dist/components/participant/animators/useBarAnimator.d.ts +3 -0
  128. package/dist/components/participant/animators/useBarAnimator.d.ts.map +1 -0
  129. package/dist/components-lNrIMTWQ.mjs +1051 -0
  130. package/dist/components-lNrIMTWQ.mjs.map +1 -0
  131. package/dist/context/chat-context.d.ts +23 -0
  132. package/dist/context/chat-context.d.ts.map +1 -0
  133. package/dist/context/feature-context.d.ts +14 -0
  134. package/dist/context/feature-context.d.ts.map +1 -0
  135. package/dist/context/index.d.ts +10 -0
  136. package/dist/context/index.d.ts.map +1 -0
  137. package/dist/context/layout-context.d.ts +32 -0
  138. package/dist/context/layout-context.d.ts.map +1 -0
  139. package/dist/context/participant-context.d.ts +22 -0
  140. package/dist/context/participant-context.d.ts.map +1 -0
  141. package/dist/context/pin-context.d.ts +17 -0
  142. package/dist/context/pin-context.d.ts.map +1 -0
  143. package/dist/context/room-context.d.ts +22 -0
  144. package/dist/context/room-context.d.ts.map +1 -0
  145. package/dist/context/session-context.d.ts +22 -0
  146. package/dist/context/session-context.d.ts.map +1 -0
  147. package/dist/context/track-reference-context.d.ts +25 -0
  148. package/dist/context/track-reference-context.d.ts.map +1 -0
  149. package/dist/contexts-D4V9wQRc.mjs +4026 -0
  150. package/dist/contexts-D4V9wQRc.mjs.map +1 -0
  151. package/dist/hooks/cloud/krisp/useKrispNoiseFilter.d.ts +42 -0
  152. package/dist/hooks/cloud/krisp/useKrispNoiseFilter.d.ts.map +1 -0
  153. package/dist/hooks/index.d.ts +54 -0
  154. package/dist/hooks/index.d.ts.map +1 -0
  155. package/dist/hooks/internal/index.d.ts +10 -0
  156. package/dist/hooks/internal/index.d.ts.map +1 -0
  157. package/dist/hooks/internal/useMediaQuery.d.ts +7 -0
  158. package/dist/hooks/internal/useMediaQuery.d.ts.map +1 -0
  159. package/dist/hooks/internal/useObservableState.d.ts +6 -0
  160. package/dist/hooks/internal/useObservableState.d.ts.map +1 -0
  161. package/dist/hooks/internal/useResizeObserver.d.ts +14 -0
  162. package/dist/hooks/internal/useResizeObserver.d.ts.map +1 -0
  163. package/dist/hooks/useAgent.d.ts +219 -0
  164. package/dist/hooks/useAgent.d.ts.map +1 -0
  165. package/dist/hooks/useAudioPlayback.d.ts +15 -0
  166. package/dist/hooks/useAudioPlayback.d.ts.map +1 -0
  167. package/dist/hooks/useChat.d.ts +43 -0
  168. package/dist/hooks/useChat.d.ts.map +1 -0
  169. package/dist/hooks/useChatToggle.d.ts +21 -0
  170. package/dist/hooks/useChatToggle.d.ts.map +1 -0
  171. package/dist/hooks/useClearPinButton.d.ts +15 -0
  172. package/dist/hooks/useClearPinButton.d.ts.map +1 -0
  173. package/dist/hooks/useConnectionQualityIndicator.d.ts +20 -0
  174. package/dist/hooks/useConnectionQualityIndicator.d.ts.map +1 -0
  175. package/dist/hooks/useConnectionStatus.d.ts +12 -0
  176. package/dist/hooks/useConnectionStatus.d.ts.map +1 -0
  177. package/dist/hooks/useDataChannel.d.ts +38 -0
  178. package/dist/hooks/useDataChannel.d.ts.map +1 -0
  179. package/dist/hooks/useDisconnectButton.d.ts +21 -0
  180. package/dist/hooks/useDisconnectButton.d.ts.map +1 -0
  181. package/dist/hooks/useEvents.d.ts +9 -0
  182. package/dist/hooks/useEvents.d.ts.map +1 -0
  183. package/dist/hooks/useFacingMode.d.ts +10 -0
  184. package/dist/hooks/useFacingMode.d.ts.map +1 -0
  185. package/dist/hooks/useFocusToggle.d.ts +26 -0
  186. package/dist/hooks/useFocusToggle.d.ts.map +1 -0
  187. package/dist/hooks/useGridLayout.d.ts +27 -0
  188. package/dist/hooks/useGridLayout.d.ts.map +1 -0
  189. package/dist/hooks/useIsEncrypted.d.ts +12 -0
  190. package/dist/hooks/useIsEncrypted.d.ts.map +1 -0
  191. package/dist/hooks/useIsMuted.d.ts +22 -0
  192. package/dist/hooks/useIsMuted.d.ts.map +1 -0
  193. package/dist/hooks/useIsRecording.d.ts +11 -0
  194. package/dist/hooks/useIsRecording.d.ts.map +1 -0
  195. package/dist/hooks/useIsSpeaking.d.ts +11 -0
  196. package/dist/hooks/useIsSpeaking.d.ts.map +1 -0
  197. package/dist/hooks/useLiveKitRoom.d.ts +19 -0
  198. package/dist/hooks/useLiveKitRoom.d.ts.map +1 -0
  199. package/dist/hooks/useLocalParticipant.d.ts +29 -0
  200. package/dist/hooks/useLocalParticipant.d.ts.map +1 -0
  201. package/dist/hooks/useLocalParticipantPermissions.d.ts +12 -0
  202. package/dist/hooks/useLocalParticipantPermissions.d.ts.map +1 -0
  203. package/dist/hooks/useMediaDeviceSelect.d.ts +41 -0
  204. package/dist/hooks/useMediaDeviceSelect.d.ts.map +1 -0
  205. package/dist/hooks/useMediaDevices.d.ts +15 -0
  206. package/dist/hooks/useMediaDevices.d.ts.map +1 -0
  207. package/dist/hooks/useMediaTrackBySourceOrName.d.ts +18 -0
  208. package/dist/hooks/useMediaTrackBySourceOrName.d.ts.map +1 -0
  209. package/dist/hooks/usePagination.d.ts +24 -0
  210. package/dist/hooks/usePagination.d.ts.map +1 -0
  211. package/dist/hooks/useParticipantAttributes.d.ts +30 -0
  212. package/dist/hooks/useParticipantAttributes.d.ts.map +1 -0
  213. package/dist/hooks/useParticipantInfo.d.ts +21 -0
  214. package/dist/hooks/useParticipantInfo.d.ts.map +1 -0
  215. package/dist/hooks/useParticipantPermissions.d.ts +17 -0
  216. package/dist/hooks/useParticipantPermissions.d.ts.map +1 -0
  217. package/dist/hooks/useParticipantTile.d.ts +22 -0
  218. package/dist/hooks/useParticipantTile.d.ts.map +1 -0
  219. package/dist/hooks/useParticipantTracks.d.ts +14 -0
  220. package/dist/hooks/useParticipantTracks.d.ts.map +1 -0
  221. package/dist/hooks/useParticipants.d.ts +30 -0
  222. package/dist/hooks/useParticipants.d.ts.map +1 -0
  223. package/dist/hooks/usePersistentUserChoices.d.ts +35 -0
  224. package/dist/hooks/usePersistentUserChoices.d.ts.map +1 -0
  225. package/dist/hooks/usePinnedTracks.d.ts +14 -0
  226. package/dist/hooks/usePinnedTracks.d.ts.map +1 -0
  227. package/dist/hooks/useRemoteParticipant.d.ts +35 -0
  228. package/dist/hooks/useRemoteParticipant.d.ts.map +1 -0
  229. package/dist/hooks/useRemoteParticipants.d.ts +30 -0
  230. package/dist/hooks/useRemoteParticipants.d.ts.map +1 -0
  231. package/dist/hooks/useRoomInfo.d.ts +21 -0
  232. package/dist/hooks/useRoomInfo.d.ts.map +1 -0
  233. package/dist/hooks/useSequentialRoomConnectDisconnect.d.ts +27 -0
  234. package/dist/hooks/useSequentialRoomConnectDisconnect.d.ts.map +1 -0
  235. package/dist/hooks/useSession.d.ts +130 -0
  236. package/dist/hooks/useSession.d.ts.map +1 -0
  237. package/dist/hooks/useSessionMessages.d.ts +29 -0
  238. package/dist/hooks/useSessionMessages.d.ts.map +1 -0
  239. package/dist/hooks/useSettingsToggle.d.ts +20 -0
  240. package/dist/hooks/useSettingsToggle.d.ts.map +1 -0
  241. package/dist/hooks/useSortedParticipants.d.ts +7 -0
  242. package/dist/hooks/useSortedParticipants.d.ts.map +1 -0
  243. package/dist/hooks/useSpeakingParticipants.d.ts +16 -0
  244. package/dist/hooks/useSpeakingParticipants.d.ts.map +1 -0
  245. package/dist/hooks/useStartAudio.d.ts +27 -0
  246. package/dist/hooks/useStartAudio.d.ts.map +1 -0
  247. package/dist/hooks/useStartVideo.d.ts +26 -0
  248. package/dist/hooks/useStartVideo.d.ts.map +1 -0
  249. package/dist/hooks/useSwipe.d.ts +24 -0
  250. package/dist/hooks/useSwipe.d.ts.map +1 -0
  251. package/dist/hooks/useTextStream.d.ts +20 -0
  252. package/dist/hooks/useTextStream.d.ts.map +1 -0
  253. package/dist/hooks/useToken.d.ts +20 -0
  254. package/dist/hooks/useToken.d.ts.map +1 -0
  255. package/dist/hooks/useTrack.d.ts +4 -0
  256. package/dist/hooks/useTrack.d.ts.map +1 -0
  257. package/dist/hooks/useTrackByName.d.ts +10 -0
  258. package/dist/hooks/useTrackByName.d.ts.map +1 -0
  259. package/dist/hooks/useTrackMutedIndicator.d.ts +18 -0
  260. package/dist/hooks/useTrackMutedIndicator.d.ts.map +1 -0
  261. package/dist/hooks/useTrackRefBySourceOrName.d.ts +7 -0
  262. package/dist/hooks/useTrackRefBySourceOrName.d.ts.map +1 -0
  263. package/dist/hooks/useTrackSyncTime.d.ts +10 -0
  264. package/dist/hooks/useTrackSyncTime.d.ts.map +1 -0
  265. package/dist/hooks/useTrackToggle.d.ts +27 -0
  266. package/dist/hooks/useTrackToggle.d.ts.map +1 -0
  267. package/dist/hooks/useTrackTranscription.d.ts +26 -0
  268. package/dist/hooks/useTrackTranscription.d.ts.map +1 -0
  269. package/dist/hooks/useTrackVolume.d.ts +49 -0
  270. package/dist/hooks/useTrackVolume.d.ts.map +1 -0
  271. package/dist/hooks/useTracks.d.ts +29 -0
  272. package/dist/hooks/useTracks.d.ts.map +1 -0
  273. package/dist/hooks/useTranscriptions.d.ts +21 -0
  274. package/dist/hooks/useTranscriptions.d.ts.map +1 -0
  275. package/dist/hooks/useVisualStableUpdate.d.ts +27 -0
  276. package/dist/hooks/useVisualStableUpdate.d.ts.map +1 -0
  277. package/dist/hooks/useVoiceAssistant.d.ts +43 -0
  278. package/dist/hooks/useVoiceAssistant.d.ts.map +1 -0
  279. package/dist/hooks/useWarnAboutMissingStyles.d.ts +5 -0
  280. package/dist/hooks/useWarnAboutMissingStyles.d.ts.map +1 -0
  281. package/dist/hooks-hQJmeINB.mjs +1992 -0
  282. package/dist/hooks-hQJmeINB.mjs.map +1 -0
  283. package/dist/hooks.d.ts +2 -0
  284. package/dist/hooks.js +2 -0
  285. package/dist/hooks.js.map +1 -0
  286. package/dist/hooks.mjs +64 -0
  287. package/dist/hooks.mjs.map +1 -0
  288. package/dist/index.d.ts +9 -0
  289. package/dist/index.d.ts.map +1 -0
  290. package/dist/index.docs.d.ts +6 -0
  291. package/dist/index.docs.d.ts.map +1 -0
  292. package/dist/index.js +2 -0
  293. package/dist/index.js.map +1 -0
  294. package/dist/index.mjs +157 -0
  295. package/dist/index.mjs.map +1 -0
  296. package/dist/krisp.d.ts +2 -0
  297. package/dist/krisp.js +2 -0
  298. package/dist/krisp.js.map +1 -0
  299. package/dist/krisp.mjs +45 -0
  300. package/dist/krisp.mjs.map +1 -0
  301. package/dist/mergeProps.d.ts +25 -0
  302. package/dist/mergeProps.d.ts.map +1 -0
  303. package/dist/prefabs/AudioConference.d.ts +22 -0
  304. package/dist/prefabs/AudioConference.d.ts.map +1 -0
  305. package/dist/prefabs/Chat.d.ts +35 -0
  306. package/dist/prefabs/Chat.d.ts.map +1 -0
  307. package/dist/prefabs/ControlBar.d.ts +45 -0
  308. package/dist/prefabs/ControlBar.d.ts.map +1 -0
  309. package/dist/prefabs/MediaDeviceMenu.d.ts +36 -0
  310. package/dist/prefabs/MediaDeviceMenu.d.ts.map +1 -0
  311. package/dist/prefabs/PreJoin.d.ts +59 -0
  312. package/dist/prefabs/PreJoin.d.ts.map +1 -0
  313. package/dist/prefabs/VideoConference.d.ts +35 -0
  314. package/dist/prefabs/VideoConference.d.ts.map +1 -0
  315. package/dist/prefabs/VoiceAssistantControlBar.d.ts +32 -0
  316. package/dist/prefabs/VoiceAssistantControlBar.d.ts.map +1 -0
  317. package/dist/prefabs/index.d.ts +8 -0
  318. package/dist/prefabs/index.d.ts.map +1 -0
  319. package/dist/prefabs.d.ts +2 -0
  320. package/dist/prefabs.js +2 -0
  321. package/dist/prefabs.js.map +1 -0
  322. package/dist/prefabs.mjs +579 -0
  323. package/dist/prefabs.mjs.map +1 -0
  324. package/dist/room-BP3SCCCd.mjs +191 -0
  325. package/dist/room-BP3SCCCd.mjs.map +1 -0
  326. package/dist/shared-88J2fzv7.js +2 -0
  327. package/dist/shared-88J2fzv7.js.map +1 -0
  328. package/dist/shared-BDr0qLg4.js +4 -0
  329. package/dist/shared-BDr0qLg4.js.map +1 -0
  330. package/dist/shared-CjI_UuOX.js +2 -0
  331. package/dist/shared-CjI_UuOX.js.map +1 -0
  332. package/dist/shared-DTHOl3uJ.js +2 -0
  333. package/dist/shared-DTHOl3uJ.js.map +1 -0
  334. package/dist/utils.d.ts +19 -0
  335. package/dist/utils.d.ts.map +1 -0
  336. package/package.json +104 -0
  337. package/src/assets/icons/CameraDisabledIcon.tsx +15 -0
  338. package/src/assets/icons/CameraIcon.tsx +14 -0
  339. package/src/assets/icons/ChatCloseIcon.tsx +17 -0
  340. package/src/assets/icons/ChatIcon.tsx +25 -0
  341. package/src/assets/icons/Chevron.tsx +19 -0
  342. package/src/assets/icons/FocusToggleIcon.tsx +16 -0
  343. package/src/assets/icons/GearIcon.tsx +19 -0
  344. package/src/assets/icons/LeaveIcon.tsx +25 -0
  345. package/src/assets/icons/LockLockedIcon.tsx +19 -0
  346. package/src/assets/icons/MicDisabledIcon.tsx +15 -0
  347. package/src/assets/icons/MicIcon.tsx +19 -0
  348. package/src/assets/icons/QualityExcellentIcon.tsx +15 -0
  349. package/src/assets/icons/QualityGoodIcon.tsx +19 -0
  350. package/src/assets/icons/QualityPoorIcon.tsx +20 -0
  351. package/src/assets/icons/QualityUnknownIcon.tsx +17 -0
  352. package/src/assets/icons/ScreenShareIcon.tsx +25 -0
  353. package/src/assets/icons/ScreenShareStopIcon.tsx +21 -0
  354. package/src/assets/icons/SpinnerIcon.tsx +93 -0
  355. package/src/assets/icons/UnfocusToggleIcon.tsx +16 -0
  356. package/src/assets/icons/index.ts +19 -0
  357. package/src/assets/icons/util.tsx +47 -0
  358. package/src/assets/images/ParticipantPlaceholder.tsx +31 -0
  359. package/src/assets/images/index.ts +1 -0
  360. package/src/assets/template.js +21 -0
  361. package/src/components/ChatEntry.tsx +112 -0
  362. package/src/components/ConnectionState.tsx +36 -0
  363. package/src/components/ConnectionStateToast.tsx +47 -0
  364. package/src/components/LiveKitRoom.tsx +122 -0
  365. package/src/components/ParticipantLoop.tsx +41 -0
  366. package/src/components/RoomAudioRenderer.tsx +57 -0
  367. package/src/components/RoomName.tsx +36 -0
  368. package/src/components/SessionProvider.tsx +22 -0
  369. package/src/components/Toast.tsx +18 -0
  370. package/src/components/TrackLoop.tsx +45 -0
  371. package/src/components/controls/ChatToggle.tsx +32 -0
  372. package/src/components/controls/ClearPinButton.tsx +32 -0
  373. package/src/components/controls/DisconnectButton.tsx +32 -0
  374. package/src/components/controls/FocusToggle.tsx +54 -0
  375. package/src/components/controls/MediaDeviceSelect.tsx +144 -0
  376. package/src/components/controls/PaginationControl.tsx +51 -0
  377. package/src/components/controls/PaginationIndicator.tsx +26 -0
  378. package/src/components/controls/SettingsMenuToggle.tsx +26 -0
  379. package/src/components/controls/StartAudio.tsx +40 -0
  380. package/src/components/controls/StartMediaButton.tsx +41 -0
  381. package/src/components/controls/TrackToggle.tsx +54 -0
  382. package/src/components/index.ts +34 -0
  383. package/src/components/layout/CarouselLayout.tsx +80 -0
  384. package/src/components/layout/FocusLayout.tsx +37 -0
  385. package/src/components/layout/GridLayout.tsx +63 -0
  386. package/src/components/layout/LayoutContextProvider.tsx +36 -0
  387. package/src/components/layout/index.ts +3 -0
  388. package/src/components/participant/AudioTrack.tsx +89 -0
  389. package/src/components/participant/AudioVisualizer.tsx +67 -0
  390. package/src/components/participant/BarVisualizer.tsx +164 -0
  391. package/src/components/participant/ConnectionQualityIndicator.tsx +36 -0
  392. package/src/components/participant/ParticipantAudioTile.tsx +67 -0
  393. package/src/components/participant/ParticipantName.tsx +50 -0
  394. package/src/components/participant/ParticipantTile.tsx +192 -0
  395. package/src/components/participant/TrackMutedIndicator.tsx +53 -0
  396. package/src/components/participant/VideoTrack.tsx +92 -0
  397. package/src/components/participant/animationSequences/connectingSequence.ts +9 -0
  398. package/src/components/participant/animationSequences/listeningSequence.ts +6 -0
  399. package/src/components/participant/animationSequences/thinkingSequence.ts +12 -0
  400. package/src/components/participant/animators/useBarAnimator.ts +55 -0
  401. package/src/context/chat-context.ts +37 -0
  402. package/src/context/feature-context.ts +28 -0
  403. package/src/context/index.ts +27 -0
  404. package/src/context/layout-context.ts +72 -0
  405. package/src/context/participant-context.ts +44 -0
  406. package/src/context/pin-context.ts +27 -0
  407. package/src/context/room-context.ts +42 -0
  408. package/src/context/session-context.ts +43 -0
  409. package/src/context/track-reference-context.ts +47 -0
  410. package/src/hooks/cloud/krisp/useKrispNoiseFilter.ts +110 -0
  411. package/src/hooks/index.ts +72 -0
  412. package/src/hooks/internal/index.ts +10 -0
  413. package/src/hooks/internal/useMediaQuery.ts +46 -0
  414. package/src/hooks/internal/useObservableState.ts +24 -0
  415. package/src/hooks/internal/useResizeObserver.ts +124 -0
  416. package/src/hooks/useAgent.ts +945 -0
  417. package/src/hooks/useAudioPlayback.ts +34 -0
  418. package/src/hooks/useChat.ts +57 -0
  419. package/src/hooks/useChatToggle.ts +38 -0
  420. package/src/hooks/useClearPinButton.ts +29 -0
  421. package/src/hooks/useConnectionQualityIndicator.ts +33 -0
  422. package/src/hooks/useConnectionStatus.ts +22 -0
  423. package/src/hooks/useDataChannel.ts +73 -0
  424. package/src/hooks/useDisconnectButton.ts +36 -0
  425. package/src/hooks/useEvents.ts +39 -0
  426. package/src/hooks/useFacingMode.ts +22 -0
  427. package/src/hooks/useFocusToggle.ts +59 -0
  428. package/src/hooks/useGridLayout.ts +44 -0
  429. package/src/hooks/useIsEncrypted.ts +29 -0
  430. package/src/hooks/useIsMuted.ts +51 -0
  431. package/src/hooks/useIsRecording.ts +23 -0
  432. package/src/hooks/useIsSpeaking.ts +21 -0
  433. package/src/hooks/useLiveKitRoom.ts +186 -0
  434. package/src/hooks/useLocalParticipant.ts +73 -0
  435. package/src/hooks/useLocalParticipantPermissions.ts +24 -0
  436. package/src/hooks/useMediaDeviceSelect.ts +81 -0
  437. package/src/hooks/useMediaDevices.ts +28 -0
  438. package/src/hooks/useMediaTrackBySourceOrName.ts +97 -0
  439. package/src/hooks/usePagination.test.ts +77 -0
  440. package/src/hooks/usePagination.ts +67 -0
  441. package/src/hooks/useParticipantAttributes.ts +69 -0
  442. package/src/hooks/useParticipantInfo.ts +35 -0
  443. package/src/hooks/useParticipantPermissions.ts +29 -0
  444. package/src/hooks/useParticipantTile.ts +81 -0
  445. package/src/hooks/useParticipantTracks.ts +54 -0
  446. package/src/hooks/useParticipants.ts +42 -0
  447. package/src/hooks/usePersistentUserChoices.ts +64 -0
  448. package/src/hooks/usePinnedTracks.ts +24 -0
  449. package/src/hooks/useRemoteParticipant.ts +79 -0
  450. package/src/hooks/useRemoteParticipants.ts +45 -0
  451. package/src/hooks/useRoomInfo.ts +32 -0
  452. package/src/hooks/useSequentialRoomConnectDisconnect.ts +171 -0
  453. package/src/hooks/useSession.ts +642 -0
  454. package/src/hooks/useSessionMessages.ts +158 -0
  455. package/src/hooks/useSettingsToggle.ts +32 -0
  456. package/src/hooks/useSortedParticipants.ts +20 -0
  457. package/src/hooks/useSpeakingParticipants.ts +27 -0
  458. package/src/hooks/useStartAudio.ts +50 -0
  459. package/src/hooks/useStartVideo.ts +49 -0
  460. package/src/hooks/useSwipe.ts +68 -0
  461. package/src/hooks/useTextStream.ts +35 -0
  462. package/src/hooks/useToken.ts +54 -0
  463. package/src/hooks/useTrack.ts +11 -0
  464. package/src/hooks/useTrackByName.ts +15 -0
  465. package/src/hooks/useTrackMutedIndicator.ts +44 -0
  466. package/src/hooks/useTrackRefBySourceOrName.ts +30 -0
  467. package/src/hooks/useTrackSyncTime.ts +18 -0
  468. package/src/hooks/useTrackToggle.ts +93 -0
  469. package/src/hooks/useTrackTranscription.ts +75 -0
  470. package/src/hooks/useTrackVolume.ts +283 -0
  471. package/src/hooks/useTracks.test.ts +60 -0
  472. package/src/hooks/useTracks.ts +154 -0
  473. package/src/hooks/useTranscriptions.ts +48 -0
  474. package/src/hooks/useVisualStableUpdate.ts +63 -0
  475. package/src/hooks/useVoiceAssistant.ts +109 -0
  476. package/src/hooks/useWarnAboutMissingStyles.ts +11 -0
  477. package/src/index.docs.ts +12 -0
  478. package/src/index.ts +32 -0
  479. package/src/mergeProps.ts +87 -0
  480. package/src/prefabs/AudioConference.tsx +57 -0
  481. package/src/prefabs/Chat.tsx +153 -0
  482. package/src/prefabs/ControlBar.tsx +227 -0
  483. package/src/prefabs/MediaDeviceMenu.tsx +159 -0
  484. package/src/prefabs/PreJoin.tsx +439 -0
  485. package/src/prefabs/VideoConference.tsx +184 -0
  486. package/src/prefabs/VoiceAssistantControlBar.tsx +109 -0
  487. package/src/prefabs/index.ts +11 -0
  488. package/src/utils.ts +78 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-hQJmeINB.mjs","sources":["../src/hooks/internal/useResizeObserver.ts","../src/hooks/internal/useObservableState.ts","../src/hooks/internal/useMediaQuery.ts","../src/hooks/useAudioPlayback.ts","../src/hooks/useClearPinButton.ts","../src/hooks/useConnectionQualityIndicator.ts","../src/hooks/useConnectionStatus.ts","../src/hooks/useDataChannel.ts","../src/hooks/useDisconnectButton.ts","../src/hooks/useFacingMode.ts","../src/hooks/useFocusToggle.ts","../src/hooks/useGridLayout.ts","../src/hooks/useIsMuted.ts","../src/hooks/useIsSpeaking.ts","../src/hooks/useLocalParticipant.ts","../src/hooks/useLocalParticipantPermissions.ts","../src/hooks/useMediaDeviceSelect.ts","../src/hooks/useMediaDevices.ts","../src/hooks/useVisualStableUpdate.ts","../src/hooks/usePagination.ts","../src/hooks/useParticipantInfo.ts","../src/hooks/useParticipantPermissions.ts","../src/hooks/useParticipantTile.ts","../src/hooks/useRemoteParticipants.ts","../src/hooks/useParticipants.ts","../src/hooks/usePinnedTracks.ts","../src/hooks/useRemoteParticipant.ts","../src/hooks/useRoomInfo.ts","../src/hooks/useSpeakingParticipants.ts","../src/hooks/useSortedParticipants.ts","../src/hooks/useStartAudio.ts","../src/hooks/useStartVideo.ts","../src/hooks/useSwipe.ts","../src/hooks/useChatToggle.ts","../src/hooks/useToken.ts","../src/hooks/useTrackMutedIndicator.ts","../src/hooks/useTrackToggle.ts","../src/hooks/useTracks.ts","../src/hooks/useTrackRefBySourceOrName.ts","../src/hooks/useTrackByName.ts","../src/hooks/useChat.ts","../src/hooks/usePersistentUserChoices.ts","../src/hooks/useIsEncrypted.ts","../src/hooks/useTrackVolume.ts","../src/hooks/useParticipantTracks.ts","../src/hooks/useTrackSyncTime.ts","../src/hooks/useTrackTranscription.ts","../src/hooks/useParticipantAttributes.ts","../src/hooks/useVoiceAssistant.ts","../src/hooks/useIsRecording.ts","../src/hooks/useTextStream.ts","../src/hooks/useTranscriptions.ts","../src/hooks/useSequentialRoomConnectDisconnect.ts","../../../node_modules/.pnpm/events@3.3.0/node_modules/events/events.js","../src/hooks/useAgent.ts","../src/hooks/useSession.ts","../src/hooks/useEvents.ts","../src/hooks/useSessionMessages.ts"],"sourcesContent":["/* eslint-disable no-return-assign */\n/* eslint-disable no-underscore-dangle */\nimport * as React from 'react';\n\nconst useLatest = <T>(current: T) => {\n const storedValue = React.useRef(current);\n React.useEffect(() => {\n storedValue.current = current;\n });\n return storedValue;\n};\n\n/**\n * A React hook that fires a callback whenever ResizeObserver detects a change to its size\n * code extracted from https://github.com/jaredLunde/react-hook/blob/master/packages/resize-observer/src/index.tsx in order to not include the polyfill for resize-observer\n *\n * @internal\n */\nexport function useResizeObserver<T extends HTMLElement>(\n target: React.RefObject<T>,\n callback: UseResizeObserverCallback,\n) {\n const resizeObserver = getResizeObserver();\n const storedCallback = useLatest(callback);\n\n React.useLayoutEffect(() => {\n let didUnsubscribe = false;\n\n const targetEl = target.current;\n if (!targetEl) return;\n\n function cb(entry: ResizeObserverEntry, observer: ResizeObserver) {\n if (didUnsubscribe) return;\n storedCallback.current(entry, observer);\n }\n\n resizeObserver?.subscribe(targetEl as HTMLElement, cb);\n\n return () => {\n didUnsubscribe = true;\n resizeObserver?.unsubscribe(targetEl as HTMLElement, cb);\n };\n }, [target.current, resizeObserver, storedCallback]);\n\n return resizeObserver?.observer;\n}\n\nfunction createResizeObserver() {\n let ticking = false;\n let allEntries: ResizeObserverEntry[] = [];\n\n const callbacks: Map<unknown, Array<UseResizeObserverCallback>> = new Map();\n\n if (typeof window === 'undefined') {\n return;\n }\n\n const observer = new ResizeObserver((entries: ResizeObserverEntry[], obs: ResizeObserver) => {\n allEntries = allEntries.concat(entries);\n if (!ticking) {\n window.requestAnimationFrame(() => {\n const triggered = new Set<Element>();\n for (let i = 0; i < allEntries.length; i++) {\n if (triggered.has(allEntries[i].target)) continue;\n triggered.add(allEntries[i].target);\n const cbs = callbacks.get(allEntries[i].target);\n cbs?.forEach((cb) => cb(allEntries[i], obs));\n }\n allEntries = [];\n ticking = false;\n });\n }\n ticking = true;\n });\n\n return {\n observer,\n subscribe(target: HTMLElement, callback: UseResizeObserverCallback) {\n observer.observe(target);\n const cbs = callbacks.get(target) ?? [];\n cbs.push(callback);\n callbacks.set(target, cbs);\n },\n unsubscribe(target: HTMLElement, callback: UseResizeObserverCallback) {\n const cbs = callbacks.get(target) ?? [];\n if (cbs.length === 1) {\n observer.unobserve(target);\n callbacks.delete(target);\n return;\n }\n const cbIndex = cbs.indexOf(callback);\n if (cbIndex !== -1) cbs.splice(cbIndex, 1);\n callbacks.set(target, cbs);\n },\n };\n}\n\nlet _resizeObserver: ReturnType<typeof createResizeObserver>;\n\nconst getResizeObserver = () =>\n !_resizeObserver ? (_resizeObserver = createResizeObserver()) : _resizeObserver;\n\nexport type UseResizeObserverCallback = (\n entry: ResizeObserverEntry,\n observer: ResizeObserver,\n) => unknown;\n\nexport const useSize = (target: React.RefObject<HTMLDivElement>) => {\n const [size, setSize] = React.useState({ width: 0, height: 0 });\n React.useLayoutEffect(() => {\n if (target.current) {\n const { width, height } = target.current.getBoundingClientRect();\n setSize({ width, height });\n }\n }, [target.current]);\n\n const resizeCallback = React.useCallback(\n (entry: ResizeObserverEntry) => setSize(entry.contentRect),\n [],\n );\n // Where the magic happens\n useResizeObserver(target, resizeCallback);\n return size;\n};\n","import * as React from 'react';\n// @ts-ignore\nimport type { Observable } from 'rxjs';\n\n/**\n * @internal\n */\nexport function useObservableState<T>(\n observable: Observable<T> | undefined,\n startWith: T,\n resetWhenObservableChanges = true,\n) {\n const [state, setState] = React.useState<T>(startWith);\n React.useEffect(() => {\n if (resetWhenObservableChanges) {\n setState(startWith);\n }\n // observable state doesn't run in SSR\n if (typeof window === 'undefined' || !observable) return;\n const subscription = observable.subscribe(setState);\n return () => subscription.unsubscribe();\n }, [observable, resetWhenObservableChanges]);\n return state;\n}\n","import * as React from 'react';\n/**\n * Implementation used from https://github.com/juliencrn/usehooks-ts\n *\n * @internal\n */\nexport function useMediaQuery(query: string): boolean {\n const getMatches = (query: string): boolean => {\n // Prevents SSR issues\n if (typeof window !== 'undefined') {\n return window.matchMedia(query).matches;\n }\n return false;\n };\n\n const [matches, setMatches] = React.useState<boolean>(getMatches(query));\n\n function handleChange() {\n setMatches(getMatches(query));\n }\n\n React.useEffect(() => {\n const matchMedia = window.matchMedia(query);\n\n // Triggered at the first client-side load and if query changes\n handleChange();\n\n // Listen matchMedia\n if (matchMedia.addListener) {\n matchMedia.addListener(handleChange);\n } else {\n matchMedia.addEventListener('change', handleChange);\n }\n\n return () => {\n if (matchMedia.removeListener) {\n matchMedia.removeListener(handleChange);\n } else {\n matchMedia.removeEventListener('change', handleChange);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query]);\n\n return matches;\n}\n","import type { Room } from 'livekit-client';\nimport * as React from 'react';\nimport { useObservableState } from './internal';\nimport { roomAudioPlaybackAllowedObservable } from '@livekit/components-core';\nimport { useEnsureRoom } from '../context';\n\n/**\n * In many browsers to start audio playback, the user must perform a user-initiated event such as clicking a button.\n * The `useAudioPlayback` hook returns an object with a boolean `canPlayAudio` flag that indicates whether audio\n * playback is allowed in the current context, as well as a `startAudio` function that can be called in a button\n * `onClick` callback to start audio playback in the current context.\n *\n * @see Autoplay policy on MDN web docs for more info: {@link https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Best_practices#autoplay_policy}\n * @alpha\n */\nexport function useAudioPlayback(room?: Room): {\n canPlayAudio: boolean;\n startAudio: () => Promise<void>;\n} {\n const roomEnsured = useEnsureRoom(room);\n const startAudio = React.useCallback(async () => {\n await roomEnsured.startAudio();\n }, [roomEnsured]);\n\n const observable = React.useMemo(\n () => roomAudioPlaybackAllowedObservable(roomEnsured),\n [roomEnsured],\n );\n const { canPlayAudio } = useObservableState(observable, {\n canPlayAudio: roomEnsured.canPlaybackAudio,\n });\n\n return { canPlayAudio, startAudio };\n}\n","import { setupClearPinButton } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useLayoutContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport type { ClearPinButtonProps } from '../components';\n\n/**\n * The `useClearPinButton` hook provides props for the {@link ClearPinButton}\n * or your custom implementation of it component. It adds the `onClick` handler\n * to signal the `LayoutContext` that the tile in focus should be cleared.\n * @public\n */\nexport function useClearPinButton(props: ClearPinButtonProps) {\n const { state, dispatch } = useLayoutContext().pin;\n\n const buttonProps = React.useMemo(() => {\n const { className } = setupClearPinButton();\n const mergedProps = mergeProps(props, {\n className,\n disabled: !state?.length,\n onClick: () => {\n if (dispatch) dispatch({ msg: 'clear_pin' });\n },\n });\n return mergedProps;\n }, [props, dispatch, state]);\n\n return { buttonProps };\n}\n","import { setupConnectionQualityIndicator } from '@livekit/components-core';\nimport type { Participant } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureParticipant } from '../context';\nimport { useObservableState } from './internal';\n\n/** @public */\nexport interface ConnectionQualityIndicatorOptions {\n participant?: Participant;\n}\n\n/**\n * The `useConnectionQualityIndicator` hook provides props for the `ConnectionQualityIndicator` or your custom implementation of it component.\n * @example\n * ```tsx\n * const { quality } = useConnectionQualityIndicator();\n * // or\n * const { quality } = useConnectionQualityIndicator({ participant });\n * ```\n * @public\n */\nexport function useConnectionQualityIndicator(options: ConnectionQualityIndicatorOptions = {}) {\n const p = useEnsureParticipant(options.participant);\n\n const { className, connectionQualityObserver } = React.useMemo(\n () => setupConnectionQualityIndicator(p),\n [p],\n );\n\n const quality = useObservableState(connectionQualityObserver, p.connectionQuality);\n\n return { className, quality };\n}\n","import { connectionStateObserver } from '@livekit/components-core';\nimport type { Room } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\nimport { useObservableState } from './internal';\n\n/**\n * The `useConnectionState` hook allows you to simply implement your own `ConnectionState` component.\n *\n * @example\n * ```tsx\n * const connectionState = useConnectionState(room);\n * ```\n * @public\n */\nexport function useConnectionState(room?: Room) {\n // passed room takes precedence, if not supplied get current room context\n const r = useEnsureRoom(room);\n const observable = React.useMemo(() => connectionStateObserver(r), [r]);\n const connectionState = useObservableState(observable, r.state);\n return connectionState;\n}\n","import type { ReceivedDataMessage } from '@livekit/components-core';\nimport { setupDataMessageHandler } from '@livekit/components-core';\nimport * as React from 'react';\nimport type { DataPublishOptions } from 'livekit-client';\nimport { useRoomContext } from '../context';\nimport { useObservableState } from './internal';\n\ntype UseDataChannelReturnType<T extends string | undefined = undefined> = {\n isSending: boolean;\n send: (payload: Uint8Array, options: DataPublishOptions) => Promise<void>;\n message: ReceivedDataMessage<T> | undefined;\n};\n\n/**\n * The `useDataChannel` hook returns the ability to send and receive messages.\n * Pass an optional `topic` to narrow down which messages are returned in the messages array.\n *\n * @remarks\n * There is only one data channel. Passing a `topic` does not open a new data channel.\n * It is only used to filter out messages with no or a different `topic`.\n *\n * @example\n * ```tsx\n * // Send messages to all participants via the 'chat' topic.\n * const { message: latestMessage, send } = useDataChannel('chat', (msg) => console.log(\"message received\", msg));\n * ```\n *\n * @example\n * ```tsx\n * // Receive all messages (no topic filtering)\n * const { message: latestMessage, send } = useDataChannel((msg) => console.log(\"message received\", msg));\n * ```\n *\n * @public\n */\nexport function useDataChannel<T extends string>(\n topic: T,\n onMessage?: (msg: ReceivedDataMessage<T>) => void,\n): UseDataChannelReturnType<T>;\n\n/**\n * Overload for `useDataChannel` without a topic. See {@link (useDataChannel:1)} for information and usage examples.\n *\n * @public\n */\nexport function useDataChannel(\n onMessage?: (msg: ReceivedDataMessage) => void,\n): UseDataChannelReturnType;\n/**\n * @internal\n */\nexport function useDataChannel<T extends string>(\n topicOrCallback?: T | ((msg: ReceivedDataMessage) => void),\n callback?: (msg: ReceivedDataMessage<T>) => void,\n) {\n const onMessage = typeof topicOrCallback === 'function' ? topicOrCallback : callback;\n\n const topic = typeof topicOrCallback === 'string' ? topicOrCallback : undefined;\n const room = useRoomContext();\n const { send, messageObservable, isSendingObservable } = React.useMemo(\n () => setupDataMessageHandler(room, topic, onMessage),\n [room, topic, onMessage],\n );\n\n const message = useObservableState(messageObservable, undefined);\n const isSending = useObservableState(isSendingObservable, false);\n\n return {\n message,\n send,\n isSending,\n };\n}\n","import { setupDisconnectButton } from '@livekit/components-core';\nimport { ConnectionState } from 'livekit-client';\nimport * as React from 'react';\nimport type { DisconnectButtonProps } from '../components';\nimport { useRoomContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport { useConnectionState } from './useConnectionStatus';\n\n/**\n * The `useDisconnectButton` hook is used to implement the `DisconnectButton` or your\n * custom implementation of it. It adds onClick handler to the button to disconnect\n * from the room.\n *\n * @example\n * ```tsx\n * const { buttonProps } = useDisconnectButton(buttonProps);\n * return <button {...buttonProps}>Disconnect</button>;\n * ```\n * @public\n */\nexport function useDisconnectButton(props: DisconnectButtonProps) {\n const room = useRoomContext();\n const connectionState = useConnectionState(room);\n\n const buttonProps = React.useMemo(() => {\n const { className, disconnect } = setupDisconnectButton(room);\n const mergedProps = mergeProps(props, {\n className,\n onClick: () => disconnect(props.stopTracks ?? true),\n disabled: connectionState === ConnectionState.Disconnected,\n });\n return mergedProps;\n }, [room, props, connectionState]);\n\n return { buttonProps };\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { LocalTrackPublication, facingModeFromLocalTrack } from 'livekit-client';\n\n/**\n * Try to determine the `facingMode` of a local participant video track.\n * @remarks\n * Works only on local video tracks.\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/facingMode | MDN docs on facingMode}\n * @alpha\n */\nexport function useFacingMode(\n trackReference: TrackReferenceOrPlaceholder,\n): 'user' | 'environment' | 'left' | 'right' | 'undefined' {\n if (trackReference.publication instanceof LocalTrackPublication) {\n const localTrack = trackReference.publication.track;\n if (localTrack) {\n const { facingMode } = facingModeFromLocalTrack(localTrack);\n return facingMode;\n }\n }\n return 'undefined';\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { setupFocusToggle, isTrackReferencePinned } from '@livekit/components-core';\nimport { useEnsureTrackRef, useMaybeLayoutContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport * as React from 'react';\n\n/** @public */\nexport interface UseFocusToggleProps {\n trackRef?: TrackReferenceOrPlaceholder;\n props: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * The `useFocusToggle` hook is used to implement the `FocusToggle` or your custom implementation of it.\n * The `TrackReferenceOrPlaceholder` is used to register a onClick handler and to identify the track to focus on.\n *\n * @example\n * ```tsx\n * const { mergedProps, inFocus } = useFocusToggle({ trackRef, props: yourButtonProps });\n * return <button {...mergedProps}>{inFocus ? 'Unfocus' : 'Focus'}</button>;\n * ```\n * @public\n */\nexport function useFocusToggle({ trackRef, props }: UseFocusToggleProps) {\n const trackReference = useEnsureTrackRef(trackRef);\n\n const layoutContext = useMaybeLayoutContext();\n const { className } = React.useMemo(() => setupFocusToggle(), []);\n\n const inFocus: boolean = React.useMemo(() => {\n return isTrackReferencePinned(trackReference, layoutContext?.pin.state);\n }, [trackReference, layoutContext?.pin.state]);\n\n const mergedProps = React.useMemo(\n () =>\n mergeProps(props, {\n className,\n onClick: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n // Call user defined on click callbacks.\n props.onClick?.(event);\n\n // Set or clear focus based on current focus state.\n if (inFocus) {\n layoutContext?.pin.dispatch?.({\n msg: 'clear_pin',\n });\n } else {\n layoutContext?.pin.dispatch?.({\n msg: 'set_pin',\n trackReference,\n });\n }\n },\n }),\n [props, className, trackReference, inFocus, layoutContext?.pin],\n );\n\n return { mergedProps, inFocus };\n}\n","import { GRID_LAYOUTS, selectGridLayout } from '@livekit/components-core';\nimport type { GridLayoutDefinition, GridLayoutInfo } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useSize } from './internal';\n\n/**\n * The `useGridLayout` hook tries to select the best layout to fit all tiles.\n * If the available screen space is not enough, it will reduce the number of maximum visible\n * tiles and select a layout that still works visually within the given limitations.\n * As the order of tiles changes over time, the hook tries to keep visual updates to a minimum\n * while trying to display important tiles such as speaking participants or screen shares.\n *\n * @example\n * ```tsx\n * const { layout } = useGridLayout(gridElement, trackCount);\n * ```\n * @public\n */\nexport function useGridLayout(\n /** HTML element that contains the grid. */\n gridElement: React.RefObject<HTMLDivElement>,\n /** Count of tracks that should get layed out */\n trackCount: number,\n options: {\n gridLayouts?: GridLayoutDefinition[];\n } = {},\n): { layout: GridLayoutInfo; containerWidth: number; containerHeight: number } {\n const gridLayouts = options.gridLayouts ?? GRID_LAYOUTS;\n const { width, height } = useSize(gridElement);\n const layout = selectGridLayout(gridLayouts, trackCount, width, height);\n\n React.useEffect(() => {\n if (gridElement.current && layout) {\n gridElement.current.style.setProperty('--lk-col-count', layout?.columns.toString());\n gridElement.current.style.setProperty('--lk-row-count', layout?.rows.toString());\n }\n }, [gridElement, layout]);\n\n return {\n layout,\n containerWidth: width,\n containerHeight: height,\n };\n}\n","import {\n type TrackReferenceOrPlaceholder,\n getTrackReferenceId,\n mutedObserver,\n} from '@livekit/components-core';\nimport type { Participant, Track } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureParticipant } from '../context';\n\n/** @public */\nexport interface UseIsMutedOptions {\n participant?: Participant;\n}\n\n/**\n * The `useIsMuted` hook is used to implement the `TrackMutedIndicator` or your custom implementation of it.\n * It returns a `boolean` that indicates if the track is muted or not.\n *\n * @example With a track reference\n * ```tsx\n * const isMuted = useIsMuted(track);\n * ```\n *\n * @param trackRef - A `TrackReference` indicating the track to monitor.\n * @returns boolean indicating if the track is muted\n *\n * @public\n */\nexport function useIsMuted(trackRef: TrackReferenceOrPlaceholder): boolean;\nexport function useIsMuted(\n sourceOrTrackRef: TrackReferenceOrPlaceholder | Track.Source,\n options: UseIsMutedOptions = {},\n) {\n const passedParticipant =\n typeof sourceOrTrackRef === 'string' ? options.participant : sourceOrTrackRef.participant;\n const p = useEnsureParticipant(passedParticipant);\n const ref =\n typeof sourceOrTrackRef === 'string'\n ? { participant: p, source: sourceOrTrackRef }\n : sourceOrTrackRef;\n const [isMuted, setIsMuted] = React.useState(\n !!(ref.publication?.isMuted || p.getTrackPublication(ref.source)?.isMuted),\n );\n\n React.useEffect(() => {\n const listener = mutedObserver(ref).subscribe(setIsMuted);\n return () => listener.unsubscribe();\n }, [getTrackReferenceId(ref)]);\n\n return isMuted;\n}\n","import { createIsSpeakingObserver } from '@livekit/components-core';\nimport type { Participant } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureParticipant } from '../context';\nimport { useObservableState } from './internal';\n\n/**\n * The `useIsSpeaking` hook returns a `boolean` that indicates if the participant is speaking or not.\n * @example\n * ```tsx\n * const isSpeaking = useIsSpeaking(participant);\n * ```\n * @public\n */\nexport function useIsSpeaking(participant?: Participant) {\n const p = useEnsureParticipant(participant);\n const observable = React.useMemo(() => createIsSpeakingObserver(p), [p]);\n const isSpeaking = useObservableState(observable, p.isSpeaking);\n\n return isSpeaking;\n}\n","import type { ParticipantMedia } from '@livekit/components-core';\nimport { observeParticipantMedia } from '@livekit/components-core';\nimport type { TrackPublication, LocalParticipant, Room } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\n\n/** @public */\nexport interface UseLocalParticipantOptions {\n /**\n * The room to use. If not provided, the hook will use the room from the context.\n */\n room?: Room;\n}\n\n/**\n * The `useLocalParticipant` hook returns the local participant and the associated state\n * around the participant.\n *\n * @example\n * ```tsx\n * const { localParticipant } = useLocalParticipant();\n * ```\n * @public\n */\nexport function useLocalParticipant(options: UseLocalParticipantOptions = {}) {\n const room = useEnsureRoom(options.room);\n const [localParticipant, setLocalParticipant] = React.useState(room.localParticipant);\n\n const [isMicrophoneEnabled, setIsMicrophoneEnabled] = React.useState(\n localParticipant.isMicrophoneEnabled,\n );\n const [isCameraEnabled, setIsCameraEnabled] = React.useState(localParticipant.isCameraEnabled);\n const [isScreenShareEnabled, setIsScreenShareEnabled] = React.useState(\n localParticipant.isScreenShareEnabled,\n );\n\n const [lastMicrophoneError, setLastMicrophoneError] = React.useState(\n localParticipant.lastMicrophoneError,\n );\n const [lastCameraError, setLastCameraError] = React.useState(localParticipant.lastCameraError);\n\n const [microphoneTrack, setMicrophoneTrack] = React.useState<TrackPublication | undefined>(\n undefined,\n );\n const [cameraTrack, setCameraTrack] = React.useState<TrackPublication | undefined>(undefined);\n\n const handleUpdate = (media: ParticipantMedia<LocalParticipant>) => {\n setIsCameraEnabled(media.isCameraEnabled);\n setIsMicrophoneEnabled(media.isMicrophoneEnabled);\n setIsScreenShareEnabled(media.isScreenShareEnabled);\n setCameraTrack(media.cameraTrack);\n setMicrophoneTrack(media.microphoneTrack);\n setLastMicrophoneError(media.participant.lastMicrophoneError);\n setLastCameraError(media.participant.lastCameraError);\n setLocalParticipant(media.participant);\n };\n React.useEffect(() => {\n const listener = observeParticipantMedia(room.localParticipant).subscribe(handleUpdate);\n // TODO also listen to permission and metadata etc. events\n return () => listener.unsubscribe();\n }, [room]);\n\n return {\n isMicrophoneEnabled,\n isScreenShareEnabled,\n isCameraEnabled,\n microphoneTrack,\n cameraTrack,\n lastMicrophoneError,\n lastCameraError,\n localParticipant,\n };\n}\n","import { participantPermissionObserver } from '@livekit/components-core';\nimport type { ParticipantPermission } from '@livekit/protocol';\nimport * as React from 'react';\nimport { useRoomContext } from '../context';\nimport { useObservableState } from './internal';\n\n/**\n * The `useLocalParticipantPermissions` hook returns the local participant's permissions.\n *\n * @example\n * ```tsx\n * const { canPublish, canPublishData } = useLocalParticipantPermissions();\n * ```\n * @public\n */\nexport function useLocalParticipantPermissions(): ParticipantPermission | undefined {\n const room = useRoomContext();\n const permissionObserver = React.useMemo(\n () => participantPermissionObserver(room.localParticipant),\n [room],\n );\n const permissions = useObservableState(permissionObserver, room.localParticipant.permissions);\n return permissions;\n}\n","import { createMediaDeviceObserver, setupDeviceSelector, log } from '@livekit/components-core';\nimport { Room, type LocalAudioTrack, type LocalVideoTrack } from 'livekit-client';\nimport * as React from 'react';\nimport { useMaybeRoomContext } from '../context';\nimport { useObservableState } from './internal';\n\n/** @public */\nexport interface UseMediaDeviceSelectProps {\n kind: MediaDeviceKind;\n room?: Room;\n track?: LocalAudioTrack | LocalVideoTrack;\n /**\n * this will call getUserMedia if the permissions are not yet given to enumerate the devices with device labels.\n * in some browsers multiple calls to getUserMedia result in multiple permission prompts.\n * It's generally advised only flip this to true, once a (preview) track has been acquired successfully with the\n * appropriate permissions.\n *\n * @see {@link MediaDeviceMenu}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices | MDN enumerateDevices}\n */\n requestPermissions?: boolean;\n /**\n * this callback gets called if an error is thrown when failing to select a device and also if a user\n * denied permissions, eventhough the `requestPermissions` option is set to `true`.\n * Most commonly this will emit a MediaDeviceError\n */\n onError?: (e: Error) => void;\n}\n\n/**\n * The `useMediaDeviceSelect` hook is used to implement the `MediaDeviceSelect` component and\n * returns o.a. the list of devices of a given kind (audioinput or videoinput), the currently active device\n * and a function to set the the active device.\n *\n * @example\n * ```tsx\n * const { devices, activeDeviceId, setActiveMediaDevice } = useMediaDeviceSelect({kind: 'audioinput'});\n * ```\n * @public\n */\nexport function useMediaDeviceSelect({\n kind,\n room,\n track,\n requestPermissions,\n onError,\n}: UseMediaDeviceSelectProps) {\n const roomContext = useMaybeRoomContext();\n\n const roomFallback = React.useMemo(() => room ?? roomContext ?? new Room(), [room, roomContext]);\n\n // List of all devices.\n const deviceObserver = React.useMemo(\n () => createMediaDeviceObserver(kind, onError, requestPermissions),\n [kind, requestPermissions, onError],\n );\n const devices = useObservableState(deviceObserver, [] as MediaDeviceInfo[]);\n // Active device management.\n const [currentDeviceId, setCurrentDeviceId] = React.useState<string>(\n roomFallback?.getActiveDevice(kind) ?? 'default',\n );\n const { className, activeDeviceObservable, setActiveMediaDevice } = React.useMemo(\n () => setupDeviceSelector(kind, roomFallback),\n [kind, roomFallback, track],\n );\n\n React.useEffect(() => {\n const listener = activeDeviceObservable.subscribe((deviceId) => {\n if (!deviceId) {\n return;\n }\n log.info('setCurrentDeviceId', deviceId);\n setCurrentDeviceId(deviceId);\n });\n return () => {\n listener?.unsubscribe();\n };\n }, [activeDeviceObservable]);\n\n return { devices, className, activeDeviceId: currentDeviceId, setActiveMediaDevice };\n}\n","import * as React from 'react';\nimport { useObservableState } from './internal';\nimport { createMediaDeviceObserver } from '@livekit/components-core';\n\n/**\n * The `useMediaDevices` hook returns the list of media devices of a given kind.\n *\n * @example\n * ```tsx\n * const videoDevices = useMediaDevices({ kind: 'videoinput' });\n * const audioDevices = useMediaDevices({ kind: 'audioinput' });\n * ```\n * @public\n */\nexport function useMediaDevices({\n kind,\n onError,\n}: {\n kind: MediaDeviceKind;\n onError?: (e: Error) => void;\n}) {\n const deviceObserver = React.useMemo(\n () => createMediaDeviceObserver(kind, onError),\n [kind, onError],\n );\n const devices = useObservableState(deviceObserver, [] as MediaDeviceInfo[]);\n return devices;\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { log, sortTrackReferences, updatePages } from '@livekit/components-core';\nimport * as React from 'react';\n\n/** @public */\nexport interface UseVisualStableUpdateOptions {\n /** Overwrites the default sort function. */\n customSortFunction?: (\n trackReferences: TrackReferenceOrPlaceholder[],\n ) => TrackReferenceOrPlaceholder[];\n}\n\n/**\n * The `useVisualStableUpdate` hook is used to prevent visually jarring jumps and shifts of elements\n * in an array. The algorithm only starts to update when there are more items than visually fit\n * on a page. If this is the case, it will make sure that speaking participants move to the first\n * page and are always visible.\n * @remarks\n * Updating the array can occur because attendees leave or join a room, or because they mute/unmute\n * or start speaking.\n * The hook is used for the `GridLayout` and `CarouselLayout` components.\n *\n * @example\n * ```tsx\n * const trackRefs = useTracks();\n * const updatedTrackRefs = useVisualStableUpdate(trackRefs, itemPerPage);\n * ```\n * @public\n */\nexport function useVisualStableUpdate(\n /** `TrackReference`s to display in the grid. */\n trackReferences: TrackReferenceOrPlaceholder[],\n maxItemsOnPage: number,\n options: UseVisualStableUpdateOptions = {},\n): TrackReferenceOrPlaceholder[] {\n const lastTrackRefs = React.useRef<TrackReferenceOrPlaceholder[]>([]);\n const lastMaxItemsOnPage = React.useRef<number>(-1);\n const layoutChanged = maxItemsOnPage !== lastMaxItemsOnPage.current;\n\n const sortedTrackRefs =\n typeof options.customSortFunction === 'function'\n ? options.customSortFunction(trackReferences)\n : sortTrackReferences(trackReferences);\n\n let updatedTrackRefs: TrackReferenceOrPlaceholder[] = [...sortedTrackRefs];\n if (layoutChanged === false) {\n try {\n updatedTrackRefs = updatePages(lastTrackRefs.current, sortedTrackRefs, maxItemsOnPage);\n } catch (error) {\n log.error('Error while running updatePages(): ', error);\n }\n }\n\n // Save info for to compare against in the next update cycle.\n if (layoutChanged) {\n lastTrackRefs.current = sortedTrackRefs;\n } else {\n lastTrackRefs.current = updatedTrackRefs;\n }\n lastMaxItemsOnPage.current = maxItemsOnPage;\n\n return updatedTrackRefs;\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useVisualStableUpdate } from './useVisualStableUpdate';\n\n/**\n * The `usePagination` hook implements simple pagination logic for use with arrays.\n * @example\n * ```tsx\n * const tracks = useTracks();\n * const pagination = usePagination(4, tracks);\n *\n * <TrackLoop tracks={pagination.tracks} />\n * ```\n * @alpha\n */\nexport function usePagination(itemPerPage: number, trackReferences: TrackReferenceOrPlaceholder[]) {\n const [currentPage, setCurrentPage] = React.useState(1);\n const totalPageCount = Math.max(Math.ceil(trackReferences.length / itemPerPage), 1);\n if (currentPage > totalPageCount) {\n setCurrentPage(totalPageCount);\n }\n const lastItemIndex = currentPage * itemPerPage;\n const firstItemIndex = lastItemIndex - itemPerPage;\n\n const changePage = (direction: 'next' | 'previous') => {\n setCurrentPage((state) => {\n if (direction === 'next') {\n if (state === totalPageCount) {\n return state;\n }\n return state + 1;\n } else {\n if (state === 1) {\n return state;\n }\n return state - 1;\n }\n });\n };\n\n const goToPage = (num: number) => {\n if (num > totalPageCount) {\n setCurrentPage(totalPageCount);\n } else if (num < 1) {\n setCurrentPage(1);\n } else {\n setCurrentPage(num);\n }\n };\n\n const updatedTrackReferences = useVisualStableUpdate(trackReferences, itemPerPage);\n\n const tracksOnPage = updatedTrackReferences.slice(firstItemIndex, lastItemIndex);\n\n return {\n totalPageCount,\n nextPage: () => changePage('next'),\n prevPage: () => changePage('previous'),\n setPage: goToPage,\n firstItemIndex,\n lastItemIndex,\n tracks: tracksOnPage,\n currentPage,\n };\n}\n\nexport default usePagination;\n","import { participantInfoObserver } from '@livekit/components-core';\nimport type { Participant } from 'livekit-client';\nimport * as React from 'react';\nimport { useMaybeParticipantContext } from '../context';\nimport { useObservableState } from './internal';\n\n/**\n * The `useParticipantInfo` hook returns the identity, name, and metadata of a given participant.\n * It requires a `Participant` object passed as property or via the `ParticipantContext`.\n *\n * @example\n * ```tsx\n * const { identity, name, metadata } = useParticipantInfo({ participant });\n * ```\n * @public\n */\nexport interface UseParticipantInfoOptions {\n participant?: Participant;\n}\n\n/** @public */\nexport function useParticipantInfo(props: UseParticipantInfoOptions = {}) {\n let p = useMaybeParticipantContext();\n if (props.participant) {\n p = props.participant;\n }\n const infoObserver = React.useMemo(() => participantInfoObserver(p), [p]);\n const { identity, name, metadata } = useObservableState(infoObserver, {\n name: p?.name,\n identity: p?.identity,\n metadata: p?.metadata,\n });\n\n return { identity, name, metadata };\n}\n","import { participantPermissionObserver } from '@livekit/components-core';\nimport type { ParticipantPermission } from '@livekit/protocol';\nimport type { Participant } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureParticipant } from '../context';\nimport { useObservableState } from './internal/useObservableState';\n\n/**\n * The `useParticipantPermissions` hook returns the permissions of a given participant.\n *\n * @example\n * ```tsx\n * const permissions = useParticipantPermissions({ participant });\n * ```\n * @public\n */\nexport interface UseParticipantPermissionsOptions {\n participant?: Participant;\n}\n\n/** @public */\nexport function useParticipantPermissions(\n options: UseParticipantPermissionsOptions = {},\n): ParticipantPermission | undefined {\n const p = useEnsureParticipant(options.participant);\n const permissionObserver = React.useMemo(() => participantPermissionObserver(p), [p]);\n const permissions = useObservableState(permissionObserver, p.permissions);\n return permissions;\n}\n","import type { ParticipantClickEvent, TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { setupParticipantTile } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useEnsureTrackRef } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport { useFacingMode } from './useFacingMode';\nimport { useIsMuted } from './useIsMuted';\nimport { useIsSpeaking } from './useIsSpeaking';\nimport { Track } from 'livekit-client';\n\n/** @public */\nexport interface UseParticipantTileProps<T extends HTMLElement> extends React.HTMLAttributes<T> {\n /** The track reference to display. */\n trackRef?: TrackReferenceOrPlaceholder;\n disableSpeakingIndicator?: boolean;\n onParticipantClick?: (event: ParticipantClickEvent) => void;\n htmlProps: React.HTMLAttributes<T>;\n}\n\n/**\n * The `useParticipantTile` hook is used to implement the `ParticipantTile` and returns the props needed to render the tile.\n * @remarks\n * The returned props include many data attributes that are useful for CSS styling purposes because they\n * indicate the state of the participant and the track.\n * For example: `data-lk-audio-muted`, `data-lk-video-muted`, `data-lk-speaking`, `data-lk-local-participant`, `data-lk-source`, `data-lk-facing-mode`.\n * @public\n */\nexport function useParticipantTile<T extends HTMLElement>({\n trackRef,\n onParticipantClick,\n disableSpeakingIndicator,\n htmlProps,\n}: UseParticipantTileProps<T>) {\n const trackReference = useEnsureTrackRef(trackRef);\n\n const mergedProps = React.useMemo(() => {\n const { className } = setupParticipantTile();\n return mergeProps(htmlProps, {\n className,\n onClick: (event: React.MouseEvent<T, MouseEvent>) => {\n htmlProps.onClick?.(event);\n if (typeof onParticipantClick === 'function') {\n const track =\n trackReference.publication ??\n trackReference.participant.getTrackPublication(trackReference.source);\n onParticipantClick({ participant: trackReference.participant, track });\n }\n },\n });\n }, [\n htmlProps,\n onParticipantClick,\n trackReference.publication,\n trackReference.source,\n trackReference.participant,\n ]);\n\n const micTrack = trackReference.participant.getTrackPublication(Track.Source.Microphone);\n const micRef = React.useMemo(() => {\n return {\n participant: trackReference.participant,\n source: Track.Source.Microphone,\n publication: micTrack,\n };\n }, [micTrack, trackReference.participant]);\n const isVideoMuted = useIsMuted(trackReference);\n const isAudioMuted = useIsMuted(micRef);\n const isSpeaking = useIsSpeaking(trackReference.participant);\n const facingMode = useFacingMode(trackReference);\n return {\n elementProps: {\n 'data-lk-audio-muted': isAudioMuted,\n 'data-lk-video-muted': isVideoMuted,\n 'data-lk-speaking': disableSpeakingIndicator === true ? false : isSpeaking,\n 'data-lk-local-participant': trackReference.participant.isLocal,\n 'data-lk-source': trackReference.source,\n 'data-lk-facing-mode': facingMode,\n ...mergedProps,\n } as React.HTMLAttributes<T>,\n };\n}\n","import { connectedParticipantsObserver } from '@livekit/components-core';\nimport type { RoomEvent, RemoteParticipant, Room } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\n\n/** @public */\nexport interface UseRemoteParticipantsOptions {\n /**\n * To optimize performance, you can use the `updateOnlyOn` property to decide on what RoomEvents the hook updates.\n * By default it updates on all relevant RoomEvents to keep the returned participants array up to date.\n * The minimal set of non-overwriteable `RoomEvents` is: `[RoomEvent.ParticipantConnected, RoomEvent.ParticipantDisconnected, RoomEvent.ConnectionStateChanged]`\n */\n updateOnlyOn?: RoomEvent[];\n /**\n * The room to use. If not provided, the hook will use the room from the context.\n */\n room?: Room;\n}\n\n/**\n * The `useRemoteParticipants` hook returns all remote participants (without the local) of the current room.\n * @remarks\n * To optimize performance, you can use the `updateOnlyOn` property to decide on what `RoomEvents` the hook updates.\n *\n * @example\n * ```tsx\n * const participants = useRemoteParticipants();\n * <ParticipantLoop participants={participants}>\n * <ParticipantName />\n * </ParticipantLoop>\n * ```\n * @public\n */\nexport function useRemoteParticipants(options: UseRemoteParticipantsOptions = {}) {\n const room = useEnsureRoom(options.room);\n const [participants, setParticipants] = React.useState<RemoteParticipant[]>([]);\n\n React.useEffect(() => {\n const listener = connectedParticipantsObserver(room, {\n additionalRoomEvents: options.updateOnlyOn,\n }).subscribe(setParticipants);\n return () => listener.unsubscribe();\n }, [room, JSON.stringify(options.updateOnlyOn)]);\n return participants;\n}\n","import type { Room, RoomEvent } from 'livekit-client';\nimport { useLocalParticipant } from './useLocalParticipant';\nimport { useRemoteParticipants } from './useRemoteParticipants';\nimport * as React from 'react';\n\n/** @public */\nexport interface UseParticipantsOptions {\n /**\n * To optimize performance, you can use the `updateOnlyOn` property to decide on what RoomEvents the hook updates.\n * By default it updates on all relevant RoomEvents to keep the returned participants array up to date.\n * The minimal set of non-overwriteable `RoomEvents` is: `[RoomEvent.ParticipantConnected, RoomEvent.ParticipantDisconnected, RoomEvent.ConnectionStateChanged]`\n */\n updateOnlyOn?: RoomEvent[];\n /**\n * The room to use. If not provided, the hook will use the room from the context.\n */\n room?: Room;\n}\n\n/**\n * The `useParticipants` hook returns all participants (local and remote) of the current room.\n * @remarks\n * To optimize performance, you can use the `updateOnlyOn` property to decide on what `RoomEvents` the hook updates.\n *\n * @example\n * ```tsx\n * const participants = useParticipants();\n * <ParticipantLoop participants={participants}>\n * <ParticipantName />\n * </ParticipantLoop>\n * ```\n * @public\n */\nexport function useParticipants(options: UseParticipantsOptions = {}) {\n const remoteParticipants = useRemoteParticipants(options);\n const { localParticipant } = useLocalParticipant(options);\n\n return React.useMemo(\n () => [localParticipant, ...remoteParticipants],\n [localParticipant, remoteParticipants],\n );\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport * as React from 'react';\nimport type { LayoutContextType } from '../context';\nimport { useEnsureLayoutContext } from '../context';\n\n/**\n * The `usePinnedTracks` hook returns a array of the pinned tracks of the current room.\n * @remarks\n * To function properly, this hook must be called within a `LayoutContext`.\n * @example\n * ```tsx\n * const pinnedTracks = usePinnedTracks();\n * ```\n * @public\n */\nexport function usePinnedTracks(layoutContext?: LayoutContextType): TrackReferenceOrPlaceholder[] {\n layoutContext = useEnsureLayoutContext(layoutContext);\n return React.useMemo(() => {\n if (layoutContext?.pin.state !== undefined && layoutContext.pin.state.length >= 1) {\n return layoutContext.pin.state;\n }\n return [];\n }, [layoutContext.pin.state]);\n}\n","import {\n type ParticipantIdentifier,\n connectedParticipantObserver,\n participantByIdentifierObserver,\n} from '@livekit/components-core';\nimport type { ParticipantEvent, RemoteParticipant } from 'livekit-client';\nimport * as React from 'react';\nimport { useRoomContext } from '../context';\n\n/** @public */\nexport interface UseRemoteParticipantOptions {\n /**\n * To optimize performance, you can use the `updateOnlyOn` property to decide on what `ParticipantEvents` the hook updates.\n * By default it updates on all relevant ParticipantEvents to keep the returned participant up to date.\n */\n updateOnlyOn?: ParticipantEvent[];\n}\n\n/**\n * The `useRemoteParticipant` hook returns the first RemoteParticipant by either identity and/or based on the participant kind.\n * @remarks\n * To optimize performance, you can use the `updateOnlyOn` property to decide on what `ParticipantEvents` the hook updates.\n *\n * @example\n * ```tsx\n * const participant = useRemoteParticipant({kind: ParticipantKind.Agent, identity: 'myAgent'});\n * ```\n * @public\n */\nexport function useRemoteParticipant(\n identifier: ParticipantIdentifier,\n options?: UseRemoteParticipantOptions,\n): RemoteParticipant | undefined;\n/**\n * The `useRemoteParticipant` hook returns the first RemoteParticipant by either identity or based on the participant kind.\n * @remarks\n * To optimize performance, you can use the `updateOnlyOn` property to decide on what `ParticipantEvents` the hook updates.\n *\n * @example\n * ```tsx\n * const participant = useRemoteParticipant('Russ');\n * ```\n * @public\n */\nexport function useRemoteParticipant(\n identity: string,\n options?: UseRemoteParticipantOptions,\n): RemoteParticipant | undefined;\nexport function useRemoteParticipant(\n identityOrIdentifier: string | ParticipantIdentifier,\n options: UseRemoteParticipantOptions = {},\n): RemoteParticipant | undefined {\n const room = useRoomContext();\n const [updateOnlyOn] = React.useState(options.updateOnlyOn);\n\n const observable = React.useMemo(() => {\n if (typeof identityOrIdentifier === 'string') {\n return connectedParticipantObserver(room, identityOrIdentifier, {\n additionalEvents: updateOnlyOn,\n });\n } else {\n return participantByIdentifierObserver(room, identityOrIdentifier, {\n additionalEvents: updateOnlyOn,\n });\n }\n }, [room, JSON.stringify(identityOrIdentifier), updateOnlyOn]);\n\n // Using `wrapperParticipant` to ensure a new object reference,\n // triggering a re-render when the participant events fire.\n const [participantWrapper, setParticipantWrapper] = React.useState({\n p: undefined as RemoteParticipant | undefined,\n });\n React.useEffect(() => {\n const listener = observable.subscribe((p) => setParticipantWrapper({ p }));\n return () => listener.unsubscribe();\n }, [observable]);\n\n return participantWrapper.p;\n}\n","import { roomInfoObserver } from '@livekit/components-core';\nimport type { Room } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\nimport { useObservableState } from './internal';\n\n/**\n * The `useRoomInfo` hook returns the name and metadata of the given `Room`.\n * @remarks\n * Needs to be called inside a `RoomContext` or by passing a `Room` instance.\n *\n * @example\n * ```tsx\n * const { name, metadata } = useRoomInfo();\n * ```\n * @public\n */\nexport interface UseRoomInfoOptions {\n room?: Room;\n}\n\n/** @public */\nexport function useRoomInfo(options: UseRoomInfoOptions = {}) {\n const room = useEnsureRoom(options.room);\n const infoObserver = React.useMemo(() => roomInfoObserver(room), [room]);\n const { name, metadata } = useObservableState(infoObserver, {\n name: room.name,\n metadata: room.metadata,\n });\n\n return { name, metadata };\n}\n","import { activeSpeakerObserver } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\nimport { useObservableState } from './internal';\nimport { Room } from 'livekit-client';\n\n/** @public */\nexport type UseSpeakingParticipantsOptions = {\n room?: Room;\n};\n\n/**\n * The `useSpeakingParticipants` hook returns only the active speakers of all participants.\n *\n * @example\n * ```tsx\n * const activeSpeakers = useSpeakingParticipants();\n * ```\n * @public\n */\nexport function useSpeakingParticipants(options?: UseSpeakingParticipantsOptions) {\n const ensuredRoom = useEnsureRoom(options?.room);\n\n const speakerObserver = React.useMemo(() => activeSpeakerObserver(ensuredRoom), [ensuredRoom]);\n const activeSpeakers = useObservableState(speakerObserver, ensuredRoom.activeSpeakers);\n return activeSpeakers;\n}\n","import { sortParticipants } from '@livekit/components-core';\nimport type { Participant } from 'livekit-client';\nimport * as React from 'react';\nimport { useSpeakingParticipants } from './useSpeakingParticipants';\n\n/**\n * The `useSortedParticipants` hook returns the participants sorted by importance.\n * @public\n */\nexport function useSortedParticipants(participants: Array<Participant>) {\n const [sortedParticipants, setSortedParticipants] = React.useState(\n sortParticipants(participants),\n );\n const activeSpeakers = useSpeakingParticipants();\n\n React.useEffect(() => {\n setSortedParticipants(sortParticipants(participants));\n }, [activeSpeakers, participants]);\n return sortedParticipants;\n}\n","import { setupStartAudio } from '@livekit/components-core';\nimport type { Room } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport { useObservableState } from './internal';\n\n/** @alpha */\nexport interface UseStartAudioProps {\n room?: Room;\n props: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * In many browsers to start audio playback, the user must perform a user-initiated event such as clicking a button.\n * The `useStatAudio` hook returns an object with a boolean `canPlayAudio` flag\n * that indicates whether audio playback is allowed in the current context,\n * as well as a `startAudio` function that can be called in a button `onClick` callback to start audio playback in the current context.\n *\n * @see Autoplay policy on MDN web docs for more info: {@link https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Best_practices#autoplay_policy}\n * @alpha\n */\nexport function useStartAudio({ room, props }: UseStartAudioProps) {\n const roomEnsured = useEnsureRoom(room);\n const { className, roomAudioPlaybackAllowedObservable, handleStartAudioPlayback } = React.useMemo(\n () => setupStartAudio(),\n [],\n );\n const observable = React.useMemo(\n () => roomAudioPlaybackAllowedObservable(roomEnsured),\n [roomEnsured, roomAudioPlaybackAllowedObservable],\n );\n const { canPlayAudio } = useObservableState(observable, {\n canPlayAudio: roomEnsured.canPlaybackAudio,\n });\n\n const mergedProps = React.useMemo(\n () =>\n mergeProps(props, {\n className,\n onClick: () => {\n handleStartAudioPlayback(roomEnsured);\n },\n style: { display: canPlayAudio ? 'none' : 'block' },\n }),\n [props, className, canPlayAudio, handleStartAudioPlayback, roomEnsured],\n );\n\n return { mergedProps, canPlayAudio };\n}\n","import { setupStartVideo } from '@livekit/components-core';\nimport type { Room } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport { useObservableState } from './internal';\n\n/** @alpha */\nexport interface UseStartVideoProps {\n room?: Room;\n props: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * In some browsers to start video playback in low power mode, the user must perform a user-initiated event such as clicking a button.\n * The `useStartVideo` hook returns an object with a boolean `canPlayVideo` flag\n * that indicates whether video playback is allowed in the current context,\n * as well as a `startVideo` function that can be called in a button `onClick` callback to start video playback in the current context.\n *\n * @alpha\n */\nexport function useStartVideo({ room, props }: UseStartVideoProps) {\n const roomEnsured = useEnsureRoom(room);\n const { className, roomVideoPlaybackAllowedObservable, handleStartVideoPlayback } = React.useMemo(\n () => setupStartVideo(),\n [],\n );\n const observable = React.useMemo(\n () => roomVideoPlaybackAllowedObservable(roomEnsured),\n [roomEnsured, roomVideoPlaybackAllowedObservable],\n );\n const { canPlayVideo } = useObservableState(observable, {\n canPlayVideo: roomEnsured.canPlaybackVideo,\n });\n\n const mergedProps = React.useMemo(\n () =>\n mergeProps(props, {\n className,\n onClick: () => {\n handleStartVideoPlayback(roomEnsured);\n },\n style: { display: canPlayVideo ? 'none' : 'block' },\n }),\n [props, className, canPlayVideo, handleStartVideoPlayback, roomEnsured],\n );\n\n return { mergedProps, canPlayVideo };\n}\n","import * as React from 'react';\n\n/**\n * @alpha\n */\nexport type UseSwipeOptions = {\n minSwipeDistance?: number;\n onLeftSwipe?: () => void;\n onRightSwipe?: () => void;\n};\n\n/**\n * Simple implementation to detect horizontal swipe actions.\n * Accepts callbacks for on right and left swipes.\n * @example\n * ```tsx\n * <div\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n >\n * ```\n * @alpha\n */\nexport function useSwipe(element: React.RefObject<HTMLElement>, options: UseSwipeOptions = {}) {\n const touchStart = React.useRef<number | null>(null);\n const touchEnd = React.useRef<number | null>(null);\n\n // The required distance between touchStart and touchEnd to be detected as a swipe.\n const minSwipeDistance = options.minSwipeDistance ?? 50;\n\n const onTouchStart = (event: TouchEvent) => {\n touchEnd.current = null; // Otherwise the swipe is fired even with usual touch events.\n touchStart.current = event.targetTouches[0].clientX;\n };\n\n const onTouchMove = (event: TouchEvent) => {\n touchEnd.current = event.targetTouches[0].clientX;\n };\n\n const onTouchEnd = React.useCallback(() => {\n if (!touchStart.current || !touchEnd.current) {\n return;\n }\n const distance = touchStart.current - touchEnd.current;\n const isLeftSwipe = distance > minSwipeDistance;\n const isRightSwipe = distance < -minSwipeDistance;\n\n if (isLeftSwipe && options.onLeftSwipe) options.onLeftSwipe();\n if (isRightSwipe && options.onRightSwipe) options.onRightSwipe();\n }, [minSwipeDistance, options]);\n\n React.useEffect(() => {\n const elementCopy = element.current;\n if (elementCopy) {\n elementCopy.addEventListener('touchstart', onTouchStart, { passive: true });\n elementCopy.addEventListener('touchmove', onTouchMove, { passive: true });\n elementCopy.addEventListener('touchend', onTouchEnd, { passive: true });\n }\n return () => {\n if (elementCopy) {\n elementCopy.removeEventListener('touchstart', onTouchStart);\n elementCopy.removeEventListener('touchmove', onTouchMove);\n elementCopy.removeEventListener('touchend', onTouchEnd);\n }\n };\n }, [element, onTouchEnd]);\n}\n","import { setupChatToggle } from '@livekit/components-core';\nimport { useLayoutContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport * as React from 'react';\n\n/** @public */\nexport interface UseChatToggleProps {\n props: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * The `useChatToggle` hook provides state and functions for toggling the chat window.\n * @remarks\n * Depends on the `LayoutContext` to work properly.\n * @see {@link ChatToggle}, {@link Chat}\n * @public\n */\nexport function useChatToggle({ props }: UseChatToggleProps) {\n const { dispatch, state } = useLayoutContext().widget;\n const { className } = React.useMemo(() => setupChatToggle(), []);\n\n const mergedProps = React.useMemo(() => {\n return mergeProps(props, {\n className,\n onClick: () => {\n if (dispatch) dispatch({ msg: 'toggle_chat' });\n },\n 'aria-pressed': state?.showChat ? 'true' : 'false',\n 'data-lk-unread-msgs': state\n ? state.unreadMessages < 10\n ? state.unreadMessages.toFixed(0)\n : '9+'\n : '0',\n });\n }, [props, className, dispatch, state]);\n\n return { mergedProps };\n}\n","import { log } from '@livekit/components-core';\nimport * as React from 'react';\n\n/** @public */\nexport interface UserInfo {\n identity?: string;\n name?: string;\n metadata?: string;\n}\n\n/** @public */\nexport interface UseTokenOptions {\n userInfo?: UserInfo;\n}\n\n/**\n * The `useToken` hook fetches a token from the given token endpoint with the given user info.\n *\n * @example\n * ```tsx\n * const token = useToken(<token-endpoint>, roomName, { userInfo: { identity, name }});\n * ```\n * @public */\nexport function useToken(\n tokenEndpoint: string | undefined,\n roomName: string,\n options: UseTokenOptions = {},\n) {\n const [token, setToken] = React.useState<string | undefined>(undefined);\n\n React.useEffect(() => {\n if (tokenEndpoint === undefined) {\n throw Error('token endpoint needs to be defined');\n }\n if (options.userInfo?.identity === undefined) {\n return;\n }\n const tokenFetcher = async () => {\n log.debug('fetching token');\n const params = new URLSearchParams({ ...options.userInfo, roomName });\n const res = await fetch(`${tokenEndpoint}?${params.toString()}`);\n if (!res.ok) {\n log.error(\n `Could not fetch token. Server responded with status ${res.status}: ${res.statusText}`,\n );\n return;\n }\n const { accessToken } = await res.json();\n setToken(accessToken);\n };\n tokenFetcher();\n }, [tokenEndpoint, roomName, JSON.stringify(options)]);\n return token;\n}\n","import {\n type TrackReferenceOrPlaceholder,\n setupTrackMutedIndicator,\n getTrackReferenceId,\n} from '@livekit/components-core';\nimport * as React from 'react';\nimport { useEnsureTrackRef } from '../context';\nimport { useObservableState } from './internal';\n\ninterface TrackMutedIndicatorReturnType {\n isMuted: boolean;\n className: string;\n}\n\n/**\n * The `useTrackMutedIndicator` hook is used to implement the `TrackMutedIndicator` component\n * and returns the muted state of the given track.\n *\n * @example\n * ```tsx\n * const { isMuted } = useTrackMutedIndicator(trackRef);\n * ```\n * @public\n */\nexport function useTrackMutedIndicator(\n trackRef?: TrackReferenceOrPlaceholder,\n): TrackMutedIndicatorReturnType {\n const trackReference = useEnsureTrackRef(trackRef);\n\n const { className, mediaMutedObserver } = React.useMemo(\n () => setupTrackMutedIndicator(trackReference),\n [getTrackReferenceId(trackReference)],\n );\n\n const isMuted = useObservableState(\n mediaMutedObserver,\n !!(\n trackReference.publication?.isMuted ||\n trackReference.participant.getTrackPublication(trackReference.source)?.isMuted\n ),\n );\n\n return { isMuted, className };\n}\n","import type { ToggleSource } from '@livekit/components-core';\nimport { setupMediaToggle, setupManualToggle, log } from '@livekit/components-core';\nimport * as React from 'react';\nimport { type Room } from 'livekit-client';\nimport type { TrackToggleProps } from '../components';\nimport { useMaybeRoomContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport { useObservableState } from './internal';\n\n/** @public */\nexport interface UseTrackToggleProps<T extends ToggleSource>\n extends Omit<TrackToggleProps<T>, 'showIcon'> {\n room?: Room;\n}\n\n/**\n * The `useTrackToggle` hook is used to implement the `TrackToggle` component and returns state\n * and functionality of the given track.\n *\n * @example\n * ```tsx\n * const { buttonProps, enabled } = useTrackToggle(trackRef);\n * return <button {...buttonProps}>{enabled ? 'disable' : 'enable'}</button>;\n * ```\n * @public\n */\nexport function useTrackToggle<T extends ToggleSource>({\n source,\n onChange,\n initialState,\n captureOptions,\n publishOptions,\n onDeviceError,\n room,\n ...rest\n}: UseTrackToggleProps<T>) {\n const roomFromContext = useMaybeRoomContext();\n const roomFallback = React.useMemo(() => room ?? roomFromContext, [room, roomFromContext]);\n const track = roomFallback?.localParticipant?.getTrackPublication(source);\n /** `true` if a user interaction such as a click on the TrackToggle button has occurred. */\n const userInteractionRef = React.useRef(false);\n\n const { toggle, className, pendingObserver, enabledObserver } = React.useMemo(\n () =>\n roomFallback\n ? setupMediaToggle<T>(source, roomFallback, captureOptions, publishOptions, onDeviceError)\n : setupManualToggle(),\n [roomFallback, source, JSON.stringify(captureOptions), publishOptions],\n );\n\n const pending = useObservableState(pendingObserver, false);\n const enabled = useObservableState(enabledObserver, initialState ?? !!track?.isEnabled);\n\n React.useEffect(() => {\n onChange?.(enabled, userInteractionRef.current);\n userInteractionRef.current = false;\n }, [enabled, onChange]);\n\n React.useEffect(() => {\n if (initialState !== undefined) {\n log.debug('forcing initial toggle state', source, initialState);\n toggle(initialState);\n }\n // only execute once at the beginning\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const newProps = React.useMemo(() => mergeProps(rest, { className }), [rest, className]);\n\n const clickHandler: React.MouseEventHandler<HTMLButtonElement> = React.useCallback(\n (evt) => {\n userInteractionRef.current = true;\n toggle().catch(() => (userInteractionRef.current = false));\n rest.onClick?.(evt);\n },\n [rest, toggle],\n );\n\n return {\n toggle,\n enabled,\n pending,\n track,\n buttonProps: {\n ...newProps,\n 'aria-pressed': enabled,\n 'data-lk-source': source,\n 'data-lk-enabled': enabled,\n disabled: pending,\n onClick: clickHandler,\n } as React.ButtonHTMLAttributes<HTMLButtonElement>,\n };\n}\n","import type {\n SourcesArray,\n TrackReference,\n TrackReferenceOrPlaceholder,\n TrackSourceWithOptions,\n TrackReferencePlaceholder,\n} from '@livekit/components-core';\nimport {\n isSourcesWithOptions,\n isSourceWitOptions,\n log,\n trackReferencesObservable,\n} from '@livekit/components-core';\nimport type { Participant, Room, RoomEvent } from 'livekit-client';\nimport { Track } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\n\n/** @public */\nexport type UseTracksOptions = {\n updateOnlyOn?: RoomEvent[];\n onlySubscribed?: boolean;\n room?: Room;\n};\n\n/** @public */\nexport type UseTracksHookReturnType<T> = T extends Track.Source[]\n ? TrackReference[]\n : T extends TrackSourceWithOptions[]\n ? TrackReferenceOrPlaceholder[]\n : never;\n\n/**\n * The `useTracks` hook returns an array of `TrackReference` or `TrackReferenceOrPlaceholder` depending on the provided `sources` property.\n * If only subscribed tracks are desired, set the `onlySubscribed` property to `true`.\n * @example\n * ```ts\n * // Return all camera track publications.\n * const trackReferences: TrackReference[] = useTracks([Track.Source.Camera])\n * ```\n * @example\n * ```ts\n * // Return all subscribed camera tracks as well as placeholders for\n * // participants without a camera subscription.\n * const trackReferencesWithPlaceholders: TrackReferenceOrPlaceholder[] = useTracks([{source: Track.Source.Camera, withPlaceholder: true}])\n * ```\n * @public\n */\nexport function useTracks<T extends SourcesArray = Track.Source[]>(\n sources: T = [\n Track.Source.Camera,\n Track.Source.Microphone,\n Track.Source.ScreenShare,\n Track.Source.ScreenShareAudio,\n Track.Source.Unknown,\n ] as T,\n options: UseTracksOptions = {},\n): UseTracksHookReturnType<T> {\n const room = useEnsureRoom(options.room);\n const [trackReferences, setTrackReferences] = React.useState<TrackReference[]>([]);\n const [participants, setParticipants] = React.useState<Participant[]>([]);\n\n const sources_ = React.useMemo(() => {\n return sources.map((s) => (isSourceWitOptions(s) ? s.source : s));\n }, [JSON.stringify(sources)]);\n\n React.useEffect(() => {\n const subscription = trackReferencesObservable(room, sources_, {\n additionalRoomEvents: options.updateOnlyOn,\n onlySubscribed: options.onlySubscribed,\n }).subscribe(({ trackReferences, participants }) => {\n log.debug('setting track bundles', trackReferences, participants);\n setTrackReferences(trackReferences);\n setParticipants(participants);\n });\n return () => subscription.unsubscribe();\n }, [\n room,\n JSON.stringify(options.onlySubscribed),\n JSON.stringify(options.updateOnlyOn),\n JSON.stringify(sources),\n ]);\n\n const maybeTrackReferences = React.useMemo(() => {\n if (isSourcesWithOptions(sources)) {\n const requirePlaceholder = requiredPlaceholders(sources, participants);\n const trackReferencesWithPlaceholders: TrackReferenceOrPlaceholder[] =\n Array.from(trackReferences);\n participants.forEach((participant) => {\n if (requirePlaceholder.has(participant.identity)) {\n const sourcesToAddPlaceholder = requirePlaceholder.get(participant.identity) ?? [];\n sourcesToAddPlaceholder.forEach((placeholderSource) => {\n if (\n trackReferences.find(\n ({ participant: p, publication }) =>\n participant.identity === p.identity && publication.source === placeholderSource,\n )\n ) {\n return;\n }\n log.debug(\n `Add ${placeholderSource} placeholder for participant ${participant.identity}.`,\n );\n const placeholder: TrackReferencePlaceholder = {\n participant,\n source: placeholderSource,\n };\n trackReferencesWithPlaceholders.push(placeholder);\n });\n }\n });\n return trackReferencesWithPlaceholders;\n } else {\n return trackReferences;\n }\n }, [trackReferences, participants, sources]);\n\n return maybeTrackReferences as UseTracksHookReturnType<T>;\n}\n\nfunction difference<T>(setA: Set<T>, setB: Set<T>): Set<T> {\n const _difference = new Set(setA);\n for (const elem of setB) {\n _difference.delete(elem);\n }\n return _difference;\n}\n\nexport function requiredPlaceholders<T extends SourcesArray>(\n sources: T,\n participants: Participant[],\n): Map<Participant['identity'], Track.Source[]> {\n const placeholderMap = new Map<Participant['identity'], Track.Source[]>();\n if (isSourcesWithOptions(sources)) {\n const sourcesThatNeedPlaceholder = sources\n .filter((sourceWithOption) => sourceWithOption.withPlaceholder)\n .map((sourceWithOption) => sourceWithOption.source);\n\n participants.forEach((participant) => {\n const sourcesOfSubscribedTracks = participant\n .getTrackPublications()\n .map((pub) => pub.track?.source)\n .filter((trackSource): trackSource is Track.Source => trackSource !== undefined);\n const placeholderNeededForThisParticipant = Array.from(\n difference(new Set(sourcesThatNeedPlaceholder), new Set(sourcesOfSubscribedTracks)),\n );\n // If the participant needs placeholder add it to the placeholder map.\n if (placeholderNeededForThisParticipant.length > 0) {\n placeholderMap.set(participant.identity, placeholderNeededForThisParticipant);\n }\n });\n }\n return placeholderMap;\n}\n","import type { TrackReferenceOrPlaceholder, TrackSource } from '@livekit/components-core';\nimport { setupMediaTrack, getTrackByIdentifier } from '@livekit/components-core';\nimport * as React from 'react';\nimport { Track } from 'livekit-client';\n\n/**\n * @internal\n */\nexport function useTrackRefBySourceOrName(\n source: TrackSource<Track.Source>,\n): TrackReferenceOrPlaceholder {\n const [publication, setPublication] = React.useState(getTrackByIdentifier(source));\n\n const { trackObserver } = React.useMemo(() => {\n return setupMediaTrack(source);\n }, [source.participant.sid ?? source.participant.identity, source.source]);\n\n React.useEffect(() => {\n const subscription = trackObserver.subscribe((publication) => {\n setPublication(publication);\n });\n return () => subscription?.unsubscribe();\n }, [trackObserver]);\n\n return {\n participant: source.participant,\n source: source.source ?? Track.Source.Unknown,\n publication,\n };\n}\n","import type { Participant } from 'livekit-client';\nimport { useEnsureParticipant } from '../context';\nimport { useTrackRefBySourceOrName } from './useTrackRefBySourceOrName';\n\n/**\n * This function `useTrackByName` allows you to access a track by referencing its track name.\n * Inside the function, it ensures that the a valid `participant` reference is available by checking\n * for both a passed participant argument and, if not available, a valid participant context.\n *\n * @public\n */\nexport function useTrackByName(name: string, participant?: Participant) {\n const p = useEnsureParticipant(participant);\n return useTrackRefBySourceOrName({ name, participant: p });\n}\n","import * as React from 'react';\nimport type { ChatOptions, ReceivedChatMessage } from '@livekit/components-core';\nimport { setupChat } from '@livekit/components-core';\nimport { ConnectionState, Room } from 'livekit-client';\nimport { useEnsureRoom } from '../context';\nimport { useObservableState } from './internal/useObservableState';\nimport { useConnectionState } from './useConnectionStatus';\n\n/**\n * The `useChat` hook provides chat functionality for a LiveKit room.\n *\n * @remarks\n * Message history is not persisted and will be lost if the component is refreshed.\n * You may want to persist message history in the browser, a cache or a database.\n *\n * @returns An object containing:\n * - `chatMessages` - Array of received chat messages\n * - `send` - Function to send a new message\n * - `isSending` - Boolean indicating if a message is currently being sent\n *\n * @example\n * ```tsx\n * function ChatComponent() {\n * const { chatMessages, send, isSending } = useChat();\n *\n * return (\n * <div>\n * {chatMessages.map((msg) => (\n * <div key={msg.timestamp}>\n * {msg.from?.identity}: {msg.message}\n * </div>\n * ))}\n * <button disabled={isSending} onClick={() => send(\"Hello!\")}>\n * Send Message\n * </button>\n * </div>\n * );\n * }\n * ```\n * @public\n */\nexport function useChat(options?: ChatOptions & { room?: Room }) {\n const room = useEnsureRoom(options?.room);\n const connectionState = useConnectionState(room);\n const isDisconnected = React.useMemo(\n () => connectionState === ConnectionState.Disconnected,\n [connectionState],\n ); // used to reset the messages on room disconnect\n const setup = React.useMemo<ReturnType<typeof setupChat>>(\n () => setupChat(room, options),\n [room, options, isDisconnected],\n );\n const isSending = useObservableState(setup.isSendingObservable, false);\n const chatMessages = useObservableState<ReceivedChatMessage[]>(setup.messageObservable, []);\n\n return { send: setup.send, chatMessages, isSending };\n}\n","import type { LocalUserChoices } from '@livekit/components-core';\nimport { loadUserChoices, saveUserChoices } from '@livekit/components-core';\nimport * as React from 'react';\n\n/**\n * Options for the `usePersistentDeviceSettings` hook.\n * @alpha\n */\nexport interface UsePersistentUserChoicesOptions {\n /**\n * The default value to use if reading from local storage returns no results or fails.\n */\n defaults?: Partial<LocalUserChoices>;\n /**\n * Whether to prevent saving to persistent storage.\n * @defaultValue false\n */\n preventSave?: boolean;\n /**\n * Whether to prevent loading user choices from persistent storage and use `defaults` instead.\n * @defaultValue false\n */\n preventLoad?: boolean;\n}\n\n/**\n * A hook that provides access to user choices stored in local storage, such as\n * selected media devices and their current state (on or off), as well as the user name.\n * @alpha\n */\nexport function usePersistentUserChoices(options: UsePersistentUserChoicesOptions = {}) {\n const [userChoices, setSettings] = React.useState<LocalUserChoices>(\n loadUserChoices(options.defaults, options.preventLoad ?? false),\n );\n\n const saveAudioInputEnabled = React.useCallback((isEnabled: boolean) => {\n setSettings((prev) => ({ ...prev, audioEnabled: isEnabled }));\n }, []);\n const saveVideoInputEnabled = React.useCallback((isEnabled: boolean) => {\n setSettings((prev) => ({ ...prev, videoEnabled: isEnabled }));\n }, []);\n const saveAudioInputDeviceId = React.useCallback((deviceId: string) => {\n setSettings((prev) => ({ ...prev, audioDeviceId: deviceId }));\n }, []);\n const saveVideoInputDeviceId = React.useCallback((deviceId: string) => {\n setSettings((prev) => ({ ...prev, videoDeviceId: deviceId }));\n }, []);\n const saveUsername = React.useCallback((username: string) => {\n setSettings((prev) => ({ ...prev, username: username }));\n }, []);\n\n React.useEffect(() => {\n saveUserChoices(userChoices, options.preventSave ?? false);\n }, [userChoices, options.preventSave]);\n\n return {\n userChoices,\n saveAudioInputEnabled,\n saveVideoInputEnabled,\n saveAudioInputDeviceId,\n saveVideoInputDeviceId,\n saveUsername,\n };\n}\n","import * as React from 'react';\nimport { LocalParticipant } from 'livekit-client';\nimport type { Participant, Room } from 'livekit-client';\nimport { encryptionStatusObservable } from '@livekit/components-core';\nimport { useEnsureParticipant, useEnsureRoom } from '../context';\nimport { useObservableState } from './internal';\n\n/**\n * @alpha\n */\nexport interface UseIsEncryptedOptions {\n room?: Room;\n}\n\n/**\n * @alpha\n */\nexport function useIsEncrypted(participant?: Participant, options: UseIsEncryptedOptions = {}) {\n const p = useEnsureParticipant(participant);\n\n const room = useEnsureRoom(options.room);\n\n const observer = React.useMemo(() => encryptionStatusObservable(room, p), [room, p]);\n const isEncrypted = useObservableState(\n observer,\n p.isLocal ? (p as LocalParticipant).isE2EEEnabled : !!p?.isEncrypted,\n );\n return isEncrypted;\n}\n","import * as React from 'react';\nimport type { LocalAudioTrack, RemoteAudioTrack, AudioAnalyserOptions } from 'livekit-client';\nimport { Track, createAudioAnalyser } from 'livekit-client';\nimport {\n type TrackReference,\n isTrackReference,\n type TrackReferenceOrPlaceholder,\n} from '@livekit/components-core';\n\n/**\n * @alpha\n * Hook for tracking the volume of an audio track using the Web Audio API.\n */\nexport function useTrackVolume(\n trackOrTrackReference?: LocalAudioTrack | RemoteAudioTrack | TrackReference,\n options: AudioAnalyserOptions = { fftSize: 32, smoothingTimeConstant: 0 },\n) {\n const track = isTrackReference(trackOrTrackReference)\n ? <LocalAudioTrack | RemoteAudioTrack | undefined>trackOrTrackReference.publication.track\n : trackOrTrackReference;\n const [volume, setVolume] = React.useState(0);\n React.useEffect(() => {\n if (!track || !track.mediaStream) {\n return;\n }\n\n const { cleanup, analyser } = createAudioAnalyser(track, options);\n\n const bufferLength = analyser.frequencyBinCount;\n const dataArray = new Uint8Array(bufferLength);\n\n const updateVolume = () => {\n analyser.getByteFrequencyData(dataArray);\n let sum = 0;\n for (let i = 0; i < dataArray.length; i++) {\n const a = dataArray[i];\n sum += a * a;\n }\n setVolume(Math.sqrt(sum / dataArray.length) / 255);\n };\n\n const interval = setInterval(updateVolume, 1000 / 30);\n\n return () => {\n cleanup();\n clearInterval(interval);\n };\n }, [track, track?.mediaStream, JSON.stringify(options)]);\n\n return volume;\n}\n\nconst normalizeFrequencies = (frequencies: Float32Array) => {\n const normalizeDb = (value: number) => {\n const minDb = -100;\n const maxDb = -10;\n let db = 1 - (Math.max(minDb, Math.min(maxDb, value)) * -1) / 100;\n db = Math.sqrt(db);\n\n return db;\n };\n\n // Normalize all frequency values\n return frequencies.map((value) => {\n if (value === -Infinity) {\n return 0;\n }\n return normalizeDb(value);\n });\n};\n\n/**\n * Interface for configuring options for the useMultibandTrackVolume hook.\n * @alpha\n */\nexport interface MultiBandTrackVolumeOptions {\n bands?: number;\n /**\n * cut off of frequency bins on the lower end\n * Note: this is not a frequency measure, but in relation to analyserOptions.fftSize,\n */\n loPass?: number;\n /**\n * cut off of frequency bins on the higher end\n * Note: this is not a frequency measure, but in relation to analyserOptions.fftSize,\n */\n hiPass?: number;\n /**\n * update should run every x ms\n */\n updateInterval?: number;\n analyserOptions?: AnalyserOptions;\n}\n\nconst multibandDefaults = {\n bands: 5,\n loPass: 100,\n hiPass: 600,\n updateInterval: 32,\n analyserOptions: { fftSize: 2048 },\n} as const satisfies MultiBandTrackVolumeOptions;\n\n/**\n * Hook for tracking the volume of an audio track across multiple frequency bands using the Web Audio API.\n * @alpha\n */\nexport function useMultibandTrackVolume(\n trackOrTrackReference?: LocalAudioTrack | RemoteAudioTrack | TrackReferenceOrPlaceholder,\n options: MultiBandTrackVolumeOptions = {},\n) {\n const track =\n trackOrTrackReference instanceof Track\n ? trackOrTrackReference\n : <LocalAudioTrack | RemoteAudioTrack | undefined>trackOrTrackReference?.publication?.track;\n const opts = { ...multibandDefaults, ...options };\n const [frequencyBands, setFrequencyBands] = React.useState<Array<number>>(\n new Array(opts.bands).fill(0),\n );\n\n React.useEffect(() => {\n if (!track || !track?.mediaStream) {\n setFrequencyBands((val) => val.slice().fill(0));\n return;\n }\n const { analyser, cleanup } = createAudioAnalyser(track, opts.analyserOptions);\n\n const bufferLength = analyser.frequencyBinCount;\n const dataArray = new Float32Array(bufferLength);\n\n const updateVolume = () => {\n analyser.getFloatFrequencyData(dataArray);\n let frequencies: Float32Array = new Float32Array(dataArray.length);\n for (let i = 0; i < dataArray.length; i++) {\n frequencies[i] = dataArray[i];\n }\n frequencies = frequencies.slice(opts.loPass, opts.hiPass);\n\n const normalizedFrequencies = normalizeFrequencies(frequencies); // is this needed ?\n const totalBins = normalizedFrequencies.length;\n const chunks: Array<number> = [];\n for (let i = 0; i < opts.bands; i++) {\n // Use proportional distribution to evenly divide bins across bands\n const startIndex = Math.floor((i * totalBins) / opts.bands);\n const endIndex = Math.floor(((i + 1) * totalBins) / opts.bands);\n const chunk = normalizedFrequencies.slice(startIndex, endIndex);\n const chunkLength = chunk.length;\n if (chunkLength === 0) {\n chunks.push(0);\n } else {\n const summedVolumes = chunk.reduce((acc, val) => (acc += val), 0);\n chunks.push(summedVolumes / chunkLength);\n }\n }\n\n setFrequencyBands(chunks);\n };\n\n const interval = setInterval(updateVolume, opts.updateInterval);\n\n return () => {\n cleanup();\n clearInterval(interval);\n };\n }, [track, track?.mediaStream, JSON.stringify(options)]);\n\n return frequencyBands;\n}\n\n/**\n * @alpha\n */\nexport interface AudioWaveformOptions {\n barCount?: number;\n volMultiplier?: number;\n updateInterval?: number;\n}\n\nconst waveformDefaults = {\n barCount: 120,\n volMultiplier: 5,\n updateInterval: 20,\n} as const satisfies AudioWaveformOptions;\n\n/**\n * @alpha\n */\nexport function useAudioWaveform(\n trackOrTrackReference?: LocalAudioTrack | RemoteAudioTrack | TrackReferenceOrPlaceholder,\n options: AudioWaveformOptions = {},\n) {\n const track =\n trackOrTrackReference instanceof Track\n ? trackOrTrackReference\n : <LocalAudioTrack | RemoteAudioTrack | undefined>trackOrTrackReference?.publication?.track;\n const opts = { ...waveformDefaults, ...options };\n\n const aggregateWave = React.useRef(new Float32Array());\n const timeRef = React.useRef(performance.now());\n const updates = React.useRef(0);\n const [bars, setBars] = React.useState<number[]>([]);\n\n const onUpdate = React.useCallback((wave: Float32Array) => {\n setBars(\n Array.from(\n filterData(wave, opts.barCount).map((v) => Math.sqrt(v) * opts.volMultiplier),\n // wave.slice(0, opts.barCount).map((v) => sigmoid(v * opts.volMultiplier, 0.08, 0.2)),\n ),\n );\n }, []);\n\n React.useEffect(() => {\n if (!track || !track?.mediaStream) {\n return;\n }\n const { analyser, cleanup } = createAudioAnalyser(track, {\n fftSize: getFFTSizeValue(opts.barCount),\n });\n\n const bufferLength = getFFTSizeValue(opts.barCount);\n const dataArray = new Float32Array(bufferLength);\n\n const update = () => {\n updateWaveform = requestAnimationFrame(update);\n analyser.getFloatTimeDomainData(dataArray);\n aggregateWave.current.map((v, i) => v + dataArray[i]);\n updates.current += 1;\n\n if (performance.now() - timeRef.current >= opts.updateInterval) {\n const newData = dataArray.map((v) => v / updates.current);\n onUpdate(newData);\n timeRef.current = performance.now();\n updates.current = 0;\n }\n };\n\n let updateWaveform = requestAnimationFrame(update);\n\n return () => {\n cleanup();\n cancelAnimationFrame(updateWaveform);\n };\n }, [track, track?.mediaStream, JSON.stringify(options), onUpdate]);\n\n return {\n bars,\n };\n}\n\nfunction getFFTSizeValue(x: number) {\n if (x < 32) return 32;\n else return pow2ceil(x);\n}\n\n// function sigmoid(x: number, k = 2, s = 0) {\n// return 1 / (1 + Math.exp(-(x - s) / k));\n// }\n\nfunction pow2ceil(v: number) {\n let p = 2;\n while ((v >>= 1)) {\n p <<= 1;\n }\n return p;\n}\n\nfunction filterData(audioData: Float32Array, numSamples: number) {\n const blockSize = Math.floor(audioData.length / numSamples); // the number of samples in each subdivision\n const filteredData = new Float32Array(numSamples);\n for (let i = 0; i < numSamples; i++) {\n const blockStart = blockSize * i; // the location of the first sample in the block\n let sum = 0;\n for (let j = 0; j < blockSize; j++) {\n sum = sum + Math.abs(audioData[blockStart + j]); // find the sum of all the samples in the block\n }\n filteredData[i] = sum / blockSize; // divide the sum by the block size to get the average\n }\n return filteredData;\n}\n\n// function normalizeData(audioData: Float32Array) {\n// const multiplier = Math.pow(Math.max(...audioData), -1);\n// return audioData.map((n) => n * multiplier);\n// }\n","import * as React from 'react';\nimport type { TrackReference } from '@livekit/components-core';\nimport { participantTracksObservable } from '@livekit/components-core';\nimport { useObservableState } from './internal';\nimport type { Room, Track } from 'livekit-client';\nimport { useMaybeParticipantContext } from '../context';\nimport { useParticipants } from './useParticipants';\n\ntype UseParticipantTracksOptions = {\n participantIdentity?: string;\n room?: Room;\n};\n\n/**\n * `useParticipantTracks` is a custom React that allows you to get tracks of a specific participant only, by specifiying the participant's identity.\n * If the participant identity is not passed the hook will try to get the participant from a participant context.\n * @public\n */\nexport function useParticipantTracks<TrackSource extends Track.Source>(\n sources: Array<TrackSource>,\n optionsOrParticipantIdentity:\n | UseParticipantTracksOptions\n | UseParticipantTracksOptions['participantIdentity'] = {},\n): Array<TrackReference> {\n let participantIdentity: UseParticipantTracksOptions['participantIdentity'];\n let room: UseParticipantTracksOptions['room'];\n if (typeof optionsOrParticipantIdentity === 'string') {\n participantIdentity = optionsOrParticipantIdentity;\n } else {\n participantIdentity = optionsOrParticipantIdentity?.participantIdentity;\n room = optionsOrParticipantIdentity?.room;\n }\n\n const participantContext = useMaybeParticipantContext();\n const participants = useParticipants({ room, updateOnlyOn: [] });\n\n const p = React.useMemo(() => {\n if (participantIdentity) {\n return participants.find((p) => p.identity === participantIdentity);\n }\n return participantContext;\n }, [participantIdentity, participants, participantContext]);\n\n const observable = React.useMemo(() => {\n if (!p) {\n return undefined;\n }\n return participantTracksObservable(p, { sources });\n }, [p, JSON.stringify(sources)]);\n\n const trackRefs = useObservableState(observable, [] as Array<TrackReference>);\n\n return trackRefs;\n}\n","import * as React from 'react';\nimport { type TrackReferenceOrPlaceholder, trackSyncTimeObserver } from '@livekit/components-core';\nimport { useObservableState } from './internal';\n\n/**\n * @internal\n * @deprecated this is an internal hook that's only used by deprecated APIs\n */\nexport function useTrackSyncTime(ref: TrackReferenceOrPlaceholder | undefined) {\n const observable = React.useMemo(\n () => (ref?.publication?.track ? trackSyncTimeObserver(ref?.publication.track) : undefined),\n [ref?.publication?.track],\n );\n return useObservableState(observable, {\n timestamp: Date.now(),\n rtpTimestamp: ref?.publication?.track?.rtpTimestamp,\n });\n}\n","import {\n type ReceivedTranscriptionSegment,\n addMediaTimestampToTranscription as addTimestampsToTranscription,\n dedupeSegments,\n // getActiveTranscriptionSegments,\n getTrackReferenceId,\n trackTranscriptionObserver,\n type TrackReferenceOrPlaceholder,\n // didActiveSegmentsChange,\n} from '@livekit/components-core';\nimport type { TranscriptionSegment } from 'livekit-client';\nimport * as React from 'react';\nimport { useTrackSyncTime } from './useTrackSyncTime';\n\n/**\n * @alpha\n * @deprecated Use useTranscription instead\n */\nexport interface TrackTranscriptionOptions {\n /**\n * how many transcription segments should be buffered in state\n * @defaultValue 100\n */\n bufferSize?: number;\n /**\n * optional callback for retrieving newly incoming transcriptions only\n */\n onTranscription?: (newSegments: TranscriptionSegment[]) => void;\n /** amount of time (in ms) that the segment is considered `active` past its original segment duration, defaults to 2_000 */\n // maxAge?: number;\n}\n\nconst TRACK_TRANSCRIPTION_DEFAULTS = {\n bufferSize: 100,\n // maxAge: 2_000,\n} as const satisfies TrackTranscriptionOptions;\n\n/**\n * @returns An object consisting of `segments` with maximum length of opts.bufferSize\n * @alpha\n * @deprecated Use useTranscription instead\n */\nexport function useTrackTranscription(\n trackRef: TrackReferenceOrPlaceholder | undefined,\n options?: TrackTranscriptionOptions,\n) {\n const opts = { ...TRACK_TRANSCRIPTION_DEFAULTS, ...options };\n const [segments, setSegments] = React.useState<Array<ReceivedTranscriptionSegment>>([]);\n\n const syncTimestamps = useTrackSyncTime(trackRef);\n const handleSegmentMessage = (newSegments: TranscriptionSegment[]) => {\n opts.onTranscription?.(newSegments);\n setSegments((prevSegments) =>\n dedupeSegments(\n prevSegments,\n // when first receiving a segment, add the current media timestamp to it\n newSegments.map((s) => addTimestampsToTranscription(s, syncTimestamps)),\n opts.bufferSize,\n ),\n );\n };\n React.useEffect(() => {\n if (!trackRef?.publication) {\n return;\n }\n const subscription = trackTranscriptionObserver(trackRef.publication).subscribe((evt) => {\n handleSegmentMessage(...evt);\n });\n return () => {\n subscription.unsubscribe();\n };\n }, [trackRef && getTrackReferenceId(trackRef), handleSegmentMessage]);\n\n return { segments };\n}\n","import { participantAttributesObserver } from '@livekit/components-core';\nimport type { Participant } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureParticipant, useMaybeParticipantContext } from '../context';\nimport { useObservableState } from './internal';\n\n/**\n * The `useParticipantAttributes` hook returns the attributes of a given participant and allows to set them.\n * It requires a `Participant` object passed as property or via the `ParticipantContext`.\n *\n * @example\n * ```tsx\n * const { attributes } = useParticipantAttributes({ participant });\n * ```\n * @public\n */\nexport interface UseParticipantAttributesOptions {\n participant?: Participant;\n}\n\n/** @public */\nexport function useParticipantAttributes(props: UseParticipantAttributesOptions = {}) {\n const participantContext = useMaybeParticipantContext();\n const p = props.participant ?? participantContext;\n const attributeObserver = React.useMemo(\n // weird typescript constraint\n () => (p ? participantAttributesObserver(p) : participantAttributesObserver(p)),\n [p],\n );\n const attributeState = useObservableState(attributeObserver, {\n attributes: p?.attributes,\n });\n\n return attributeState;\n}\n\n/**\n * The `useParticipantAttribute` hook returns the latest value of a given attribute key of a participant.\n * It requires a `Participant` object passed as property in the `UseParticipantAttributesOptions` or via the `ParticipantContext`.\n *\n * @example\n * ```tsx\n * const myAttributeValue = useParticipantAttribute('targetAttributeName');\n * ```\n * @public\n */\nexport function useParticipantAttribute(\n attributeKey: string,\n options: UseParticipantAttributesOptions = {},\n) {\n const p = useEnsureParticipant(options.participant);\n const [attribute, setAttribute] = React.useState(p.attributes[attributeKey]);\n\n React.useEffect(() => {\n if (!p) {\n return;\n }\n const subscription = participantAttributesObserver(p).subscribe((val) => {\n if (val.changed[attributeKey] !== undefined) {\n setAttribute(val.attributes[attributeKey]);\n }\n });\n return () => {\n subscription.unsubscribe();\n };\n }, [p, attributeKey]);\n\n return attribute;\n}\n","import * as React from 'react';\nimport { ConnectionState, ParticipantKind, Track } from 'livekit-client';\nimport type { RemoteParticipant } from 'livekit-client';\nimport {\n ParticipantAgentAttributes,\n type ReceivedTranscriptionSegment,\n type TrackReference,\n} from '@livekit/components-core';\nimport { useRemoteParticipants } from './useRemoteParticipants';\nimport { useParticipantTracks } from './useParticipantTracks';\nimport { useTrackTranscription } from './useTrackTranscription';\nimport { useConnectionState } from './useConnectionStatus';\nimport { useParticipantAttributes } from './useParticipantAttributes';\nimport { AgentState } from './useAgent';\n\n/**\n * @beta\n */\nexport interface VoiceAssistant {\n /**\n * The agent participant.\n */\n agent: RemoteParticipant | undefined;\n /**\n * The current state of the agent.\n */\n state: AgentState;\n /**\n * The microphone track published by the agent or associated avatar worker (if any).\n */\n audioTrack: TrackReference | undefined;\n /**\n * The camera track published by the agent or associated avatar worker (if any).\n */\n videoTrack: TrackReference | undefined;\n /**\n * The transcriptions of the agent's microphone track (if any).\n */\n agentTranscriptions: ReceivedTranscriptionSegment[];\n /**\n * The agent's participant attributes.\n */\n agentAttributes: RemoteParticipant['attributes'] | undefined;\n}\n\nconst state_attribute = ParticipantAgentAttributes.AgentState;\n\n/**\n * This hook looks for the first agent-participant in the room.\n * @remarks This hook requires an agent running with livekit-agents \\>= 0.9.0\n * @example\n * ```tsx\n * const { state, audioTrack, agentTranscriptions, agentAttributes } = useVoiceAssistant();\n * ```\n * @beta\n */\nexport function useVoiceAssistant(): VoiceAssistant {\n const remoteParticipants = useRemoteParticipants();\n const agent = remoteParticipants.find(\n (p) =>\n p.kind === ParticipantKind.AGENT &&\n !(ParticipantAgentAttributes.PublishOnBehalf in p.attributes),\n );\n const worker = remoteParticipants.find(\n (p) =>\n p.kind === ParticipantKind.AGENT &&\n p.attributes[ParticipantAgentAttributes.PublishOnBehalf] === agent?.identity,\n );\n const agentTracks = useParticipantTracks(\n [Track.Source.Microphone, Track.Source.Camera],\n agent?.identity,\n );\n const workerTracks = useParticipantTracks(\n [Track.Source.Microphone, Track.Source.Camera],\n worker?.identity,\n );\n const audioTrack =\n agentTracks.find((t) => t.source === Track.Source.Microphone) ??\n workerTracks.find((t) => t.source === Track.Source.Microphone);\n const videoTrack =\n agentTracks.find((t) => t.source === Track.Source.Camera) ??\n workerTracks.find((t) => t.source === Track.Source.Camera);\n const { segments: agentTranscriptions } = useTrackTranscription(audioTrack);\n const connectionState = useConnectionState();\n const { attributes } = useParticipantAttributes({ participant: agent });\n\n const state: AgentState = React.useMemo(() => {\n if (connectionState === ConnectionState.Disconnected) {\n return 'disconnected';\n } else if (\n connectionState === ConnectionState.Connecting ||\n !agent ||\n !attributes?.[state_attribute]\n ) {\n return 'connecting';\n } else {\n return attributes[state_attribute] as AgentState;\n }\n }, [attributes, agent, connectionState]);\n\n return {\n agent,\n state,\n audioTrack,\n videoTrack,\n agentTranscriptions,\n agentAttributes: attributes,\n };\n}\n","import { recordingStatusObservable } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\nimport { useObservableState } from './internal';\nimport { useConnectionState } from './useConnectionStatus';\nimport type { Room } from 'livekit-client';\n\n/**\n * The `useIsRecording` hook returns a `boolean` that indicates if the room is currently being recorded.\n * @example\n * ```tsx\n * const isRecording = useIsRecording();\n * ```\n * @public\n */\nexport function useIsRecording(room?: Room) {\n const r = useEnsureRoom(room);\n const connectionState = useConnectionState(r);\n const observable = React.useMemo(() => recordingStatusObservable(r), [r, connectionState]);\n const isRecording = useObservableState(observable, r.isRecording);\n\n return isRecording;\n}\n","import * as React from 'react';\nimport { ConnectionState, Room } from 'livekit-client';\nimport { setupTextStream, type TextStreamData } from '@livekit/components-core';\nimport { useEnsureRoom } from '../context';\nimport { useConnectionState } from './useConnectionStatus';\nimport { useObservableState } from './internal';\n\n/** @beta */\nexport type UseTextStreamOptions = {\n room?: Room;\n};\n\n/**\n * @beta\n * @param topic - the topic to listen to\n * @returns an array of TextStreamData that holds the text, participantInfo, and streamInfo\n * @example\n * ```tsx\n * const { textStreams } = useTextStream('my-topic');\n * return <div>{textStreams.map((textStream) => textStream.text)}</div>;\n * ```\n */\nexport function useTextStream(topic: string, options?: UseTextStreamOptions) {\n const room = useEnsureRoom(options?.room);\n\n const connectionState = useConnectionState(room);\n const isDisconnected = connectionState === ConnectionState.Disconnected;\n\n const textStreamData = React.useMemo(() => setupTextStream(room, topic), [room, topic]);\n const textStreamObservable = isDisconnected ? undefined : textStreamData;\n\n const textStreams = useObservableState<TextStreamData[]>(textStreamObservable, []);\n\n return { textStreams };\n}\n","import * as React from 'react';\nimport { useTextStream } from './useTextStream';\nimport { DataTopic, ParticipantAgentAttributes } from '@livekit/components-core';\nimport { Room } from 'livekit-client';\n\n/**\n * @beta\n */\nexport interface UseTranscriptionsOptions {\n room?: Room;\n participantIdentities?: string[];\n trackSids?: string[];\n}\n\n/**\n * @beta\n * useTranscriptions is a hook that returns the transcriptions for the given participant identities and track sids,\n * if no options are provided, it will return all transcriptions\n * @example\n * ```tsx\n * const transcriptions = useTranscriptions();\n * return <div>{transcriptions.map((transcription) => transcription.text)}</div>;\n * ```\n */\nexport function useTranscriptions(opts?: UseTranscriptionsOptions) {\n const { participantIdentities, trackSids } = opts ?? {};\n const { textStreams } = useTextStream(DataTopic.TRANSCRIPTION, { room: opts?.room });\n\n const filteredMessages = React.useMemo(\n () =>\n textStreams\n .filter((stream) =>\n participantIdentities\n ? participantIdentities.includes(stream.participantInfo.identity)\n : true,\n )\n .filter((stream) =>\n trackSids\n ? trackSids.includes(\n stream.streamInfo.attributes?.[ParticipantAgentAttributes.TranscribedTrackId] ?? '',\n )\n : true,\n ),\n [textStreams, participantIdentities, trackSids],\n );\n\n return filteredMessages;\n}\n","import { Mutex, type Room } from 'livekit-client';\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { log } from '@livekit/components-core';\n\nconst CONNECT_DISCONNECT_WARNING_THRESHOLD_QUANTITY = 2;\nconst CONNECT_DISCONNECT_WARNING_THRESHOLD_MS = 400;\n\nconst ROOM_CHANGE_WARNING_THRESHOLD_QUANTITY = 3;\nconst ROOM_CHANGE_WARNING_THRESHOLD_MS = 1000;\n\n/** @public */\nexport type UseSequentialRoomConnectDisconnectResults<R extends Room | undefined> = {\n connect: typeof Room.prototype.connect & (R extends undefined ? null : unknown);\n disconnect: typeof Room.prototype.disconnect & (R extends undefined ? null : unknown);\n};\n\n/**\n * When calling room.disconnect() as part of a React useEffect cleanup function, it is possible for\n * a room.connect(...) in the effect body to start running while the room.disconnect() is still\n * running. This hook sequentializes these two operations, so they always happen in order and\n * never overlap.\n *\n * @example\n * ```ts\n * const { connect, disconnect } = useSequentialRoomConnectDisconnect(room);\n *\n * // Connecting to a room:\n * useEffect(() => {\n * connect();\n * return () => disconnect();\n * }, [connect, disconnect]);\n * ```\n *\n * @public\n */\nexport function useSequentialRoomConnectDisconnect<R extends Room | undefined>(\n room: R,\n): UseSequentialRoomConnectDisconnectResults<R> {\n const connectDisconnectQueueRef = useRef<\n Array<\n | {\n type: 'connect';\n room: Room;\n args: Parameters<typeof Room.prototype.connect>;\n resolve: (value: Awaited<ReturnType<typeof Room.prototype.connect>>) => void;\n reject: (err: Error) => void;\n }\n | {\n type: 'disconnect';\n room: Room;\n args: Parameters<typeof Room.prototype.disconnect>;\n resolve: (value: Awaited<ReturnType<typeof Room.prototype.disconnect>>) => void;\n reject: (err: Error) => void;\n }\n >\n >([]);\n\n // Process room connection / disconnection events and execute them in series\n // The main queue is a ref, so one invocation of this function can continue to process newly added\n // events\n const processConnectsAndDisconnectsLock = useMemo(() => new Mutex(), []);\n const processConnectsAndDisconnects = useCallback(async () => {\n return processConnectsAndDisconnectsLock.lock().then(async (unlock) => {\n while (true) {\n const message = connectDisconnectQueueRef.current.pop();\n if (!message) {\n unlock();\n break;\n }\n\n switch (message.type) {\n case 'connect':\n await message.room\n .connect(...message.args)\n .then(message.resolve)\n .catch(message.reject);\n break;\n case 'disconnect':\n await message.room\n .disconnect(...message.args)\n .then(message.resolve)\n .catch(message.reject);\n break;\n }\n }\n });\n }, []);\n\n const roomChangedTimesRef = useRef<Array<Date>>([]);\n const checkRoomThreshold = useCallback((now: Date) => {\n let roomChangesInThreshold = 0;\n roomChangedTimesRef.current = roomChangedTimesRef.current.filter((i) => {\n const isWithinThreshold = now.getTime() - i.getTime() < ROOM_CHANGE_WARNING_THRESHOLD_MS;\n if (isWithinThreshold) {\n roomChangesInThreshold += 1;\n }\n return isWithinThreshold;\n });\n\n if (roomChangesInThreshold > ROOM_CHANGE_WARNING_THRESHOLD_QUANTITY) {\n log.warn(\n `useSequentialRoomConnectDisconnect: room changed reference rapidly (over ${ROOM_CHANGE_WARNING_THRESHOLD_QUANTITY}x in ${ROOM_CHANGE_WARNING_THRESHOLD_MS}ms). This is not recommended.`,\n );\n }\n }, []);\n\n // When the room changes, clear any pending connect / disconnect calls and log when it happened\n useEffect(() => {\n connectDisconnectQueueRef.current = [];\n\n const now = new Date();\n roomChangedTimesRef.current.push(now);\n checkRoomThreshold(now);\n }, [room, checkRoomThreshold]);\n\n const connectDisconnectEnqueueTimes = useRef<Array<Date>>([]);\n const checkConnectDisconnectThreshold = useCallback((now: Date) => {\n let connectDisconnectsInThreshold = 0;\n connectDisconnectEnqueueTimes.current = connectDisconnectEnqueueTimes.current.filter((i) => {\n const isWithinThreshold =\n now.getTime() - i.getTime() < CONNECT_DISCONNECT_WARNING_THRESHOLD_MS;\n if (isWithinThreshold) {\n connectDisconnectsInThreshold += 1;\n }\n return isWithinThreshold;\n });\n\n if (connectDisconnectsInThreshold > CONNECT_DISCONNECT_WARNING_THRESHOLD_QUANTITY) {\n log.warn(\n `useSequentialRoomConnectDisconnect: room connect / disconnect occurring in rapid sequence (over ${CONNECT_DISCONNECT_WARNING_THRESHOLD_QUANTITY}x in ${CONNECT_DISCONNECT_WARNING_THRESHOLD_MS}ms). This is not recommended and may be the sign of a bug like a useEffect dependency changing every render.`,\n );\n }\n }, []);\n\n const connect = useCallback(\n async (...args: Parameters<typeof Room.prototype.connect>) => {\n return new Promise((resolve, reject) => {\n if (!room) {\n throw new Error('Called connect(), but room was unset');\n }\n const now = new Date();\n checkConnectDisconnectThreshold(now);\n connectDisconnectQueueRef.current.push({ type: 'connect', room, args, resolve, reject });\n connectDisconnectEnqueueTimes.current.push(now);\n processConnectsAndDisconnects();\n });\n },\n [room, checkConnectDisconnectThreshold, processConnectsAndDisconnects],\n );\n\n const disconnect = useCallback(\n async (...args: Parameters<typeof Room.prototype.disconnect>) => {\n return new Promise((resolve, reject) => {\n if (!room) {\n throw new Error('Called discconnect(), but room was unset');\n }\n const now = new Date();\n checkConnectDisconnectThreshold(now);\n connectDisconnectQueueRef.current.push({ type: 'disconnect', room, args, resolve, reject });\n connectDisconnectEnqueueTimes.current.push(now);\n processConnectsAndDisconnects();\n });\n },\n [room, checkConnectDisconnectThreshold, processConnectsAndDisconnects],\n );\n\n return {\n connect: room ? connect : null,\n disconnect: room ? disconnect : null,\n } as UseSequentialRoomConnectDisconnectResults<R>;\n}\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","import {\n ConnectionState,\n LocalTrackPublication,\n ParticipantEvent,\n ParticipantKind,\n RemoteParticipant,\n RoomEvent,\n Track,\n Participant,\n} from 'livekit-client';\nimport type TypedEventEmitter from 'typed-emitter';\nimport { EventEmitter } from 'events';\nimport * as React from 'react';\nimport { ParticipantAgentAttributes, TrackReference } from '@livekit/components-core';\n\nimport { useParticipantTracks } from './useParticipantTracks';\nimport { useRemoteParticipants } from './useRemoteParticipants';\nimport { UseSessionReturn } from './useSession';\nimport { useMaybeSessionContext } from '../context';\nimport { useParticipantInfo } from './useParticipantInfo';\n\n// FIXME: make this 10 seconds once room dispatch booting info is discoverable\nconst DEFAULT_AGENT_CONNECT_TIMEOUT_MILLISECONDS = 20_000;\n\n/** @see https://github.com/livekit/agents/blob/65170238db197f62f479eb7aaef1c0e18bfad6e7/livekit-agents/livekit/agents/voice/events.py#L97 */\ntype AgentSdkStates = 'initializing' | 'idle' | 'listening' | 'thinking' | 'speaking';\n\n/**\n * State representing the current status of the agent, whether it is ready for speach, etc\n *\n * For most agents (which have the preconnect audio buffer feature enabled), this is the lifecycle:\n * connecting ➡️ pre-connect-buffering ➡️ initializing/listening/thinking/speaking\n *\n * For agents without the preconnect audio feature enabled:\n * connecting ➡️ initializing ➡️ idle/listening/thinking/speaking\n *\n * If an agent fails to connect:\n * connecting ➡️ pre-connect-buffering/initializing ➡️ failed\n *\n * Legacy useVoiceAssistant hook:\n * disconnected ➡️ connecting ➡️ initializing ➡️ listening/thinking/speaking\n *\n * @beta\n * */\nexport type AgentState =\n | 'disconnected'\n | 'connecting'\n | 'pre-connect-buffering'\n | 'failed'\n | AgentSdkStates;\n\n/** @beta */\nexport enum AgentEvent {\n CameraChanged = 'cameraChanged',\n MicrophoneChanged = 'microphoneChanged',\n StateChanged = 'stateChanged',\n}\n\n/** @beta */\nexport type AgentCallbacks = {\n [AgentEvent.CameraChanged]: (newTrack: TrackReference | undefined) => void;\n [AgentEvent.MicrophoneChanged]: (newTrack: TrackReference | undefined) => void;\n [AgentEvent.StateChanged]: (newAgentState: AgentState) => void;\n};\n\ntype AgentStateCommon = {\n // FIXME: maybe add some sort of schema to this?\n attributes: Participant['attributes'];\n\n internal: {\n emitter: TypedEventEmitter<AgentCallbacks>;\n\n agentParticipant: RemoteParticipant | null;\n workerParticipant: RemoteParticipant | null;\n };\n};\n\ntype AgentStateAvailable = AgentStateCommon & {\n state: 'listening' | 'thinking' | 'speaking';\n failureReasons: null;\n\n /** The agent's assigned identity, coming from the JWT token. */\n identity: Participant['identity'];\n name: Participant['name'];\n metadata: Participant['metadata'];\n\n /** Is the agent connected to the client? */\n isConnected: true;\n\n /**\n * Could the client be listening for user speech?\n *\n * Note that this may not mean that the agent is actually connected - the audio pre-connect\n * buffer could be active and recording user input before the agent actually connects.\n * */\n canListen: true;\n\n /** Has the client disconnected from the agent either for an expected or unexpected reason? */\n isFinished: false;\n\n /** Is the agent currently connecting or setting itself up? */\n isPending: false;\n\n cameraTrack?: TrackReference;\n microphoneTrack?: TrackReference;\n};\n\ntype AgentStatePreConnectBuffering = AgentStateCommon & {\n state: 'pre-connect-buffering';\n failureReasons: null;\n\n /** The client's assigned identity, coming from the JWT token. */\n identity: Participant['identity'];\n name: Participant['name'];\n metadata: Participant['metadata'];\n\n /** Is the agent connected to the client? */\n isConnected: false;\n\n /**\n * Could the client be listening for user speech?\n *\n * Note that this may not mean that the agent is actually connected - the audio pre-connect\n * buffer could be active and recording user input before the agent actually connects.\n * */\n canListen: true;\n\n /** Has the client disconnected from the agent either for an expected or unexpected reason? */\n isFinished: false;\n\n /** Is the agent currently connecting or setting itself up? */\n isPending: false;\n\n cameraTrack?: TrackReference;\n microphoneTrack?: TrackReference;\n};\n\ntype AgentStateUnAvailable = AgentStateCommon & {\n state: 'initializing' | 'idle';\n failureReasons: null;\n\n /** The client's assigned identity, coming from the JWT token. */\n identity: Participant['identity'];\n name: Participant['name'];\n metadata: Participant['metadata'];\n\n /** Is the agent connected to the client? */\n isConnected: false;\n\n /**\n * Could the client be listening for user speech?\n *\n * Note that this may not mean that the agent is actually connected - the audio pre-connect\n * buffer could be active and recording user input before the agent actually connects.\n * */\n canListen: false;\n\n /** Has the client disconnected from the agent either for an expected or unexpected reason? */\n isFinished: false;\n\n /** Is the agent currently connecting or setting itself up? */\n isPending: true;\n\n cameraTrack?: TrackReference;\n microphoneTrack?: TrackReference;\n};\n\ntype AgentStateConnecting = AgentStateCommon & {\n state: 'connecting';\n failureReasons: null;\n\n /** The client's assigned identity, coming from the JWT token. */\n identity: undefined;\n name: undefined;\n metadata: undefined;\n\n /** Is the agent connected to the client? */\n isConnected: false;\n\n /**\n * Could the client be listening for user speech?\n *\n * Note that this may not mean that the agent is actually connected - the audio pre-connect\n * buffer could be active and recording user input before the agent actually connects.\n * */\n canListen: false;\n\n /** Has the client disconnected from the agent either for an expected or unexpected reason? */\n isFinished: false;\n\n /** Is the agent currently connecting or setting itself up? */\n isPending: true;\n\n cameraTrack: undefined;\n microphoneTrack: undefined;\n};\n\ntype AgentStateDisconnected = AgentStateCommon & {\n state: 'disconnected';\n failureReasons: null;\n\n /** The client's assigned identity, coming from the JWT token. */\n identity: undefined;\n name: undefined;\n metadata: undefined;\n\n /** Is the agent connected to the client? */\n isConnected: false;\n\n /**\n * Could the client be listening for user speech?\n *\n * Note that this may not mean that the agent is actually connected - the audio pre-connect\n * buffer could be active and recording user input before the agent actually connects.\n * */\n canListen: false;\n\n /** Has the client disconnected from the agent either for an expected or unexpected reason? */\n isFinished: true;\n\n /** Is the agent currently connecting or setting itself up? */\n isPending: false;\n\n cameraTrack: undefined;\n microphoneTrack: undefined;\n};\n\ntype AgentStateFailed = AgentStateCommon & {\n state: 'failed';\n failureReasons: Array<string>;\n\n /** The client's assigned identity, coming from the JWT token. */\n identity: undefined;\n name: undefined;\n metadata: undefined;\n\n /** Is the agent connected to the client? */\n isConnected: false;\n\n /**\n * Could the client be listening for user speech?\n *\n * Note that this may not mean that the agent is actually connected - the audio pre-connect\n * buffer could be active and recording user input before the agent actually connects.\n * */\n canListen: false;\n\n /** Has the client disconnected from the agent either for an expected or unexpected reason? */\n isFinished: true;\n\n /** Is the agent currently connecting or setting itself up? */\n isPending: false;\n\n cameraTrack: undefined;\n microphoneTrack: undefined;\n};\n\ntype AgentActions = {\n /** Returns a promise that resolves once the agent is connected and available for user input */\n waitUntilConnected: (signal?: AbortSignal) => Promise<void>;\n\n /**\n * Returns a promise that resolves once the client could be listening for user speech (`canListen` is true)\n *\n * Note that this may not mean that the agent is actually connected - the audio pre-connect\n * buffer could be active and recording user input before the agent actually connects.\n * */\n waitUntilCouldBeListening: (signal?: AbortSignal) => Promise<void>;\n\n /** Returns a promise that resolves once the client has disconnected from the agent either for an expected or unexpected reason. */\n waitUntilFinished: (signal?: AbortSignal) => Promise<void>;\n\n /** Returns a promise that resolves once the agent has published a camera track */\n waitUntilCamera: (signal?: AbortSignal) => Promise<TrackReference>;\n\n /** Returns a promise that resolves once the agent has published a microphone track */\n waitUntilMicrophone: (signal?: AbortSignal) => Promise<TrackReference>;\n};\n\ntype AgentStateCases =\n | AgentStateConnecting\n | AgentStateDisconnected\n | AgentStateAvailable\n | AgentStatePreConnectBuffering\n | AgentStateUnAvailable\n | AgentStateFailed;\n\n/** @beta */\nexport type UseAgentReturn = AgentStateCases & AgentActions;\n\nconst generateDerivedStateValues = <State extends AgentState>(state: State) =>\n ({\n isConnected: state === 'listening' || state === 'thinking' || state === 'speaking',\n canListen:\n state === 'pre-connect-buffering' ||\n state === 'listening' ||\n state === 'thinking' ||\n state === 'speaking',\n isFinished: state === 'disconnected' || state === 'failed',\n isPending: state === 'connecting' || state === 'initializing' || state === 'idle',\n }) as {\n isConnected: State extends 'listening' | 'thinking' | 'speaking' ? true : false;\n canListen: State extends 'pre-connect-buffering' | 'listening' | 'thinking' | 'speaking'\n ? true\n : false;\n isFinished: State extends 'disconnected' | 'failed' ? true : false;\n isPending: State extends 'connecting' | 'initializing' | 'idle' ? true : false;\n };\n\n/** Internal hook used by useSession to store global agent state */\nexport const useAgentTimeoutIdStore = (): {\n agentTimeoutFailureReason: string | null;\n startAgentTimeout: (agentConnectTimeoutMilliseconds?: number) => void;\n clearAgentTimeout: () => void;\n clearAgentTimeoutFailureReason: () => void;\n updateAgentTimeoutState: (agentState: AgentState) => void;\n updateAgentTimeoutParticipantExists: (agentParticipantExists: boolean) => void;\n} => {\n const [agentTimeoutFailureReason, setAgentTimeoutFailureReason] = React.useState<string | null>(\n null,\n );\n const [agentTimeoutId, setAgentTimeoutId] = React.useState<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n const agentStateRef = React.useRef<AgentState>('connecting');\n const agentParticipantExistsRef = React.useRef(false);\n\n const startAgentConnectedTimeout = (agentConnectTimeoutMilliseconds?: number) => {\n return setTimeout(() => {\n if (!agentParticipantExistsRef.current) {\n setAgentTimeoutFailureReason('Agent did not join the room.');\n return;\n }\n\n const { isConnected } = generateDerivedStateValues(agentStateRef.current);\n if (!isConnected) {\n setAgentTimeoutFailureReason('Agent joined the room but did not complete initializing.');\n return;\n }\n }, agentConnectTimeoutMilliseconds ?? DEFAULT_AGENT_CONNECT_TIMEOUT_MILLISECONDS);\n };\n\n return {\n agentTimeoutFailureReason,\n startAgentTimeout: React.useCallback(\n (agentConnectTimeoutMilliseconds?: number) => {\n if (agentTimeoutId) {\n clearTimeout(agentTimeoutId);\n }\n\n setAgentTimeoutFailureReason(null);\n setAgentTimeoutId(startAgentConnectedTimeout(agentConnectTimeoutMilliseconds));\n agentStateRef.current = 'connecting';\n agentParticipantExistsRef.current = false;\n },\n [agentTimeoutId],\n ),\n clearAgentTimeout: React.useCallback(() => {\n if (agentTimeoutId) {\n clearTimeout(agentTimeoutId);\n }\n\n setAgentTimeoutFailureReason(null);\n setAgentTimeoutId(null);\n agentStateRef.current = 'connecting';\n agentParticipantExistsRef.current = false;\n }, [agentTimeoutId]),\n clearAgentTimeoutFailureReason: React.useCallback(() => {\n setAgentTimeoutFailureReason(null);\n }, []),\n\n updateAgentTimeoutState: React.useCallback((agentState: AgentState) => {\n agentStateRef.current = agentState;\n }, []),\n updateAgentTimeoutParticipantExists: React.useCallback((agentParticipantExists: boolean) => {\n agentParticipantExistsRef.current = agentParticipantExists;\n }, []),\n };\n};\n\ntype SessionStub = Pick<UseSessionReturn, 'connectionState' | 'room' | 'internal'>;\n\n/** Internal hook used by useAgent which generates a function that when called, will return a\n * promise which resolves when agent.isAvailable is enabled. */\nfunction useAgentWaitUntilDerivedStates(\n emitter: TypedEventEmitter<AgentCallbacks>,\n state: AgentState,\n) {\n const stateRef = React.useRef(state);\n React.useEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n const waitUntilConnected = React.useCallback(\n async (signal?: AbortSignal) => {\n const { isConnected } = generateDerivedStateValues(stateRef.current);\n if (isConnected) {\n return;\n }\n\n return new Promise<void>((resolve, reject) => {\n const stateChangedHandler = (state: AgentState) => {\n const { isConnected } = generateDerivedStateValues(state);\n if (!isConnected) {\n return;\n }\n cleanup();\n resolve();\n };\n const abortHandler = () => {\n cleanup();\n reject(new Error('useAgent(/* ... */).waitUntilConnected - signal aborted'));\n };\n\n const cleanup = () => {\n emitter.off(AgentEvent.StateChanged, stateChangedHandler);\n signal?.removeEventListener('abort', abortHandler);\n };\n\n emitter.on(AgentEvent.StateChanged, stateChangedHandler);\n signal?.addEventListener('abort', abortHandler);\n });\n },\n [emitter],\n );\n\n const waitUntilCouldBeListening = React.useCallback(\n async (signal?: AbortSignal) => {\n const { canListen } = generateDerivedStateValues(stateRef.current);\n if (canListen) {\n return;\n }\n\n return new Promise<void>((resolve, reject) => {\n const stateChangedHandler = (state: AgentState) => {\n const { canListen } = generateDerivedStateValues(state);\n if (!canListen) {\n return;\n }\n cleanup();\n resolve();\n };\n const abortHandler = () => {\n cleanup();\n reject(new Error('useAgent(/* ... */).waitUntilCouldBeListening - signal aborted'));\n };\n\n const cleanup = () => {\n emitter.off(AgentEvent.StateChanged, stateChangedHandler);\n signal?.removeEventListener('abort', abortHandler);\n };\n\n emitter.on(AgentEvent.StateChanged, stateChangedHandler);\n signal?.addEventListener('abort', abortHandler);\n });\n },\n [emitter],\n );\n\n const waitUntilFinished = React.useCallback(\n async (signal?: AbortSignal) => {\n const { isFinished } = generateDerivedStateValues(stateRef.current);\n if (isFinished) {\n return;\n }\n\n return new Promise<void>((resolve, reject) => {\n const stateChangedHandler = (state: AgentState) => {\n const { isFinished } = generateDerivedStateValues(state);\n if (!isFinished) {\n return;\n }\n cleanup();\n resolve();\n };\n const abortHandler = () => {\n cleanup();\n reject(new Error('useAgent(/* ... */).waitUntilFinished - signal aborted'));\n };\n\n const cleanup = () => {\n emitter.off(AgentEvent.StateChanged, stateChangedHandler);\n signal?.removeEventListener('abort', abortHandler);\n };\n\n emitter.on(AgentEvent.StateChanged, stateChangedHandler);\n signal?.addEventListener('abort', abortHandler);\n });\n },\n [emitter],\n );\n\n return { waitUntilConnected, waitUntilCouldBeListening, waitUntilFinished };\n}\n\n/**\n * useAgent encapculates all agent state, normalizing some quirks around how LiveKit Agents work.\n * @beta\n */\nexport function useAgent(session?: SessionStub): UseAgentReturn {\n const sessionFromContext = useMaybeSessionContext();\n session = session ?? sessionFromContext;\n if (!session) {\n throw new Error(\n 'No session provided, make sure you are inside a Session context or pass the session explicitly',\n );\n }\n\n const {\n room,\n internal: {\n agentConnectTimeoutMilliseconds,\n\n agentTimeoutFailureReason,\n startAgentTimeout,\n clearAgentTimeout,\n clearAgentTimeoutFailureReason,\n updateAgentTimeoutState,\n updateAgentTimeoutParticipantExists,\n },\n } = session;\n\n const emitter = React.useMemo(() => new EventEmitter() as TypedEventEmitter<AgentCallbacks>, []);\n\n const roomRemoteParticipants = useRemoteParticipants({ room });\n\n const agentParticipant = React.useMemo(() => {\n return (\n roomRemoteParticipants.find(\n (p) =>\n p.kind === ParticipantKind.AGENT &&\n !(ParticipantAgentAttributes.PublishOnBehalf in p.attributes),\n ) ?? null\n );\n }, [roomRemoteParticipants]);\n const workerParticipant = React.useMemo(() => {\n if (!agentParticipant) {\n return null;\n }\n return (\n roomRemoteParticipants.find(\n (p) =>\n p.kind === ParticipantKind.AGENT &&\n p.attributes[ParticipantAgentAttributes.PublishOnBehalf] === agentParticipant.identity,\n ) ?? null\n );\n }, [agentParticipant, roomRemoteParticipants]);\n\n // 1. Listen for agent participant attribute changes\n const [agentParticipantAttributes, setAgentParticipantAttributes] = React.useState<\n Participant['attributes']\n >(agentParticipant?.attributes ?? {});\n React.useEffect(() => {\n if (!agentParticipant) {\n return;\n }\n\n const handleAttributesChanged = (attributes: UseAgentReturn['attributes']) => {\n setAgentParticipantAttributes(attributes);\n };\n\n agentParticipant.on(ParticipantEvent.AttributesChanged, handleAttributesChanged);\n return () => {\n agentParticipant.off(ParticipantEvent.AttributesChanged, handleAttributesChanged);\n };\n }, [agentParticipant, emitter]);\n\n // 2. Listen for track updates\n const agentTracks = useParticipantTracks([Track.Source.Camera, Track.Source.Microphone], {\n room,\n participantIdentity: agentParticipant?.identity,\n });\n const workerTracks = useParticipantTracks([Track.Source.Camera, Track.Source.Microphone], {\n room,\n participantIdentity: workerParticipant?.identity,\n });\n\n const videoTrack = React.useMemo(\n () =>\n agentTracks.find((t) => t.source === Track.Source.Camera) ??\n workerTracks.find((t) => t.source === Track.Source.Camera),\n [agentTracks, workerTracks],\n );\n React.useEffect(() => {\n emitter.emit(AgentEvent.CameraChanged, videoTrack);\n }, [emitter, videoTrack]);\n\n const audioTrack = React.useMemo(\n () =>\n agentTracks.find((t) => t.source === Track.Source.Microphone) ??\n workerTracks.find((t) => t.source === Track.Source.Microphone),\n [agentTracks, workerTracks],\n );\n React.useEffect(() => {\n emitter.emit(AgentEvent.MicrophoneChanged, audioTrack);\n }, [emitter, audioTrack]);\n\n // Listen for room connection state updates\n const [roomConnectionState, setRoomConnectionState] = React.useState(room.state);\n React.useEffect(() => {\n const handleConnectionStateChanged = (connectionState: ConnectionState) => {\n setRoomConnectionState(connectionState);\n };\n\n room.on(RoomEvent.ConnectionStateChanged, handleConnectionStateChanged);\n return () => {\n room.off(RoomEvent.ConnectionStateChanged, handleConnectionStateChanged);\n };\n }, [room]);\n\n // When the agent participant connects, reset the timeout failure state\n React.useEffect(() => {\n if (!agentParticipant) {\n return;\n }\n\n clearAgentTimeoutFailureReason();\n }, [agentParticipant]);\n\n // If the agent participant disconnects in the middle of a conversation unexpectedly, mark that as an explicit failure\n const [agentDisconnectedFailureReason, setAgentDisconnectedFailureReason] = React.useState<\n string | null\n >(null);\n React.useEffect(() => {\n if (!agentParticipant) {\n return;\n }\n\n const onParticipantDisconnect = (participant: RemoteParticipant) => {\n if (participant.identity !== agentParticipant?.identity) {\n return;\n }\n setAgentDisconnectedFailureReason('Agent left the room unexpectedly.');\n };\n\n room.on(RoomEvent.ParticipantDisconnected, onParticipantDisconnect);\n\n return () => {\n room.off(RoomEvent.ParticipantDisconnected, onParticipantDisconnect);\n };\n }, [agentParticipant, room]);\n\n React.useEffect(() => {\n if (roomConnectionState !== ConnectionState.Disconnected) {\n return;\n }\n // Clear the agent disconnect failure state when the room disconnects\n setAgentDisconnectedFailureReason(null);\n }, [roomConnectionState]);\n\n const [localMicTrack, setLocalMicTrack] = React.useState<LocalTrackPublication | null>(\n () => room.localParticipant.getTrackPublication(Track.Source.Microphone) ?? null,\n );\n React.useEffect(() => {\n const handleLocalParticipantTrackPublished = () => {\n setLocalMicTrack(room.localParticipant.getTrackPublication(Track.Source.Microphone) ?? null);\n };\n const handleLocalParticipantTrackUnPublished = () => {\n setLocalMicTrack(null);\n };\n\n room.localParticipant.on(\n ParticipantEvent.LocalTrackPublished,\n handleLocalParticipantTrackPublished,\n );\n room.localParticipant.on(\n ParticipantEvent.LocalTrackUnpublished,\n handleLocalParticipantTrackUnPublished,\n );\n return () => {\n room.localParticipant.off(\n ParticipantEvent.LocalTrackPublished,\n handleLocalParticipantTrackPublished,\n );\n room.localParticipant.off(\n ParticipantEvent.LocalTrackUnpublished,\n handleLocalParticipantTrackUnPublished,\n );\n };\n }, [room.localParticipant]);\n\n const failureReasons = React.useMemo(() => {\n const reasons = [];\n if (agentTimeoutFailureReason) {\n reasons.push(agentTimeoutFailureReason);\n }\n if (agentDisconnectedFailureReason) {\n reasons.push(agentDisconnectedFailureReason);\n }\n return reasons;\n }, [agentTimeoutFailureReason, agentDisconnectedFailureReason]);\n\n const state = React.useMemo(() => {\n if (failureReasons.length > 0) {\n return 'failed';\n }\n\n let state: AgentState = 'disconnected';\n\n if (roomConnectionState !== ConnectionState.Disconnected) {\n state = 'connecting';\n }\n\n // If the microphone preconnect buffer is active, then a special 'pre-connect-buffering' state\n // is set\n if (localMicTrack) {\n state = 'pre-connect-buffering';\n }\n\n if (agentParticipant && agentParticipantAttributes[ParticipantAgentAttributes.AgentState]) {\n state = agentParticipantAttributes[ParticipantAgentAttributes.AgentState] as AgentSdkStates;\n }\n\n return state;\n }, [\n failureReasons,\n roomConnectionState,\n localMicTrack,\n agentParticipant,\n agentParticipantAttributes,\n ]);\n\n React.useEffect(() => {\n emitter.emit(AgentEvent.StateChanged, state);\n updateAgentTimeoutState(state);\n }, [emitter, state]);\n React.useEffect(() => {\n updateAgentTimeoutParticipantExists(agentParticipant !== null);\n }, [agentParticipant]);\n\n // When the session room begins connecting, start the agent timeout\n const isSessionDisconnected = session.connectionState === 'disconnected';\n React.useEffect(() => {\n if (isSessionDisconnected) {\n return;\n }\n\n startAgentTimeout(agentConnectTimeoutMilliseconds);\n return () => {\n clearAgentTimeout();\n };\n }, [isSessionDisconnected, agentConnectTimeoutMilliseconds]);\n\n const {\n identity: agentParticipantIdentity,\n name: agentParticipantName,\n metadata: agentParticipantMetadata,\n } = useParticipantInfo({ participant: agentParticipant ?? undefined });\n\n const agentState: AgentStateCases = React.useMemo(() => {\n const common: AgentStateCommon = {\n attributes: agentParticipantAttributes,\n\n internal: {\n agentParticipant,\n workerParticipant,\n emitter,\n },\n };\n\n switch (state) {\n case 'disconnected':\n return {\n ...common,\n identity: undefined,\n name: undefined,\n metadata: undefined,\n\n state,\n ...generateDerivedStateValues(state),\n failureReasons: null,\n\n // Clear inner values if no longer connected\n cameraTrack: undefined,\n microphoneTrack: undefined,\n };\n\n case 'connecting':\n return {\n ...common,\n identity: undefined,\n name: undefined,\n metadata: undefined,\n\n state,\n ...generateDerivedStateValues(state),\n failureReasons: null,\n\n // Clear inner values if no longer connected\n cameraTrack: undefined,\n microphoneTrack: undefined,\n };\n\n case 'initializing':\n case 'idle':\n return {\n ...common,\n identity: agentParticipantIdentity!,\n name: agentParticipantName,\n metadata: agentParticipantMetadata,\n\n state,\n ...generateDerivedStateValues(state),\n failureReasons: null,\n\n cameraTrack: videoTrack,\n microphoneTrack: audioTrack,\n };\n\n case 'pre-connect-buffering':\n return {\n ...common,\n identity: agentParticipantIdentity!,\n name: agentParticipantName,\n metadata: agentParticipantMetadata,\n\n state,\n ...generateDerivedStateValues(state),\n failureReasons: null,\n\n cameraTrack: videoTrack,\n microphoneTrack: audioTrack,\n };\n\n case 'listening':\n case 'thinking':\n case 'speaking':\n return {\n ...common,\n identity: agentParticipantIdentity!,\n name: agentParticipantName,\n metadata: agentParticipantMetadata,\n\n state,\n ...generateDerivedStateValues(state),\n failureReasons: null,\n\n cameraTrack: videoTrack,\n microphoneTrack: audioTrack,\n };\n\n case 'failed':\n return {\n ...common,\n identity: undefined,\n name: undefined,\n metadata: undefined,\n\n state: 'failed',\n ...generateDerivedStateValues('failed'),\n failureReasons,\n\n // Clear inner values if no longer connected\n cameraTrack: undefined,\n microphoneTrack: undefined,\n };\n }\n }, [\n agentParticipantIdentity,\n agentParticipantName,\n agentParticipantMetadata,\n agentParticipantAttributes,\n emitter,\n agentParticipant,\n state,\n videoTrack,\n audioTrack,\n ]);\n\n const { waitUntilConnected, waitUntilCouldBeListening, waitUntilFinished } =\n useAgentWaitUntilDerivedStates(emitter, state);\n\n const waitUntilCamera = React.useCallback(\n (signal?: AbortSignal) => {\n return new Promise<TrackReference>((resolve, reject) => {\n const stateChangedHandler = (camera: TrackReference | undefined) => {\n if (!camera) {\n return;\n }\n cleanup();\n resolve(camera);\n };\n const abortHandler = () => {\n cleanup();\n reject(new Error('useAgent(/* ... */).waitUntilCamera - signal aborted'));\n };\n\n const cleanup = () => {\n emitter.off(AgentEvent.CameraChanged, stateChangedHandler);\n signal?.removeEventListener('abort', abortHandler);\n };\n\n emitter.on(AgentEvent.CameraChanged, stateChangedHandler);\n signal?.addEventListener('abort', abortHandler);\n });\n },\n [emitter],\n );\n\n const waitUntilMicrophone = React.useCallback(\n (signal?: AbortSignal) => {\n return new Promise<TrackReference>((resolve, reject) => {\n const stateChangedHandler = (microphone: TrackReference | undefined) => {\n if (!microphone) {\n return;\n }\n cleanup();\n resolve(microphone);\n };\n const abortHandler = () => {\n cleanup();\n reject(new Error('useAgent(/* ... */).waitUntilMicrophone - signal aborted'));\n };\n\n const cleanup = () => {\n emitter.off(AgentEvent.MicrophoneChanged, stateChangedHandler);\n signal?.removeEventListener('abort', abortHandler);\n };\n\n emitter.on(AgentEvent.MicrophoneChanged, stateChangedHandler);\n signal?.addEventListener('abort', abortHandler);\n });\n },\n [emitter],\n );\n\n return React.useMemo(() => {\n return {\n ...agentState,\n waitUntilConnected,\n waitUntilCouldBeListening,\n waitUntilFinished,\n waitUntilCamera,\n waitUntilMicrophone,\n };\n }, [\n agentState,\n waitUntilConnected,\n waitUntilCouldBeListening,\n waitUntilFinished,\n waitUntilCamera,\n waitUntilMicrophone,\n ]);\n}\n","import * as React from 'react';\nimport type TypedEventEmitter from 'typed-emitter';\nimport {\n Room,\n RoomEvent,\n ConnectionState,\n TrackPublishOptions,\n Track,\n TokenSourceConfigurable,\n TokenSourceFixed,\n TokenSourceFetchOptions,\n RoomConnectOptions,\n decodeTokenPayload,\n} from 'livekit-client';\nimport { EventEmitter } from 'events';\n\nimport { useMaybeRoomContext } from '../context';\nimport { AgentState, useAgent, useAgentTimeoutIdStore } from './useAgent';\nimport { TrackReference } from '@livekit/components-core';\nimport { useLocalParticipant } from './useLocalParticipant';\n\n/** @beta */\nexport enum SessionEvent {\n ConnectionStateChanged = 'connectionStateChanged',\n /**\n * Emits when an error is encountered while attempting to create a track.\n * Use MediaDeviceFailure.getFailure(error) to get the reason of failure.\n * args: (error: Error, kind: MediaDeviceKind)\n */\n MediaDevicesError = 'mediaDevicesError',\n /**\n * Emits when an error is received while decrypting frame received frame information.\n * args: (error: Error)\n */\n EncryptionError = 'encryptionError',\n}\n\n/** @beta */\nexport type SessionCallbacks = {\n [SessionEvent.ConnectionStateChanged]: (newAgentConnectionState: ConnectionState) => void;\n [SessionEvent.MediaDevicesError]: (error: Error) => void;\n [SessionEvent.EncryptionError]: (error: Error) => void;\n};\n\n/** @beta */\nexport type SessionConnectOptions = {\n /** Optional abort signal which if triggered will terminate connecting even if it isn't complete */\n signal?: AbortSignal;\n\n tracks?: {\n microphone?: {\n enabled?: boolean;\n publishOptions?: TrackPublishOptions;\n };\n camera?: {\n enabled?: boolean;\n publishOptions?: TrackPublishOptions;\n };\n screenShare?: {\n enabled?: boolean;\n publishOptions?: TrackPublishOptions;\n };\n };\n\n /** Options for Room.connect(.., .., opts) */\n roomConnectOptions?: RoomConnectOptions;\n};\n\n/** @beta */\nexport type SwitchActiveDeviceOptions = {\n /**\n * If true, adds an `exact` constraint to the getUserMedia request.\n * The request will fail if this option is true and the device specified is not actually available\n */\n exact?: boolean;\n};\n\ntype SessionStateCommon = {\n room: Room;\n internal: {\n emitter: TypedEventEmitter<SessionCallbacks>;\n tokenSource: TokenSourceConfigurable | TokenSourceFixed;\n agentConnectTimeoutMilliseconds?: number;\n\n agentTimeoutFailureReason: string | null;\n startAgentTimeout: (agentConnectTimeoutMilliseconds?: number) => void;\n clearAgentTimeout: () => void;\n clearAgentTimeoutFailureReason: () => void;\n updateAgentTimeoutState: (agentState: AgentState) => void;\n updateAgentTimeoutParticipantExists: (agentParticipantExists: boolean) => void;\n };\n};\n\ntype SessionStateConnecting = SessionStateCommon & {\n connectionState: ConnectionState.Connecting;\n isConnected: false;\n\n local: {\n cameraTrack: undefined;\n microphoneTrack: undefined;\n screenShareTrack: undefined;\n };\n};\n\ntype SessionStateConnected = SessionStateCommon & {\n connectionState:\n | ConnectionState.Connected\n | ConnectionState.Reconnecting\n | ConnectionState.SignalReconnecting;\n isConnected: true;\n\n local: {\n cameraTrack?: TrackReference;\n microphoneTrack?: TrackReference;\n screenShareTrack?: TrackReference;\n };\n};\n\ntype SessionStateDisconnected = SessionStateCommon & {\n connectionState: ConnectionState.Disconnected;\n isConnected: false;\n\n local: {\n cameraTrack: undefined;\n microphoneTrack: undefined;\n screenShareTrack: undefined;\n };\n};\n\ntype SessionActions = {\n /** Returns a promise that resolves once the room connects. */\n waitUntilConnected: (signal?: AbortSignal) => void;\n /** Returns a promise that resolves once the room disconnects */\n waitUntilDisconnected: (signal?: AbortSignal) => void;\n\n prepareConnection: () => Promise<void>;\n\n /** Connect to the underlying room and dispatch any agents */\n start: (options?: SessionConnectOptions) => Promise<void>;\n\n /** Disconnect from the underlying room */\n end: () => Promise<void>;\n};\n\n/** @beta */\nexport type UseSessionReturn = (\n | SessionStateConnecting\n | SessionStateConnected\n | SessionStateDisconnected\n) &\n SessionActions;\n\ntype UseSessionCommonOptions = {\n room?: Room;\n\n /**\n * Amount of time in milliseonds the system will wait for an agent to join the room, before\n * transitioning to the \"failure\" state.\n */\n agentConnectTimeoutMilliseconds?: number;\n};\n\ntype UseSessionConfigurableOptions = UseSessionCommonOptions & TokenSourceFetchOptions;\ntype UseSessionFixedOptions = UseSessionCommonOptions;\n\n/**\n * Given two TokenSourceFetchOptions values, check to see if they are deep equal.\n *\n * FIXME: swap this for an import from livekit-client once\n * https://github.com/livekit/client-sdk-js/pull/1733 is merged and published!\n * */\nfunction areTokenSourceFetchOptionsEqual(a: TokenSourceFetchOptions, b: TokenSourceFetchOptions) {\n const allKeysSet = new Set([...Object.keys(a), ...Object.keys(b)]) as Set<\n keyof TokenSourceFetchOptions\n >;\n\n for (const key of allKeysSet) {\n switch (key) {\n case 'roomName':\n case 'participantName':\n case 'participantIdentity':\n case 'participantMetadata':\n case 'participantAttributes':\n case 'agentName':\n case 'agentMetadata':\n if (a[key] !== b[key]) {\n return false;\n }\n break;\n default:\n // ref: https://stackoverflow.com/a/58009992\n const exhaustiveCheckedKey: never = key;\n throw new Error(`Options key ${exhaustiveCheckedKey} not being checked for equality!`);\n }\n }\n\n return true;\n}\n\n/** Internal hook used by useSession to manage creating a function which can be used to wait\n * until the session is in a given state before resolving. */\nfunction useSessionWaitUntilConnectionState(\n emitter: TypedEventEmitter<SessionCallbacks>,\n connectionState: UseSessionReturn['connectionState'],\n) {\n const connectionStateRef = React.useRef(connectionState);\n React.useEffect(() => {\n connectionStateRef.current = connectionState;\n }, [connectionState]);\n\n const waitUntilConnectionState = React.useCallback(\n async (state: UseSessionReturn['connectionState'], signal?: AbortSignal) => {\n if (connectionStateRef.current === state) {\n return;\n }\n\n return new Promise<void>((resolve, reject) => {\n const onceEventOccurred = (newState: UseSessionReturn['connectionState']) => {\n if (newState !== state) {\n return;\n }\n cleanup();\n resolve();\n };\n const abortHandler = () => {\n cleanup();\n reject(\n new Error(\n `useSession(/* ... */).waitUntilConnectionState(${state}, /* signal */) - signal aborted`,\n ),\n );\n };\n\n const cleanup = () => {\n emitter.off(SessionEvent.ConnectionStateChanged, onceEventOccurred);\n signal?.removeEventListener('abort', abortHandler);\n };\n\n emitter.on(SessionEvent.ConnectionStateChanged, onceEventOccurred);\n signal?.addEventListener('abort', abortHandler);\n });\n },\n [emitter],\n );\n\n return waitUntilConnectionState;\n}\n\n/** Internal hook used by useSession to manage creating a function that properly invokes\n * tokenSource.fetch(...) with any fetch options */\nfunction useSessionTokenSourceFetch(\n tokenSource: TokenSourceConfigurable | TokenSourceFixed,\n unstableRestOptions: Exclude<UseSessionConfigurableOptions, keyof UseSessionCommonOptions>,\n) {\n const isConfigurable = tokenSource instanceof TokenSourceConfigurable;\n\n const memoizedTokenFetchOptionsRef = React.useRef<TokenSourceFetchOptions | null>(\n isConfigurable ? unstableRestOptions : null,\n );\n\n React.useEffect(() => {\n if (!isConfigurable) {\n memoizedTokenFetchOptionsRef.current = null;\n return;\n }\n\n if (\n memoizedTokenFetchOptionsRef.current !== null &&\n areTokenSourceFetchOptionsEqual(memoizedTokenFetchOptionsRef.current, unstableRestOptions)\n ) {\n return;\n }\n\n memoizedTokenFetchOptionsRef.current = unstableRestOptions;\n }, [isConfigurable, unstableRestOptions]);\n\n const tokenSourceFetch = React.useCallback(async () => {\n if (isConfigurable) {\n if (!memoizedTokenFetchOptionsRef.current) {\n throw new Error(\n `AgentSession - memoized token fetch options are not set, but the passed tokenSource was an instance of TokenSourceConfigurable. If you are seeing this please make a new GitHub issue!`,\n );\n }\n return tokenSource.fetch(memoizedTokenFetchOptionsRef.current);\n } else {\n return tokenSource.fetch();\n }\n }, [isConfigurable, tokenSource]);\n\n return tokenSourceFetch;\n}\n\n/**\n * A Session represents a managed connection to a Room which can contain Agents.\n * @beta\n */\nexport function useSession(\n tokenSource: TokenSourceConfigurable,\n options?: UseSessionConfigurableOptions,\n): UseSessionReturn;\n/**\n * A Session represents a managed connection to a Room which can contain Agents.\n * @beta\n */\nexport function useSession(\n tokenSource: TokenSourceFixed,\n options?: UseSessionFixedOptions,\n): UseSessionReturn;\nexport function useSession(\n tokenSource: TokenSourceConfigurable | TokenSourceFixed,\n options: UseSessionConfigurableOptions | UseSessionFixedOptions = {},\n): UseSessionReturn {\n const { room: optionsRoom, agentConnectTimeoutMilliseconds, ...restOptions } = options;\n\n const roomFromContext = useMaybeRoomContext();\n const room = React.useMemo(\n () => roomFromContext ?? optionsRoom ?? new Room(),\n [roomFromContext, optionsRoom],\n );\n\n const emitter = React.useMemo(\n () => new EventEmitter() as TypedEventEmitter<SessionCallbacks>,\n [],\n );\n\n const generateDerivedConnectionStateValues = React.useCallback(\n <State extends UseSessionReturn['connectionState']>(connectionState: State) =>\n ({\n isConnected:\n connectionState === ConnectionState.Connected ||\n connectionState === ConnectionState.Reconnecting ||\n connectionState === ConnectionState.SignalReconnecting,\n }) as {\n isConnected: State extends\n | ConnectionState.Connected\n | ConnectionState.Reconnecting\n | ConnectionState.SignalReconnecting\n ? true\n : false;\n },\n [],\n );\n\n const [roomConnectionState, setRoomConnectionState] = React.useState(room.state);\n React.useEffect(() => {\n const handleConnectionStateChanged = (connectionState: ConnectionState) => {\n setRoomConnectionState(connectionState);\n };\n\n room.on(RoomEvent.ConnectionStateChanged, handleConnectionStateChanged);\n return () => {\n room.off(RoomEvent.ConnectionStateChanged, handleConnectionStateChanged);\n };\n }, [room]);\n\n React.useEffect(() => {\n const handleMediaDevicesError = async (error: Error) => {\n emitter.emit(SessionEvent.MediaDevicesError, error);\n };\n\n room.on(RoomEvent.MediaDevicesError, handleMediaDevicesError);\n return () => {\n room.off(RoomEvent.MediaDevicesError, handleMediaDevicesError);\n };\n }, [room, emitter]);\n\n React.useEffect(() => {\n const handleEncryptionError = async (error: Error) => {\n emitter.emit(SessionEvent.EncryptionError, error);\n };\n\n room.on(RoomEvent.EncryptionError, handleEncryptionError);\n return () => {\n room.off(RoomEvent.EncryptionError, handleEncryptionError);\n };\n }, [room, emitter]);\n\n const { localParticipant } = useLocalParticipant({ room });\n const cameraPublication = localParticipant.getTrackPublication(Track.Source.Camera);\n const localCamera = React.useMemo(() => {\n if (!cameraPublication) {\n return undefined;\n }\n return {\n source: Track.Source.Camera,\n participant: localParticipant,\n publication: cameraPublication,\n };\n }, [localParticipant, cameraPublication]);\n const microphonePublication = localParticipant.getTrackPublication(Track.Source.Microphone);\n const localMicrophone = React.useMemo(() => {\n if (!microphonePublication) {\n return undefined;\n }\n return {\n source: Track.Source.Microphone,\n participant: localParticipant,\n publication: microphonePublication,\n };\n }, [localParticipant, microphonePublication]);\n const screenSharePublication = localParticipant.getTrackPublication(Track.Source.ScreenShare);\n const localScreenShare = React.useMemo(() => {\n if (!screenSharePublication) {\n return undefined;\n }\n return {\n source: Track.Source.ScreenShare,\n participant: localParticipant,\n publication: screenSharePublication,\n };\n }, [localParticipant, screenSharePublication]);\n\n const {\n agentTimeoutFailureReason,\n startAgentTimeout,\n clearAgentTimeout,\n clearAgentTimeoutFailureReason,\n updateAgentTimeoutState,\n updateAgentTimeoutParticipantExists,\n } = useAgentTimeoutIdStore();\n\n const sessionInternal: UseSessionReturn['internal'] = React.useMemo(\n () => ({\n emitter,\n tokenSource,\n agentConnectTimeoutMilliseconds,\n\n agentTimeoutFailureReason,\n startAgentTimeout,\n clearAgentTimeout,\n clearAgentTimeoutFailureReason,\n updateAgentTimeoutState,\n updateAgentTimeoutParticipantExists,\n }),\n [\n emitter,\n agentConnectTimeoutMilliseconds,\n tokenSource,\n agentTimeoutFailureReason,\n startAgentTimeout,\n clearAgentTimeout,\n clearAgentTimeoutFailureReason,\n updateAgentTimeoutState,\n updateAgentTimeoutParticipantExists,\n ],\n );\n\n const conversationState = React.useMemo(():\n | SessionStateConnecting\n | SessionStateConnected\n | SessionStateDisconnected => {\n const common: SessionStateCommon = {\n room,\n internal: sessionInternal,\n };\n\n switch (roomConnectionState) {\n case ConnectionState.Connecting:\n return {\n ...common,\n\n connectionState: ConnectionState.Connecting,\n ...generateDerivedConnectionStateValues(ConnectionState.Connecting),\n\n local: {\n cameraTrack: undefined,\n microphoneTrack: undefined,\n screenShareTrack: undefined,\n },\n };\n\n case ConnectionState.Connected:\n case ConnectionState.Reconnecting:\n case ConnectionState.SignalReconnecting:\n return {\n ...common,\n\n connectionState: roomConnectionState,\n ...generateDerivedConnectionStateValues(roomConnectionState),\n\n local: {\n cameraTrack: localCamera,\n microphoneTrack: localMicrophone,\n screenShareTrack: localScreenShare,\n },\n };\n\n case ConnectionState.Disconnected:\n return {\n ...common,\n\n connectionState: ConnectionState.Disconnected,\n ...generateDerivedConnectionStateValues(ConnectionState.Disconnected),\n\n local: {\n cameraTrack: undefined,\n microphoneTrack: undefined,\n screenShareTrack: undefined,\n },\n };\n }\n }, [\n sessionInternal,\n room,\n roomConnectionState,\n localCamera,\n localMicrophone,\n generateDerivedConnectionStateValues,\n ]);\n React.useEffect(() => {\n emitter.emit(SessionEvent.ConnectionStateChanged, conversationState.connectionState);\n }, [emitter, conversationState.connectionState]);\n\n const waitUntilConnectionState = useSessionWaitUntilConnectionState(\n emitter,\n conversationState.connectionState,\n );\n\n const waitUntilConnected = React.useCallback(\n async (signal?: AbortSignal) => {\n return waitUntilConnectionState(\n ConnectionState.Connected /* FIXME: should I check for other states too? */,\n signal,\n );\n },\n [waitUntilConnectionState],\n );\n\n const waitUntilDisconnected = React.useCallback(\n async (signal?: AbortSignal) => {\n return waitUntilConnectionState(ConnectionState.Disconnected, signal);\n },\n [waitUntilConnectionState],\n );\n\n const agent = useAgent(\n React.useMemo(\n () => ({\n connectionState: conversationState.connectionState,\n room,\n internal: sessionInternal,\n }),\n [conversationState, room, sessionInternal],\n ),\n );\n\n const tokenSourceFetch = useSessionTokenSourceFetch(tokenSource, restOptions);\n\n const start = React.useCallback(\n async (connectOptions: SessionConnectOptions = {}) => {\n const {\n signal,\n tracks = { microphone: { enabled: true, publishOptions: { preConnectBuffer: true } } },\n roomConnectOptions,\n } = connectOptions;\n\n await waitUntilDisconnected(signal);\n\n const onSignalAbort = () => {\n room.disconnect();\n };\n signal?.addEventListener('abort', onSignalAbort);\n\n let tokenDispatchesAgent = false;\n await Promise.all([\n tokenSourceFetch().then(({ serverUrl, participantToken }) => {\n const participantTokenPayload = decodeTokenPayload(participantToken);\n const participantTokenAgentDispatchCount =\n participantTokenPayload.roomConfig?.agents?.length ?? 0;\n tokenDispatchesAgent = participantTokenAgentDispatchCount > 0;\n\n return room.connect(serverUrl, participantToken, roomConnectOptions);\n }),\n\n // Start microphone (with preconnect buffer) by default\n tracks.microphone?.enabled\n ? room.localParticipant.setMicrophoneEnabled(\n true,\n undefined,\n tracks.microphone?.publishOptions ?? {},\n )\n : Promise.resolve(),\n tracks.camera?.enabled\n ? room.localParticipant.setCameraEnabled(\n true,\n undefined,\n tracks.camera?.publishOptions ?? {},\n )\n : Promise.resolve(),\n tracks.screenShare?.enabled\n ? room.localParticipant.setScreenShareEnabled(\n true,\n undefined,\n tracks.screenShare?.publishOptions ?? {},\n )\n : Promise.resolve(),\n ]);\n\n await waitUntilConnected(signal);\n if (tokenDispatchesAgent) {\n await agent.waitUntilConnected(signal);\n }\n\n signal?.removeEventListener('abort', onSignalAbort);\n },\n [room, waitUntilDisconnected, tokenSourceFetch, waitUntilConnected, agent.waitUntilConnected],\n );\n\n const end = React.useCallback(async () => {\n await room.disconnect();\n }, [room]);\n\n const prepareConnection = React.useCallback(async () => {\n const credentials = await tokenSourceFetch();\n await room.prepareConnection(credentials.serverUrl, credentials.participantToken);\n }, [tokenSourceFetch, room]);\n React.useEffect(\n () => {\n prepareConnection().catch((err) => {\n // FIXME: figure out a better logging solution?\n console.warn('WARNING: Room.prepareConnection failed:', err);\n });\n },\n [\n /* note: no prepareConnection here, this effect should only ever run once! */\n ],\n );\n\n return React.useMemo(\n () => ({\n ...conversationState,\n\n waitUntilConnected,\n waitUntilDisconnected,\n\n prepareConnection,\n start,\n end,\n }),\n [conversationState, waitUntilConnected, waitUntilDisconnected, prepareConnection, start, end],\n );\n}\n","import * as React from 'react';\nimport TypedEventEmitter, { EventMap } from 'typed-emitter';\n\n/** @public */\nexport function useEvents<\n Emitter extends TypedEventEmitter<EventMap>,\n EmitterEventMap extends Emitter extends TypedEventEmitter<infer EM> ? EM : never,\n Event extends Parameters<Emitter['on']>[0],\n Callback extends EmitterEventMap[Event],\n>(\n instance: Emitter | { internal: { emitter: Emitter } } | null | undefined,\n event: Event,\n handlerFn: Callback | undefined,\n dependencies?: React.DependencyList,\n) {\n const fallback = React.useMemo(() => () => {}, []);\n const wrappedCallback = React.useCallback(handlerFn ?? fallback, dependencies ?? []);\n const callback = dependencies ? wrappedCallback : handlerFn;\n\n const emitter = React.useMemo(() => {\n if (!instance) {\n return null;\n }\n if ('internal' in instance) {\n return instance.internal.emitter;\n }\n return instance;\n }, [instance]);\n\n React.useEffect(() => {\n if (!emitter || !callback) {\n return;\n }\n emitter.on(event, callback);\n return () => {\n emitter.off(event, callback);\n };\n }, [emitter, event, callback]);\n}\n","import * as React from 'react';\nimport type TypedEventEmitter from 'typed-emitter';\nimport { SendTextOptions } from 'livekit-client';\nimport { EventEmitter } from 'events';\nimport {\n ReceivedMessage,\n ReceivedChatMessage,\n TextStreamData,\n ReceivedUserTranscriptionMessage,\n ReceivedAgentTranscriptionMessage,\n} from '@livekit/components-core';\n\nimport { useAgent } from './useAgent';\nimport { useTranscriptions } from './useTranscriptions';\nimport { useChat } from './useChat';\nimport { UseSessionReturn } from './useSession';\nimport { useEnsureSession } from '../context';\n\n/** @beta */\nexport type UseSessionMessagesReturn = {\n messages: Array<ReceivedMessage>;\n\n /** Is a send operation currently in progress? */\n isSending: boolean;\n\n send: (message: string, options?: SendTextOptions) => Promise<ReceivedChatMessage>;\n\n internal: {\n emitter: TypedEventEmitter<MessagesCallbacks>;\n };\n};\n\n/** @beta */\nexport enum MessagesEvent {\n /**\n * Emits when a new message is received from a participant\n * args: (message: ReceivedMessage)\n */\n MessageReceived = 'messageReceived',\n}\n\n/** @beta */\nexport type MessagesCallbacks = {\n [MessagesEvent.MessageReceived]: (message: ReceivedMessage) => void;\n};\n\n/** @beta */\nexport function useSessionMessages(session?: UseSessionReturn): UseSessionMessagesReturn {\n const { room } = useEnsureSession(session);\n\n const emitter = React.useMemo(\n () => new EventEmitter() as TypedEventEmitter<MessagesCallbacks>,\n [],\n );\n\n const agent = useAgent(session);\n\n const transcriptions: Array<TextStreamData> = useTranscriptions({ room });\n const chatOptions = React.useMemo(() => ({ room }), [room]);\n const chat = useChat(chatOptions);\n\n const transcriptionMessages: Array<\n ReceivedUserTranscriptionMessage | ReceivedAgentTranscriptionMessage\n > = React.useMemo(() => {\n return transcriptions.map((transcription) => {\n switch (transcription.participantInfo.identity) {\n case room.localParticipant.identity:\n return {\n type: 'userTranscript',\n message: transcription.text,\n\n id: transcription.streamInfo.id,\n timestamp: transcription.streamInfo.timestamp,\n from: room.localParticipant,\n };\n\n case agent.internal.agentParticipant?.identity:\n case agent.internal.workerParticipant?.identity:\n return {\n type: 'agentTranscript',\n message: transcription.text,\n\n id: transcription.streamInfo.id,\n timestamp: transcription.streamInfo.timestamp,\n from:\n agent.internal.agentParticipant?.identity === transcription.participantInfo.identity\n ? agent.internal.agentParticipant\n : agent.internal.workerParticipant!,\n };\n\n default:\n // FIXME: what should happen if an associated participant is not found?\n //\n // For now, just assume it is an agent transcription, since maybe it is from an agent\n // which disconencted from the room or something like that.\n return {\n type: 'agentTranscript',\n message: transcription.text,\n\n id: transcription.streamInfo.id,\n timestamp: transcription.streamInfo.timestamp,\n from: Array.from(room.remoteParticipants.values()).find(\n (p) => p.identity === transcription.participantInfo.identity,\n ),\n };\n }\n });\n }, [transcriptions, room]);\n\n const receivedMessages = React.useMemo(() => {\n const merged: Array<ReceivedMessage> = [...transcriptionMessages, ...chat.chatMessages];\n return merged;\n }, [transcriptionMessages, chat.chatMessages]);\n\n const messageFirstReceivedTimeMapRef = React.useRef(new Map<ReceivedMessage['id'], Date>());\n const sortedReceivedMessages = React.useMemo(() => {\n const now = new Date();\n for (const message of receivedMessages) {\n if (messageFirstReceivedTimeMapRef.current.has(message.id)) {\n continue;\n }\n\n messageFirstReceivedTimeMapRef.current.set(message.id, now);\n }\n\n return receivedMessages.sort((a, b) => {\n const aFirstReceivedAt = messageFirstReceivedTimeMapRef.current.get(a.id);\n const bFirstReceivedAt = messageFirstReceivedTimeMapRef.current.get(b.id);\n if (typeof aFirstReceivedAt === 'undefined' || typeof bFirstReceivedAt === 'undefined') {\n return 0;\n }\n\n return aFirstReceivedAt.getTime() - bFirstReceivedAt.getTime();\n });\n }, [receivedMessages]);\n\n const previouslyReceivedMessageIdsRef = React.useRef(new Set());\n React.useEffect(() => {\n for (const message of sortedReceivedMessages) {\n if (previouslyReceivedMessageIdsRef.current.has(message.id)) {\n continue;\n }\n\n previouslyReceivedMessageIdsRef.current.add(message.id);\n emitter.emit(MessagesEvent.MessageReceived, message);\n }\n }, [sortedReceivedMessages]);\n\n return React.useMemo(\n () => ({\n messages: sortedReceivedMessages,\n send: chat.send,\n isSending: chat.isSending,\n internal: { emitter },\n }),\n [sortedReceivedMessages, chat.send, chat.isSending],\n );\n}\n"],"names":["useLatest","current","storedValue","React","useResizeObserver","target","callback","resizeObserver","getResizeObserver","storedCallback","didUnsubscribe","targetEl","cb","entry","observer","createResizeObserver","ticking","allEntries","callbacks","entries","obs","triggered","i","cbs","cbIndex","_resizeObserver","useSize","size","setSize","width","height","resizeCallback","useObservableState","observable","startWith","resetWhenObservableChanges","state","setState","subscription","useMediaQuery","query","getMatches","matches","setMatches","handleChange","matchMedia","useAudioPlayback","room","roomEnsured","useEnsureRoom","startAudio","roomAudioPlaybackAllowedObservable","canPlayAudio","useClearPinButton","props","dispatch","useLayoutContext","className","setupClearPinButton","mergeProps","useConnectionQualityIndicator","options","p","useEnsureParticipant","connectionQualityObserver","setupConnectionQualityIndicator","quality","useConnectionState","r","connectionStateObserver","useDataChannel","topicOrCallback","onMessage","topic","useRoomContext","send","messageObservable","isSendingObservable","setupDataMessageHandler","message","isSending","useDisconnectButton","connectionState","disconnect","setupDisconnectButton","ConnectionState","useFacingMode","trackReference","LocalTrackPublication","localTrack","facingMode","facingModeFromLocalTrack","useFocusToggle","trackRef","useEnsureTrackRef","layoutContext","useMaybeLayoutContext","setupFocusToggle","inFocus","isTrackReferencePinned","event","_a","_c","_b","_e","_d","useGridLayout","gridElement","trackCount","gridLayouts","GRID_LAYOUTS","layout","selectGridLayout","useIsMuted","sourceOrTrackRef","passedParticipant","ref","isMuted","setIsMuted","listener","mutedObserver","getTrackReferenceId","useIsSpeaking","participant","createIsSpeakingObserver","useLocalParticipant","localParticipant","setLocalParticipant","isMicrophoneEnabled","setIsMicrophoneEnabled","isCameraEnabled","setIsCameraEnabled","isScreenShareEnabled","setIsScreenShareEnabled","lastMicrophoneError","setLastMicrophoneError","lastCameraError","setLastCameraError","microphoneTrack","setMicrophoneTrack","cameraTrack","setCameraTrack","handleUpdate","media","observeParticipantMedia","useLocalParticipantPermissions","permissionObserver","participantPermissionObserver","useMediaDeviceSelect","kind","track","requestPermissions","onError","roomContext","useMaybeRoomContext","roomFallback","Room","deviceObserver","createMediaDeviceObserver","devices","currentDeviceId","setCurrentDeviceId","activeDeviceObservable","setActiveMediaDevice","setupDeviceSelector","deviceId","log","useMediaDevices","useVisualStableUpdate","trackReferences","maxItemsOnPage","lastTrackRefs","lastMaxItemsOnPage","layoutChanged","sortedTrackRefs","sortTrackReferences","updatedTrackRefs","updatePages","error","usePagination","itemPerPage","currentPage","setCurrentPage","totalPageCount","lastItemIndex","firstItemIndex","changePage","direction","goToPage","num","tracksOnPage","useParticipantInfo","useMaybeParticipantContext","infoObserver","participantInfoObserver","identity","name","metadata","useParticipantPermissions","useParticipantTile","onParticipantClick","disableSpeakingIndicator","htmlProps","mergedProps","setupParticipantTile","micTrack","Track","micRef","isVideoMuted","isAudioMuted","isSpeaking","useRemoteParticipants","participants","setParticipants","connectedParticipantsObserver","useParticipants","remoteParticipants","usePinnedTracks","useEnsureLayoutContext","useRemoteParticipant","identityOrIdentifier","updateOnlyOn","connectedParticipantObserver","participantByIdentifierObserver","participantWrapper","setParticipantWrapper","useRoomInfo","roomInfoObserver","useSpeakingParticipants","ensuredRoom","speakerObserver","activeSpeakerObserver","useSortedParticipants","sortedParticipants","setSortedParticipants","sortParticipants","activeSpeakers","useStartAudio","handleStartAudioPlayback","setupStartAudio","useStartVideo","roomVideoPlaybackAllowedObservable","handleStartVideoPlayback","setupStartVideo","canPlayVideo","useSwipe","element","touchStart","touchEnd","minSwipeDistance","onTouchStart","onTouchMove","onTouchEnd","distance","isLeftSwipe","isRightSwipe","elementCopy","useChatToggle","setupChatToggle","useToken","tokenEndpoint","roomName","token","setToken","params","res","accessToken","useTrackMutedIndicator","mediaMutedObserver","setupTrackMutedIndicator","useTrackToggle","source","onChange","initialState","captureOptions","publishOptions","onDeviceError","rest","roomFromContext","userInteractionRef","toggle","pendingObserver","enabledObserver","setupMediaToggle","setupManualToggle","pending","enabled","newProps","clickHandler","evt","useTracks","sources","setTrackReferences","sources_","s","isSourceWitOptions","trackReferencesObservable","isSourcesWithOptions","requirePlaceholder","requiredPlaceholders","trackReferencesWithPlaceholders","placeholderSource","publication","placeholder","difference","setA","setB","_difference","elem","placeholderMap","sourcesThatNeedPlaceholder","sourceWithOption","sourcesOfSubscribedTracks","pub","trackSource","placeholderNeededForThisParticipant","useTrackRefBySourceOrName","setPublication","getTrackByIdentifier","trackObserver","setupMediaTrack","useTrackByName","useChat","isDisconnected","setup","setupChat","chatMessages","usePersistentUserChoices","userChoices","setSettings","loadUserChoices","saveAudioInputEnabled","isEnabled","prev","saveVideoInputEnabled","saveAudioInputDeviceId","saveVideoInputDeviceId","saveUsername","username","saveUserChoices","useIsEncrypted","encryptionStatusObservable","useTrackVolume","trackOrTrackReference","isTrackReference","volume","setVolume","cleanup","analyser","createAudioAnalyser","bufferLength","dataArray","interval","sum","a","normalizeFrequencies","frequencies","normalizeDb","value","db","multibandDefaults","useMultibandTrackVolume","opts","frequencyBands","setFrequencyBands","val","normalizedFrequencies","totalBins","chunks","startIndex","endIndex","chunk","chunkLength","summedVolumes","acc","waveformDefaults","useAudioWaveform","aggregateWave","timeRef","updates","bars","setBars","onUpdate","wave","filterData","v","getFFTSizeValue","update","updateWaveform","newData","x","pow2ceil","audioData","numSamples","blockSize","filteredData","blockStart","j","useParticipantTracks","optionsOrParticipantIdentity","participantIdentity","participantContext","participantTracksObservable","useTrackSyncTime","trackSyncTimeObserver","TRACK_TRANSCRIPTION_DEFAULTS","useTrackTranscription","segments","setSegments","syncTimestamps","handleSegmentMessage","newSegments","prevSegments","dedupeSegments","addTimestampsToTranscription","trackTranscriptionObserver","useParticipantAttributes","attributeObserver","participantAttributesObserver","useParticipantAttribute","attributeKey","attribute","setAttribute","state_attribute","ParticipantAgentAttributes","useVoiceAssistant","agent","ParticipantKind","worker","agentTracks","workerTracks","audioTrack","t","videoTrack","agentTranscriptions","attributes","useIsRecording","recordingStatusObservable","useTextStream","textStreamData","setupTextStream","useTranscriptions","participantIdentities","trackSids","textStreams","DataTopic","stream","CONNECT_DISCONNECT_WARNING_THRESHOLD_QUANTITY","CONNECT_DISCONNECT_WARNING_THRESHOLD_MS","ROOM_CHANGE_WARNING_THRESHOLD_QUANTITY","ROOM_CHANGE_WARNING_THRESHOLD_MS","useSequentialRoomConnectDisconnect","connectDisconnectQueueRef","useRef","processConnectsAndDisconnectsLock","useMemo","Mutex","processConnectsAndDisconnects","useCallback","unlock","roomChangedTimesRef","checkRoomThreshold","now","roomChangesInThreshold","isWithinThreshold","useEffect","connectDisconnectEnqueueTimes","checkConnectDisconnectThreshold","connectDisconnectsInThreshold","connect","args","resolve","reject","R","ReflectApply","receiver","ReflectOwnKeys","ProcessEmitWarning","warning","NumberIsNaN","EventEmitter","eventsModule","once","defaultMaxListeners","checkListener","arg","n","_getMaxListeners","that","type","doError","events","er","err","handler","len","listeners","arrayClone","_addListener","prepend","m","existing","w","onceWrapper","_onceWrap","wrapped","list","position","originalListener","spliceOne","keys","key","_listeners","unwrap","evlistener","unwrapListeners","emitter","listenerCount","arr","copy","index","ret","errorListener","resolver","eventTargetAgnosticAddListener","addErrorHandlerIfEventEmitter","flags","wrapListener","DEFAULT_AGENT_CONNECT_TIMEOUT_MILLISECONDS","AgentEvent","generateDerivedStateValues","useAgentTimeoutIdStore","agentTimeoutFailureReason","setAgentTimeoutFailureReason","agentTimeoutId","setAgentTimeoutId","agentStateRef","agentParticipantExistsRef","startAgentConnectedTimeout","agentConnectTimeoutMilliseconds","isConnected","agentState","agentParticipantExists","useAgentWaitUntilDerivedStates","stateRef","waitUntilConnected","signal","stateChangedHandler","abortHandler","waitUntilCouldBeListening","canListen","waitUntilFinished","isFinished","useAgent","session","sessionFromContext","useMaybeSessionContext","startAgentTimeout","clearAgentTimeout","clearAgentTimeoutFailureReason","updateAgentTimeoutState","updateAgentTimeoutParticipantExists","roomRemoteParticipants","agentParticipant","workerParticipant","agentParticipantAttributes","setAgentParticipantAttributes","handleAttributesChanged","ParticipantEvent","roomConnectionState","setRoomConnectionState","handleConnectionStateChanged","RoomEvent","agentDisconnectedFailureReason","setAgentDisconnectedFailureReason","onParticipantDisconnect","localMicTrack","setLocalMicTrack","handleLocalParticipantTrackPublished","handleLocalParticipantTrackUnPublished","failureReasons","reasons","isSessionDisconnected","agentParticipantIdentity","agentParticipantName","agentParticipantMetadata","common","waitUntilCamera","camera","waitUntilMicrophone","microphone","SessionEvent","areTokenSourceFetchOptionsEqual","b","allKeysSet","exhaustiveCheckedKey","useSessionWaitUntilConnectionState","connectionStateRef","onceEventOccurred","newState","useSessionTokenSourceFetch","tokenSource","unstableRestOptions","isConfigurable","TokenSourceConfigurable","memoizedTokenFetchOptionsRef","useSession","optionsRoom","restOptions","generateDerivedConnectionStateValues","handleMediaDevicesError","handleEncryptionError","cameraPublication","localCamera","microphonePublication","localMicrophone","screenSharePublication","localScreenShare","sessionInternal","conversationState","waitUntilConnectionState","waitUntilDisconnected","tokenSourceFetch","start","connectOptions","tracks","roomConnectOptions","onSignalAbort","tokenDispatchesAgent","serverUrl","participantToken","decodeTokenPayload","_f","end","prepareConnection","credentials","useEvents","instance","handlerFn","dependencies","fallback","wrappedCallback","MessagesEvent","useSessionMessages","useEnsureSession","transcriptions","chatOptions","chat","transcriptionMessages","transcription","receivedMessages","messageFirstReceivedTimeMapRef","sortedReceivedMessages","aFirstReceivedAt","bFirstReceivedAt","previouslyReceivedMessageIdsRef"],"mappings":";;;;;AAIA,MAAMA,KAAY,CAAIC,MAAe;AACnC,QAAMC,IAAcC,EAAM,OAAOF,CAAO;AACxC,SAAAE,EAAM,UAAU,MAAM;AACpB,IAAAD,EAAY,UAAUD;AAAA,EACxB,CAAC,GACMC;AACT;AAQO,SAASE,GACdC,GACAC,GACA;AACA,QAAMC,IAAiBC,GAAA,GACjBC,IAAiBT,GAAUM,CAAQ;AAEzC,SAAAH,EAAM,gBAAgB,MAAM;AAC1B,QAAIO,IAAiB;AAErB,UAAMC,IAAWN,EAAO;AACxB,QAAI,CAACM,EAAU;AAEf,aAASC,EAAGC,GAA4BC,GAA0B;AAChE,MAAIJ,KACJD,EAAe,QAAQI,GAAOC,CAAQ;AAAA,IACxC;AAEA,WAAAP,KAAA,QAAAA,EAAgB,UAAUI,GAAyBC,IAE5C,MAAM;AACX,MAAAF,IAAiB,IACjBH,KAAA,QAAAA,EAAgB,YAAYI,GAAyBC;AAAA,IACvD;AAAA,EACF,GAAG,CAACP,EAAO,SAASE,GAAgBE,CAAc,CAAC,GAE5CF,KAAA,gBAAAA,EAAgB;AACzB;AAEA,SAASQ,KAAuB;AAC9B,MAAIC,IAAU,IACVC,IAAoC,CAAA;AAExC,QAAMC,wBAAgE,IAAA;AAEtE,MAAI,OAAO,SAAW;AACpB;AAGF,QAAMJ,IAAW,IAAI,eAAe,CAACK,GAAgCC,MAAwB;AAC3F,IAAAH,IAAaA,EAAW,OAAOE,CAAO,GACjCH,KACH,OAAO,sBAAsB,MAAM;AACjC,YAAMK,wBAAgB,IAAA;AACtB,eAASC,IAAI,GAAGA,IAAIL,EAAW,QAAQK,KAAK;AAC1C,YAAID,EAAU,IAAIJ,EAAWK,CAAC,EAAE,MAAM,EAAG;AACzC,QAAAD,EAAU,IAAIJ,EAAWK,CAAC,EAAE,MAAM;AAClC,cAAMC,IAAML,EAAU,IAAID,EAAWK,CAAC,EAAE,MAAM;AAC9C,QAAAC,KAAA,QAAAA,EAAK,QAAQ,CAACX,MAAOA,EAAGK,EAAWK,CAAC,GAAGF,CAAG;AAAA,MAC5C;AACA,MAAAH,IAAa,CAAA,GACbD,IAAU;AAAA,IACZ,CAAC,GAEHA,IAAU;AAAA,EACZ,CAAC;AAED,SAAO;AAAA,IACL,UAAAF;AAAA,IACA,UAAUT,GAAqBC,GAAqC;AAClE,MAAAQ,EAAS,QAAQT,CAAM;AACvB,YAAMkB,IAAML,EAAU,IAAIb,CAAM,KAAK,CAAA;AACrC,MAAAkB,EAAI,KAAKjB,CAAQ,GACjBY,EAAU,IAAIb,GAAQkB,CAAG;AAAA,IAC3B;AAAA,IACA,YAAYlB,GAAqBC,GAAqC;AACpE,YAAMiB,IAAML,EAAU,IAAIb,CAAM,KAAK,CAAA;AACrC,UAAIkB,EAAI,WAAW,GAAG;AACpB,QAAAT,EAAS,UAAUT,CAAM,GACzBa,EAAU,OAAOb,CAAM;AACvB;AAAA,MACF;AACA,YAAMmB,IAAUD,EAAI,QAAQjB,CAAQ;AACpC,MAAIkB,MAAY,MAAID,EAAI,OAAOC,GAAS,CAAC,GACzCN,EAAU,IAAIb,GAAQkB,CAAG;AAAA,IAC3B;AAAA,EAAA;AAEJ;AAEA,IAAIE;AAEJ,MAAMjB,KAAoB,MACvBiB,OAAmBA,KAAkBV,OAO3BW,KAAU,CAACrB,MAA4C;AAClE,QAAM,CAACsB,GAAMC,CAAO,IAAIzB,EAAM,SAAS,EAAE,OAAO,GAAG,QAAQ,GAAG;AAC9D,EAAAA,EAAM,gBAAgB,MAAM;AAC1B,QAAIE,EAAO,SAAS;AAClB,YAAM,EAAE,OAAAwB,GAAO,QAAAC,EAAA,IAAWzB,EAAO,QAAQ,sBAAA;AACzC,MAAAuB,EAAQ,EAAE,OAAAC,GAAO,QAAAC,GAAQ;AAAA,IAC3B;AAAA,EACF,GAAG,CAACzB,EAAO,OAAO,CAAC;AAEnB,QAAM0B,IAAiB5B,EAAM;AAAA,IAC3B,CAACU,MAA+Be,EAAQf,EAAM,WAAW;AAAA,IACzD,CAAA;AAAA,EAAC;AAGH,SAAAT,GAAkBC,GAAQ0B,CAAc,GACjCJ;AACT;ACpHO,SAASK,EACdC,GACAC,GACAC,IAA6B,IAC7B;AACA,QAAM,CAACC,GAAOC,CAAQ,IAAIlC,EAAM,SAAY+B,CAAS;AACrD,SAAA/B,EAAM,UAAU,MAAM;AAKpB,QAJIgC,KACFE,EAASH,CAAS,GAGhB,OAAO,SAAW,OAAe,CAACD,EAAY;AAClD,UAAMK,IAAeL,EAAW,UAAUI,CAAQ;AAClD,WAAO,MAAMC,EAAa,YAAA;AAAA,EAC5B,GAAG,CAACL,GAAYE,CAA0B,CAAC,GACpCC;AACT;ACjBO,SAASG,GAAcC,GAAwB;AACpD,QAAMC,IAAa,CAACD,MAEd,OAAO,SAAW,MACb,OAAO,WAAWA,CAAK,EAAE,UAE3B,IAGH,CAACE,GAASC,CAAU,IAAIxC,EAAM,SAAkBsC,EAAWD,CAAK,CAAC;AAEvE,WAASI,IAAe;AACtB,IAAAD,EAAWF,EAAWD,CAAK,CAAC;AAAA,EAC9B;AAEA,SAAArC,EAAM,UAAU,MAAM;AACpB,UAAM0C,IAAa,OAAO,WAAWL,CAAK;AAG1C,WAAAI,EAAA,GAGIC,EAAW,cACbA,EAAW,YAAYD,CAAY,IAEnCC,EAAW,iBAAiB,UAAUD,CAAY,GAG7C,MAAM;AACX,MAAIC,EAAW,iBACbA,EAAW,eAAeD,CAAY,IAEtCC,EAAW,oBAAoB,UAAUD,CAAY;AAAA,IAEzD;AAAA,EAEF,GAAG,CAACJ,CAAK,CAAC,GAEHE;AACT;AC9BO,SAASI,GAAiBC,GAG/B;AACA,QAAMC,IAAcC,EAAcF,CAAI,GAChCG,IAAa/C,EAAM,YAAY,YAAY;AAC/C,UAAM6C,EAAY,WAAA;AAAA,EACpB,GAAG,CAACA,CAAW,CAAC,GAEVf,IAAa9B,EAAM;AAAA,IACvB,MAAMgD,GAAmCH,CAAW;AAAA,IACpD,CAACA,CAAW;AAAA,EAAA,GAER,EAAE,cAAAI,EAAA,IAAiBpB,EAAmBC,GAAY;AAAA,IACtD,cAAce,EAAY;AAAA,EAAA,CAC3B;AAED,SAAO,EAAE,cAAAI,GAAc,YAAAF,EAAA;AACzB;ACrBO,SAASG,GAAkBC,GAA4B;AAC5D,QAAM,EAAE,OAAAlB,GAAO,UAAAmB,MAAaC,KAAmB;AAc/C,SAAO,EAAE,aAZWrD,EAAM,QAAQ,MAAM;AACtC,UAAM,EAAE,WAAAsD,EAAA,IAAcC,GAAA;AAQtB,WAPoBC,EAAWL,GAAO;AAAA,MACpC,WAAAG;AAAA,MACA,UAAU,EAACrB,KAAA,QAAAA,EAAO;AAAA,MAClB,SAAS,MAAM;AACb,QAAImB,KAAUA,EAAS,EAAE,KAAK,aAAa;AAAA,MAC7C;AAAA,IAAA,CACD;AAAA,EAEH,GAAG,CAACD,GAAOC,GAAUnB,CAAK,CAAC,EAElB;AACX;ACPO,SAASwB,GAA8BC,IAA6C,IAAI;AAC7F,QAAMC,IAAIC,EAAqBF,EAAQ,WAAW,GAE5C,EAAE,WAAAJ,GAAW,2BAAAO,EAAA,IAA8B7D,EAAM;AAAA,IACrD,MAAM8D,GAAgCH,CAAC;AAAA,IACvC,CAACA,CAAC;AAAA,EAAA,GAGEI,IAAUlC,EAAmBgC,GAA2BF,EAAE,iBAAiB;AAEjF,SAAO,EAAE,WAAAL,GAAW,SAAAS,EAAA;AACtB;ACjBO,SAASC,GAAmBpB,GAAa;AAE9C,QAAMqB,IAAInB,EAAcF,CAAI,GACtBd,IAAa9B,EAAM,QAAQ,MAAMkE,GAAwBD,CAAC,GAAG,CAACA,CAAC,CAAC;AAEtE,SADwBpC,EAAmBC,GAAYmC,EAAE,KAAK;AAEhE;AC8BO,SAASE,GACdC,GACAjE,GACA;AACA,QAAMkE,IAAY,OAAOD,KAAoB,aAAaA,IAAkBjE,GAEtEmE,IAAQ,OAAOF,KAAoB,WAAWA,IAAkB,QAChExB,IAAO2B,GAAA,GACP,EAAE,MAAAC,GAAM,mBAAAC,GAAmB,qBAAAC,EAAA,IAAwB1E,EAAM;AAAA,IAC7D,MAAM2E,GAAwB/B,GAAM0B,GAAOD,CAAS;AAAA,IACpD,CAACzB,GAAM0B,GAAOD,CAAS;AAAA,EAAA,GAGnBO,IAAU/C,EAAmB4C,GAAmB,MAAS,GACzDI,IAAYhD,EAAmB6C,GAAqB,EAAK;AAE/D,SAAO;AAAA,IACL,SAAAE;AAAA,IACA,MAAAJ;AAAA,IACA,WAAAK;AAAA,EAAA;AAEJ;ACpDO,SAASC,GAAoB3B,GAA8B;AAChE,QAAMP,IAAO2B,GAAA,GACPQ,IAAkBf,GAAmBpB,CAAI;AAY/C,SAAO,EAAE,aAVW5C,EAAM,QAAQ,MAAM;AACtC,UAAM,EAAE,WAAAsD,GAAW,YAAA0B,MAAeC,GAAsBrC,CAAI;AAM5D,WALoBY,EAAWL,GAAO;AAAA,MACpC,WAAAG;AAAA,MACA,SAAS,MAAM0B,EAAW7B,EAAM,cAAc,EAAI;AAAA,MAClD,UAAU4B,MAAoBG,EAAgB;AAAA,IAAA,CAC/C;AAAA,EAEH,GAAG,CAACtC,GAAMO,GAAO4B,CAAe,CAAC,EAExB;AACX;ACzBO,SAASI,GACdC,GACyD;AACzD,MAAIA,EAAe,uBAAuBC,IAAuB;AAC/D,UAAMC,IAAaF,EAAe,YAAY;AAC9C,QAAIE,GAAY;AACd,YAAM,EAAE,YAAAC,EAAA,IAAeC,GAAyBF,CAAU;AAC1D,aAAOC;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;ACEO,SAASE,GAAe,EAAE,UAAAC,GAAU,OAAAvC,KAA8B;AACvE,QAAMiC,IAAiBO,GAAkBD,CAAQ,GAE3CE,IAAgBC,GAAA,GAChB,EAAE,WAAAvC,MAActD,EAAM,QAAQ,MAAM8F,GAAA,GAAoB,EAAE,GAE1DC,IAAmB/F,EAAM,QAAQ,MAC9BgG,GAAuBZ,GAAgBQ,KAAA,gBAAAA,EAAe,IAAI,KAAK,GACrE,CAACR,GAAgBQ,KAAA,gBAAAA,EAAe,IAAI,KAAK,CAAC;AA0B7C,SAAO,EAAE,aAxBW5F,EAAM;AAAA,IACxB,MACEwD,EAAWL,GAAO;AAAA,MAChB,WAAAG;AAAA,MACA,SAAS,CAAC2C,MAA2D;;AAEnE,SAAAC,IAAA/C,EAAM,YAAN,QAAA+C,EAAA,KAAA/C,GAAgB8C,IAGZF,KACFI,IAAAP,KAAA,iBAAAQ,IAAAR,EAAe,KAAI,aAAnB,QAAAO,EAAA,KAAAC,GAA8B;AAAA,UAC5B,KAAK;AAAA,QAAA,MAGPC,IAAAT,KAAA,iBAAAU,IAAAV,EAAe,KAAI,aAAnB,QAAAS,EAAA,KAAAC,GAA8B;AAAA,UAC5B,KAAK;AAAA,UACL,gBAAAlB;AAAA,QAAA;AAAA,MAGN;AAAA,IAAA,CACD;AAAA,IACH,CAACjC,GAAOG,GAAW8B,GAAgBW,GAASH,KAAA,gBAAAA,EAAe,GAAG;AAAA,EAAA,GAG1C,SAAAG,EAAA;AACxB;ACxCO,SAASQ,GAEdC,GAEAC,GACA/C,IAEI,CAAA,GACyE;AAC7E,QAAMgD,IAAchD,EAAQ,eAAeiD,IACrC,EAAE,OAAAjF,GAAO,QAAAC,MAAWJ,GAAQiF,CAAW,GACvCI,IAASC,GAAiBH,GAAaD,GAAY/E,GAAOC,CAAM;AAEtE,SAAA3B,EAAM,UAAU,MAAM;AACpB,IAAIwG,EAAY,WAAWI,MACzBJ,EAAY,QAAQ,MAAM,YAAY,kBAAkBI,KAAA,gBAAAA,EAAQ,QAAQ,UAAU,GAClFJ,EAAY,QAAQ,MAAM,YAAY,kBAAkBI,KAAA,gBAAAA,EAAQ,KAAK,UAAU;AAAA,EAEnF,GAAG,CAACJ,GAAaI,CAAM,CAAC,GAEjB;AAAA,IACL,QAAAA;AAAA,IACA,gBAAgBlF;AAAA,IAChB,iBAAiBC;AAAA,EAAA;AAErB;ACdO,SAASmF,GACdC,GACArD,IAA6B,IAC7B;;AACA,QAAMsD,IACJ,OAAOD,KAAqB,WAAWrD,EAAQ,cAAcqD,EAAiB,aAC1EpD,IAAIC,EAAqBoD,CAAiB,GAC1CC,IACJ,OAAOF,KAAqB,WACxB,EAAE,aAAapD,GAAG,QAAQoD,EAAA,IAC1BA,GACA,CAACG,GAASC,CAAU,IAAInH,EAAM;AAAA,IAClC,CAAC,GAAEkG,IAAAe,EAAI,gBAAJ,QAAAf,EAAiB,YAAWE,IAAAzC,EAAE,oBAAoBsD,EAAI,MAAM,MAAhC,QAAAb,EAAmC;AAAA,EAAA;AAGpE,SAAApG,EAAM,UAAU,MAAM;AACpB,UAAMoH,IAAWC,GAAcJ,CAAG,EAAE,UAAUE,CAAU;AACxD,WAAO,MAAMC,EAAS,YAAA;AAAA,EACxB,GAAG,CAACE,GAAoBL,CAAG,CAAC,CAAC,GAEtBC;AACT;ACpCO,SAASK,GAAcC,GAA2B;AACvD,QAAM7D,IAAIC,EAAqB4D,CAAW,GACpC1F,IAAa9B,EAAM,QAAQ,MAAMyH,GAAyB9D,CAAC,GAAG,CAACA,CAAC,CAAC;AAGvE,SAFmB9B,EAAmBC,GAAY6B,EAAE,UAAU;AAGhE;ACIO,SAAS+D,GAAoBhE,IAAsC,IAAI;AAC5E,QAAMd,IAAOE,EAAcY,EAAQ,IAAI,GACjC,CAACiE,GAAkBC,CAAmB,IAAI5H,EAAM,SAAS4C,EAAK,gBAAgB,GAE9E,CAACiF,GAAqBC,CAAsB,IAAI9H,EAAM;AAAA,IAC1D2H,EAAiB;AAAA,EAAA,GAEb,CAACI,GAAiBC,CAAkB,IAAIhI,EAAM,SAAS2H,EAAiB,eAAe,GACvF,CAACM,GAAsBC,CAAuB,IAAIlI,EAAM;AAAA,IAC5D2H,EAAiB;AAAA,EAAA,GAGb,CAACQ,GAAqBC,CAAsB,IAAIpI,EAAM;AAAA,IAC1D2H,EAAiB;AAAA,EAAA,GAEb,CAACU,GAAiBC,CAAkB,IAAItI,EAAM,SAAS2H,EAAiB,eAAe,GAEvF,CAACY,GAAiBC,CAAkB,IAAIxI,EAAM;AAAA,IAClD;AAAA,EAAA,GAEI,CAACyI,GAAaC,CAAc,IAAI1I,EAAM,SAAuC,MAAS,GAEtF2I,IAAe,CAACC,MAA8C;AAClE,IAAAZ,EAAmBY,EAAM,eAAe,GACxCd,EAAuBc,EAAM,mBAAmB,GAChDV,EAAwBU,EAAM,oBAAoB,GAClDF,EAAeE,EAAM,WAAW,GAChCJ,EAAmBI,EAAM,eAAe,GACxCR,EAAuBQ,EAAM,YAAY,mBAAmB,GAC5DN,EAAmBM,EAAM,YAAY,eAAe,GACpDhB,EAAoBgB,EAAM,WAAW;AAAA,EACvC;AACA,SAAA5I,EAAM,UAAU,MAAM;AACpB,UAAMoH,IAAWyB,GAAwBjG,EAAK,gBAAgB,EAAE,UAAU+F,CAAY;AAEtF,WAAO,MAAMvB,EAAS,YAAA;AAAA,EACxB,GAAG,CAACxE,CAAI,CAAC,GAEF;AAAA,IACL,qBAAAiF;AAAA,IACA,sBAAAI;AAAA,IACA,iBAAAF;AAAA,IACA,iBAAAQ;AAAA,IACA,aAAAE;AAAA,IACA,qBAAAN;AAAA,IACA,iBAAAE;AAAA,IACA,kBAAAV;AAAA,EAAA;AAEJ;ACzDO,SAASmB,KAAoE;AAClF,QAAMlG,IAAO2B,GAAA,GACPwE,IAAqB/I,EAAM;AAAA,IAC/B,MAAMgJ,GAA8BpG,EAAK,gBAAgB;AAAA,IACzD,CAACA,CAAI;AAAA,EAAA;AAGP,SADoBf,EAAmBkH,GAAoBnG,EAAK,iBAAiB,WAAW;AAE9F;ACiBO,SAASqG,GAAqB;AAAA,EACnC,MAAAC;AAAA,EACA,MAAAtG;AAAA,EACA,OAAAuG;AAAA,EACA,oBAAAC;AAAA,EACA,SAAAC;AACF,GAA8B;AAC5B,QAAMC,IAAcC,GAAA,GAEdC,IAAexJ,EAAM,QAAQ,MAAM4C,KAAQ0G,KAAe,IAAIG,GAAA,GAAQ,CAAC7G,GAAM0G,CAAW,CAAC,GAGzFI,IAAiB1J,EAAM;AAAA,IAC3B,MAAM2J,GAA0BT,GAAMG,GAASD,CAAkB;AAAA,IACjE,CAACF,GAAME,GAAoBC,CAAO;AAAA,EAAA,GAE9BO,IAAU/H,EAAmB6H,GAAgB,EAAuB,GAEpE,CAACG,GAAiBC,CAAkB,IAAI9J,EAAM;AAAA,KAClDwJ,KAAA,gBAAAA,EAAc,gBAAgBN,OAAS;AAAA,EAAA,GAEnC,EAAE,WAAA5F,GAAW,wBAAAyG,GAAwB,sBAAAC,EAAA,IAAyBhK,EAAM;AAAA,IACxE,MAAMiK,GAAoBf,GAAMM,CAAY;AAAA,IAC5C,CAACN,GAAMM,GAAcL,CAAK;AAAA,EAAA;AAG5B,SAAAnJ,EAAM,UAAU,MAAM;AACpB,UAAMoH,IAAW2C,EAAuB,UAAU,CAACG,MAAa;AAC9D,MAAKA,MAGLC,EAAI,KAAK,sBAAsBD,CAAQ,GACvCJ,EAAmBI,CAAQ;AAAA,IAC7B,CAAC;AACD,WAAO,MAAM;AACX,MAAA9C,KAAA,QAAAA,EAAU;AAAA,IACZ;AAAA,EACF,GAAG,CAAC2C,CAAsB,CAAC,GAEpB,EAAE,SAAAH,GAAS,WAAAtG,GAAW,gBAAgBuG,GAAiB,sBAAAG,EAAA;AAChE;AClEO,SAASI,GAAgB;AAAA,EAC9B,MAAAlB;AAAA,EACA,SAAAG;AACF,GAGG;AACD,QAAMK,IAAiB1J,EAAM;AAAA,IAC3B,MAAM2J,GAA0BT,GAAMG,CAAO;AAAA,IAC7C,CAACH,GAAMG,CAAO;AAAA,EAAA;AAGhB,SADgBxH,EAAmB6H,GAAgB,EAAuB;AAE5E;ACEO,SAASW,GAEdC,GACAC,GACA7G,IAAwC,CAAA,GACT;AAC/B,QAAM8G,IAAgBxK,EAAM,OAAsC,EAAE,GAC9DyK,IAAqBzK,EAAM,OAAe,EAAE,GAC5C0K,IAAgBH,MAAmBE,EAAmB,SAEtDE,IACJ,OAAOjH,EAAQ,sBAAuB,aAClCA,EAAQ,mBAAmB4G,CAAe,IAC1CM,GAAoBN,CAAe;AAEzC,MAAIO,IAAkD,CAAC,GAAGF,CAAe;AACzE,MAAID,MAAkB;AACpB,QAAI;AACF,MAAAG,IAAmBC,GAAYN,EAAc,SAASG,GAAiBJ,CAAc;AAAA,IACvF,SAASQ,GAAO;AACd,MAAAZ,EAAI,MAAM,uCAAuCY,CAAK;AAAA,IACxD;AAIF,SAAIL,IACFF,EAAc,UAAUG,IAExBH,EAAc,UAAUK,GAE1BJ,EAAmB,UAAUF,GAEtBM;AACT;AC/CO,SAASG,GAAcC,GAAqBX,GAAgD;AACjG,QAAM,CAACY,GAAaC,CAAc,IAAInL,EAAM,SAAS,CAAC,GAChDoL,IAAiB,KAAK,IAAI,KAAK,KAAKd,EAAgB,SAASW,CAAW,GAAG,CAAC;AAClF,EAAIC,IAAcE,KAChBD,EAAeC,CAAc;AAE/B,QAAMC,IAAgBH,IAAcD,GAC9BK,IAAiBD,IAAgBJ,GAEjCM,IAAa,CAACC,MAAmC;AACrD,IAAAL,EAAe,CAAClJ,MACVuJ,MAAc,SACZvJ,MAAUmJ,IACLnJ,IAEFA,IAAQ,IAEXA,MAAU,IACLA,IAEFA,IAAQ,CAElB;AAAA,EACH,GAEMwJ,IAAW,CAACC,MAAgB;AAChC,IAAIA,IAAMN,IACRD,EAAeC,CAAc,IACpBM,IAAM,IACfP,EAAe,CAAC,IAEhBA,EAAeO,CAAG;AAAA,EAEtB,GAIMC,IAFyBtB,GAAsBC,GAAiBW,CAAW,EAErC,MAAMK,GAAgBD,CAAa;AAE/E,SAAO;AAAA,IACL,gBAAAD;AAAA,IACA,UAAU,MAAMG,EAAW,MAAM;AAAA,IACjC,UAAU,MAAMA,EAAW,UAAU;AAAA,IACrC,SAASE;AAAA,IACT,gBAAAH;AAAA,IACA,eAAAD;AAAA,IACA,QAAQM;AAAA,IACR,aAAAT;AAAA,EAAA;AAEJ;AC3CO,SAASU,GAAmBzI,IAAmC,IAAI;AACxE,MAAIQ,IAAIkI,GAAA;AACR,EAAI1I,EAAM,gBACRQ,IAAIR,EAAM;AAEZ,QAAM2I,IAAe9L,EAAM,QAAQ,MAAM+L,GAAwBpI,CAAC,GAAG,CAACA,CAAC,CAAC,GAClE,EAAE,UAAAqI,GAAU,MAAAC,GAAM,UAAAC,EAAA,IAAarK,EAAmBiK,GAAc;AAAA,IACpE,MAAMnI,KAAA,gBAAAA,EAAG;AAAA,IACT,UAAUA,KAAA,gBAAAA,EAAG;AAAA,IACb,UAAUA,KAAA,gBAAAA,EAAG;AAAA,EAAA,CACd;AAED,SAAO,EAAE,UAAAqI,GAAU,MAAAC,GAAM,UAAAC,EAAA;AAC3B;ACbO,SAASC,GACdzI,IAA4C,IACT;AACnC,QAAMC,IAAIC,EAAqBF,EAAQ,WAAW,GAC5CqF,IAAqB/I,EAAM,QAAQ,MAAMgJ,GAA8BrF,CAAC,GAAG,CAACA,CAAC,CAAC;AAEpF,SADoB9B,EAAmBkH,GAAoBpF,EAAE,WAAW;AAE1E;ACDO,SAASyI,GAA0C;AAAA,EACxD,UAAA1G;AAAA,EACA,oBAAA2G;AAAA,EACA,0BAAAC;AAAA,EACA,WAAAC;AACF,GAA+B;AAC7B,QAAMnH,IAAiBO,GAAkBD,CAAQ,GAE3C8G,IAAcxM,EAAM,QAAQ,MAAM;AACtC,UAAM,EAAE,WAAAsD,EAAA,IAAcmJ,GAAA;AACtB,WAAOjJ,EAAW+I,GAAW;AAAA,MAC3B,WAAAjJ;AAAA,MACA,SAAS,CAAC2C,MAA2C;;AAEnD,aADAC,IAAAqG,EAAU,YAAV,QAAArG,EAAA,KAAAqG,GAAoBtG,IAChB,OAAOoG,KAAuB,YAAY;AAC5C,gBAAMlD,IACJ/D,EAAe,eACfA,EAAe,YAAY,oBAAoBA,EAAe,MAAM;AACtE,UAAAiH,EAAmB,EAAE,aAAajH,EAAe,aAAa,OAAA+D,GAAO;AAAA,QACvE;AAAA,MACF;AAAA,IAAA,CACD;AAAA,EACH,GAAG;AAAA,IACDoD;AAAA,IACAF;AAAA,IACAjH,EAAe;AAAA,IACfA,EAAe;AAAA,IACfA,EAAe;AAAA,EAAA,CAChB,GAEKsH,IAAWtH,EAAe,YAAY,oBAAoBuH,EAAM,OAAO,UAAU,GACjFC,IAAS5M,EAAM,QAAQ,OACpB;AAAA,IACL,aAAaoF,EAAe;AAAA,IAC5B,QAAQuH,EAAM,OAAO;AAAA,IACrB,aAAaD;AAAA,EAAA,IAEd,CAACA,GAAUtH,EAAe,WAAW,CAAC,GACnCyH,IAAe/F,GAAW1B,CAAc,GACxC0H,IAAehG,GAAW8F,CAAM,GAChCG,IAAaxF,GAAcnC,EAAe,WAAW,GACrDG,IAAaJ,GAAcC,CAAc;AAC/C,SAAO;AAAA,IACL,cAAc;AAAA,MACZ,uBAAuB0H;AAAA,MACvB,uBAAuBD;AAAA,MACvB,oBAAoBP,MAA6B,KAAO,KAAQS;AAAA,MAChE,6BAA6B3H,EAAe,YAAY;AAAA,MACxD,kBAAkBA,EAAe;AAAA,MACjC,uBAAuBG;AAAA,MACvB,GAAGiH;AAAA,IAAA;AAAA,EACL;AAEJ;AC/CO,SAASQ,GAAsBtJ,IAAwC,IAAI;AAChF,QAAMd,IAAOE,EAAcY,EAAQ,IAAI,GACjC,CAACuJ,GAAcC,CAAe,IAAIlN,EAAM,SAA8B,CAAA,CAAE;AAE9E,SAAAA,EAAM,UAAU,MAAM;AACpB,UAAMoH,IAAW+F,GAA8BvK,GAAM;AAAA,MACnD,sBAAsBc,EAAQ;AAAA,IAAA,CAC/B,EAAE,UAAUwJ,CAAe;AAC5B,WAAO,MAAM9F,EAAS,YAAA;AAAA,EACxB,GAAG,CAACxE,GAAM,KAAK,UAAUc,EAAQ,YAAY,CAAC,CAAC,GACxCuJ;AACT;ACXO,SAASG,GAAgB1J,IAAkC,IAAI;AACpE,QAAM2J,IAAqBL,GAAsBtJ,CAAO,GAClD,EAAE,kBAAAiE,EAAA,IAAqBD,GAAoBhE,CAAO;AAExD,SAAO1D,EAAM;AAAA,IACX,MAAM,CAAC2H,GAAkB,GAAG0F,CAAkB;AAAA,IAC9C,CAAC1F,GAAkB0F,CAAkB;AAAA,EAAA;AAEzC;AC1BO,SAASC,GAAgB1H,GAAkE;AAChG,SAAAA,IAAgB2H,GAAuB3H,CAAa,GAC7C5F,EAAM,QAAQ,OACf4F,KAAA,gBAAAA,EAAe,IAAI,WAAU,UAAaA,EAAc,IAAI,MAAM,UAAU,IACvEA,EAAc,IAAI,QAEpB,CAAA,GACN,CAACA,EAAc,IAAI,KAAK,CAAC;AAC9B;ACyBO,SAAS4H,GACdC,GACA/J,IAAuC,IACR;AAC/B,QAAMd,IAAO2B,GAAA,GACP,CAACmJ,CAAY,IAAI1N,EAAM,SAAS0D,EAAQ,YAAY,GAEpD5B,IAAa9B,EAAM,QAAQ,MAC3B,OAAOyN,KAAyB,WAC3BE,GAA6B/K,GAAM6K,GAAsB;AAAA,IAC9D,kBAAkBC;AAAA,EAAA,CACnB,IAEME,GAAgChL,GAAM6K,GAAsB;AAAA,IACjE,kBAAkBC;AAAA,EAAA,CACnB,GAEF,CAAC9K,GAAM,KAAK,UAAU6K,CAAoB,GAAGC,CAAY,CAAC,GAIvD,CAACG,GAAoBC,CAAqB,IAAI9N,EAAM,SAAS;AAAA,IACjE,GAAG;AAAA,EAAA,CACJ;AACD,SAAAA,EAAM,UAAU,MAAM;AACpB,UAAMoH,IAAWtF,EAAW,UAAU,CAAC6B,MAAMmK,EAAsB,EAAE,GAAAnK,EAAA,CAAG,CAAC;AACzE,WAAO,MAAMyD,EAAS,YAAA;AAAA,EACxB,GAAG,CAACtF,CAAU,CAAC,GAER+L,EAAmB;AAC5B;ACxDO,SAASE,GAAYrK,IAA8B,IAAI;AAC5D,QAAMd,IAAOE,EAAcY,EAAQ,IAAI,GACjCoI,IAAe9L,EAAM,QAAQ,MAAMgO,GAAiBpL,CAAI,GAAG,CAACA,CAAI,CAAC,GACjE,EAAE,MAAAqJ,GAAM,UAAAC,MAAarK,EAAmBiK,GAAc;AAAA,IAC1D,MAAMlJ,EAAK;AAAA,IACX,UAAUA,EAAK;AAAA,EAAA,CAChB;AAED,SAAO,EAAE,MAAAqJ,GAAM,UAAAC,EAAA;AACjB;ACXO,SAAS+B,GAAwBvK,GAA0C;AAChF,QAAMwK,IAAcpL,EAAcY,KAAA,gBAAAA,EAAS,IAAI,GAEzCyK,IAAkBnO,EAAM,QAAQ,MAAMoO,GAAsBF,CAAW,GAAG,CAACA,CAAW,CAAC;AAE7F,SADuBrM,EAAmBsM,GAAiBD,EAAY,cAAc;AAEvF;ACjBO,SAASG,GAAsBpB,GAAkC;AACtE,QAAM,CAACqB,GAAoBC,CAAqB,IAAIvO,EAAM;AAAA,IACxDwO,GAAiBvB,CAAY;AAAA,EAAA,GAEzBwB,IAAiBR,GAAA;AAEvB,SAAAjO,EAAM,UAAU,MAAM;AACpB,IAAAuO,EAAsBC,GAAiBvB,CAAY,CAAC;AAAA,EACtD,GAAG,CAACwB,GAAgBxB,CAAY,CAAC,GAC1BqB;AACT;ACGO,SAASI,GAAc,EAAE,MAAA9L,GAAM,OAAAO,KAA6B;AACjE,QAAMN,IAAcC,EAAcF,CAAI,GAChC,EAAE,WAAAU,GAAW,oCAAAN,GAAoC,0BAAA2L,EAAA,IAA6B3O,EAAM;AAAA,IACxF,MAAM4O,GAAA;AAAA,IACN,CAAA;AAAA,EAAC,GAEG9M,IAAa9B,EAAM;AAAA,IACvB,MAAMgD,EAAmCH,CAAW;AAAA,IACpD,CAACA,GAAaG,CAAkC;AAAA,EAAA,GAE5C,EAAE,cAAAC,EAAA,IAAiBpB,EAAmBC,GAAY;AAAA,IACtD,cAAce,EAAY;AAAA,EAAA,CAC3B;AAcD,SAAO,EAAE,aAZW7C,EAAM;AAAA,IACxB,MACEwD,EAAWL,GAAO;AAAA,MAChB,WAAAG;AAAA,MACA,SAAS,MAAM;AACb,QAAAqL,EAAyB9L,CAAW;AAAA,MACtC;AAAA,MACA,OAAO,EAAE,SAASI,IAAe,SAAS,QAAA;AAAA,IAAQ,CACnD;AAAA,IACH,CAACE,GAAOG,GAAWL,GAAc0L,GAA0B9L,CAAW;AAAA,EAAA,GAGlD,cAAAI,EAAA;AACxB;AC5BO,SAAS4L,GAAc,EAAE,MAAAjM,GAAM,OAAAO,KAA6B;AACjE,QAAMN,IAAcC,EAAcF,CAAI,GAChC,EAAE,WAAAU,GAAW,oCAAAwL,GAAoC,0BAAAC,EAAA,IAA6B/O,EAAM;AAAA,IACxF,MAAMgP,GAAA;AAAA,IACN,CAAA;AAAA,EAAC,GAEGlN,IAAa9B,EAAM;AAAA,IACvB,MAAM8O,EAAmCjM,CAAW;AAAA,IACpD,CAACA,GAAaiM,CAAkC;AAAA,EAAA,GAE5C,EAAE,cAAAG,EAAA,IAAiBpN,EAAmBC,GAAY;AAAA,IACtD,cAAce,EAAY;AAAA,EAAA,CAC3B;AAcD,SAAO,EAAE,aAZW7C,EAAM;AAAA,IACxB,MACEwD,EAAWL,GAAO;AAAA,MAChB,WAAAG;AAAA,MACA,SAAS,MAAM;AACb,QAAAyL,EAAyBlM,CAAW;AAAA,MACtC;AAAA,MACA,OAAO,EAAE,SAASoM,IAAe,SAAS,QAAA;AAAA,IAAQ,CACnD;AAAA,IACH,CAAC9L,GAAOG,GAAW2L,GAAcF,GAA0BlM,CAAW;AAAA,EAAA,GAGlD,cAAAoM,EAAA;AACxB;ACxBO,SAASC,GAASC,GAAuCzL,IAA2B,IAAI;AAC7F,QAAM0L,IAAapP,EAAM,OAAsB,IAAI,GAC7CqP,IAAWrP,EAAM,OAAsB,IAAI,GAG3CsP,IAAmB5L,EAAQ,oBAAoB,IAE/C6L,IAAe,CAACtJ,MAAsB;AAC1C,IAAAoJ,EAAS,UAAU,MACnBD,EAAW,UAAUnJ,EAAM,cAAc,CAAC,EAAE;AAAA,EAC9C,GAEMuJ,IAAc,CAACvJ,MAAsB;AACzC,IAAAoJ,EAAS,UAAUpJ,EAAM,cAAc,CAAC,EAAE;AAAA,EAC5C,GAEMwJ,IAAazP,EAAM,YAAY,MAAM;AACzC,QAAI,CAACoP,EAAW,WAAW,CAACC,EAAS;AACnC;AAEF,UAAMK,IAAWN,EAAW,UAAUC,EAAS,SACzCM,IAAcD,IAAWJ,GACzBM,IAAeF,IAAW,CAACJ;AAEjC,IAAIK,KAAejM,EAAQ,eAAaA,EAAQ,YAAA,GAC5CkM,KAAgBlM,EAAQ,gBAAcA,EAAQ,aAAA;AAAA,EACpD,GAAG,CAAC4L,GAAkB5L,CAAO,CAAC;AAE9B,EAAA1D,EAAM,UAAU,MAAM;AACpB,UAAM6P,IAAcV,EAAQ;AAC5B,WAAIU,MACFA,EAAY,iBAAiB,cAAcN,GAAc,EAAE,SAAS,IAAM,GAC1EM,EAAY,iBAAiB,aAAaL,GAAa,EAAE,SAAS,IAAM,GACxEK,EAAY,iBAAiB,YAAYJ,GAAY,EAAE,SAAS,IAAM,IAEjE,MAAM;AACX,MAAII,MACFA,EAAY,oBAAoB,cAAcN,CAAY,GAC1DM,EAAY,oBAAoB,aAAaL,CAAW,GACxDK,EAAY,oBAAoB,YAAYJ,CAAU;AAAA,IAE1D;AAAA,EACF,GAAG,CAACN,GAASM,CAAU,CAAC;AAC1B;AClDO,SAASK,GAAc,EAAE,OAAA3M,KAA6B;AAC3D,QAAM,EAAE,UAAAC,GAAU,OAAAnB,MAAUoB,KAAmB,QACzC,EAAE,WAAAC,MAActD,EAAM,QAAQ,MAAM+P,GAAA,GAAmB,EAAE;AAiB/D,SAAO,EAAE,aAfW/P,EAAM,QAAQ,MACzBwD,EAAWL,GAAO;AAAA,IACvB,WAAAG;AAAA,IACA,SAAS,MAAM;AACb,MAAIF,KAAUA,EAAS,EAAE,KAAK,eAAe;AAAA,IAC/C;AAAA,IACA,gBAAgBnB,KAAA,QAAAA,EAAO,WAAW,SAAS;AAAA,IAC3C,uBAAuBA,IACnBA,EAAM,iBAAiB,KACrBA,EAAM,eAAe,QAAQ,CAAC,IAC9B,OACF;AAAA,EAAA,CACL,GACA,CAACkB,GAAOG,GAAWF,GAAUnB,CAAK,CAAC,EAE7B;AACX;ACdO,SAAS+N,GACdC,GACAC,GACAxM,IAA2B,CAAA,GAC3B;AACA,QAAM,CAACyM,GAAOC,CAAQ,IAAIpQ,EAAM,SAA6B,MAAS;AAEtE,SAAAA,EAAM,UAAU,MAAM;;AACpB,QAAIiQ,MAAkB;AACpB,YAAM,MAAM,oCAAoC;AAElD,UAAI/J,IAAAxC,EAAQ,aAAR,gBAAAwC,EAAkB,cAAa;AACjC;AAeF,KAbqB,YAAY;AAC/B,MAAAiE,EAAI,MAAM,gBAAgB;AAC1B,YAAMkG,IAAS,IAAI,gBAAgB,EAAE,GAAG3M,EAAQ,UAAU,UAAAwM,GAAU,GAC9DI,IAAM,MAAM,MAAM,GAAGL,CAAa,IAAII,EAAO,SAAA,CAAU,EAAE;AAC/D,UAAI,CAACC,EAAI,IAAI;AACX,QAAAnG,EAAI;AAAA,UACF,uDAAuDmG,EAAI,MAAM,KAAKA,EAAI,UAAU;AAAA,QAAA;AAEtF;AAAA,MACF;AACA,YAAM,EAAE,aAAAC,EAAA,IAAgB,MAAMD,EAAI,KAAA;AAClC,MAAAF,EAASG,CAAW;AAAA,IACtB,GACA;AAAA,EACF,GAAG,CAACN,GAAeC,GAAU,KAAK,UAAUxM,CAAO,CAAC,CAAC,GAC9CyM;AACT;AC7BO,SAASK,GACd9K,GAC+B;;AAC/B,QAAMN,IAAiBO,GAAkBD,CAAQ,GAE3C,EAAE,WAAApC,GAAW,oBAAAmN,EAAA,IAAuBzQ,EAAM;AAAA,IAC9C,MAAM0Q,GAAyBtL,CAAc;AAAA,IAC7C,CAACkC,GAAoBlC,CAAc,CAAC;AAAA,EAAA;AAWtC,SAAO,EAAE,SAROvD;AAAA,IACd4O;AAAA,IACA,CAAC,GACCvK,IAAAd,EAAe,gBAAf,QAAAc,EAA4B,YAC5BE,IAAAhB,EAAe,YAAY,oBAAoBA,EAAe,MAAM,MAApE,QAAAgB,EAAuE;AAAA,EAAA,GAIzD,WAAA9C,EAAA;AACpB;ACjBO,SAASqN,GAAuC;AAAA,EACrD,QAAAC;AAAA,EACA,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,MAAArO;AAAA,EACA,GAAGsO;AACL,GAA2B;;AACzB,QAAMC,IAAkB5H,GAAA,GAClBC,IAAexJ,EAAM,QAAQ,MAAM4C,KAAQuO,GAAiB,CAACvO,GAAMuO,CAAe,CAAC,GACnFhI,KAAQjD,IAAAsD,KAAA,gBAAAA,EAAc,qBAAd,gBAAAtD,EAAgC,oBAAoB0K,IAE5DQ,IAAqBpR,EAAM,OAAO,EAAK,GAEvC,EAAE,QAAAqR,GAAQ,WAAA/N,GAAW,iBAAAgO,GAAiB,iBAAAC,EAAA,IAAoBvR,EAAM;AAAA,IACpE,MACEwJ,IACIgI,GAAoBZ,GAAQpH,GAAcuH,GAAgBC,GAAgBC,CAAa,IACvFQ,GAAA;AAAA,IACN,CAACjI,GAAcoH,GAAQ,KAAK,UAAUG,CAAc,GAAGC,CAAc;AAAA,EAAA,GAGjEU,IAAU7P,EAAmByP,GAAiB,EAAK,GACnDK,IAAU9P,EAAmB0P,GAAiBT,KAAgB,CAAC,EAAC3H,KAAA,QAAAA,EAAO,UAAS;AAEtF,EAAAnJ,EAAM,UAAU,MAAM;AACpB,IAAA6Q,KAAA,QAAAA,EAAWc,GAASP,EAAmB,UACvCA,EAAmB,UAAU;AAAA,EAC/B,GAAG,CAACO,GAASd,CAAQ,CAAC,GAEtB7Q,EAAM,UAAU,MAAM;AACpB,IAAI8Q,MAAiB,WACnB3G,EAAI,MAAM,gCAAgCyG,GAAQE,CAAY,GAC9DO,EAAOP,CAAY;AAAA,EAIvB,GAAG,CAAA,CAAE;AAEL,QAAMc,IAAW5R,EAAM,QAAQ,MAAMwD,EAAW0N,GAAM,EAAE,WAAA5N,GAAW,GAAG,CAAC4N,GAAM5N,CAAS,CAAC,GAEjFuO,IAA2D7R,EAAM;AAAA,IACrE,CAAC8R,MAAQ;;AACP,MAAAV,EAAmB,UAAU,IAC7BC,EAAA,EAAS,MAAM,MAAOD,EAAmB,UAAU,EAAM,IACzDlL,IAAAgL,EAAK,YAAL,QAAAhL,EAAA,KAAAgL,GAAeY;AAAA,IACjB;AAAA,IACA,CAACZ,GAAMG,CAAM;AAAA,EAAA;AAGf,SAAO;AAAA,IACL,QAAAA;AAAA,IACA,SAAAM;AAAA,IACA,SAAAD;AAAA,IACA,OAAAvI;AAAA,IACA,aAAa;AAAA,MACX,GAAGyI;AAAA,MACH,gBAAgBD;AAAA,MAChB,kBAAkBf;AAAA,MAClB,mBAAmBe;AAAA,MACnB,UAAUD;AAAA,MACV,SAASG;AAAA,IAAA;AAAA,EACX;AAEJ;AC5CO,SAASE,GACdC,IAAa;AAAA,EACXrF,EAAM,OAAO;AAAA,EACbA,EAAM,OAAO;AAAA,EACbA,EAAM,OAAO;AAAA,EACbA,EAAM,OAAO;AAAA,EACbA,EAAM,OAAO;AACf,GACAjJ,IAA4B,CAAA,GACA;AAC5B,QAAMd,IAAOE,EAAcY,EAAQ,IAAI,GACjC,CAAC4G,GAAiB2H,CAAkB,IAAIjS,EAAM,SAA2B,CAAA,CAAE,GAC3E,CAACiN,GAAcC,CAAe,IAAIlN,EAAM,SAAwB,CAAA,CAAE,GAElEkS,IAAWlS,EAAM,QAAQ,MACtBgS,EAAQ,IAAI,CAACG,MAAOC,GAAmBD,CAAC,IAAIA,EAAE,SAASA,CAAE,GAC/D,CAAC,KAAK,UAAUH,CAAO,CAAC,CAAC;AAE5B,SAAAhS,EAAM,UAAU,MAAM;AACpB,UAAMmC,IAAekQ,GAA0BzP,GAAMsP,GAAU;AAAA,MAC7D,sBAAsBxO,EAAQ;AAAA,MAC9B,gBAAgBA,EAAQ;AAAA,IAAA,CACzB,EAAE,UAAU,CAAC,EAAE,iBAAA4G,GAAiB,cAAA2C,QAAmB;AAClD,MAAA9C,EAAI,MAAM,yBAAyBG,GAAiB2C,CAAY,GAChEgF,EAAmB3H,CAAe,GAClC4C,EAAgBD,CAAY;AAAA,IAC9B,CAAC;AACD,WAAO,MAAM9K,EAAa,YAAA;AAAA,EAC5B,GAAG;AAAA,IACDS;AAAA,IACA,KAAK,UAAUc,EAAQ,cAAc;AAAA,IACrC,KAAK,UAAUA,EAAQ,YAAY;AAAA,IACnC,KAAK,UAAUsO,CAAO;AAAA,EAAA,CACvB,GAE4BhS,EAAM,QAAQ,MAAM;AAC/C,QAAIsS,GAAqBN,CAAO,GAAG;AACjC,YAAMO,IAAqBC,GAAqBR,GAAS/E,CAAY,GAC/DwF,IACJ,MAAM,KAAKnI,CAAe;AAC5B,aAAA2C,EAAa,QAAQ,CAACzF,MAAgB;AACpC,QAAI+K,EAAmB,IAAI/K,EAAY,QAAQ,MACb+K,EAAmB,IAAI/K,EAAY,QAAQ,KAAK,CAAA,GACxD,QAAQ,CAACkL,MAAsB;AACrD,cACEpI,EAAgB;AAAA,YACd,CAAC,EAAE,aAAa3G,GAAG,aAAAgP,QACjBnL,EAAY,aAAa7D,EAAE,YAAYgP,EAAY,WAAWD;AAAA,UAAA;AAGlE;AAEF,UAAAvI,EAAI;AAAA,YACF,OAAOuI,CAAiB,gCAAgClL,EAAY,QAAQ;AAAA,UAAA;AAE9E,gBAAMoL,IAAyC;AAAA,YAC7C,aAAApL;AAAA,YACA,QAAQkL;AAAA,UAAA;AAEV,UAAAD,EAAgC,KAAKG,CAAW;AAAA,QAClD,CAAC;AAAA,MAEL,CAAC,GACMH;AAAA,IACT;AACE,aAAOnI;AAAA,EAEX,GAAG,CAACA,GAAiB2C,GAAc+E,CAAO,CAAC;AAG7C;AAEA,SAASa,GAAcC,GAAcC,GAAsB;AACzD,QAAMC,IAAc,IAAI,IAAIF,CAAI;AAChC,aAAWG,KAAQF;AACjB,IAAAC,EAAY,OAAOC,CAAI;AAEzB,SAAOD;AACT;AAEO,SAASR,GACdR,GACA/E,GAC8C;AAC9C,QAAMiG,wBAAqB,IAAA;AAC3B,MAAIZ,GAAqBN,CAAO,GAAG;AACjC,UAAMmB,IAA6BnB,EAChC,OAAO,CAACoB,MAAqBA,EAAiB,eAAe,EAC7D,IAAI,CAACA,MAAqBA,EAAiB,MAAM;AAEpD,IAAAnG,EAAa,QAAQ,CAACzF,MAAgB;AACpC,YAAM6L,IAA4B7L,EAC/B,qBAAA,EACA,IAAI,CAAC8L,MAAA;;AAAQ,gBAAApN,IAAAoN,EAAI,UAAJ,gBAAApN,EAAW;AAAA,OAAM,EAC9B,OAAO,CAACqN,MAA6CA,MAAgB,MAAS,GAC3EC,IAAsC,MAAM;AAAA,QAChDX,GAAW,IAAI,IAAIM,CAA0B,GAAG,IAAI,IAAIE,CAAyB,CAAC;AAAA,MAAA;AAGpF,MAAIG,EAAoC,SAAS,KAC/CN,EAAe,IAAI1L,EAAY,UAAUgM,CAAmC;AAAA,IAEhF,CAAC;AAAA,EACH;AACA,SAAON;AACT;ACjJO,SAASO,GACd7C,GAC6B;AAC7B,QAAM,CAAC+B,GAAae,CAAc,IAAI1T,EAAM,SAAS2T,GAAqB/C,CAAM,CAAC,GAE3E,EAAE,eAAAgD,EAAA,IAAkB5T,EAAM,QAAQ,MAC/B6T,GAAgBjD,CAAM,GAC5B,CAACA,EAAO,YAAY,OAAOA,EAAO,YAAY,UAAUA,EAAO,MAAM,CAAC;AAEzE,SAAA5Q,EAAM,UAAU,MAAM;AACpB,UAAMmC,IAAeyR,EAAc,UAAU,CAACjB,MAAgB;AAC5D,MAAAe,EAAef,CAAW;AAAA,IAC5B,CAAC;AACD,WAAO,MAAMxQ,KAAA,gBAAAA,EAAc;AAAA,EAC7B,GAAG,CAACyR,CAAa,CAAC,GAEX;AAAA,IACL,aAAahD,EAAO;AAAA,IACpB,QAAQA,EAAO,UAAUjE,EAAM,OAAO;AAAA,IACtC,aAAAgG;AAAA,EAAA;AAEJ;AClBO,SAASmB,GAAe7H,GAAczE,GAA2B;AACtE,QAAM7D,IAAIC,EAAqB4D,CAAW;AAC1C,SAAOiM,GAA0B,EAAE,MAAAxH,GAAM,aAAatI,GAAG;AAC3D;AC2BO,SAASoQ,GAAQrQ,GAAyC;AAC/D,QAAMd,IAAOE,EAAcY,KAAA,gBAAAA,EAAS,IAAI,GAClCqB,IAAkBf,GAAmBpB,CAAI,GACzCoR,IAAiBhU,EAAM;AAAA,IAC3B,MAAM+E,MAAoBG,EAAgB;AAAA,IAC1C,CAACH,CAAe;AAAA,EAAA,GAEZkP,IAAQjU,EAAM;AAAA,IAClB,MAAMkU,GAAUtR,GAAMc,CAAO;AAAA,IAC7B,CAACd,GAAMc,GAASsQ,CAAc;AAAA,EAAA,GAE1BnP,IAAYhD,EAAmBoS,EAAM,qBAAqB,EAAK,GAC/DE,IAAetS,EAA0CoS,EAAM,mBAAmB,CAAA,CAAE;AAE1F,SAAO,EAAE,MAAMA,EAAM,MAAM,cAAAE,GAAc,WAAAtP,EAAA;AAC3C;AC1BO,SAASuP,GAAyB1Q,IAA2C,IAAI;AACtF,QAAM,CAAC2Q,GAAaC,CAAW,IAAItU,EAAM;AAAA,IACvCuU,GAAgB7Q,EAAQ,UAAUA,EAAQ,eAAe,EAAK;AAAA,EAAA,GAG1D8Q,IAAwBxU,EAAM,YAAY,CAACyU,MAAuB;AACtE,IAAAH,EAAY,CAACI,OAAU,EAAE,GAAGA,GAAM,cAAcD,IAAY;AAAA,EAC9D,GAAG,CAAA,CAAE,GACCE,IAAwB3U,EAAM,YAAY,CAACyU,MAAuB;AACtE,IAAAH,EAAY,CAACI,OAAU,EAAE,GAAGA,GAAM,cAAcD,IAAY;AAAA,EAC9D,GAAG,CAAA,CAAE,GACCG,IAAyB5U,EAAM,YAAY,CAACkK,MAAqB;AACrE,IAAAoK,EAAY,CAACI,OAAU,EAAE,GAAGA,GAAM,eAAexK,IAAW;AAAA,EAC9D,GAAG,CAAA,CAAE,GACC2K,IAAyB7U,EAAM,YAAY,CAACkK,MAAqB;AACrE,IAAAoK,EAAY,CAACI,OAAU,EAAE,GAAGA,GAAM,eAAexK,IAAW;AAAA,EAC9D,GAAG,CAAA,CAAE,GACC4K,IAAe9U,EAAM,YAAY,CAAC+U,MAAqB;AAC3D,IAAAT,EAAY,CAACI,OAAU,EAAE,GAAGA,GAAM,UAAAK,IAAqB;AAAA,EACzD,GAAG,CAAA,CAAE;AAEL,SAAA/U,EAAM,UAAU,MAAM;AACpB,IAAAgV,GAAgBX,GAAa3Q,EAAQ,eAAe,EAAK;AAAA,EAC3D,GAAG,CAAC2Q,GAAa3Q,EAAQ,WAAW,CAAC,GAE9B;AAAA,IACL,aAAA2Q;AAAA,IACA,uBAAAG;AAAA,IACA,uBAAAG;AAAA,IACA,wBAAAC;AAAA,IACA,wBAAAC;AAAA,IACA,cAAAC;AAAA,EAAA;AAEJ;AC9CO,SAASG,GAAezN,GAA2B9D,IAAiC,IAAI;AAC7F,QAAMC,IAAIC,EAAqB4D,CAAW,GAEpC5E,IAAOE,EAAcY,EAAQ,IAAI,GAEjC/C,IAAWX,EAAM,QAAQ,MAAMkV,GAA2BtS,GAAMe,CAAC,GAAG,CAACf,GAAMe,CAAC,CAAC;AAKnF,SAJoB9B;AAAA,IAClBlB;AAAA,IACAgD,EAAE,UAAWA,EAAuB,gBAAgB,CAAC,EAACA,KAAA,QAAAA,EAAG;AAAA,EAAA;AAG7D;ACfO,SAASwR,GACdC,GACA1R,IAAgC,EAAE,SAAS,IAAI,uBAAuB,KACtE;AACA,QAAMyF,IAAQkM,GAAiBD,CAAqB,IACAA,EAAsB,YAAY,QAClFA,GACE,CAACE,GAAQC,CAAS,IAAIvV,EAAM,SAAS,CAAC;AAC5C,SAAAA,EAAM,UAAU,MAAM;AACpB,QAAI,CAACmJ,KAAS,CAACA,EAAM;AACnB;AAGF,UAAM,EAAE,SAAAqM,GAAS,UAAAC,EAAA,IAAaC,GAAoBvM,GAAOzF,CAAO,GAE1DiS,IAAeF,EAAS,mBACxBG,IAAY,IAAI,WAAWD,CAAY,GAYvCE,IAAW,YAVI,MAAM;AACzB,MAAAJ,EAAS,qBAAqBG,CAAS;AACvC,UAAIE,IAAM;AACV,eAAS3U,IAAI,GAAGA,IAAIyU,EAAU,QAAQzU,KAAK;AACzC,cAAM4U,IAAIH,EAAUzU,CAAC;AACrB,QAAA2U,KAAOC,IAAIA;AAAA,MACb;AACA,MAAAR,EAAU,KAAK,KAAKO,IAAMF,EAAU,MAAM,IAAI,GAAG;AAAA,IACnD,GAE2C,MAAO,EAAE;AAEpD,WAAO,MAAM;AACX,MAAAJ,EAAA,GACA,cAAcK,CAAQ;AAAA,IACxB;AAAA,EACF,GAAG,CAAC1M,GAAOA,KAAA,gBAAAA,EAAO,aAAa,KAAK,UAAUzF,CAAO,CAAC,CAAC,GAEhD4R;AACT;AAEA,MAAMU,KAAuB,CAACC,MAA8B;AAC1D,QAAMC,IAAc,CAACC,MAAkB;AAGrC,QAAIC,IAAK,IAAK,KAAK,IAAI,MAAO,KAAK,IAAI,KAAOD,CAAK,CAAC,IAAI,KAAM;AAC9D,WAAAC,IAAK,KAAK,KAAKA,CAAE,GAEVA;AAAA,EACT;AAGA,SAAOH,EAAY,IAAI,CAACE,MAClBA,MAAU,SACL,IAEFD,EAAYC,CAAK,CACzB;AACH,GAyBME,KAAoB;AAAA,EACxB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,iBAAiB,EAAE,SAAS,KAAA;AAC9B;AAMO,SAASC,GACdlB,GACA1R,IAAuC,IACvC;;AACA,QAAMyF,IACJiM,aAAiCzI,IAC7ByI,KACgDlP,IAAAkP,KAAA,gBAAAA,EAAuB,gBAAvB,gBAAAlP,EAAoC,OACpFqQ,IAAO,EAAE,GAAGF,IAAmB,GAAG3S,EAAA,GAClC,CAAC8S,GAAgBC,CAAiB,IAAIzW,EAAM;AAAA,IAChD,IAAI,MAAMuW,EAAK,KAAK,EAAE,KAAK,CAAC;AAAA,EAAA;AAG9B,SAAAvW,EAAM,UAAU,MAAM;AACpB,QAAI,CAACmJ,KAAS,EAACA,KAAA,QAAAA,EAAO,cAAa;AACjC,MAAAsN,EAAkB,CAACC,MAAQA,EAAI,QAAQ,KAAK,CAAC,CAAC;AAC9C;AAAA,IACF;AACA,UAAM,EAAE,UAAAjB,GAAU,SAAAD,EAAA,IAAYE,GAAoBvM,GAAOoN,EAAK,eAAe,GAEvEZ,IAAeF,EAAS,mBACxBG,IAAY,IAAI,aAAaD,CAAY,GA8BzCE,IAAW,YA5BI,MAAM;AACzB,MAAAJ,EAAS,sBAAsBG,CAAS;AACxC,UAAIK,IAA4B,IAAI,aAAaL,EAAU,MAAM;AACjE,eAASzU,IAAI,GAAGA,IAAIyU,EAAU,QAAQzU;AACpC,QAAA8U,EAAY9U,CAAC,IAAIyU,EAAUzU,CAAC;AAE9B,MAAA8U,IAAcA,EAAY,MAAMM,EAAK,QAAQA,EAAK,MAAM;AAExD,YAAMI,IAAwBX,GAAqBC,CAAW,GACxDW,IAAYD,EAAsB,QAClCE,IAAwB,CAAA;AAC9B,eAAS1V,IAAI,GAAGA,IAAIoV,EAAK,OAAOpV,KAAK;AAEnC,cAAM2V,IAAa,KAAK,MAAO3V,IAAIyV,IAAaL,EAAK,KAAK,GACpDQ,IAAW,KAAK,OAAQ5V,IAAI,KAAKyV,IAAaL,EAAK,KAAK,GACxDS,IAAQL,EAAsB,MAAMG,GAAYC,CAAQ,GACxDE,IAAcD,EAAM;AAC1B,YAAIC,MAAgB;AAClB,UAAAJ,EAAO,KAAK,CAAC;AAAA,aACR;AACL,gBAAMK,IAAgBF,EAAM,OAAO,CAACG,GAAKT,MAASS,KAAOT,GAAM,CAAC;AAChE,UAAAG,EAAO,KAAKK,IAAgBD,CAAW;AAAA,QACzC;AAAA,MACF;AAEA,MAAAR,EAAkBI,CAAM;AAAA,IAC1B,GAE2CN,EAAK,cAAc;AAE9D,WAAO,MAAM;AACX,MAAAf,EAAA,GACA,cAAcK,CAAQ;AAAA,IACxB;AAAA,EACF,GAAG,CAAC1M,GAAOA,KAAA,gBAAAA,EAAO,aAAa,KAAK,UAAUzF,CAAO,CAAC,CAAC,GAEhD8S;AACT;AAWA,MAAMY,KAAmB;AAAA,EACvB,UAAU;AAAA,EACV,eAAe;AAAA,EACf,gBAAgB;AAClB;AAKO,SAASC,GACdjC,GACA1R,IAAgC,IAChC;;AACA,QAAMyF,IACJiM,aAAiCzI,IAC7ByI,KACgDlP,IAAAkP,KAAA,gBAAAA,EAAuB,gBAAvB,gBAAAlP,EAAoC,OACpFqQ,IAAO,EAAE,GAAGa,IAAkB,GAAG1T,EAAA,GAEjC4T,IAAgBtX,EAAM,OAAO,IAAI,cAAc,GAC/CuX,IAAUvX,EAAM,OAAO,YAAY,KAAK,GACxCwX,IAAUxX,EAAM,OAAO,CAAC,GACxB,CAACyX,GAAMC,CAAO,IAAI1X,EAAM,SAAmB,CAAA,CAAE,GAE7C2X,IAAW3X,EAAM,YAAY,CAAC4X,MAAuB;AACzD,IAAAF;AAAA,MACE,MAAM;AAAA,QACJG,GAAWD,GAAMrB,EAAK,QAAQ,EAAE,IAAI,CAACuB,MAAM,KAAK,KAAKA,CAAC,IAAIvB,EAAK,aAAa;AAAA;AAAA,MAAA;AAAA,IAE9E;AAAA,EAEJ,GAAG,CAAA,CAAE;AAEL,SAAAvW,EAAM,UAAU,MAAM;AACpB,QAAI,CAACmJ,KAAS,EAACA,KAAA,QAAAA,EAAO;AACpB;AAEF,UAAM,EAAE,UAAAsM,GAAU,SAAAD,MAAYE,GAAoBvM,GAAO;AAAA,MACvD,SAAS4O,GAAgBxB,EAAK,QAAQ;AAAA,IAAA,CACvC,GAEKZ,IAAeoC,GAAgBxB,EAAK,QAAQ,GAC5CX,IAAY,IAAI,aAAaD,CAAY,GAEzCqC,IAAS,MAAM;AAMnB,UALAC,IAAiB,sBAAsBD,CAAM,GAC7CvC,EAAS,uBAAuBG,CAAS,GACzC0B,EAAc,QAAQ,IAAI,CAACQ,GAAG3W,MAAM2W,IAAIlC,EAAUzU,CAAC,CAAC,GACpDqW,EAAQ,WAAW,GAEf,YAAY,IAAA,IAAQD,EAAQ,WAAWhB,EAAK,gBAAgB;AAC9D,cAAM2B,IAAUtC,EAAU,IAAI,CAACkC,MAAMA,IAAIN,EAAQ,OAAO;AACxD,QAAAG,EAASO,CAAO,GAChBX,EAAQ,UAAU,YAAY,IAAA,GAC9BC,EAAQ,UAAU;AAAA,MACpB;AAAA,IACF;AAEA,QAAIS,IAAiB,sBAAsBD,CAAM;AAEjD,WAAO,MAAM;AACX,MAAAxC,EAAA,GACA,qBAAqByC,CAAc;AAAA,IACrC;AAAA,EACF,GAAG,CAAC9O,GAAOA,KAAA,gBAAAA,EAAO,aAAa,KAAK,UAAUzF,CAAO,GAAGiU,CAAQ,CAAC,GAE1D;AAAA,IACL,MAAAF;AAAA,EAAA;AAEJ;AAEA,SAASM,GAAgBI,GAAW;AAClC,SAAIA,IAAI,KAAW,KACPC,GAASD,CAAC;AACxB;AAMA,SAASC,GAASN,GAAW;AAC3B,MAAInU,IAAI;AACR,SAAQmU,MAAM;AACZ,IAAAnU,MAAM;AAER,SAAOA;AACT;AAEA,SAASkU,GAAWQ,GAAyBC,GAAoB;AAC/D,QAAMC,IAAY,KAAK,MAAMF,EAAU,SAASC,CAAU,GACpDE,IAAe,IAAI,aAAaF,CAAU;AAChD,WAASnX,IAAI,GAAGA,IAAImX,GAAYnX,KAAK;AACnC,UAAMsX,IAAaF,IAAYpX;AAC/B,QAAI2U,IAAM;AACV,aAAS4C,IAAI,GAAGA,IAAIH,GAAWG;AAC7B,MAAA5C,IAAMA,IAAM,KAAK,IAAIuC,EAAUI,IAAaC,CAAC,CAAC;AAEhD,IAAAF,EAAarX,CAAC,IAAI2U,IAAMyC;AAAA,EAC1B;AACA,SAAOC;AACT;ACnQO,SAASG,GACd3G,GACA4G,IAEyD,IAClC;AACvB,MAAIC,GACAjW;AACJ,EAAI,OAAOgW,KAAiC,WAC1CC,IAAsBD,KAEtBC,IAAsBD,KAAA,gBAAAA,EAA8B,qBACpDhW,IAAOgW,KAAA,gBAAAA,EAA8B;AAGvC,QAAME,IAAqBjN,GAAA,GACrBoB,IAAeG,GAAgB,EAAE,MAAAxK,GAAM,cAAc,CAAA,GAAI,GAEzDe,IAAI3D,EAAM,QAAQ,MAClB6Y,IACK5L,EAAa,KAAK,CAACtJ,MAAMA,EAAE,aAAakV,CAAmB,IAE7DC,GACN,CAACD,GAAqB5L,GAAc6L,CAAkB,CAAC,GAEpDhX,IAAa9B,EAAM,QAAQ,MAAM;AACrC,QAAK2D;AAGL,aAAOoV,GAA4BpV,GAAG,EAAE,SAAAqO,GAAS;AAAA,EACnD,GAAG,CAACrO,GAAG,KAAK,UAAUqO,CAAO,CAAC,CAAC;AAI/B,SAFkBnQ,EAAmBC,GAAY,EAA2B;AAG9E;AC7CO,SAASkX,GAAiB/R,GAA8C;;AAC7E,QAAMnF,IAAa9B,EAAM;AAAA,IACvB;;AAAO,cAAAkG,IAAAe,KAAA,gBAAAA,EAAK,gBAAL,QAAAf,EAAkB,QAAQ+S,GAAsBhS,KAAA,gBAAAA,EAAK,YAAY,KAAK,IAAI;AAAA;AAAA,IACjF,EAACf,IAAAe,KAAA,gBAAAA,EAAK,gBAAL,gBAAAf,EAAkB,KAAK;AAAA,EAAA;AAE1B,SAAOrE,EAAmBC,GAAY;AAAA,IACpC,WAAW,KAAK,IAAA;AAAA,IAChB,eAAcqE,KAAAC,IAAAa,KAAA,gBAAAA,EAAK,gBAAL,gBAAAb,EAAkB,UAAlB,gBAAAD,EAAyB;AAAA,EAAA,CACxC;AACH;ACeA,MAAM+S,KAA+B;AAAA,EACnC,YAAY;AAAA;AAEd;AAOO,SAASC,GACdzT,GACAhC,GACA;AACA,QAAM6S,IAAO,EAAE,GAAG2C,IAA8B,GAAGxV,EAAA,GAC7C,CAAC0V,GAAUC,CAAW,IAAIrZ,EAAM,SAA8C,CAAA,CAAE,GAEhFsZ,IAAiBN,GAAiBtT,CAAQ,GAC1C6T,IAAuB,CAACC,MAAwC;;AACpE,KAAAtT,IAAAqQ,EAAK,oBAAL,QAAArQ,EAAA,KAAAqQ,GAAuBiD,IACvBH;AAAA,MAAY,CAACI,MACXC;AAAA,QACED;AAAA;AAAA,QAEAD,EAAY,IAAI,CAACrH,MAAMwH,GAA6BxH,GAAGmH,CAAc,CAAC;AAAA,QACtE/C,EAAK;AAAA,MAAA;AAAA,IACP;AAAA,EAEJ;AACA,SAAAvW,EAAM,UAAU,MAAM;AACpB,QAAI,EAAC0F,KAAA,QAAAA,EAAU;AACb;AAEF,UAAMvD,IAAeyX,GAA2BlU,EAAS,WAAW,EAAE,UAAU,CAACoM,MAAQ;AACvF,MAAAyH,EAAqB,GAAGzH,CAAG;AAAA,IAC7B,CAAC;AACD,WAAO,MAAM;AACX,MAAA3P,EAAa,YAAA;AAAA,IACf;AAAA,EACF,GAAG,CAACuD,KAAY4B,GAAoB5B,CAAQ,GAAG6T,CAAoB,CAAC,GAE7D,EAAE,UAAAH,EAAA;AACX;ACrDO,SAASS,GAAyB1W,IAAyC,IAAI;AACpF,QAAM2V,IAAqBjN,GAAA,GACrBlI,IAAIR,EAAM,eAAe2V,GACzBgB,IAAoB9Z,EAAM;AAAA;AAAA,IAE9B,MAAO2D,IAAIoW,GAA8BpW,CAAC,IAAIoW,GAA8BpW,CAAC;AAAA,IAC7E,CAACA,CAAC;AAAA,EAAA;AAMJ,SAJuB9B,EAAmBiY,GAAmB;AAAA,IAC3D,YAAYnW,KAAA,gBAAAA,EAAG;AAAA,EAAA,CAChB;AAGH;AAYO,SAASqW,GACdC,GACAvW,IAA2C,IAC3C;AACA,QAAMC,IAAIC,EAAqBF,EAAQ,WAAW,GAC5C,CAACwW,GAAWC,CAAY,IAAIna,EAAM,SAAS2D,EAAE,WAAWsW,CAAY,CAAC;AAE3E,SAAAja,EAAM,UAAU,MAAM;AACpB,QAAI,CAAC2D;AACH;AAEF,UAAMxB,IAAe4X,GAA8BpW,CAAC,EAAE,UAAU,CAAC+S,MAAQ;AACvE,MAAIA,EAAI,QAAQuD,CAAY,MAAM,UAChCE,EAAazD,EAAI,WAAWuD,CAAY,CAAC;AAAA,IAE7C,CAAC;AACD,WAAO,MAAM;AACX,MAAA9X,EAAa,YAAA;AAAA,IACf;AAAA,EACF,GAAG,CAACwB,GAAGsW,CAAY,CAAC,GAEbC;AACT;ACvBA,MAAME,KAAkBC,EAA2B;AAW5C,SAASC,KAAoC;AAClD,QAAMjN,IAAqBL,GAAA,GACrBuN,IAAQlN,EAAmB;AAAA,IAC/B,CAAC1J,MACCA,EAAE,SAAS6W,GAAgB,SAC3B,EAAEH,EAA2B,mBAAmB1W,EAAE;AAAA,EAAA,GAEhD8W,IAASpN,EAAmB;AAAA,IAChC,CAAC1J,MACCA,EAAE,SAAS6W,GAAgB,SAC3B7W,EAAE,WAAW0W,EAA2B,eAAe,OAAME,KAAA,gBAAAA,EAAO;AAAA,EAAA,GAElEG,IAAc/B;AAAA,IAClB,CAAChM,EAAM,OAAO,YAAYA,EAAM,OAAO,MAAM;AAAA,IAC7C4N,KAAA,gBAAAA,EAAO;AAAA,EAAA,GAEHI,IAAehC;AAAA,IACnB,CAAChM,EAAM,OAAO,YAAYA,EAAM,OAAO,MAAM;AAAA,IAC7C8N,KAAA,gBAAAA,EAAQ;AAAA,EAAA,GAEJG,IACJF,EAAY,KAAK,CAACG,MAAMA,EAAE,WAAWlO,EAAM,OAAO,UAAU,KAC5DgO,EAAa,KAAK,CAACE,MAAMA,EAAE,WAAWlO,EAAM,OAAO,UAAU,GACzDmO,IACJJ,EAAY,KAAK,CAACG,MAAMA,EAAE,WAAWlO,EAAM,OAAO,MAAM,KACxDgO,EAAa,KAAK,CAACE,MAAMA,EAAE,WAAWlO,EAAM,OAAO,MAAM,GACrD,EAAE,UAAUoO,MAAwB5B,GAAsByB,CAAU,GACpE7V,IAAkBf,GAAA,GAClB,EAAE,YAAAgX,EAAA,IAAenB,GAAyB,EAAE,aAAaU,GAAO,GAEhEtY,IAAoBjC,EAAM,QAAQ,MAClC+E,MAAoBG,EAAgB,eAC/B,iBAEPH,MAAoBG,EAAgB,cACpC,CAACqV,KACD,EAACS,KAAA,QAAAA,EAAaZ,OAEP,eAEAY,EAAWZ,EAAe,GAElC,CAACY,GAAYT,GAAOxV,CAAe,CAAC;AAEvC,SAAO;AAAA,IACL,OAAAwV;AAAA,IACA,OAAAtY;AAAA,IACA,YAAA2Y;AAAA,IACA,YAAAE;AAAA,IACA,qBAAAC;AAAA,IACA,iBAAiBC;AAAA,EAAA;AAErB;AC7FO,SAASC,GAAerY,GAAa;AAC1C,QAAMqB,IAAInB,EAAcF,CAAI,GACtBmC,IAAkBf,GAAmBC,CAAC,GACtCnC,IAAa9B,EAAM,QAAQ,MAAMkb,GAA0BjX,CAAC,GAAG,CAACA,GAAGc,CAAe,CAAC;AAGzF,SAFoBlD,EAAmBC,GAAYmC,EAAE,WAAW;AAGlE;ACAO,SAASkX,GAAc7W,GAAeZ,GAAgC;AAC3E,QAAMd,IAAOE,EAAcY,KAAA,gBAAAA,EAAS,IAAI,GAGlCsQ,IADkBhQ,GAAmBpB,CAAI,MACJsC,EAAgB,cAErDkW,IAAiBpb,EAAM,QAAQ,MAAMqb,GAAgBzY,GAAM0B,CAAK,GAAG,CAAC1B,GAAM0B,CAAK,CAAC;AAKtF,SAAO,EAAE,aAFWzC,EAFSmS,IAAiB,SAAYoH,GAEqB,EAAE,EAExE;AACX;ACVO,SAASE,GAAkB/E,GAAiC;AACjE,QAAM,EAAE,uBAAAgF,GAAuB,WAAAC,EAAA,IAAcjF,KAAQ,CAAA,GAC/C,EAAE,aAAAkF,MAAgBN,GAAcO,GAAU,eAAe,EAAE,MAAMnF,KAAA,gBAAAA,EAAM,MAAM;AAoBnF,SAlByBvW,EAAM;AAAA,IAC7B,MACEyb,EACG;AAAA,MAAO,CAACE,MACPJ,IACIA,EAAsB,SAASI,EAAO,gBAAgB,QAAQ,IAC9D;AAAA,IAAA,EAEL;AAAA,MAAO,CAACA,MAAA;;AACP,eAAAH,IACIA,EAAU;AAAA,YACRtV,IAAAyV,EAAO,WAAW,eAAlB,gBAAAzV,EAA+BmU,EAA2B,wBAAuB;AAAA,QAAA,IAEnF;AAAA;AAAA,IAAA;AAAA,IAEV,CAACoB,GAAaF,GAAuBC,CAAS;AAAA,EAAA;AAIlD;AC3CA,MAAMI,KAAgD,GAChDC,KAA0C,KAE1CC,KAAyC,GACzCC,KAAmC;AA2BlC,SAASC,GACdpZ,GAC8C;AAC9C,QAAMqZ,IAA4BC,GAiBhC,EAAE,GAKEC,IAAoCC,GAAQ,MAAM,IAAIC,GAAA,GAAS,CAAA,CAAE,GACjEC,IAAgCC,GAAY,YACzCJ,EAAkC,KAAA,EAAO,KAAK,OAAOK,MAAW;AACrE,eAAa;AACX,YAAM5X,IAAUqX,EAA0B,QAAQ,IAAA;AAClD,UAAI,CAACrX,GAAS;AACZ,QAAA4X,EAAA;AACA;AAAA,MACF;AAEA,cAAQ5X,EAAQ,MAAA;AAAA,QACd,KAAK;AACH,gBAAMA,EAAQ,KACX,QAAQ,GAAGA,EAAQ,IAAI,EACvB,KAAKA,EAAQ,OAAO,EACpB,MAAMA,EAAQ,MAAM;AACvB;AAAA,QACF,KAAK;AACH,gBAAMA,EAAQ,KACX,WAAW,GAAGA,EAAQ,IAAI,EAC1B,KAAKA,EAAQ,OAAO,EACpB,MAAMA,EAAQ,MAAM;AACvB;AAAA,MAAA;AAAA,IAEN;AAAA,EACF,CAAC,GACA,CAAA,CAAE,GAEC6X,IAAsBP,GAAoB,EAAE,GAC5CQ,IAAqBH,GAAY,CAACI,MAAc;AACpD,QAAIC,IAAyB;AAC7B,IAAAH,EAAoB,UAAUA,EAAoB,QAAQ,OAAO,CAACtb,MAAM;AACtE,YAAM0b,IAAoBF,EAAI,QAAA,IAAYxb,EAAE,YAAY4a;AACxD,aAAIc,MACFD,KAA0B,IAErBC;AAAA,IACT,CAAC,GAEGD,IAAyBd,MAC3B3R,EAAI;AAAA,MACF,4EAA4E2R,EAAsC,QAAQC,EAAgC;AAAA,IAAA;AAAA,EAGhK,GAAG,CAAA,CAAE;AAGL,EAAAe,GAAU,MAAM;AACd,IAAAb,EAA0B,UAAU,CAAA;AAEpC,UAAMU,wBAAU,KAAA;AAChB,IAAAF,EAAoB,QAAQ,KAAKE,CAAG,GACpCD,EAAmBC,CAAG;AAAA,EACxB,GAAG,CAAC/Z,GAAM8Z,CAAkB,CAAC;AAE7B,QAAMK,IAAgCb,GAAoB,EAAE,GACtDc,IAAkCT,GAAY,CAACI,MAAc;AACjE,QAAIM,IAAgC;AACpC,IAAAF,EAA8B,UAAUA,EAA8B,QAAQ,OAAO,CAAC5b,MAAM;AAC1F,YAAM0b,IACJF,EAAI,QAAA,IAAYxb,EAAE,YAAY0a;AAChC,aAAIgB,MACFI,KAAiC,IAE5BJ;AAAA,IACT,CAAC,GAEGI,IAAgCrB,MAClCzR,EAAI;AAAA,MACF,mGAAmGyR,EAA6C,QAAQC,EAAuC;AAAA,IAAA;AAAA,EAGrM,GAAG,CAAA,CAAE,GAECqB,IAAUX;AAAA,IACd,UAAUY,MACD,IAAI,QAAQ,CAACC,GAASC,MAAW;AACtC,UAAI,CAACza;AACH,cAAM,IAAI,MAAM,sCAAsC;AAExD,YAAM+Z,wBAAU,KAAA;AAChB,MAAAK,EAAgCL,CAAG,GACnCV,EAA0B,QAAQ,KAAK,EAAE,MAAM,WAAW,MAAArZ,GAAM,MAAAua,GAAM,SAAAC,GAAS,QAAAC,GAAQ,GACvFN,EAA8B,QAAQ,KAAKJ,CAAG,GAC9CL,EAAA;AAAA,IACF,CAAC;AAAA,IAEH,CAAC1Z,GAAMoa,GAAiCV,CAA6B;AAAA,EAAA,GAGjEtX,IAAauX;AAAA,IACjB,UAAUY,MACD,IAAI,QAAQ,CAACC,GAASC,MAAW;AACtC,UAAI,CAACza;AACH,cAAM,IAAI,MAAM,0CAA0C;AAE5D,YAAM+Z,wBAAU,KAAA;AAChB,MAAAK,EAAgCL,CAAG,GACnCV,EAA0B,QAAQ,KAAK,EAAE,MAAM,cAAc,MAAArZ,GAAM,MAAAua,GAAM,SAAAC,GAAS,QAAAC,GAAQ,GAC1FN,EAA8B,QAAQ,KAAKJ,CAAG,GAC9CL,EAAA;AAAA,IACF,CAAC;AAAA,IAEH,CAAC1Z,GAAMoa,GAAiCV,CAA6B;AAAA,EAAA;AAGvE,SAAO;AAAA,IACL,SAAS1Z,IAAOsa,IAAU;AAAA,IAC1B,YAAYta,IAAOoC,IAAa;AAAA,EAAA;AAEpC;;;;;ACnJA,MAAIsY,IAAI,OAAO,WAAY,WAAW,UAAU,MAC5CC,IAAeD,KAAK,OAAOA,EAAE,SAAU,aACvCA,EAAE,QACF,SAAsBpd,GAAQsd,GAAUL,GAAM;AAC9C,WAAO,SAAS,UAAU,MAAM,KAAKjd,GAAQsd,GAAUL,CAAI;AAAA,EAC/D,GAEIM;AACJ,EAAIH,KAAK,OAAOA,EAAE,WAAY,aAC5BG,IAAiBH,EAAE,UACV,OAAO,wBAChBG,IAAiB,SAAwBvd,GAAQ;AAC/C,WAAO,OAAO,oBAAoBA,CAAM,EACrC,OAAO,OAAO,sBAAsBA,CAAM,CAAC;AAAA,EAClD,IAEEud,IAAiB,SAAwBvd,GAAQ;AAC/C,WAAO,OAAO,oBAAoBA,CAAM;AAAA,EAC5C;AAGA,WAASwd,EAAmBC,GAAS;AACnC,IAAI,WAAW,QAAQ,QAAM,QAAQ,KAAKA,CAAO;AAAA,EACnD;AAEA,MAAIC,IAAc,OAAO,SAAS,SAAqBzH,GAAO;AAC5D,WAAOA,MAAUA;AAAA,EACnB;AAEA,WAAS0H,IAAe;AACtB,IAAAA,EAAa,KAAK,KAAK,IAAI;AAAA,EAC7B;AACAC,EAAAA,GAAA,UAAiBD,GACjBC,GAAA,QAAA,OAAsBC,GAGtBF,EAAa,eAAeA,GAE5BA,EAAa,UAAU,UAAU,QACjCA,EAAa,UAAU,eAAe,GACtCA,EAAa,UAAU,gBAAgB;AAIvC,MAAIG,IAAsB;AAE1B,WAASC,EAAc7W,GAAU;AAC/B,QAAI,OAAOA,KAAa;AACtB,YAAM,IAAI,UAAU,qEAAqE,OAAOA,CAAQ;AAAA,EAE5G;AAEA,SAAO,eAAeyW,GAAc,uBAAuB;AAAA,IACzD,YAAY;AAAA,IACZ,KAAK,WAAW;AACd,aAAOG;AAAA,IACX;AAAA,IACE,KAAK,SAASE,GAAK;AACjB,UAAI,OAAOA,KAAQ,YAAYA,IAAM,KAAKN,EAAYM,CAAG;AACvD,cAAM,IAAI,WAAW,oGAAoGA,IAAM,GAAG;AAEpI,MAAAF,IAAsBE;AAAA,IAC1B;AAAA,EACA,CAAC,GAEDL,EAAa,OAAO,WAAW;AAE7B,KAAI,KAAK,YAAY,UACjB,KAAK,YAAY,OAAO,eAAe,IAAI,EAAE,aAC/C,KAAK,UAAU,uBAAO,OAAO,IAAI,GACjC,KAAK,eAAe,IAGtB,KAAK,gBAAgB,KAAK,iBAAiB;AAAA,EAC7C,GAIAA,EAAa,UAAU,kBAAkB,SAAyBM,GAAG;AACnE,QAAI,OAAOA,KAAM,YAAYA,IAAI,KAAKP,EAAYO,CAAC;AACjD,YAAM,IAAI,WAAW,kFAAkFA,IAAI,GAAG;AAEhH,gBAAK,gBAAgBA,GACd;AAAA,EACT;AAEA,WAASC,EAAiBC,GAAM;AAC9B,WAAIA,EAAK,kBAAkB,SAClBR,EAAa,sBACfQ,EAAK;AAAA,EACd;AAEA,EAAAR,EAAa,UAAU,kBAAkB,WAA2B;AAClE,WAAOO,EAAiB,IAAI;AAAA,EAC9B,GAEAP,EAAa,UAAU,OAAO,SAAcS,GAAM;AAEhD,aADInB,IAAO,CAAA,GACFhc,IAAI,GAAGA,IAAI,UAAU,QAAQA,IAAK,CAAAgc,EAAK,KAAK,UAAUhc,CAAC,CAAC;AACjE,QAAIod,IAAWD,MAAS,SAEpBE,IAAS,KAAK;AAClB,QAAIA,MAAW;AACb,MAAAD,IAAWA,KAAWC,EAAO,UAAU;AAAA,aAChC,CAACD;AACR,aAAO;AAGT,QAAIA,GAAS;AACX,UAAIE;AAGJ,UAFItB,EAAK,SAAS,MAChBsB,IAAKtB,EAAK,CAAC,IACTsB,aAAc;AAGhB,cAAMA;AAGR,UAAIC,IAAM,IAAI,MAAM,sBAAsBD,IAAK,OAAOA,EAAG,UAAU,MAAM,GAAG;AAC5E,YAAAC,EAAI,UAAUD,GACRC;AAAA,IACV;AAEE,QAAIC,IAAUH,EAAOF,CAAI;AAEzB,QAAIK,MAAY;AACd,aAAO;AAET,QAAI,OAAOA,KAAY;AACrB,MAAApB,EAAaoB,GAAS,MAAMxB,CAAI;AAAA;AAIhC,eAFIyB,IAAMD,EAAQ,QACdE,IAAYC,EAAWH,GAASC,CAAG,GAC9Bzd,IAAI,GAAGA,IAAIyd,GAAK,EAAEzd;AACzB,QAAAoc,EAAasB,EAAU1d,CAAC,GAAG,MAAMgc,CAAI;AAGzC,WAAO;AAAA,EACT;AAEA,WAAS4B,EAAa7e,GAAQoe,GAAMlX,GAAU4X,GAAS;AACrD,QAAIC,GACAT,GACAU;AAsBJ,QApBAjB,EAAc7W,CAAQ,GAEtBoX,IAASte,EAAO,SACZse,MAAW,UACbA,IAASte,EAAO,UAAU,uBAAO,OAAO,IAAI,GAC5CA,EAAO,eAAe,MAIlBse,EAAO,gBAAgB,WACzBte,EAAO;AAAA,MAAK;AAAA,MAAeoe;AAAA,MACflX,EAAS,WAAWA,EAAS,WAAWA;AAAA,IAAQ,GAI5DoX,IAASte,EAAO,UAElBgf,IAAWV,EAAOF,CAAI,IAGpBY,MAAa;AAEf,MAAAA,IAAWV,EAAOF,CAAI,IAAIlX,GAC1B,EAAElH,EAAO;AAAA,aAEL,OAAOgf,KAAa,aAEtBA,IAAWV,EAAOF,CAAI,IACpBU,IAAU,CAAC5X,GAAU8X,CAAQ,IAAI,CAACA,GAAU9X,CAAQ,IAE7C4X,IACTE,EAAS,QAAQ9X,CAAQ,IAEzB8X,EAAS,KAAK9X,CAAQ,GAIxB6X,IAAIb,EAAiBle,CAAM,GACvB+e,IAAI,KAAKC,EAAS,SAASD,KAAK,CAACC,EAAS,QAAQ;AACpD,MAAAA,EAAS,SAAS;AAGlB,UAAIC,IAAI,IAAI,MAAM,iDACED,EAAS,SAAS,MAAM,OAAOZ,CAAI,IAAI,mEAEvB;AACpC,MAAAa,EAAE,OAAO,+BACTA,EAAE,UAAUjf,GACZif,EAAE,OAAOb,GACTa,EAAE,QAAQD,EAAS,QACnBxB,EAAmByB,CAAC;AAAA,IAC1B;AAGE,WAAOjf;AAAA,EACT;AAEA,EAAA2d,EAAa,UAAU,cAAc,SAAqBS,GAAMlX,GAAU;AACxE,WAAO2X,EAAa,MAAMT,GAAMlX,GAAU,EAAK;AAAA,EACjD,GAEAyW,EAAa,UAAU,KAAKA,EAAa,UAAU,aAEnDA,EAAa,UAAU,kBACnB,SAAyBS,GAAMlX,GAAU;AACvC,WAAO2X,EAAa,MAAMT,GAAMlX,GAAU,EAAI;AAAA,EACpD;AAEA,WAASgY,IAAc;AACrB,QAAI,CAAC,KAAK;AAGR,aAFA,KAAK,OAAO,eAAe,KAAK,MAAM,KAAK,MAAM,GACjD,KAAK,QAAQ,IACT,UAAU,WAAW,IAChB,KAAK,SAAS,KAAK,KAAK,MAAM,IAChC,KAAK,SAAS,MAAM,KAAK,QAAQ,SAAS;AAAA,EAErD;AAEA,WAASC,EAAUnf,GAAQoe,GAAMlX,GAAU;AACzC,QAAInF,IAAQ,EAAE,OAAO,IAAO,QAAQ,QAAW,QAAQ/B,GAAQ,MAAMoe,GAAM,UAAUlX,EAAQ,GACzFkY,IAAUF,EAAY,KAAKnd,CAAK;AACpC,WAAAqd,EAAQ,WAAWlY,GACnBnF,EAAM,SAASqd,GACRA;AAAA,EACT;AAEA,EAAAzB,EAAa,UAAU,OAAO,SAAcS,GAAMlX,GAAU;AAC1D,WAAA6W,EAAc7W,CAAQ,GACtB,KAAK,GAAGkX,GAAMe,EAAU,MAAMf,GAAMlX,CAAQ,CAAC,GACtC;AAAA,EACT,GAEAyW,EAAa,UAAU,sBACnB,SAA6BS,GAAMlX,GAAU;AAC3C,WAAA6W,EAAc7W,CAAQ,GACtB,KAAK,gBAAgBkX,GAAMe,EAAU,MAAMf,GAAMlX,CAAQ,CAAC,GACnD;AAAA,EACb,GAGAyW,EAAa,UAAU,iBACnB,SAAwBS,GAAMlX,GAAU;AACtC,QAAImY,GAAMf,GAAQgB,GAAUre,GAAGse;AAK/B,QAHAxB,EAAc7W,CAAQ,GAEtBoX,IAAS,KAAK,SACVA,MAAW;AACb,aAAO;AAGT,QADAe,IAAOf,EAAOF,CAAI,GACdiB,MAAS;AACX,aAAO;AAET,QAAIA,MAASnY,KAAYmY,EAAK,aAAanY;AACzC,MAAI,EAAE,KAAK,iBAAiB,IAC1B,KAAK,UAAU,uBAAO,OAAO,IAAI,KAEjC,OAAOoX,EAAOF,CAAI,GACdE,EAAO,kBACT,KAAK,KAAK,kBAAkBF,GAAMiB,EAAK,YAAYnY,CAAQ;AAAA,aAEtD,OAAOmY,KAAS,YAAY;AAGrC,WAFAC,IAAW,IAENre,IAAIoe,EAAK,SAAS,GAAGpe,KAAK,GAAGA;AAChC,YAAIoe,EAAKpe,CAAC,MAAMiG,KAAYmY,EAAKpe,CAAC,EAAE,aAAaiG,GAAU;AACzD,UAAAqY,IAAmBF,EAAKpe,CAAC,EAAE,UAC3Bqe,IAAWre;AACX;AAAA,QACZ;AAGQ,UAAIqe,IAAW;AACb,eAAO;AAET,MAAIA,MAAa,IACfD,EAAK,MAAK,IAEVG,EAAUH,GAAMC,CAAQ,GAGtBD,EAAK,WAAW,MAClBf,EAAOF,CAAI,IAAIiB,EAAK,CAAC,IAEnBf,EAAO,mBAAmB,UAC5B,KAAK,KAAK,kBAAkBF,GAAMmB,KAAoBrY,CAAQ;AAAA,IACxE;AAEM,WAAO;AAAA,EACb,GAEAyW,EAAa,UAAU,MAAMA,EAAa,UAAU,gBAEpDA,EAAa,UAAU,qBACnB,SAA4BS,GAAM;AAChC,QAAIO,GAAWL,GAAQrd;AAGvB,QADAqd,IAAS,KAAK,SACVA,MAAW;AACb,aAAO;AAGT,QAAIA,EAAO,mBAAmB;AAC5B,aAAI,UAAU,WAAW,KACvB,KAAK,UAAU,uBAAO,OAAO,IAAI,GACjC,KAAK,eAAe,KACXA,EAAOF,CAAI,MAAM,WACtB,EAAE,KAAK,iBAAiB,IAC1B,KAAK,UAAU,uBAAO,OAAO,IAAI,IAEjC,OAAOE,EAAOF,CAAI,IAEf;AAIT,QAAI,UAAU,WAAW,GAAG;AAC1B,UAAIqB,IAAO,OAAO,KAAKnB,CAAM,GACzBoB;AACJ,WAAKze,IAAI,GAAGA,IAAIwe,EAAK,QAAQ,EAAExe;AAE7B,QADAye,IAAMD,EAAKxe,CAAC,GACRye,MAAQ,oBACZ,KAAK,mBAAmBA,CAAG;AAE7B,kBAAK,mBAAmB,gBAAgB,GACxC,KAAK,UAAU,uBAAO,OAAO,IAAI,GACjC,KAAK,eAAe,GACb;AAAA,IACf;AAIM,QAFAf,IAAYL,EAAOF,CAAI,GAEnB,OAAOO,KAAc;AACvB,WAAK,eAAeP,GAAMO,CAAS;AAAA,aAC1BA,MAAc;AAEvB,WAAK1d,IAAI0d,EAAU,SAAS,GAAG1d,KAAK,GAAGA;AACrC,aAAK,eAAemd,GAAMO,EAAU1d,CAAC,CAAC;AAI1C,WAAO;AAAA,EACb;AAEA,WAAS0e,EAAW3f,GAAQoe,GAAMwB,GAAQ;AACxC,QAAItB,IAASte,EAAO;AAEpB,QAAIse,MAAW;AACb,aAAO,CAAA;AAET,QAAIuB,IAAavB,EAAOF,CAAI;AAC5B,WAAIyB,MAAe,SACV,CAAA,IAEL,OAAOA,KAAe,aACjBD,IAAS,CAACC,EAAW,YAAYA,CAAU,IAAI,CAACA,CAAU,IAE5DD,IACLE,EAAgBD,CAAU,IAAIjB,EAAWiB,GAAYA,EAAW,MAAM;AAAA,EAC1E;AAEA,EAAAlC,EAAa,UAAU,YAAY,SAAmBS,GAAM;AAC1D,WAAOuB,EAAW,MAAMvB,GAAM,EAAI;AAAA,EACpC,GAEAT,EAAa,UAAU,eAAe,SAAsBS,GAAM;AAChE,WAAOuB,EAAW,MAAMvB,GAAM,EAAK;AAAA,EACrC,GAEAT,EAAa,gBAAgB,SAASoC,GAAS3B,GAAM;AACnD,WAAI,OAAO2B,EAAQ,iBAAkB,aAC5BA,EAAQ,cAAc3B,CAAI,IAE1B4B,EAAc,KAAKD,GAAS3B,CAAI;AAAA,EAE3C,GAEAT,EAAa,UAAU,gBAAgBqC;AACvC,WAASA,EAAc5B,GAAM;AAC3B,QAAIE,IAAS,KAAK;AAElB,QAAIA,MAAW,QAAW;AACxB,UAAIuB,IAAavB,EAAOF,CAAI;AAE5B,UAAI,OAAOyB,KAAe;AACxB,eAAO;AACF,UAAIA,MAAe;AACxB,eAAOA,EAAW;AAAA,IAExB;AAEE,WAAO;AAAA,EACT;AAEA,EAAAlC,EAAa,UAAU,aAAa,WAAsB;AACxD,WAAO,KAAK,eAAe,IAAIJ,EAAe,KAAK,OAAO,IAAI,CAAA;AAAA,EAChE;AAEA,WAASqB,EAAWqB,GAAKhC,GAAG;AAE1B,aADIiC,IAAO,IAAI,MAAMjC,CAAC,GACbhd,IAAI,GAAGA,IAAIgd,GAAG,EAAEhd;AACvB,MAAAif,EAAKjf,CAAC,IAAIgf,EAAIhf,CAAC;AACjB,WAAOif;AAAA,EACT;AAEA,WAASV,EAAUH,GAAMc,GAAO;AAC9B,WAAOA,IAAQ,IAAId,EAAK,QAAQc;AAC9B,MAAAd,EAAKc,CAAK,IAAId,EAAKc,IAAQ,CAAC;AAC9B,IAAAd,EAAK,IAAG;AAAA,EACV;AAEA,WAASS,EAAgBG,GAAK;AAE5B,aADIG,IAAM,IAAI,MAAMH,EAAI,MAAM,GACrBhf,IAAI,GAAGA,IAAImf,EAAI,QAAQ,EAAEnf;AAChC,MAAAmf,EAAInf,CAAC,IAAIgf,EAAIhf,CAAC,EAAE,YAAYgf,EAAIhf,CAAC;AAEnC,WAAOmf;AAAA,EACT;AAEA,WAASvC,EAAKkC,GAAShU,GAAM;AAC3B,WAAO,IAAI,QAAQ,SAAUmR,GAASC,GAAQ;AAC5C,eAASkD,EAAc7B,GAAK;AAC1B,QAAAuB,EAAQ,eAAehU,GAAMuU,CAAQ,GACrCnD,EAAOqB,CAAG;AAAA,MAChB;AAEI,eAAS8B,IAAW;AAClB,QAAI,OAAOP,EAAQ,kBAAmB,cACpCA,EAAQ,eAAe,SAASM,CAAa,GAE/CnD,EAAQ,CAAA,EAAG,MAAM,KAAK,SAAS,CAAC;AAAA,MACtC;AAEI,MAAAqD,EAA+BR,GAAShU,GAAMuU,GAAU,EAAE,MAAM,IAAM,GAClEvU,MAAS,WACXyU,EAA8BT,GAASM,GAAe,EAAE,MAAM,GAAI,CAAE;AAAA,IAE1E,CAAG;AAAA,EACH;AAEA,WAASG,EAA8BT,GAAStB,GAASgC,GAAO;AAC9D,IAAI,OAAOV,EAAQ,MAAO,cACxBQ,EAA+BR,GAAS,SAAStB,GAASgC,CAAK;AAAA,EAEnE;AAEA,WAASF,EAA+BR,GAAShU,GAAM7E,GAAUuZ,GAAO;AACtE,QAAI,OAAOV,EAAQ,MAAO;AACxB,MAAIU,EAAM,OACRV,EAAQ,KAAKhU,GAAM7E,CAAQ,IAE3B6Y,EAAQ,GAAGhU,GAAM7E,CAAQ;AAAA,aAElB,OAAO6Y,EAAQ,oBAAqB;AAG7C,MAAAA,EAAQ,iBAAiBhU,GAAM,SAAS2U,EAAa1C,GAAK;AAGxD,QAAIyC,EAAM,QACRV,EAAQ,oBAAoBhU,GAAM2U,CAAY,GAEhDxZ,EAAS8W,CAAG;AAAA,MAClB,CAAK;AAAA;AAED,YAAM,IAAI,UAAU,wEAAwE,OAAO+B,CAAO;AAAA,EAE9G;;;;AC1dA,MAAMY,KAA6C;AA8B5C,IAAKC,uBAAAA,OACVA,EAAA,gBAAgB,iBAChBA,EAAA,oBAAoB,qBACpBA,EAAA,eAAe,gBAHLA,IAAAA,MAAA,CAAA,CAAA;AA8OZ,MAAMC,IAA6B,CAA2B9e,OAC3D;AAAA,EACC,aAAaA,MAAU,eAAeA,MAAU,cAAcA,MAAU;AAAA,EACxE,WACEA,MAAU,2BACVA,MAAU,eACVA,MAAU,cACVA,MAAU;AAAA,EACZ,YAAYA,MAAU,kBAAkBA,MAAU;AAAA,EAClD,WAAWA,MAAU,gBAAgBA,MAAU,kBAAkBA,MAAU;AAC7E,IAUW+e,KAAyB,MAOjC;AACH,QAAM,CAACC,GAA2BC,CAA4B,IAAIlhB,EAAM;AAAA,IACtE;AAAA,EAAA,GAEI,CAACmhB,GAAgBC,CAAiB,IAAIphB,EAAM;AAAA,IAChD;AAAA,EAAA,GAGIqhB,IAAgBrhB,EAAM,OAAmB,YAAY,GACrDshB,IAA4BthB,EAAM,OAAO,EAAK,GAE9CuhB,IAA6B,CAACC,MAC3B,WAAW,MAAM;AACtB,QAAI,CAACF,EAA0B,SAAS;AACtC,MAAAJ,EAA6B,8BAA8B;AAC3D;AAAA,IACF;AAEA,UAAM,EAAE,aAAAO,EAAA,IAAgBV,EAA2BM,EAAc,OAAO;AACxE,QAAI,CAACI,GAAa;AAChB,MAAAP,EAA6B,0DAA0D;AACvF;AAAA,IACF;AAAA,EACF,GAAGM,KAAmCX,EAA0C;AAGlF,SAAO;AAAA,IACL,2BAAAI;AAAA,IACA,mBAAmBjhB,EAAM;AAAA,MACvB,CAACwhB,MAA6C;AAC5C,QAAIL,KACF,aAAaA,CAAc,GAG7BD,EAA6B,IAAI,GACjCE,EAAkBG,EAA2BC,CAA+B,CAAC,GAC7EH,EAAc,UAAU,cACxBC,EAA0B,UAAU;AAAA,MACtC;AAAA,MACA,CAACH,CAAc;AAAA,IAAA;AAAA,IAEjB,mBAAmBnhB,EAAM,YAAY,MAAM;AACzC,MAAImhB,KACF,aAAaA,CAAc,GAG7BD,EAA6B,IAAI,GACjCE,EAAkB,IAAI,GACtBC,EAAc,UAAU,cACxBC,EAA0B,UAAU;AAAA,IACtC,GAAG,CAACH,CAAc,CAAC;AAAA,IACnB,gCAAgCnhB,EAAM,YAAY,MAAM;AACtD,MAAAkhB,EAA6B,IAAI;AAAA,IACnC,GAAG,CAAA,CAAE;AAAA,IAEL,yBAAyBlhB,EAAM,YAAY,CAAC0hB,MAA2B;AACrE,MAAAL,EAAc,UAAUK;AAAA,IAC1B,GAAG,CAAA,CAAE;AAAA,IACL,qCAAqC1hB,EAAM,YAAY,CAAC2hB,MAAoC;AAC1F,MAAAL,EAA0B,UAAUK;AAAA,IACtC,GAAG,CAAA,CAAE;AAAA,EAAA;AAET;AAMA,SAASC,GACP3B,GACAhe,GACA;AACA,QAAM4f,IAAW7hB,EAAM,OAAOiC,CAAK;AACnC,EAAAjC,EAAM,UAAU,MAAM;AACpB,IAAA6hB,EAAS,UAAU5f;AAAA,EACrB,GAAG,CAACA,CAAK,CAAC;AAEV,QAAM6f,IAAqB9hB,EAAM;AAAA,IAC/B,OAAO+hB,MAAyB;AAC9B,YAAM,EAAE,aAAAN,EAAA,IAAgBV,EAA2Bc,EAAS,OAAO;AACnE,UAAI,CAAAJ;AAIJ,eAAO,IAAI,QAAc,CAACrE,GAASC,MAAW;AAC5C,gBAAM2E,IAAsB,CAAC/f,MAAsB;AACjD,kBAAM,EAAE,aAAAwf,MAAgBV,EAA2B9e,CAAK;AACxD,YAAKwf,MAGLjM,EAAA,GACA4H,EAAA;AAAA,UACF,GACM6E,IAAe,MAAM;AACzB,YAAAzM,EAAA,GACA6H,EAAO,IAAI,MAAM,yDAAyD,CAAC;AAAA,UAC7E,GAEM7H,IAAU,MAAM;AACpB,YAAAyK,EAAQ,IAAI,gBAAyB+B,CAAmB,GACxDD,KAAA,QAAAA,EAAQ,oBAAoB,SAASE;AAAA,UACvC;AAEA,UAAAhC,EAAQ,GAAG,gBAAyB+B,CAAmB,GACvDD,KAAA,QAAAA,EAAQ,iBAAiB,SAASE;AAAA,QACpC,CAAC;AAAA,IACH;AAAA,IACA,CAAChC,CAAO;AAAA,EAAA,GAGJiC,IAA4BliB,EAAM;AAAA,IACtC,OAAO+hB,MAAyB;AAC9B,YAAM,EAAE,WAAAI,EAAA,IAAcpB,EAA2Bc,EAAS,OAAO;AACjE,UAAI,CAAAM;AAIJ,eAAO,IAAI,QAAc,CAAC/E,GAASC,MAAW;AAC5C,gBAAM2E,IAAsB,CAAC/f,MAAsB;AACjD,kBAAM,EAAE,WAAAkgB,MAAcpB,EAA2B9e,CAAK;AACtD,YAAKkgB,MAGL3M,EAAA,GACA4H,EAAA;AAAA,UACF,GACM6E,IAAe,MAAM;AACzB,YAAAzM,EAAA,GACA6H,EAAO,IAAI,MAAM,gEAAgE,CAAC;AAAA,UACpF,GAEM7H,IAAU,MAAM;AACpB,YAAAyK,EAAQ,IAAI,gBAAyB+B,CAAmB,GACxDD,KAAA,QAAAA,EAAQ,oBAAoB,SAASE;AAAA,UACvC;AAEA,UAAAhC,EAAQ,GAAG,gBAAyB+B,CAAmB,GACvDD,KAAA,QAAAA,EAAQ,iBAAiB,SAASE;AAAA,QACpC,CAAC;AAAA,IACH;AAAA,IACA,CAAChC,CAAO;AAAA,EAAA,GAGJmC,IAAoBpiB,EAAM;AAAA,IAC9B,OAAO+hB,MAAyB;AAC9B,YAAM,EAAE,YAAAM,EAAA,IAAetB,EAA2Bc,EAAS,OAAO;AAClE,UAAI,CAAAQ;AAIJ,eAAO,IAAI,QAAc,CAACjF,GAASC,MAAW;AAC5C,gBAAM2E,IAAsB,CAAC/f,MAAsB;AACjD,kBAAM,EAAE,YAAAogB,MAAetB,EAA2B9e,CAAK;AACvD,YAAKogB,MAGL7M,EAAA,GACA4H,EAAA;AAAA,UACF,GACM6E,IAAe,MAAM;AACzB,YAAAzM,EAAA,GACA6H,EAAO,IAAI,MAAM,wDAAwD,CAAC;AAAA,UAC5E,GAEM7H,IAAU,MAAM;AACpB,YAAAyK,EAAQ,IAAI,gBAAyB+B,CAAmB,GACxDD,KAAA,QAAAA,EAAQ,oBAAoB,SAASE;AAAA,UACvC;AAEA,UAAAhC,EAAQ,GAAG,gBAAyB+B,CAAmB,GACvDD,KAAA,QAAAA,EAAQ,iBAAiB,SAASE;AAAA,QACpC,CAAC;AAAA,IACH;AAAA,IACA,CAAChC,CAAO;AAAA,EAAA;AAGV,SAAO,EAAE,oBAAA6B,GAAoB,2BAAAI,GAA2B,mBAAAE,EAAA;AAC1D;AAMO,SAASE,GAASC,GAAuC;AAC9D,QAAMC,IAAqBC,GAAA;AAE3B,MADAF,IAAUA,KAAWC,GACjB,CAACD;AACH,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAIJ,QAAM;AAAA,IACJ,MAAA3f;AAAA,IACA,UAAU;AAAA,MACR,iCAAA4e;AAAA,MAEA,2BAAAP;AAAA,MACA,mBAAAyB;AAAA,MACA,mBAAAC;AAAA,MACA,gCAAAC;AAAA,MACA,yBAAAC;AAAA,MACA,qCAAAC;AAAA,IAAA;AAAA,EACF,IACEP,GAEEtC,IAAUjgB,EAAM,QAAQ,MAAM,IAAI6d,GAAAA,aAAA,GAAqD,EAAE,GAEzFkF,IAAyB/V,GAAsB,EAAE,MAAApK,GAAM,GAEvDogB,IAAmBhjB,EAAM,QAAQ,MAEnC+iB,EAAuB;AAAA,IACrB,CAACpf,MACCA,EAAE,SAAS6W,GAAgB,SAC3B,EAAEH,EAA2B,mBAAmB1W,EAAE;AAAA,EAAA,KACjD,MAEN,CAACof,CAAsB,CAAC,GACrBE,IAAoBjjB,EAAM,QAAQ,MACjCgjB,IAIHD,EAAuB;AAAA,IACrB,CAACpf,MACCA,EAAE,SAAS6W,GAAgB,SAC3B7W,EAAE,WAAW0W,EAA2B,eAAe,MAAM2I,EAAiB;AAAA,EAAA,KAC7E,OAPE,MASR,CAACA,GAAkBD,CAAsB,CAAC,GAGvC,CAACG,GAA4BC,CAA6B,IAAInjB,EAAM,UAExEgjB,KAAA,gBAAAA,EAAkB,eAAc,EAAE;AACpC,EAAAhjB,EAAM,UAAU,MAAM;AACpB,QAAI,CAACgjB;AACH;AAGF,UAAMI,IAA0B,CAACpI,MAA6C;AAC5E,MAAAmI,EAA8BnI,CAAU;AAAA,IAC1C;AAEA,WAAAgI,EAAiB,GAAGK,GAAiB,mBAAmBD,CAAuB,GACxE,MAAM;AACX,MAAAJ,EAAiB,IAAIK,GAAiB,mBAAmBD,CAAuB;AAAA,IAClF;AAAA,EACF,GAAG,CAACJ,GAAkB/C,CAAO,CAAC;AAG9B,QAAMvF,IAAc/B,GAAqB,CAAChM,EAAM,OAAO,QAAQA,EAAM,OAAO,UAAU,GAAG;AAAA,IACvF,MAAA/J;AAAA,IACA,qBAAqBogB,KAAA,gBAAAA,EAAkB;AAAA,EAAA,CACxC,GACKrI,IAAehC,GAAqB,CAAChM,EAAM,OAAO,QAAQA,EAAM,OAAO,UAAU,GAAG;AAAA,IACxF,MAAA/J;AAAA,IACA,qBAAqBqgB,KAAA,gBAAAA,EAAmB;AAAA,EAAA,CACzC,GAEKnI,IAAa9a,EAAM;AAAA,IACvB,MACE0a,EAAY,KAAK,CAACG,MAAMA,EAAE,WAAWlO,EAAM,OAAO,MAAM,KACxDgO,EAAa,KAAK,CAACE,MAAMA,EAAE,WAAWlO,EAAM,OAAO,MAAM;AAAA,IAC3D,CAAC+N,GAAaC,CAAY;AAAA,EAAA;AAE5B,EAAA3a,EAAM,UAAU,MAAM;AACpB,IAAAigB,EAAQ,KAAK,iBAA0BnF,CAAU;AAAA,EACnD,GAAG,CAACmF,GAASnF,CAAU,CAAC;AAExB,QAAMF,IAAa5a,EAAM;AAAA,IACvB,MACE0a,EAAY,KAAK,CAACG,MAAMA,EAAE,WAAWlO,EAAM,OAAO,UAAU,KAC5DgO,EAAa,KAAK,CAACE,MAAMA,EAAE,WAAWlO,EAAM,OAAO,UAAU;AAAA,IAC/D,CAAC+N,GAAaC,CAAY;AAAA,EAAA;AAE5B,EAAA3a,EAAM,UAAU,MAAM;AACpB,IAAAigB,EAAQ,KAAK,qBAA8BrF,CAAU;AAAA,EACvD,GAAG,CAACqF,GAASrF,CAAU,CAAC;AAGxB,QAAM,CAAC0I,GAAqBC,CAAsB,IAAIvjB,EAAM,SAAS4C,EAAK,KAAK;AAC/E,EAAA5C,EAAM,UAAU,MAAM;AACpB,UAAMwjB,IAA+B,CAACze,MAAqC;AACzE,MAAAwe,EAAuBxe,CAAe;AAAA,IACxC;AAEA,WAAAnC,EAAK,GAAG6gB,EAAU,wBAAwBD,CAA4B,GAC/D,MAAM;AACX,MAAA5gB,EAAK,IAAI6gB,EAAU,wBAAwBD,CAA4B;AAAA,IACzE;AAAA,EACF,GAAG,CAAC5gB,CAAI,CAAC,GAGT5C,EAAM,UAAU,MAAM;AACpB,IAAKgjB,KAILJ,EAAA;AAAA,EACF,GAAG,CAACI,CAAgB,CAAC;AAGrB,QAAM,CAACU,GAAgCC,CAAiC,IAAI3jB,EAAM,SAEhF,IAAI;AACN,EAAAA,EAAM,UAAU,MAAM;AACpB,QAAI,CAACgjB;AACH;AAGF,UAAMY,IAA0B,CAACpc,MAAmC;AAClE,MAAIA,EAAY,cAAawb,KAAA,gBAAAA,EAAkB,aAG/CW,EAAkC,mCAAmC;AAAA,IACvE;AAEA,WAAA/gB,EAAK,GAAG6gB,EAAU,yBAAyBG,CAAuB,GAE3D,MAAM;AACX,MAAAhhB,EAAK,IAAI6gB,EAAU,yBAAyBG,CAAuB;AAAA,IACrE;AAAA,EACF,GAAG,CAACZ,GAAkBpgB,CAAI,CAAC,GAE3B5C,EAAM,UAAU,MAAM;AACpB,IAAIsjB,MAAwBpe,EAAgB,gBAI5Cye,EAAkC,IAAI;AAAA,EACxC,GAAG,CAACL,CAAmB,CAAC;AAExB,QAAM,CAACO,GAAeC,CAAgB,IAAI9jB,EAAM;AAAA,IAC9C,MAAM4C,EAAK,iBAAiB,oBAAoB+J,EAAM,OAAO,UAAU,KAAK;AAAA,EAAA;AAE9E,EAAA3M,EAAM,UAAU,MAAM;AACpB,UAAM+jB,IAAuC,MAAM;AACjD,MAAAD,EAAiBlhB,EAAK,iBAAiB,oBAAoB+J,EAAM,OAAO,UAAU,KAAK,IAAI;AAAA,IAC7F,GACMqX,IAAyC,MAAM;AACnD,MAAAF,EAAiB,IAAI;AAAA,IACvB;AAEA,WAAAlhB,EAAK,iBAAiB;AAAA,MACpBygB,GAAiB;AAAA,MACjBU;AAAA,IAAA,GAEFnhB,EAAK,iBAAiB;AAAA,MACpBygB,GAAiB;AAAA,MACjBW;AAAA,IAAA,GAEK,MAAM;AACX,MAAAphB,EAAK,iBAAiB;AAAA,QACpBygB,GAAiB;AAAA,QACjBU;AAAA,MAAA,GAEFnhB,EAAK,iBAAiB;AAAA,QACpBygB,GAAiB;AAAA,QACjBW;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF,GAAG,CAACphB,EAAK,gBAAgB,CAAC;AAE1B,QAAMqhB,IAAiBjkB,EAAM,QAAQ,MAAM;AACzC,UAAMkkB,IAAU,CAAA;AAChB,WAAIjD,KACFiD,EAAQ,KAAKjD,CAAyB,GAEpCyC,KACFQ,EAAQ,KAAKR,CAA8B,GAEtCQ;AAAA,EACT,GAAG,CAACjD,GAA2ByC,CAA8B,CAAC,GAExDzhB,IAAQjC,EAAM,QAAQ,MAAM;AAChC,QAAIikB,EAAe,SAAS;AAC1B,aAAO;AAGT,QAAIhiB,IAAoB;AAExB,WAAIqhB,MAAwBpe,EAAgB,iBAC1CjD,IAAQ,eAKN4hB,MACF5hB,IAAQ,0BAGN+gB,KAAoBE,EAA2B7I,EAA2B,UAAU,MACtFpY,IAAQihB,EAA2B7I,EAA2B,UAAU,IAGnEpY;AAAAA,EACT,GAAG;AAAA,IACDgiB;AAAA,IACAX;AAAA,IACAO;AAAA,IACAb;AAAA,IACAE;AAAA,EAAA,CACD;AAED,EAAAljB,EAAM,UAAU,MAAM;AACpB,IAAAigB,EAAQ,KAAK,gBAAyBhe,CAAK,GAC3C4gB,EAAwB5gB,CAAK;AAAA,EAC/B,GAAG,CAACge,GAAShe,CAAK,CAAC,GACnBjC,EAAM,UAAU,MAAM;AACpB,IAAA8iB,EAAoCE,MAAqB,IAAI;AAAA,EAC/D,GAAG,CAACA,CAAgB,CAAC;AAGrB,QAAMmB,IAAwB5B,EAAQ,oBAAoB;AAC1D,EAAAviB,EAAM,UAAU,MAAM;AACpB,QAAI,CAAAmkB;AAIJ,aAAAzB,EAAkBlB,CAA+B,GAC1C,MAAM;AACX,QAAAmB,EAAA;AAAA,MACF;AAAA,EACF,GAAG,CAACwB,GAAuB3C,CAA+B,CAAC;AAE3D,QAAM;AAAA,IACJ,UAAU4C;AAAA,IACV,MAAMC;AAAA,IACN,UAAUC;AAAA,EAAA,IACR1Y,GAAmB,EAAE,aAAaoX,KAAoB,QAAW,GAE/DtB,KAA8B1hB,EAAM,QAAQ,MAAM;AACtD,UAAMukB,IAA2B;AAAA,MAC/B,YAAYrB;AAAA,MAEZ,UAAU;AAAA,QACR,kBAAAF;AAAA,QACA,mBAAAC;AAAA,QACA,SAAAhD;AAAA,MAAA;AAAA,IACF;AAGF,YAAQhe,GAAA;AAAA,MACN,KAAK;AACH,eAAO;AAAA,UACL,GAAGsiB;AAAA,UACH,UAAU;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,UAEV,OAAAtiB;AAAA,UACA,GAAG8e,EAA2B9e,CAAK;AAAA,UACnC,gBAAgB;AAAA;AAAA,UAGhB,aAAa;AAAA,UACb,iBAAiB;AAAA,QAAA;AAAA,MAGrB,KAAK;AACH,eAAO;AAAA,UACL,GAAGsiB;AAAA,UACH,UAAU;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,UAEV,OAAAtiB;AAAA,UACA,GAAG8e,EAA2B9e,CAAK;AAAA,UACnC,gBAAgB;AAAA;AAAA,UAGhB,aAAa;AAAA,UACb,iBAAiB;AAAA,QAAA;AAAA,MAGrB,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,UACL,GAAGsiB;AAAA,UACH,UAAUH;AAAA,UACV,MAAMC;AAAA,UACN,UAAUC;AAAA,UAEV,OAAAriB;AAAA,UACA,GAAG8e,EAA2B9e,CAAK;AAAA,UACnC,gBAAgB;AAAA,UAEhB,aAAa6Y;AAAA,UACb,iBAAiBF;AAAA,QAAA;AAAA,MAGrB,KAAK;AACH,eAAO;AAAA,UACL,GAAG2J;AAAA,UACH,UAAUH;AAAA,UACV,MAAMC;AAAA,UACN,UAAUC;AAAA,UAEV,OAAAriB;AAAA,UACA,GAAG8e,EAA2B9e,CAAK;AAAA,UACnC,gBAAgB;AAAA,UAEhB,aAAa6Y;AAAA,UACb,iBAAiBF;AAAA,QAAA;AAAA,MAGrB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,UACL,GAAG2J;AAAA,UACH,UAAUH;AAAA,UACV,MAAMC;AAAA,UACN,UAAUC;AAAA,UAEV,OAAAriB;AAAA,UACA,GAAG8e,EAA2B9e,CAAK;AAAA,UACnC,gBAAgB;AAAA,UAEhB,aAAa6Y;AAAA,UACb,iBAAiBF;AAAA,QAAA;AAAA,MAGrB,KAAK;AACH,eAAO;AAAA,UACL,GAAG2J;AAAA,UACH,UAAU;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,UAEV,OAAO;AAAA,UACP,GAAGxD,EAA2B,QAAQ;AAAA,UACtC,gBAAAkD;AAAA;AAAA,UAGA,aAAa;AAAA,UACb,iBAAiB;AAAA,QAAA;AAAA,IACnB;AAAA,EAEN,GAAG;AAAA,IACDG;AAAA,IACAC;AAAA,IACAC;AAAA,IACApB;AAAA,IACAjD;AAAA,IACA+C;AAAA,IACA/gB;AAAA,IACA6Y;AAAA,IACAF;AAAA,EAAA,CACD,GAEK,EAAE,oBAAAkH,GAAoB,2BAAAI,GAA2B,mBAAAE,MACrDR,GAA+B3B,GAAShe,CAAK,GAEzCuiB,IAAkBxkB,EAAM;AAAA,IAC5B,CAAC+hB,MACQ,IAAI,QAAwB,CAAC3E,GAASC,MAAW;AACtD,YAAM2E,IAAsB,CAACyC,MAAuC;AAClE,QAAKA,MAGLjP,EAAA,GACA4H,EAAQqH,CAAM;AAAA,MAChB,GACMxC,IAAe,MAAM;AACzB,QAAAzM,EAAA,GACA6H,EAAO,IAAI,MAAM,sDAAsD,CAAC;AAAA,MAC1E,GAEM7H,IAAU,MAAM;AACpB,QAAAyK,EAAQ,IAAI,iBAA0B+B,CAAmB,GACzDD,KAAA,QAAAA,EAAQ,oBAAoB,SAASE;AAAA,MACvC;AAEA,MAAAhC,EAAQ,GAAG,iBAA0B+B,CAAmB,GACxDD,KAAA,QAAAA,EAAQ,iBAAiB,SAASE;AAAA,IACpC,CAAC;AAAA,IAEH,CAAChC,CAAO;AAAA,EAAA,GAGJyE,KAAsB1kB,EAAM;AAAA,IAChC,CAAC+hB,MACQ,IAAI,QAAwB,CAAC3E,GAASC,MAAW;AACtD,YAAM2E,IAAsB,CAAC2C,MAA2C;AACtE,QAAKA,MAGLnP,EAAA,GACA4H,EAAQuH,CAAU;AAAA,MACpB,GACM1C,IAAe,MAAM;AACzB,QAAAzM,EAAA,GACA6H,EAAO,IAAI,MAAM,0DAA0D,CAAC;AAAA,MAC9E,GAEM7H,IAAU,MAAM;AACpB,QAAAyK,EAAQ,IAAI,qBAA8B+B,CAAmB,GAC7DD,KAAA,QAAAA,EAAQ,oBAAoB,SAASE;AAAA,MACvC;AAEA,MAAAhC,EAAQ,GAAG,qBAA8B+B,CAAmB,GAC5DD,KAAA,QAAAA,EAAQ,iBAAiB,SAASE;AAAA,IACpC,CAAC;AAAA,IAEH,CAAChC,CAAO;AAAA,EAAA;AAGV,SAAOjgB,EAAM,QAAQ,OACZ;AAAA,IACL,GAAG0hB;AAAA,IACH,oBAAAI;AAAA,IACA,2BAAAI;AAAA,IACA,mBAAAE;AAAA,IACA,iBAAAoC;AAAA,IACA,qBAAAE;AAAA,EAAA,IAED;AAAA,IACDhD;AAAA,IACAI;AAAA,IACAI;AAAA,IACAE;AAAA,IACAoC;AAAA,IACAE;AAAA,EAAA,CACD;AACH;AC15BO,IAAKE,uBAAAA,OACVA,EAAA,yBAAyB,0BAMzBA,EAAA,oBAAoB,qBAKpBA,EAAA,kBAAkB,mBAZRA,IAAAA,MAAA,CAAA,CAAA;AAqJZ,SAASC,GAAgC9O,GAA4B+O,GAA4B;AAC/F,QAAMC,IAAa,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAKhP,CAAC,GAAG,GAAG,OAAO,KAAK+O,CAAC,CAAC,CAAC;AAIjE,aAAWlF,KAAOmF;AAChB,YAAQnF,GAAA;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,YAAI7J,EAAE6J,CAAG,MAAMkF,EAAElF,CAAG;AAClB,iBAAO;AAET;AAAA,MACF;AAEE,cAAMoF,IAA8BpF;AACpC,cAAM,IAAI,MAAM,eAAeoF,CAAoB,kCAAkC;AAAA,IAAA;AAI3F,SAAO;AACT;AAIA,SAASC,GACPhF,GACAlb,GACA;AACA,QAAMmgB,IAAqBllB,EAAM,OAAO+E,CAAe;AACvD,SAAA/E,EAAM,UAAU,MAAM;AACpB,IAAAklB,EAAmB,UAAUngB;AAAA,EAC/B,GAAG,CAACA,CAAe,CAAC,GAEa/E,EAAM;AAAA,IACrC,OAAOiC,GAA4C8f,MAAyB;AAC1E,UAAImD,EAAmB,YAAYjjB;AAInC,eAAO,IAAI,QAAc,CAACmb,GAASC,MAAW;AAC5C,gBAAM8H,IAAoB,CAACC,MAAkD;AAC3E,YAAIA,MAAanjB,MAGjBuT,EAAA,GACA4H,EAAA;AAAA,UACF,GACM6E,IAAe,MAAM;AACzB,YAAAzM,EAAA,GACA6H;AAAA,cACE,IAAI;AAAA,gBACF,kDAAkDpb,CAAK;AAAA,cAAA;AAAA,YACzD;AAAA,UAEJ,GAEMuT,IAAU,MAAM;AACpB,YAAAyK,EAAQ,IAAI,0BAAqCkF,CAAiB,GAClEpD,KAAA,QAAAA,EAAQ,oBAAoB,SAASE;AAAA,UACvC;AAEA,UAAAhC,EAAQ,GAAG,0BAAqCkF,CAAiB,GACjEpD,KAAA,QAAAA,EAAQ,iBAAiB,SAASE;AAAA,QACpC,CAAC;AAAA,IACH;AAAA,IACA,CAAChC,CAAO;AAAA,EAAA;AAIZ;AAIA,SAASoF,GACPC,GACAC,GACA;AACA,QAAMC,IAAiBF,aAAuBG,IAExCC,IAA+B1lB,EAAM;AAAA,IACzCwlB,IAAiBD,IAAsB;AAAA,EAAA;AAGzC,SAAAvlB,EAAM,UAAU,MAAM;AACpB,QAAI,CAACwlB,GAAgB;AACnB,MAAAE,EAA6B,UAAU;AACvC;AAAA,IACF;AAEA,IACEA,EAA6B,YAAY,QACzCb,GAAgCa,EAA6B,SAASH,CAAmB,MAK3FG,EAA6B,UAAUH;AAAA,EACzC,GAAG,CAACC,GAAgBD,CAAmB,CAAC,GAEfvlB,EAAM,YAAY,YAAY;AACrD,QAAIwlB,GAAgB;AAClB,UAAI,CAACE,EAA6B;AAChC,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAGJ,aAAOJ,EAAY,MAAMI,EAA6B,OAAO;AAAA,IAC/D;AACE,aAAOJ,EAAY,MAAA;AAAA,EAEvB,GAAG,CAACE,GAAgBF,CAAW,CAAC;AAGlC;AAkBO,SAASK,GACdL,GACA5hB,IAAkE,IAChD;AAClB,QAAM,EAAE,MAAMkiB,GAAa,iCAAApE,GAAiC,GAAGqE,MAAgBniB,GAEzEyN,IAAkB5H,GAAA,GAClB3G,IAAO5C,EAAM;AAAA,IACjB,MAAMmR,KAAmByU,KAAe,IAAInc,GAAA;AAAA,IAC5C,CAAC0H,GAAiByU,CAAW;AAAA,EAAA,GAGzB3F,IAAUjgB,EAAM;AAAA,IACpB,MAAM,IAAI6d,GAAAA,aAAA;AAAA,IACV,CAAA;AAAA,EAAC,GAGGiI,IAAuC9lB,EAAM;AAAA,IACjD,CAAoD+E,OACjD;AAAA,MACC,aACEA,MAAoBG,EAAgB,aACpCH,MAAoBG,EAAgB,gBACpCH,MAAoBG,EAAgB;AAAA,IAAA;AAAA,IAS1C,CAAA;AAAA,EAAC,GAGG,CAACoe,GAAqBC,CAAsB,IAAIvjB,EAAM,SAAS4C,EAAK,KAAK;AAC/E,EAAA5C,EAAM,UAAU,MAAM;AACpB,UAAMwjB,IAA+B,CAACze,MAAqC;AACzE,MAAAwe,EAAuBxe,CAAe;AAAA,IACxC;AAEA,WAAAnC,EAAK,GAAG6gB,EAAU,wBAAwBD,CAA4B,GAC/D,MAAM;AACX,MAAA5gB,EAAK,IAAI6gB,EAAU,wBAAwBD,CAA4B;AAAA,IACzE;AAAA,EACF,GAAG,CAAC5gB,CAAI,CAAC,GAET5C,EAAM,UAAU,MAAM;AACpB,UAAM+lB,IAA0B,OAAOhb,MAAiB;AACtD,MAAAkV,EAAQ,KAAK,qBAAgClV,CAAK;AAAA,IACpD;AAEA,WAAAnI,EAAK,GAAG6gB,EAAU,mBAAmBsC,CAAuB,GACrD,MAAM;AACX,MAAAnjB,EAAK,IAAI6gB,EAAU,mBAAmBsC,CAAuB;AAAA,IAC/D;AAAA,EACF,GAAG,CAACnjB,GAAMqd,CAAO,CAAC,GAElBjgB,EAAM,UAAU,MAAM;AACpB,UAAMgmB,IAAwB,OAAOjb,MAAiB;AACpD,MAAAkV,EAAQ,KAAK,mBAA8BlV,CAAK;AAAA,IAClD;AAEA,WAAAnI,EAAK,GAAG6gB,EAAU,iBAAiBuC,CAAqB,GACjD,MAAM;AACX,MAAApjB,EAAK,IAAI6gB,EAAU,iBAAiBuC,CAAqB;AAAA,IAC3D;AAAA,EACF,GAAG,CAACpjB,GAAMqd,CAAO,CAAC;AAElB,QAAM,EAAE,kBAAAtY,EAAA,IAAqBD,GAAoB,EAAE,MAAA9E,GAAM,GACnDqjB,IAAoBte,EAAiB,oBAAoBgF,EAAM,OAAO,MAAM,GAC5EuZ,IAAclmB,EAAM,QAAQ,MAAM;AACtC,QAAKimB;AAGL,aAAO;AAAA,QACL,QAAQtZ,EAAM,OAAO;AAAA,QACrB,aAAahF;AAAA,QACb,aAAase;AAAA,MAAA;AAAA,EAEjB,GAAG,CAACte,GAAkBse,CAAiB,CAAC,GAClCE,IAAwBxe,EAAiB,oBAAoBgF,EAAM,OAAO,UAAU,GACpFyZ,IAAkBpmB,EAAM,QAAQ,MAAM;AAC1C,QAAKmmB;AAGL,aAAO;AAAA,QACL,QAAQxZ,EAAM,OAAO;AAAA,QACrB,aAAahF;AAAA,QACb,aAAawe;AAAA,MAAA;AAAA,EAEjB,GAAG,CAACxe,GAAkBwe,CAAqB,CAAC,GACtCE,IAAyB1e,EAAiB,oBAAoBgF,EAAM,OAAO,WAAW,GACtF2Z,IAAmBtmB,EAAM,QAAQ,MAAM;AAC3C,QAAKqmB;AAGL,aAAO;AAAA,QACL,QAAQ1Z,EAAM,OAAO;AAAA,QACrB,aAAahF;AAAA,QACb,aAAa0e;AAAA,MAAA;AAAA,EAEjB,GAAG,CAAC1e,GAAkB0e,CAAsB,CAAC,GAEvC;AAAA,IACJ,2BAAApF;AAAA,IACA,mBAAAyB;AAAA,IACA,mBAAAC;AAAA,IACA,gCAAAC;AAAA,IACA,yBAAAC;AAAA,IACA,qCAAAC;AAAA,EAAA,IACE9B,GAAA,GAEEuF,IAAgDvmB,EAAM;AAAA,IAC1D,OAAO;AAAA,MACL,SAAAigB;AAAA,MACA,aAAAqF;AAAA,MACA,iCAAA9D;AAAA,MAEA,2BAAAP;AAAA,MACA,mBAAAyB;AAAA,MACA,mBAAAC;AAAA,MACA,gCAAAC;AAAA,MACA,yBAAAC;AAAA,MACA,qCAAAC;AAAA,IAAA;AAAA,IAEF;AAAA,MACE7C;AAAA,MACAuB;AAAA,MACA8D;AAAA,MACArE;AAAA,MACAyB;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,IAAA;AAAA,EACF,GAGI0D,IAAoBxmB,EAAM,QAAQ,MAGR;AAC9B,UAAMukB,IAA6B;AAAA,MACjC,MAAA3hB;AAAA,MACA,UAAU2jB;AAAA,IAAA;AAGZ,YAAQjD,GAAA;AAAA,MACN,KAAKpe,EAAgB;AACnB,eAAO;AAAA,UACL,GAAGqf;AAAA,UAEH,iBAAiBrf,EAAgB;AAAA,UACjC,GAAG4gB,EAAqC5gB,EAAgB,UAAU;AAAA,UAElE,OAAO;AAAA,YACL,aAAa;AAAA,YACb,iBAAiB;AAAA,YACjB,kBAAkB;AAAA,UAAA;AAAA,QACpB;AAAA,MAGJ,KAAKA,EAAgB;AAAA,MACrB,KAAKA,EAAgB;AAAA,MACrB,KAAKA,EAAgB;AACnB,eAAO;AAAA,UACL,GAAGqf;AAAA,UAEH,iBAAiBjB;AAAA,UACjB,GAAGwC,EAAqCxC,CAAmB;AAAA,UAE3D,OAAO;AAAA,YACL,aAAa4C;AAAA,YACb,iBAAiBE;AAAA,YACjB,kBAAkBE;AAAA,UAAA;AAAA,QACpB;AAAA,MAGJ,KAAKphB,EAAgB;AACnB,eAAO;AAAA,UACL,GAAGqf;AAAA,UAEH,iBAAiBrf,EAAgB;AAAA,UACjC,GAAG4gB,EAAqC5gB,EAAgB,YAAY;AAAA,UAEpE,OAAO;AAAA,YACL,aAAa;AAAA,YACb,iBAAiB;AAAA,YACjB,kBAAkB;AAAA,UAAA;AAAA,QACpB;AAAA,IACF;AAAA,EAEN,GAAG;AAAA,IACDqhB;AAAA,IACA3jB;AAAA,IACA0gB;AAAA,IACA4C;AAAA,IACAE;AAAA,IACAN;AAAA,EAAA,CACD;AACD,EAAA9lB,EAAM,UAAU,MAAM;AACpB,IAAAigB,EAAQ,KAAK,0BAAqCuG,EAAkB,eAAe;AAAA,EACrF,GAAG,CAACvG,GAASuG,EAAkB,eAAe,CAAC;AAE/C,QAAMC,IAA2BxB;AAAA,IAC/BhF;AAAA,IACAuG,EAAkB;AAAA,EAAA,GAGd1E,IAAqB9hB,EAAM;AAAA,IAC/B,OAAO+hB,MACE0E;AAAA,MACLvhB,EAAgB;AAAA,MAChB6c;AAAA,IAAA;AAAA,IAGJ,CAAC0E,CAAwB;AAAA,EAAA,GAGrBC,IAAwB1mB,EAAM;AAAA,IAClC,OAAO+hB,MACE0E,EAAyBvhB,EAAgB,cAAc6c,CAAM;AAAA,IAEtE,CAAC0E,CAAwB;AAAA,EAAA,GAGrBlM,IAAQ+H;AAAA,IACZtiB,EAAM;AAAA,MACJ,OAAO;AAAA,QACL,iBAAiBwmB,EAAkB;AAAA,QACnC,MAAA5jB;AAAA,QACA,UAAU2jB;AAAA,MAAA;AAAA,MAEZ,CAACC,GAAmB5jB,GAAM2jB,CAAe;AAAA,IAAA;AAAA,EAC3C,GAGII,IAAmBtB,GAA2BC,GAAaO,CAAW,GAEtEe,IAAQ5mB,EAAM;AAAA,IAClB,OAAO6mB,IAAwC,CAAA,MAAO;;AACpD,YAAM;AAAA,QACJ,QAAA9E;AAAA,QACA,QAAA+E,IAAS,EAAE,YAAY,EAAE,SAAS,IAAM,gBAAgB,EAAE,kBAAkB,GAAA,IAAO;AAAA,QACnF,oBAAAC;AAAA,MAAA,IACEF;AAEJ,YAAMH,EAAsB3E,CAAM;AAElC,YAAMiF,IAAgB,MAAM;AAC1B,QAAApkB,EAAK,WAAA;AAAA,MACP;AACA,MAAAmf,KAAA,QAAAA,EAAQ,iBAAiB,SAASiF;AAElC,UAAIC,IAAuB;AAC3B,YAAM,QAAQ,IAAI;AAAA,QAChBN,IAAmB,KAAK,CAAC,EAAE,WAAAO,IAAW,kBAAAC,SAAuB;;AAI3D,iBAAAF,OADE7gB,MAAAF,KAF8BkhB,GAAmBD,EAAgB,EAEzC,eAAxB,gBAAAjhB,GAAoC,WAApC,gBAAAE,GAA4C,WAAU,KACI,GAErDxD,EAAK,QAAQskB,IAAWC,IAAkBJ,EAAkB;AAAA,QACrE,CAAC;AAAA;AAAA,SAGD7gB,IAAA4gB,EAAO,eAAP,QAAA5gB,EAAmB,UACftD,EAAK,iBAAiB;AAAA,UACpB;AAAA,UACA;AAAA,YACAwD,IAAA0gB,EAAO,eAAP,gBAAA1gB,EAAmB,mBAAkB,CAAA;AAAA,QAAC,IAExC,QAAQ,QAAA;AAAA,SACZD,IAAA2gB,EAAO,WAAP,QAAA3gB,EAAe,UACXvD,EAAK,iBAAiB;AAAA,UACpB;AAAA,UACA;AAAA,YACA0D,IAAAwgB,EAAO,WAAP,gBAAAxgB,EAAe,mBAAkB,CAAA;AAAA,QAAC,IAEpC,QAAQ,QAAA;AAAA,SACZD,IAAAygB,EAAO,gBAAP,QAAAzgB,EAAoB,UAChBzD,EAAK,iBAAiB;AAAA,UACpB;AAAA,UACA;AAAA,YACAykB,KAAAP,EAAO,gBAAP,gBAAAO,GAAoB,mBAAkB,CAAA;AAAA,QAAC,IAEzC,QAAQ,QAAA;AAAA,MAAQ,CACrB,GAED,MAAMvF,EAAmBC,CAAM,GAC3BkF,KACF,MAAM1M,EAAM,mBAAmBwH,CAAM,GAGvCA,KAAA,QAAAA,EAAQ,oBAAoB,SAASiF;AAAA,IACvC;AAAA,IACA,CAACpkB,GAAM8jB,GAAuBC,GAAkB7E,GAAoBvH,EAAM,kBAAkB;AAAA,EAAA,GAGxF+M,KAAMtnB,EAAM,YAAY,YAAY;AACxC,UAAM4C,EAAK,WAAA;AAAA,EACb,GAAG,CAACA,CAAI,CAAC,GAEH2kB,IAAoBvnB,EAAM,YAAY,YAAY;AACtD,UAAMwnB,IAAc,MAAMb,EAAA;AAC1B,UAAM/jB,EAAK,kBAAkB4kB,EAAY,WAAWA,EAAY,gBAAgB;AAAA,EAClF,GAAG,CAACb,GAAkB/jB,CAAI,CAAC;AAC3B,SAAA5C,EAAM;AAAA,IACJ,MAAM;AACJ,MAAAunB,EAAA,EAAoB,MAAM,CAAC7I,MAAQ;AAEjC,gBAAQ,KAAK,2CAA2CA,CAAG;AAAA,MAC7D,CAAC;AAAA,IACH;AAAA,IACA;AAAA;AAAA,IAAA;AAAA,EAEA,GAGK1e,EAAM;AAAA,IACX,OAAO;AAAA,MACL,GAAGwmB;AAAA,MAEH,oBAAA1E;AAAA,MACA,uBAAA4E;AAAA,MAEA,mBAAAa;AAAA,MACA,OAAAX;AAAA,MACA,KAAAU;AAAA,IAAA;AAAA,IAEF,CAACd,GAAmB1E,GAAoB4E,GAAuBa,GAAmBX,GAAOU,EAAG;AAAA,EAAA;AAEhG;AC7nBO,SAASG,GAMdC,GACAzhB,GACA0hB,GACAC,GACA;AACA,QAAMC,IAAW7nB,EAAM,QAAQ,MAAM,MAAM;AAAA,EAAC,GAAG,CAAA,CAAE,GAC3C8nB,IAAkB9nB,EAAM,YAAY2nB,KAAaE,GAAUD,KAAgB,EAAE,GAC7EznB,IAAWynB,IAAeE,IAAkBH,GAE5C1H,IAAUjgB,EAAM,QAAQ,MACvB0nB,IAGD,cAAcA,IACTA,EAAS,SAAS,UAEpBA,IALE,MAMR,CAACA,CAAQ,CAAC;AAEb,EAAA1nB,EAAM,UAAU,MAAM;AACpB,QAAI,GAACigB,KAAW,CAAC9f;AAGjB,aAAA8f,EAAQ,GAAGha,GAAO9F,CAAQ,GACnB,MAAM;AACX,QAAA8f,EAAQ,IAAIha,GAAO9F,CAAQ;AAAA,MAC7B;AAAA,EACF,GAAG,CAAC8f,GAASha,GAAO9F,CAAQ,CAAC;AAC/B;ACLO,IAAK4nB,uBAAAA,OAKVA,EAAA,kBAAkB,mBALRA,IAAAA,MAAA,CAAA,CAAA;AAcL,SAASC,GAAmBzF,GAAsD;AACvF,QAAM,EAAE,MAAA3f,EAAA,IAASqlB,GAAiB1F,CAAO,GAEnCtC,IAAUjgB,EAAM;AAAA,IACpB,MAAM,IAAI6d,GAAAA,aAAA;AAAA,IACV,CAAA;AAAA,EAAC,GAGGtD,IAAQ+H,GAASC,CAAO,GAExB2F,IAAwC5M,GAAkB,EAAE,MAAA1Y,GAAM,GAClEulB,IAAcnoB,EAAM,QAAQ,OAAO,EAAE,MAAA4C,MAAS,CAACA,CAAI,CAAC,GACpDwlB,IAAOrU,GAAQoU,CAAW,GAE1BE,IAEFroB,EAAM,QAAQ,MACTkoB,EAAe,IAAI,CAACI,MAAkB;;AAC3C,YAAQA,EAAc,gBAAgB,UAAA;AAAA,MACpC,KAAK1lB,EAAK,iBAAiB;AACzB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS0lB,EAAc;AAAA,UAEvB,IAAIA,EAAc,WAAW;AAAA,UAC7B,WAAWA,EAAc,WAAW;AAAA,UACpC,MAAM1lB,EAAK;AAAA,QAAA;AAAA,MAGf,OAAKsD,IAAAqU,EAAM,SAAS,qBAAf,gBAAArU,EAAiC;AAAA,MACtC,OAAKE,IAAAmU,EAAM,SAAS,sBAAf,gBAAAnU,EAAkC;AACrC,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAASkiB,EAAc;AAAA,UAEvB,IAAIA,EAAc,WAAW;AAAA,UAC7B,WAAWA,EAAc,WAAW;AAAA,UACpC,QACEniB,IAAAoU,EAAM,SAAS,qBAAf,gBAAApU,EAAiC,cAAamiB,EAAc,gBAAgB,WACxE/N,EAAM,SAAS,mBACfA,EAAM,SAAS;AAAA,QAAA;AAAA,MAGzB;AAKE,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS+N,EAAc;AAAA,UAEvB,IAAIA,EAAc,WAAW;AAAA,UAC7B,WAAWA,EAAc,WAAW;AAAA,UACpC,MAAM,MAAM,KAAK1lB,EAAK,mBAAmB,OAAA,CAAQ,EAAE;AAAA,YACjD,CAACe,MAAMA,EAAE,aAAa2kB,EAAc,gBAAgB;AAAA,UAAA;AAAA,QACtD;AAAA,IACF;AAAA,EAEN,CAAC,GACA,CAACJ,GAAgBtlB,CAAI,CAAC,GAEnB2lB,IAAmBvoB,EAAM,QAAQ,MACE,CAAC,GAAGqoB,GAAuB,GAAGD,EAAK,YAAY,GAErF,CAACC,GAAuBD,EAAK,YAAY,CAAC,GAEvCI,IAAiCxoB,EAAM,OAAO,oBAAI,KAAkC,GACpFyoB,IAAyBzoB,EAAM,QAAQ,MAAM;AACjD,UAAM2c,wBAAU,KAAA;AAChB,eAAW/X,KAAW2jB;AACpB,MAAIC,EAA+B,QAAQ,IAAI5jB,EAAQ,EAAE,KAIzD4jB,EAA+B,QAAQ,IAAI5jB,EAAQ,IAAI+X,CAAG;AAG5D,WAAO4L,EAAiB,KAAK,CAACxS,GAAG+O,MAAM;AACrC,YAAM4D,IAAmBF,EAA+B,QAAQ,IAAIzS,EAAE,EAAE,GAClE4S,IAAmBH,EAA+B,QAAQ,IAAI1D,EAAE,EAAE;AACxE,aAAI,OAAO4D,IAAqB,OAAe,OAAOC,IAAqB,MAClE,IAGFD,EAAiB,YAAYC,EAAiB,QAAA;AAAA,IACvD,CAAC;AAAA,EACH,GAAG,CAACJ,CAAgB,CAAC,GAEfK,IAAkC5oB,EAAM,OAAO,oBAAI,KAAK;AAC9D,SAAAA,EAAM,UAAU,MAAM;AACpB,eAAW4E,KAAW6jB;AACpB,MAAIG,EAAgC,QAAQ,IAAIhkB,EAAQ,EAAE,MAI1DgkB,EAAgC,QAAQ,IAAIhkB,EAAQ,EAAE,GACtDqb,EAAQ,KAAK,mBAA+Brb,CAAO;AAAA,EAEvD,GAAG,CAAC6jB,CAAsB,CAAC,GAEpBzoB,EAAM;AAAA,IACX,OAAO;AAAA,MACL,UAAUyoB;AAAA,MACV,MAAML,EAAK;AAAA,MACX,WAAWA,EAAK;AAAA,MAChB,UAAU,EAAE,SAAAnI,EAAA;AAAA,IAAQ;AAAA,IAEtB,CAACwI,GAAwBL,EAAK,MAAMA,EAAK,SAAS;AAAA,EAAA;AAEtD;","x_google_ignoreList":[53]}