{"version":3,"file":"flamflix-sdk.cjs","sources":["../src/index.js"],"sourcesContent":["// Flamflix SDK - Main Entry Point\n// Only initializeFlamflix is exported as the public API\n\n\"use strict\";\n\n// WAV Conversion Functions\nfunction audioBufferToWav(buffer) {\n  const numChannels = buffer.numberOfChannels;\n  const sampleRate = buffer.sampleRate;\n  const format = 1;\n  const bitDepth = 16;\n  const bytesPerSample = bitDepth / 8;\n  const blockAlign = numChannels * bytesPerSample;\n  const length = buffer.length;\n  const arrayBuffer = new ArrayBuffer(\n    44 + length * numChannels * bytesPerSample\n  );\n  const view = new DataView(arrayBuffer);\n\n  const writeString = (offset, string) => {\n    for (let i = 0; i < string.length; i++) {\n      view.setUint8(offset + i, string.charCodeAt(i));\n    }\n  };\n\n  writeString(0, \"RIFF\");\n  view.setUint32(4, 36 + length * numChannels * bytesPerSample, true);\n  writeString(8, \"WAVE\");\n  writeString(12, \"fmt \");\n  view.setUint32(16, 16, true);\n  view.setUint16(20, format, true);\n  view.setUint16(22, numChannels, true);\n  view.setUint32(24, sampleRate, true);\n  view.setUint32(28, sampleRate * blockAlign, true);\n  view.setUint16(32, blockAlign, true);\n  view.setUint16(34, bitDepth, true);\n  writeString(36, \"data\");\n  view.setUint32(40, length * numChannels * bytesPerSample, true);\n\n  let offset = 44;\n  for (let i = 0; i < length; i++) {\n    for (let channel = 0; channel < numChannels; channel++) {\n      const sample = Math.max(\n        -1,\n        Math.min(1, buffer.getChannelData(channel)[i])\n      );\n      view.setInt16(offset, sample * 0x7fff, true);\n      offset += 2;\n    }\n  }\n\n  return new Blob([arrayBuffer], { type: \"audio/wav\" });\n}\n\n// Convert Blob to Base64\nfunction blobToBase64(blob) {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.onload = () => {\n      const result = reader.result;\n      const base64 = result.split(\",\")[1];\n      resolve(base64);\n    };\n    reader.onerror = reject;\n    reader.readAsDataURL(blob);\n  });\n}\n\n// Convert WebM audio to WAV using Web Audio API\nasync function convertWebMToWav(webmBlob) {\n  return new Promise(async (resolve, reject) => {\n    try {\n      // Create audio context\n      const audioContext = new (window.AudioContext ||\n        window.webkitAudioContext)();\n\n      // Convert blob to array buffer\n      const arrayBuffer = await webmBlob.arrayBuffer();\n\n      // Decode audio data\n      const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);\n\n      // Convert to WAV\n      const wavBlob = audioBufferToWav(audioBuffer);\n\n      // Close audio context\n      await audioContext.close();\n\n      resolve(wavBlob);\n    } catch (error) {\n      reject(error);\n    }\n  });\n}\n\n// Check microphone permission status\nasync function checkMicrophonePermission() {\n  // Check if navigator.permissions is supported\n  if (!navigator.permissions) {\n    console.warn(\"Permissions API not supported in this browser\");\n    return {\n      state: \"unknown\",\n      supported: false,\n      message: \"Permissions API not supported in this browser\",\n    };\n  }\n\n  // Query microphone permission\n  const permissionStatus = await navigator.permissions.query({\n    name: \"microphone\",\n  });\n\n  return {\n    state: permissionStatus.state, // 'granted', 'denied', or 'prompt'\n    supported: true,\n    message: `Microphone permission is ${permissionStatus.state}`,\n  };\n}\n\n// Canvas Renderer for Alpha Channel Video Rendering\nfunction createCanvasRenderer(options = {}) {\n  const {\n    videoElement,\n    container,\n    width = \"100%\",\n    height = \"auto\",\n    style = {},\n    objectFit = \"contain\",\n    onError,\n    filters = {},\n    preserveDrawingBuffer = false,\n    className = \"\",\n  } = options;\n\n  // Make these mutable so they can be updated\n  let enableAlphaProcessing = options.enableAlphaProcessing || false;\n  let isHorizontal = options.isHorizontal || false;\n  let frameRate = options.frameRate || 18;\n\n  // Internal state\n  let canvasElement = null;\n  let animationFrameId = null;\n  let isRendering = false;\n  let containerElement = container;\n  let lastTime = 0;\n\n  // Create canvas element for alpha channel rendering\n  function createCanvasElement() {\n    const canvas = document.createElement(\"canvas\");\n\n    if (className) {\n      canvas.className = className;\n    }\n\n    const canvasStyle = {\n      width: typeof width === \"number\" ? `${width}px` : width,\n      height: typeof height === \"number\" ? `${height}px` : height,\n      maxWidth: \"100%\",\n      objectFit: objectFit,\n      display: \"block\",\n      ...style,\n    };\n\n    Object.assign(canvas.style, canvasStyle);\n\n    if (preserveDrawingBuffer) {\n      canvas.preserveDrawingBuffer = true;\n    }\n\n    return canvas;\n  }\n\n  // Process vertical alpha channel\n  function processVerticalAlpha(imageData) {\n    const { data, width, height } = imageData;\n    const newImageData = new ImageData(width, height / 2);\n    const newData = newImageData.data;\n    const halfHeight = height / 2;\n\n    for (let y = 0; y < halfHeight; y++) {\n      for (let x = 0; x < width; x++) {\n        const colorY = y;\n        const colorIndex = (colorY * width + x) * 4;\n        const alphaY = colorY + halfHeight;\n        const alphaIndex = (alphaY * width + x) * 4;\n        const outputIndex = (y * width + x) * 4;\n\n        const r = data[colorIndex];\n        const g = data[colorIndex + 1];\n        const b = data[colorIndex + 2];\n        const alpha = data[alphaIndex];\n\n        newData[outputIndex] = r;\n        newData[outputIndex + 1] = g;\n        newData[outputIndex + 2] = b;\n        newData[outputIndex + 3] = alpha;\n      }\n    }\n\n    return newImageData;\n  }\n\n  // Process horizontal alpha channel\n  function processHorizontalAlpha(imageData) {\n    const { data, width, height } = imageData;\n    const newImageData = new ImageData(width / 2, height);\n    const newData = newImageData.data;\n    const halfWidth = width / 2;\n\n    for (let y = 0; y < height; y++) {\n      for (let x = 0; x < halfWidth; x++) {\n        const colorX = x;\n        const colorY = y;\n        const colorIndex = (colorY * width + colorX) * 4;\n        const alphaX = colorX + halfWidth;\n        const alphaIndex = (colorY * width + alphaX) * 4;\n        const outputIndex = (y * halfWidth + x) * 4;\n\n        const r = data[colorIndex];\n        const g = data[colorIndex + 1];\n        const b = data[colorIndex + 2];\n        const alpha = data[alphaIndex];\n\n        newData[outputIndex] = r;\n        newData[outputIndex + 1] = g;\n        newData[outputIndex + 2] = b;\n        newData[outputIndex + 3] = alpha;\n      }\n    }\n\n    return newImageData;\n  }\n\n  // Render loop for alpha channel\n  function startRenderLoop() {\n    if (!videoElement || !canvasElement) {\n      console.warn(\"Canvas renderer: Missing video or canvas element\");\n      return;\n    }\n\n    const ctx = canvasElement.getContext(\"2d\");\n    if (!ctx) {\n      const error = new Error(\"Failed to get 2D context from canvas\");\n      console.error(\"Canvas renderer:\", error);\n      if (onError) onError(error);\n      return;\n    }\n\n    isRendering = true;\n\n    function draw(time) {\n      if (!isRendering || !videoElement || !canvasElement) return;\n\n      if (enableAlphaProcessing) {\n        if (videoElement.paused || videoElement.ended) return;\n\n        const elapsed = time - lastTime;\n        const interval = 1000 / frameRate;\n\n        if (elapsed < interval) {\n          if (isRendering) {\n            animationFrameId = requestAnimationFrame(draw);\n          }\n          return;\n        }\n        lastTime = time;\n      }\n\n      try {\n        const targetWidth = videoElement.videoWidth || 0;\n        const targetHeight = videoElement.videoHeight || 0;\n\n        if (targetWidth && targetHeight) {\n          if (enableAlphaProcessing) {\n            const outputWidth = isHorizontal ? targetWidth / 2 : targetWidth;\n            const outputHeight = isHorizontal ? targetHeight : targetHeight / 2;\n\n            if (canvasElement.width !== outputWidth)\n              canvasElement.width = outputWidth;\n            if (canvasElement.height !== outputHeight)\n              canvasElement.height = outputHeight;\n\n            if (objectFit === \"contain\") {\n              canvasElement.style.width =\n                typeof width === \"number\" ? `${width}px` : width;\n              canvasElement.style.height =\n                typeof height === \"number\" ? `${height}px` : height;\n            }\n\n            ctx.clearRect(0, 0, outputWidth, outputHeight);\n\n            const tempCanvas = document.createElement(\"canvas\");\n            tempCanvas.width = targetWidth;\n            tempCanvas.height = targetHeight;\n            const tempCtx = tempCanvas.getContext(\"2d\");\n\n            if (tempCtx) {\n              tempCtx.drawImage(videoElement, 0, 0, targetWidth, targetHeight);\n              const imageData = tempCtx.getImageData(\n                0,\n                0,\n                targetWidth,\n                targetHeight\n              );\n              let processedImageData = isHorizontal\n                ? processHorizontalAlpha(imageData)\n                : processVerticalAlpha(imageData);\n\n              if (Object.keys(filters).length > 0) {\n                processedImageData =\n                  rendererAPI.applyAllFilters(processedImageData);\n              }\n\n              ctx.putImageData(processedImageData, 0, 0);\n            }\n          } else {\n            if (canvasElement.width !== targetWidth)\n              canvasElement.width = targetWidth;\n            if (canvasElement.height !== targetHeight)\n              canvasElement.height = targetHeight;\n\n            if (objectFit === \"contain\") {\n              canvasElement.style.width =\n                typeof width === \"number\" ? `${width}px` : width;\n              canvasElement.style.height =\n                typeof height === \"number\" ? `${height}px` : height;\n            }\n\n            ctx.clearRect(0, 0, targetWidth, targetHeight);\n            ctx.drawImage(videoElement, 0, 0, targetWidth, targetHeight);\n          }\n        }\n      } catch (error) {\n        console.error(\"Canvas renderer draw error:\", error);\n        if (onError) onError(error);\n      }\n\n      if (isRendering) {\n        animationFrameId = requestAnimationFrame(draw);\n      }\n    }\n\n    if (animationFrameId === null) {\n      animationFrameId = requestAnimationFrame(draw);\n    }\n  }\n\n  function stopRenderLoop() {\n    isRendering = false;\n    if (animationFrameId !== null) {\n      cancelAnimationFrame(animationFrameId);\n      animationFrameId = null;\n    }\n  }\n\n  // Initialize canvas renderer\n  function initialize() {\n    try {\n      if (!videoElement) {\n        throw new Error(\"Video element is required\");\n      }\n\n      if (!containerElement) {\n        throw new Error(\"Container element is required\");\n      }\n\n      canvasElement = createCanvasElement();\n      containerElement.appendChild(canvasElement);\n      return true;\n    } catch (error) {\n      console.error(\"Failed to initialize canvas renderer:\", error);\n      if (onError) onError(error);\n      return false;\n    }\n  }\n\n  // Public API\n  const rendererAPI = {\n    start: () => {\n      if (!canvasElement) {\n        console.warn(\"Canvas renderer not initialized\");\n        return false;\n      }\n      startRenderLoop();\n      return true;\n    },\n\n    stop: () => {\n      stopRenderLoop();\n    },\n\n    getCanvas: () => canvasElement,\n    getContext: () => (canvasElement ? canvasElement.getContext(\"2d\") : null),\n    isRendering: () => isRendering,\n\n    updateAlphaSettings: (\n      newEnableAlphaProcessing,\n      newIsHorizontal,\n      newFrameRate\n    ) => {\n      if (typeof newEnableAlphaProcessing === \"boolean\") {\n        enableAlphaProcessing = newEnableAlphaProcessing;\n      }\n      if (typeof newIsHorizontal === \"boolean\") {\n        isHorizontal = newIsHorizontal;\n      }\n      if (typeof newFrameRate === \"number\" && newFrameRate > 0) {\n        frameRate = newFrameRate;\n      }\n    },\n\n    applyAllFilters: (imageData) => {\n      let result = imageData;\n      for (const [name, filterFunc] of Object.entries(filters)) {\n        try {\n          result = filterFunc(result) || result;\n        } catch (error) {\n          console.warn(`Filter \"${name}\" failed:`, error);\n        }\n      }\n      return result;\n    },\n\n    destroy: () => {\n      stopRenderLoop();\n      if (canvasElement && containerElement) {\n        try {\n          containerElement.removeChild(canvasElement);\n        } catch (error) {\n          console.warn(\"Failed to remove canvas from container:\", error);\n        }\n      }\n      canvasElement = null;\n      containerElement = null;\n    },\n  };\n\n  if (initialize()) {\n    return rendererAPI;\n  } else {\n    return null;\n  }\n}\n\n/**\n * Creates a simplified Flamflix Player instance\n * @param {string|HTMLElement} container - CSS selector or DOM element for the container\n * @param {Object} options - Configuration options\n * @param {string} options.micPosition - Position: 'top-left', 'top-right', 'bottom-left', 'bottom-right', 'center' (default: 'top-right')\n * @param {string} options.micMode - Microphone mode: 'toggle', 'push-to-talk', 'hybrid' (default: 'push-to-talk')\n * @param {boolean} options.useDefaultMic - Whether to show the default microphone button (default: true)\n * @returns {Object} Player instance with essential control methods\n */\nfunction createFlamflixPlayer(container, options = {}) {\n  const {\n    micPosition = \"top-right\",\n    micMode = \"push-to-talk\",\n    useDefaultMic = true,\n  } = options;\n\n  // Control whether to show default mic button\n  // Internal state\n  let videoElement = null;\n  let canvasRenderer = null;\n  let player = null;\n  let isLoading = true;\n  let error = null;\n  let containerElement = null;\n\n  // Audio recording state\n  let mediaRecorder = null;\n  let audioChunks = [];\n  let isRecording = false;\n  let audioStream = null;\n  let talkButton = null;\n  let isProcessingAudio = false;\n  let recordedAudioBlob = null; // Store recorded audio for playback\n  let recordedAudioURL = null; // URL for playing recorded audio\n\n  // Speech recognition state\n  let speechRecognition = null;\n  let isSpeechRecognitionSupported = false;\n  let recognizedText = \"\";\n\n  // Initialize speech recognition\n  function initializeSpeechRecognition() {\n    // Check if Speech Recognition is supported\n    const SpeechRecognition =\n      window.SpeechRecognition || window.webkitSpeechRecognition;\n\n    if (!SpeechRecognition) {\n      console.warn(\"Speech Recognition not supported in this browser\");\n      isSpeechRecognitionSupported = false;\n      return false;\n    }\n\n    try {\n      speechRecognition = new SpeechRecognition();\n\n      // Configure speech recognition\n      speechRecognition.continuous = true;\n      speechRecognition.interimResults = true;\n      speechRecognition.lang = \"en-US\"; // Default to English, can be made configurable\n\n      // Event handlers\n      speechRecognition.onstart = () => {\n        recognizedText = \"\";\n      };\n\n      speechRecognition.onresult = (event) => {\n        let interimTranscript = \"\";\n        let finalTranscript = \"\";\n\n        for (let i = event.resultIndex; i < event.results.length; i++) {\n          const transcript = event.results[i][0].transcript;\n          if (event.results[i].isFinal) {\n            finalTranscript += transcript;\n          } else {\n            interimTranscript += transcript;\n          }\n        }\n\n        // Update recognized text\n        recognizedText = finalTranscript + interimTranscript;\n\n        // Log interim results for debugging\n      };\n\n      speechRecognition.onerror = (event) => {\n        console.error(\"Speech recognition error:\", event.error);\n      };\n\n      isSpeechRecognitionSupported = true;\n      return true;\n    } catch (error) {\n      console.error(\"Failed to initialize speech recognition:\", error);\n      isSpeechRecognitionSupported = false;\n      return false;\n    }\n  }\n\n  // Start speech recognition\n  function startSpeechRecognition() {\n    if (!isSpeechRecognitionSupported || !speechRecognition) {\n      console.warn(\"Speech recognition not available\");\n      return false;\n    }\n\n    try {\n      speechRecognition.start();\n      return true;\n    } catch (error) {\n      console.error(\"Failed to start speech recognition:\", error);\n      return false;\n    }\n  }\n\n  // Stop speech recognition\n  function stopSpeechRecognition() {\n    if (!speechRecognition) return;\n\n    try {\n      speechRecognition.stop();\n    } catch (error) {\n      console.error(\"Failed to stop speech recognition:\", error);\n    }\n  }\n\n  // Get recognized text\n  async function getRecognizedText() {\n    // Wait for 500ms to ensure we get the full text\n    await new Promise((resolve) => setTimeout(resolve, 300));\n    return recognizedText.trim();\n  }\n\n  // Microphone mode state\n  let currentMicMode = micMode;\n  let hybridPressStartTime = 0;\n  let hybridMinPressTime = 500; // 500ms minimum for push-to-talk mode\n  let hybridTimeout = null;\n  let pushToTalkPressStartTime = 0;\n  let pushToTalkMinPressTime = 200; // 200ms minimum for push-to-talk mode\n  let pushToTalkTimeout = null;\n\n  // Video configuration state\n  let currentSrc = null;\n  let currentIsAlpha = false;\n  let currentIsHorizontal = false;\n  let actualStreamType = \"hls\";\n  let isWelcomeVideo = false;\n  let isIdleVideo = false;\n  let idleVideoConfig = null;\n  let welcomeVideoConfig = null;\n\n  // Get container element\n  function getContainerElement() {\n    if (typeof container === \"string\") {\n      return document.querySelector(container);\n    } else if (container instanceof Element) {\n      return container;\n    }\n    if (container && container.current) {\n      return container.current;\n    }\n    return null;\n  }\n\n  // Audio recording functions\n  async function startAudioRecording() {\n    if (isProcessingAudio) {\n      return;\n    }\n\n    try {\n      if (!isIdleVideo) {\n        await playIdleVideo();\n      }\n\n      isProcessingAudio = false;\n      updateTalkButton(true);\n      const microphonePermission = await checkMicrophonePermission();\n      audioStream = await navigator.mediaDevices.getUserMedia({\n        audio: {\n          echoCancellation: true,\n          noiseSuppression: true,\n          autoGainControl: true,\n        },\n      });\n      if (microphonePermission.state !== \"granted\") {\n        updateTalkButton(false);\n        return;\n      }\n\n      // Start speech recognition if supported\n      if (isSpeechRecognitionSupported) {\n        startSpeechRecognition();\n      }\n\n      await new Promise((resolve) => setTimeout(resolve, 100));\n\n      const options = {\n        mimeType: \"audio/webm;codecs=opus\",\n      };\n\n      mediaRecorder = new MediaRecorder(audioStream, options);\n      audioChunks = [];\n\n      mediaRecorder.ondataavailable = function (event) {\n        if (event.data && event.data.size > 0) {\n          audioChunks.push(event.data);\n        }\n      };\n\n      mediaRecorder.onstop = async function () {\n        if (isProcessingAudio) {\n          return;\n        }\n\n        // Ensure we have audio chunks to process\n        if (!audioChunks || audioChunks.length === 0) {\n          console.warn(\"No audio chunks recorded\");\n          isRecording = false;\n          isProcessingAudio = false;\n          updateTalkButton(false);\n          // Return to idle video\n          await playIdleVideo();\n          return;\n        }\n\n        isProcessingAudio = true;\n        updateTalkButton(true);\n\n        try {\n          const mimeType = mediaRecorder.mimeType || \"audio/webm\";\n          const audioBlob = new Blob(audioChunks, { type: mimeType });\n\n          recordedAudioBlob = audioBlob;\n          if (recordedAudioURL) {\n            URL.revokeObjectURL(recordedAudioURL);\n          }\n          recordedAudioURL = URL.createObjectURL(audioBlob);\n\n          try {\n            // Get the recognized text from speech recognition\n\n            const recognizedText = await getRecognizedText();\n\n            // Use text instead of audio blob, but keep audio processing logic intact\n            const videoConfig = await processAudioToVideo(\n              audioBlob,\n              recognizedText\n            );\n\n            currentSrc = videoConfig.src;\n            currentIsAlpha = videoConfig.isalpha;\n            currentIsHorizontal = videoConfig.isHorizontal;\n            actualStreamType = videoConfig.streamType || \"hls\";\n            isWelcomeVideo = false;\n            isIdleVideo = false;\n            if (player && currentSrc) {\n              try {\n                await player.load(currentSrc);\n              } catch (loadError) {\n                console.error(\"Error loading video:\", loadError);\n                // Return to idle video on error\n                await playIdleVideo();\n                throw loadError;\n              }\n\n              // Disable loop for response videos\n              videoElement.loop = false;\n\n              if (currentIsAlpha) {\n                videoElement.style.display = \"none\";\n                videoElement.muted = false;\n                if (videoElement.readyState < 2) {\n                  videoElement.addEventListener(\"loadeddata\", () => {}, {\n                    once: true,\n                  });\n                }\n              } else {\n                videoElement.style.display = \"block\";\n                videoElement.muted = false;\n              }\n\n              if (currentIsAlpha) {\n                videoElement.style.display = \"none\";\n\n                // Create canvas renderer only if it doesn't exist\n                if (!canvasRenderer) {\n                  canvasRenderer = initCanvasRenderer();\n                }\n\n                if (canvasRenderer) {\n                  // Stop any existing rendering first\n                  canvasRenderer.stop();\n\n                  // Update alpha settings for the new video\n                  canvasRenderer.updateAlphaSettings(\n                    true,\n                    currentIsHorizontal,\n                    18\n                  );\n\n                  // Wait for video to actually start playing before starting canvas\n                  const startCanvasWhenPlaying = () => {\n                    const canvas = canvasRenderer.getCanvas();\n                    if (canvas) {\n                      canvas.style.display = \"block\";\n                    }\n                    canvasRenderer.start();\n                  };\n\n                  // Listen for when video actually starts playing\n                  const handleVideoPlay = () => {\n                    videoElement.removeEventListener(\"play\", handleVideoPlay);\n                    // Small delay to ensure video is actually rendering frames\n                    setTimeout(startCanvasWhenPlaying, 100);\n                  };\n\n                  videoElement.addEventListener(\"play\", handleVideoPlay, {\n                    once: true,\n                  });\n                }\n              } else {\n                videoElement.style.display = \"block\";\n\n                // For non-alpha videos, just stop the canvas renderer but don't destroy it\n                if (canvasRenderer) {\n                  canvasRenderer.stop();\n                  const canvas = canvasRenderer.getCanvas();\n                  if (canvas) {\n                    canvas.style.display = \"none\";\n                  }\n                }\n              }\n\n              // Add event listener to return to idle video when response video ends\n              const handleResponseVideoEnd = async () => {\n                videoElement.removeEventListener(\n                  \"ended\",\n                  handleResponseVideoEnd\n                );\n                await playIdleVideo();\n              };\n              videoElement.addEventListener(\"ended\", handleResponseVideoEnd, {\n                once: true,\n              });\n\n              try {\n                if (videoElement.readyState >= 2) {\n                  await videoElement.play();\n                } else {\n                  let hasPlayed = false;\n\n                  const playWhenReady = async () => {\n                    if (hasPlayed) return;\n                    hasPlayed = true;\n\n                    try {\n                      await videoElement.play();\n                    } catch (playErr) {\n                      console.warn(\n                        \"Autoplay failed after ready event:\",\n                        playErr\n                      );\n                    }\n                  };\n\n                  videoElement.addEventListener(\"canplay\", playWhenReady, {\n                    once: true,\n                  });\n                }\n              } catch (playErr) {\n                console.warn(\"Autoplay failed:\", playErr);\n              }\n\n              // No loading to hide - we kept idle video playing\n            } else {\n              console.error(\"No player instance or video source available\");\n              // Return to idle video on error\n              await playIdleVideo();\n              throw new Error(\"Missing player instance or video source\");\n            }\n          } catch (error) {\n            console.error(\"❌ Failed to process audio:\", error);\n            // Return to idle video on error instead of showing error\n            await playIdleVideo();\n          }\n        } catch (processingError) {\n          console.error(\n            \"❌ Failed to process recorded audio:\",\n            processingError\n          );\n          // Return to idle video on error\n          await playIdleVideo();\n        } finally {\n          isProcessingAudio = false;\n          updateTalkButton(false);\n        }\n\n        if (audioStream) {\n          audioStream.getTracks().forEach((track) => track.stop());\n          audioStream = null;\n        }\n\n        isRecording = false;\n        updateTalkButton(false);\n      };\n\n      updateTalkButton();\n      mediaRecorder.start(100);\n      isRecording = true;\n      updateTalkButton();\n    } catch (error) {\n      console.error(\"Error accessing microphone:\", error);\n      showError(\"Could not access microphone. Please check permissions.\");\n\n      updateTalkButton();\n      isRecording = false;\n      isProcessingAudio = false; // Reset processing flag on error\n      updateTalkButton();\n    }\n  }\n\n  function stopAudioRecording() {\n    try {\n      if (mediaRecorder && mediaRecorder.state === \"recording\") {\n        mediaRecorder.stop();\n      }\n    } catch (error) {\n      console.warn(\"Error stopping media recorder:\", error);\n    }\n\n    // Stop speech recognition and log the final text\n    if (isSpeechRecognitionSupported) {\n      stopSpeechRecognition();\n    }\n\n    // Clean up audio stream if it exists\n    if (audioStream) {\n      try {\n        audioStream.getTracks().forEach((track) => track.stop());\n      } catch (error) {\n        console.warn(\"Error stopping audio stream tracks:\", error);\n      }\n      audioStream = null;\n    }\n\n    // isRecording = false;\n    updateTalkButton();\n  }\n\n  function updateTalkButton(showLoading = false) {\n    if (!talkButton) return;\n\n    // Get the actual button element (it's inside the wrapper)\n    const labelElement = talkButton.querySelector(\"#flamflix-mic-label\");\n    const buttonElement = talkButton.querySelector(\"#flamflix-talk-button\");\n\n    if (!buttonElement) return;\n\n    if (isProcessingAudio) {\n      // Show loading state when explicitly requested or when processing audio\n      buttonElement.disabled = true;\n      buttonElement.style.backgroundColor = \"#881DE5\";\n      buttonElement.style.color = \"#ffffff\";\n      buttonElement.innerHTML = `\n        <div class=\"flamflix-loading-spinner\" style=\"\n          width: 20px;\n          height: 20px;\n          border: 2px solid rgba(255, 255, 255, 0.6);\n          border-top: 2px solid #ffffff;\n          border-radius: 50%;\n        \"></div>\n      `;\n      // Update label text for processing state\n      if (labelElement) {\n        labelElement.textContent = \"Thinking a Response\";\n      }\n    } else if (isRecording) {\n      buttonElement.disabled = false;\n      buttonElement.style.backgroundColor = \"#ff0000\";\n      buttonElement.style.color = \"#ffffff\";\n      buttonElement.style.transformOrigin = \"center\";\n      buttonElement.style.padding = \"0\";\n      buttonElement.style.display = \"flex\";\n      buttonElement.style.alignItems = \"center\";\n      buttonElement.style.justifyContent = \"center\";\n      buttonElement.style.width = \"48px\";\n      buttonElement.style.height = \"48px\";\n      buttonElement.style.minWidth = \"48px\";\n      buttonElement.style.minHeight = \"48px\";\n      buttonElement.innerHTML = `<img src=\"https://storage.googleapis.com/bucket-fi-production-apps-0672ab2d/original/images/i78n1f3khfzyl87l3vj7j9zz.gif\" style=\"width: 48px; height: 48px; object-fit: contain; display: block;\" alt=\"Recording\" />`;\n      // Update label text for listening state\n      if (labelElement) {\n        // Different text based on mic mode\n        if (currentMicMode === \"push-to-talk\") {\n          labelElement.textContent = \"Release to stop\";\n        } else {\n          labelElement.textContent = \"Ask your question now\";\n        }\n      }\n    } else {\n      buttonElement.disabled = false;\n      buttonElement.style.backgroundColor = \"#881DE5\";\n      buttonElement.style.padding = \"12px\";\n      buttonElement.style.boxShadow = \"0 2px 8px rgba(0,0,0,0.2)\";\n      buttonElement.style.transformOrigin = \"center\";\n      buttonElement.style.width = \"48px\";\n      buttonElement.style.height = \"48px\";\n      buttonElement.style.minWidth = \"48px\";\n      buttonElement.style.minHeight = \"48px\";\n      buttonElement.style.display = \"flex\";\n      buttonElement.style.alignItems = \"center\";\n      buttonElement.style.justifyContent = \"center\";\n      buttonElement.innerHTML = `<img src=\"https://storage.googleapis.com/bucket-fi-production-apps-0672ab2d/original/images/iym7re4iwdt2outwhof5n2in.png\" style=\"width: 24px; height: 24px; object-fit: contain; display: block; pointer-events: none;\" alt=\"Recording\" />`;\n\n      // Update label text for idle state\n      if (labelElement) {\n        // Different text based on mic mode\n        if (currentMicMode === \"push-to-talk\") {\n          labelElement.textContent = \"Hold to Record\";\n        } else {\n          labelElement.textContent = \"Press Mic to Ask\";\n        }\n      }\n    }\n  }\n\n  function createTalkButton() {\n    // Create wrapper container for button and label\n    const wrapper = document.createElement(\"div\");\n    wrapper.id = \"flamflix-mic-wrapper\";\n\n    // Add CSS animation for loading spinner\n    const style = document.createElement(\"style\");\n    style.textContent = `\n      @keyframes spin {\n        0% { transform: rotate(0deg); }\n        100% { transform: rotate(360deg); }\n      }\n      .flamflix-loading-spinner {\n        animation: spin 1s linear infinite;\n      }\n    `;\n    document.head.appendChild(style);\n\n    // Default wrapper styles - can be customized\n    const wrapperStyle = {\n      position: \"absolute\",\n      zIndex: \"20\",\n      display: \"flex\",\n      flexDirection: \"row\",\n      alignItems: \"center\",\n      gap: \"4px\",\n      width: \"fit-content\", // Prevent width changes\n      minWidth: \"120px\",\n    };\n\n    Object.assign(wrapper.style, wrapperStyle);\n\n    const button = document.createElement(\"button\");\n    button.id = \"flamflix-talk-button\";\n\n    // Fixed mic button configuration - no customization allowed\n    const micConfig = {\n      html: `<img src=\"https://storage.googleapis.com/bucket-fi-production-apps-0672ab2d/original/images/iym7re4iwdt2outwhof5n2in.png\" style=\"width: 24px; height: 24px; object-fit: contain; display: block; pointer-events: none;\" alt=\"Recording\" />`,\n      style: {\n        width: \"48px\",\n        height: \"48px\",\n        minWidth: \"48px\",\n        minHeight: \"48px\",\n        padding: \"12px\",\n        backgroundColor: \"#881DE5\",\n        border: \"none\",\n        borderRadius: \"100%\",\n        cursor: \"pointer\",\n        display: \"flex\",\n        alignItems: \"center\",\n        justifyContent: \"center\",\n        boxShadow: \"0 2px 8px rgba(0,0,0,0.2)\",\n        transformOrigin: \"center\",\n        transform: \"translate(0, 0)\",\n      },\n      position: micPosition,\n    };\n\n    // Create label element\n    const label = document.createElement(\"span\");\n    label.id = \"flamflix-mic-label\";\n    // Different text based on mic mode\n    if (currentMicMode === \"push-to-talk\") {\n      label.textContent = \"Hold to Record\";\n    } else {\n      label.textContent = \"Press Mic to Ask\";\n    }\n\n    // Default label styles - can be customized\n    const labelStyle = {\n      fontSize: \"10px\",\n      color: \"#ffffff\",\n      textAlign: \"center\",\n      backgroundColor: \"#000000\",\n      whiteSpace: \"nowrap\",\n      fontFamily: \"Arial, sans-serif\",\n      textShadow: \"0 1px 2px rgba(0,0,0,0.5)\",\n      pointerEvents: \"none\",\n      padding: \"2px 4px\",\n      borderRadius: \"6px\",\n      userSelect: \"none\",\n      fontWeight: \"600\",\n      display: \"flex\",\n      alignItems: \"center\",\n      justifyContent: \"center\",\n      border: \"1px solid #6B7280\",\n      boxShadow: \"0px 3px 10px -2px rgba(20, 21, 26, 0.02)\",\n      width: \"100%\", // Take full width of container\n      minHeight: \"16px\", // Reserve space for text to prevent jumping\n    };\n\n    Object.assign(label.style, labelStyle);\n\n    if (micConfig.html) {\n      button.innerHTML = micConfig.html;\n    } else {\n      button.textContent = micConfig.text;\n    }\n\n    Object.assign(button.style, micConfig.style);\n\n    // Position wrapper based on micPosition\n    const positionMap = {\n      \"top-left\": {\n        top: \"10px\",\n        left: \"10px\",\n        right: \"auto\",\n        bottom: \"auto\",\n      },\n      \"top-right\": {\n        top: \"10px\",\n        right: \"10px\",\n        left: \"auto\",\n        bottom: \"auto\",\n      },\n      \"bottom-left\": {\n        bottom: \"10px\",\n        left: \"10px\",\n        right: \"auto\",\n        top: \"auto\",\n      },\n      \"bottom-right\": {\n        bottom: \"10px\",\n        right: \"10px\",\n        left: \"auto\",\n        top: \"auto\",\n      },\n      center: {\n        top: \"50%\",\n        left: \"50%\",\n        transform: \"translate(-50%, -50%)\",\n        right: \"auto\",\n        bottom: \"auto\",\n      },\n      \"bottom-center\": {\n        bottom: \"10px\",\n        left: \"50%\",\n        transform: \"translate(-50%, 0)\",\n        right: \"auto\",\n        top: \"auto\",\n      },\n      \"top-center\": {\n        top: \"10px\",\n        left: \"50%\",\n        transform: \"translate(-50%, 0)\",\n        right: \"auto\",\n        bottom: \"auto\",\n      },\n      \"left-center\": {\n        left: \"10px\",\n        top: \"50%\",\n        transform: \"translate(0, -50%)\",\n        right: \"auto\",\n        bottom: \"auto\",\n      },\n      \"right-center\": {\n        right: \"10px\",\n        top: \"50%\",\n        transform: \"translate(0, -50%)\",\n        left: \"auto\",\n        bottom: \"auto\",\n      },\n    };\n\n    if (positionMap[micConfig.position]) {\n      Object.assign(wrapper.style, positionMap[micConfig.position]);\n    }\n\n    // Add label and button to wrapper (label first for left positioning)\n    wrapper.appendChild(label);\n    wrapper.appendChild(button);\n\n    if (currentMicMode === \"toggle\") {\n      if (button.disabled) {\n        return wrapper;\n      }\n      button.addEventListener(\"click\", () => {\n        if (isRecording) {\n          stopAudioRecording();\n        } else {\n          startAudioRecording();\n        }\n      });\n    } else if (currentMicMode === \"push-to-talk\") {\n      if (button.disabled) {\n        return wrapper;\n      }\n      button.addEventListener(\"mousedown\", (e) => {\n        e.preventDefault();\n        pushToTalkPressStartTime = Date.now();\n\n        if (!isRecording && !isProcessingAudio) {\n          pushToTalkTimeout = setTimeout(() => {\n            if (!isRecording && !isProcessingAudio) {\n              startAudioRecording();\n            }\n          }, pushToTalkMinPressTime);\n        }\n      });\n\n      // Add mouseup to both button and document to catch mouse release anywhere\n      const handleMouseUp = (e) => {\n        e.preventDefault();\n        if (button.disabled) {\n          return;\n        }\n        const pressDuration = Date.now() - pushToTalkPressStartTime;\n\n        if (pushToTalkTimeout) {\n          clearTimeout(pushToTalkTimeout);\n          pushToTalkTimeout = null;\n        }\n\n        if (pressDuration >= pushToTalkMinPressTime && isRecording) {\n          stopAudioRecording();\n        }\n\n        // Remove the global listener after handling\n        document.removeEventListener(\"mouseup\", handleMouseUp);\n      };\n\n      button.addEventListener(\"mouseup\", handleMouseUp);\n\n      // Add global mouseup listener when recording starts\n      button.addEventListener(\"mousedown\", () => {\n        document.addEventListener(\"mouseup\", handleMouseUp);\n      });\n\n      // Touch events for mobile\n      const handleTouchEnd = (e) => {\n        // Check if button is disabled FIRST, before preventDefault\n        if (button.disabled) {\n          return;\n        }\n\n        e.preventDefault();\n        e.stopPropagation(); // Add this to prevent event bubbling issues\n\n        const pressDuration = Date.now() - pushToTalkPressStartTime;\n\n        // Clear timeout if touch released\n        if (pushToTalkTimeout) {\n          clearTimeout(pushToTalkTimeout);\n          pushToTalkTimeout = null;\n        }\n\n        if (pressDuration >= pushToTalkMinPressTime && isRecording) {\n          // Normal stop - process and send audio\n          stopAudioRecording();\n        }\n\n        // Remove global listeners\n        document.removeEventListener(\"touchend\", handleTouchEnd);\n        document.removeEventListener(\"touchcancel\", handleTouchEnd);\n      };\n\n      button.addEventListener(\n        \"touchstart\",\n        (e) => {\n          // Check if button is disabled FIRST, before preventDefault\n          if (button.disabled) {\n            return;\n          }\n\n          e.preventDefault();\n          e.stopPropagation(); // Add this to prevent event bubbling issues\n\n          pushToTalkPressStartTime = Date.now();\n\n          if (!isRecording && !isProcessingAudio) {\n            // Only start recording after minimum press duration\n            pushToTalkTimeout = setTimeout(() => {\n              if (!isRecording && !isProcessingAudio) {\n                startAudioRecording();\n              }\n            }, pushToTalkMinPressTime);\n          }\n\n          // Add global touch listeners to catch touch end anywhere\n          document.addEventListener(\"touchend\", handleTouchEnd, {\n            passive: false,\n          });\n          document.addEventListener(\"touchcancel\", handleTouchEnd, {\n            passive: false,\n          });\n        },\n        { passive: false }\n      );\n\n      button.addEventListener(\"touchend\", handleTouchEnd, { passive: false });\n      button.addEventListener(\"touchcancel\", handleTouchEnd, {\n        passive: false,\n      });\n\n      // Add pointer-events: none to SVG elements to ensure touch events bubble up to button\n    } else if (currentMicMode === \"hybrid\") {\n      // Hybrid behavior - short press = toggle, long press = push-to-talk\n      const handleHybridMouseUp = (e) => {\n        e.preventDefault();\n        if (button.disabled) {\n          return;\n        }\n        const pressDuration = Date.now() - hybridPressStartTime;\n\n        if (hybridTimeout) {\n          clearTimeout(hybridTimeout);\n          hybridTimeout = null;\n        }\n\n        if (pressDuration < hybridMinPressTime) {\n          if (isRecording) {\n            stopAudioRecording();\n          } else {\n            startAudioRecording();\n          }\n        } else {\n          // Long press - stop recording (push-to-talk mode)\n          if (isRecording) {\n            stopAudioRecording();\n          }\n        }\n\n        // Remove the global listener\n        document.removeEventListener(\"mouseup\", handleHybridMouseUp);\n      };\n\n      button.addEventListener(\"mousedown\", (e) => {\n        e.preventDefault();\n        if (button.disabled) {\n          return;\n        }\n        hybridPressStartTime = Date.now();\n\n        if (!isRecording && !isProcessingAudio) {\n          hybridTimeout = setTimeout(() => {\n            if (!isRecording) {\n              startAudioRecording();\n            }\n          }, hybridMinPressTime);\n        }\n\n        // Add global listener\n        document.addEventListener(\"mouseup\", handleHybridMouseUp);\n      });\n\n      button.addEventListener(\"mouseup\", handleHybridMouseUp);\n\n      // Touch events for mobile\n      const handleHybridTouchEnd = (e) => {\n        // Check if button is disabled FIRST, before preventDefault\n        if (button.disabled) {\n          return;\n        }\n\n        e.preventDefault();\n        const pressDuration = Date.now() - hybridPressStartTime;\n\n        if (hybridTimeout) {\n          clearTimeout(hybridTimeout);\n          hybridTimeout = null;\n        }\n\n        if (pressDuration < hybridMinPressTime) {\n          // Short press - toggle behavior\n          if (isRecording) {\n            // For short press while recording, treat as cancel since it was meant to be toggle\n            stopAudioRecording();\n          } else {\n            startAudioRecording();\n          }\n        } else {\n          // Long press - stop recording (push-to-talk mode)\n          if (isRecording) {\n            stopAudioRecording();\n          }\n        }\n\n        // Remove global listeners\n        document.removeEventListener(\"touchend\", handleHybridTouchEnd);\n        document.removeEventListener(\"touchcancel\", handleHybridTouchEnd);\n      };\n\n      button.addEventListener(\n        \"touchstart\",\n        (e) => {\n          // Check if button is disabled FIRST, before preventDefault\n          if (button.disabled) {\n            return;\n          }\n\n          e.preventDefault();\n          hybridPressStartTime = Date.now();\n\n          if (!isRecording && !isProcessingAudio) {\n            hybridTimeout = setTimeout(() => {\n              if (!isRecording) {\n                startAudioRecording();\n              }\n            }, hybridMinPressTime);\n          }\n\n          // Add global touch listeners\n          document.addEventListener(\"touchend\", handleHybridTouchEnd, {\n            passive: false,\n          });\n          document.addEventListener(\"touchcancel\", handleHybridTouchEnd, {\n            passive: false,\n          });\n        },\n        { passive: false }\n      );\n\n      button.addEventListener(\"touchend\", handleHybridTouchEnd, {\n        passive: false,\n      });\n      button.addEventListener(\"touchcancel\", handleHybridTouchEnd, {\n        passive: false,\n      });\n    }\n\n    // Store label reference for updates\n    button._label = label;\n    button._wrapper = wrapper;\n\n    return wrapper;\n  }\n\n  // Play idle video (replaces listening UI)\n  async function playIdleVideo() {\n    if (!idleVideoConfig || !player) return;\n\n    try {\n      currentSrc = idleVideoConfig.src;\n      currentIsAlpha = idleVideoConfig.isalpha;\n      currentIsHorizontal = idleVideoConfig.isHorizontal;\n      actualStreamType = idleVideoConfig.streamType || \"hls\";\n      isWelcomeVideo = false;\n      isIdleVideo = true;\n\n      await player.load(currentSrc);\n      videoElement.loop = true; // Idle video loops\n\n      if (currentIsAlpha) {\n        videoElement.style.display = \"none\";\n        videoElement.muted = true; // Idle video is muted\n\n        // Create canvas renderer only if it doesn't exist\n        if (!canvasRenderer) {\n          canvasRenderer = initCanvasRenderer();\n        }\n\n        if (canvasRenderer) {\n          // Stop any existing rendering first\n          canvasRenderer.stop();\n\n          // Update alpha settings for idle video\n          canvasRenderer.updateAlphaSettings(true, currentIsHorizontal, 18);\n\n          // Wait for video to actually start playing before starting canvas\n          const startIdleCanvasWhenPlaying = () => {\n            const canvas = canvasRenderer.getCanvas();\n            if (canvas) {\n              canvas.style.display = \"block\";\n            }\n            canvasRenderer.start();\n          };\n\n          // Listen for when video actually starts playing\n          const handleIdleVideoPlay = () => {\n            videoElement.removeEventListener(\"play\", handleIdleVideoPlay);\n            // Small delay to ensure video is actually rendering frames\n            setTimeout(startIdleCanvasWhenPlaying, 100);\n          };\n\n          videoElement.addEventListener(\"play\", handleIdleVideoPlay, {\n            once: true,\n          });\n        }\n      } else {\n        videoElement.style.display = \"block\";\n        videoElement.muted = true;\n\n        // For non-alpha videos, just stop the canvas renderer but don't destroy it\n        if (canvasRenderer) {\n          canvasRenderer.stop();\n          const canvas = canvasRenderer.getCanvas();\n          if (canvas) {\n            canvas.style.display = \"none\";\n          }\n        }\n      }\n\n      await videoElement.play();\n    } catch (error) {\n      console.error(\"Failed to play idle video:\", error);\n    }\n  }\n\n  // API function to process audio and return video config\n  async function processAudioToVideo(audioBlob, recognizedText = null) {\n    return await options._sdkInstance.processAudioToVideo(\n      audioBlob,\n      recognizedText\n    );\n  }\n\n  async function getWelcomeAndIdleVideos() {\n    return await options._sdkInstance.getWelcomeVideo();\n  }\n\n  // Create video element\n  // Create video element\n  function createVideoElement() {\n    const video = document.createElement(\"video\");\n    video.controls = false;\n    video.autoplay = false;\n    video.muted = false;\n    video.playsInline = true;\n    video.disablePictureInPicture = true;\n    video.crossOrigin = \"anonymous\";\n\n    // Additional attribute for browsers that don't respect the property\n    video.setAttribute(\"disablepictureinpicture\", \"\");\n    video.setAttribute(\n      \"controlslist\",\n      \"nodownload nofullscreen noremoteplayback\"\n    );\n\n    const videoStyle = {\n      width: \"100%\",\n      height: \"100%\",\n      maxWidth: \"100%\",\n      maxHeight: \"100%\",\n      objectFit: \"contain\",\n      display: \"block\",\n    };\n\n    Object.assign(video.style, videoStyle);\n    return video;\n  }\n\n  // Initialize canvas renderer for alpha channel rendering\n  function initCanvasRenderer() {\n    if (!currentIsAlpha || !videoElement || !containerElement) {\n      return null;\n    }\n\n    try {\n      const renderer = createCanvasRenderer({\n        videoElement: videoElement,\n        container: containerElement,\n        width: \"100%\",\n        height: \"100%\",\n        style: {},\n        objectFit: \"contain\",\n        enableAlphaProcessing: true,\n        isHorizontal: currentIsHorizontal,\n        frameRate: 18,\n        onError: (error) => {\n          console.error(\"Canvas renderer error:\", error);\n        },\n      });\n\n      return renderer;\n    } catch (error) {\n      console.error(\"Error creating canvas renderer:\", error);\n      return null;\n    }\n  }\n\n  function startRenderLoop() {\n    if (canvasRenderer) {\n      canvasRenderer.start();\n    }\n  }\n\n  function stopRenderLoop() {\n    if (canvasRenderer) {\n      canvasRenderer.stop();\n    }\n  }\n\n  // Hide loading indicator\n  function hideLoading() {\n    if (!containerElement) return;\n    const loadingDiv = containerElement.querySelector(\".shaka-loading\");\n    if (loadingDiv) {\n      loadingDiv.remove();\n    }\n  }\n\n  // Show error\n  function showError(errorMessage) {\n    if (!containerElement) return;\n\n    containerElement.innerHTML = \"\";\n\n    const errorDiv = document.createElement(\"div\");\n    errorDiv.className = \"shaka-player-error\";\n\n    const errorContent = document.createElement(\"div\");\n    Object.assign(errorContent.style, {\n      padding: \"20px\",\n      backgroundColor: \"#f8d7da\",\n      color: \"#721c24\",\n      border: \"1px solid #f5c6cb\",\n      borderRadius: \"4px\",\n      textAlign: \"center\",\n      fontSize: \"14px\",\n      height: \"100%\",\n      fontFamily: \"Arial, sans-serif\",\n    });\n\n    const errorTitle = document.createElement(\"h4\");\n    errorTitle.textContent = \"Video Player Error\";\n    errorTitle.style.margin = \"0 0 10px 0\";\n\n    const errorText = document.createElement(\"p\");\n    errorText.textContent = errorMessage;\n    errorText.style.margin = \"0 0 10px 0\";\n\n    errorContent.appendChild(errorTitle);\n    errorContent.appendChild(errorText);\n    errorDiv.appendChild(errorContent);\n    containerElement.appendChild(errorDiv);\n  }\n\n  // Initialize Shaka Player\n  async function initPlayer() {\n    try {\n      if (!window.shaka) {\n        throw new Error(\"Shaka Player not loaded\");\n      }\n\n      if (!videoElement) {\n        throw new Error(\"Video element not created\");\n      }\n\n      window.shaka.polyfill.installAll();\n\n      if (!window.shaka.Player.isBrowserSupported()) {\n        throw new Error(\"Browser not supported\");\n      }\n\n      player = new window.shaka.Player();\n      player.attach(videoElement);\n\n      const defaultConfig = {\n        streaming: {\n          bufferBehind: 15, // 15s behind - enough for short seeks\n          bufferingGoal: 8, // 8s ahead - quick start, less data\n          rebufferingGoal: 3, // 3s to resume - fast recovery\n          ignoreTextStreamFailures: true, // No subtitles needed\n          retryParameters: {\n            timeout: 20000, // 20s timeout - faster failure\n            maxAttempts: 2, // 2 attempts - reasonable persistence\n            backoffFactor: 1.5, // 50% longer wait - not too aggressive\n          },\n        },\n        abr: {\n          enabled: false, // Consistent quality for AI responses\n        },\n        manifest: {\n          retryParameters: {\n            timeout: 15000, // 15s for manifest - critical but fast\n            maxAttempts: 3, // 3 attempts - manifest is crucial\n            backoffFactor: 1.3, // 30% longer wait\n          },\n        },\n      };\n\n      player.configure(defaultConfig);\n\n      player.addEventListener(\"error\", (event) => {\n        const playerError = event.detail;\n        console.error(\"Shaka Player Error:\", playerError);\n        const errorMessage = `Player Error: ${\n          playerError.message || playerError.code\n        }`;\n        error = errorMessage;\n        showError(errorMessage);\n      });\n\n      const handlePlay = () => {\n        startRenderLoop();\n      };\n\n      const handlePause = () => {\n        stopRenderLoop();\n      };\n\n      videoElement.addEventListener(\"play\", handlePlay);\n      videoElement.addEventListener(\"pause\", handlePause);\n      videoElement.addEventListener(\"ended\", handlePause);\n\n      isLoading = false;\n      error = null;\n    } catch (err) {\n      console.error(\"Failed to initialize Shaka Player:\", err);\n      error = err.message;\n      isLoading = false;\n      hideLoading();\n      showError(err.message);\n    }\n  }\n\n  // Load Shaka Player script if not already loaded\n  function loadShakaScript() {\n    return new Promise((resolve, reject) => {\n      if (window.shaka) {\n        resolve();\n        return;\n      }\n\n      const script = document.createElement(\"script\");\n      script.src =\n        \"https://cdnjs.cloudflare.com/ajax/libs/shaka-player/4.7.0/shaka-player.compiled.js\";\n      script.onload = resolve;\n      script.onerror = () => reject(new Error(\"Failed to load Shaka Player\"));\n      document.head.appendChild(script);\n    });\n  }\n\n  // Load and play welcome video, then transition to idle video\n  async function loadWelcomeVideo() {\n    try {\n      // No loading indicator\n      const videoConfigs = await getWelcomeAndIdleVideos();\n\n      // Store both configs\n      welcomeVideoConfig = videoConfigs.welcome;\n      idleVideoConfig = videoConfigs.idle;\n\n      // Play welcome video first\n      currentSrc = welcomeVideoConfig.src;\n      currentIsAlpha = welcomeVideoConfig.isalpha;\n      currentIsHorizontal = welcomeVideoConfig.isHorizontal;\n      actualStreamType = welcomeVideoConfig.streamType || \"hls\";\n      isWelcomeVideo = true;\n      isIdleVideo = false;\n\n      if (player && currentSrc) {\n        await player.load(currentSrc);\n\n        // Welcome video plays once (no loop)\n        videoElement.loop = false;\n\n        if (currentIsAlpha) {\n          videoElement.style.display = \"none\";\n          videoElement.muted = false;\n\n          // Create canvas renderer only if it doesn't exist\n          if (!canvasRenderer) {\n            canvasRenderer = initCanvasRenderer();\n          }\n\n          if (canvasRenderer) {\n            // Stop any existing rendering first\n            canvasRenderer.stop();\n\n            // Update alpha settings for welcome video\n            canvasRenderer.updateAlphaSettings(true, currentIsHorizontal, 18);\n\n            // Wait for video to actually start playing before starting canvas\n            const startWelcomeCanvasWhenPlaying = () => {\n              const canvas = canvasRenderer.getCanvas();\n              if (canvas) {\n                canvas.style.display = \"block\";\n              }\n              canvasRenderer.start();\n            };\n\n            // Listen for when video actually starts playing\n            const handleWelcomeVideoPlay = () => {\n              videoElement.removeEventListener(\"play\", handleWelcomeVideoPlay);\n              // Small delay to ensure video is actually rendering frames\n              setTimeout(startWelcomeCanvasWhenPlaying, 100);\n            };\n\n            videoElement.addEventListener(\"play\", handleWelcomeVideoPlay, {\n              once: true,\n            });\n          }\n        } else {\n          videoElement.style.display = \"block\";\n          videoElement.muted = false;\n\n          // For non-alpha videos, just stop the canvas renderer but don't destroy it\n          if (canvasRenderer) {\n            canvasRenderer.stop();\n            const canvas = canvasRenderer.getCanvas();\n            if (canvas) {\n              canvas.style.display = \"none\";\n            }\n          }\n        }\n\n        // Add event listener to transition to idle video when welcome video ends\n        const handleWelcomeVideoEnd = async () => {\n          videoElement.removeEventListener(\"ended\", handleWelcomeVideoEnd);\n          await playIdleVideo();\n        };\n        videoElement.addEventListener(\"ended\", handleWelcomeVideoEnd, {\n          once: true,\n        });\n\n        // Auto-play the welcome video\n        try {\n          await videoElement.play();\n        } catch (playErr) {\n          console.warn(\"Autoplay failed for welcome video:\", playErr);\n          // If welcome video fails, go directly to idle\n          await playIdleVideo();\n        }\n      }\n    } catch (error) {\n      console.error(\"Failed to load welcome video:\", error);\n      // On error, try to play idle video as fallback\n      if (idleVideoConfig) {\n        await playIdleVideo();\n      } else {\n        showError(error.message || \"Failed to load welcome video\");\n      }\n    }\n  }\n\n  // Initialize the player\n  async function initialize() {\n    try {\n      containerElement = getContainerElement();\n      if (!containerElement) {\n        throw new Error(\"Container element not found\");\n      }\n\n      const existingClassName = containerElement.className || \"\";\n      containerElement.className =\n        `${existingClassName} shaka-player-container`.trim();\n\n      const containerStyles = {\n        position: containerElement.style.position || \"relative\",\n      };\n      Object.assign(containerElement.style, containerStyles);\n\n      videoElement = createVideoElement();\n      videoElement.style.display = \"none\";\n      containerElement.appendChild(videoElement);\n\n      // Create mic button only if useDefaultMic is true\n      if (useDefaultMic) {\n        talkButton = createTalkButton();\n        containerElement.appendChild(talkButton);\n      }\n\n      // Initialize speech recognition\n      initializeSpeechRecognition();\n\n      await loadShakaScript();\n      await initPlayer();\n\n      // Load and play welcome video after player is ready\n      await loadWelcomeVideo();\n\n      hideLoading();\n      isLoading = false;\n    } catch (err) {\n      console.error(\"Failed to initialize player:\", err);\n      error = err.message;\n      isLoading = false;\n      hideLoading();\n      showError(err.message);\n    }\n  }\n\n  // Public API - Essential functions with enhanced features\n  const playerAPI = {\n    // Essential control methods\n    play: async () => {\n      if (videoElement) {\n        await videoElement.play();\n      }\n    },\n\n    pause: () => {\n      if (videoElement) {\n        videoElement.pause();\n      }\n    },\n\n    reset: () => {\n      if (isRecording) {\n        stopAudioRecording();\n      }\n\n      // Stop speech recognition if active\n      if (isSpeechRecognitionSupported) {\n        stopSpeechRecognition();\n      }\n\n      if (videoElement) {\n        videoElement.pause();\n        videoElement.currentTime = 0;\n        videoElement.style.display = \"none\";\n        videoElement.src = \"\";\n      }\n\n      if (player) {\n        try {\n          player.unload();\n        } catch (error) {\n          console.warn(\"Error unloading player:\", error);\n        }\n      }\n\n      if (canvasRenderer) {\n        canvasRenderer.destroy();\n        canvasRenderer = null;\n      }\n\n      if (talkButton) {\n        isRecording = false;\n        // Remove the talk button wrapper from the container\n        try {\n          if (containerElement && containerElement.contains(talkButton)) {\n            containerElement.removeChild(talkButton);\n          }\n        } catch (error) {\n          console.warn(\"Error removing talk button:\", error);\n        }\n        talkButton = null;\n      }\n\n      // Clear recorded audio\n      if (recordedAudioURL) {\n        URL.revokeObjectURL(recordedAudioURL);\n        recordedAudioURL = null;\n      }\n      recordedAudioBlob = null;\n\n      // Clear speech recognition text\n      recognizedText = \"\";\n\n      currentSrc = null;\n      currentIsAlpha = false;\n      currentIsHorizontal = false;\n      isProcessingAudio = false;\n      actualStreamType = \"hls\";\n      isWelcomeVideo = false;\n      isIdleVideo = false;\n\n      // Clear video configs to prevent automatic restart\n      idleVideoConfig = null;\n      welcomeVideoConfig = null;\n    },\n\n    startRecording: () => {\n      if (!isRecording) {\n        startAudioRecording();\n      }\n    },\n\n    stopRecording: () => {\n      if (isRecording) {\n        stopAudioRecording();\n      }\n    },\n\n    // Volume control\n    setVolume: (volume) => {\n      if (videoElement) {\n        videoElement.volume = Math.max(0, Math.min(1, volume));\n      }\n    },\n\n    getVolume: () => {\n      return videoElement ? videoElement.volume : 0;\n    },\n\n    // Audio playback functionality\n    getRecordedAudio: () => {\n      return recordedAudioBlob;\n    },\n\n    playRecordedAudio: () => {\n      if (recordedAudioURL) {\n        const audio = new Audio(recordedAudioURL);\n        return audio.play();\n      } else {\n        console.warn(\"No recorded audio available\");\n        return Promise.reject(new Error(\"No recorded audio available\"));\n      }\n    },\n\n    // State getters\n    isLoading: () => isLoading,\n\n    isRecording: () => isRecording,\n\n    isProcessing: () => isProcessingAudio,\n\n    // Microphone mode control\n    getMicMode: () => currentMicMode,\n\n    setMicMode: (newMode) => {\n      if (![\"toggle\", \"push-to-talk\", \"hybrid\"].includes(newMode)) {\n        console.warn(\n          \"Invalid mic mode. Valid modes: toggle, push-to-talk, hybrid\"\n        );\n        return false;\n      }\n\n      // Stop recording if currently recording\n      if (isRecording) {\n        stopAudioRecording();\n      }\n\n      // Clear any timeouts\n      if (hybridTimeout) {\n        clearTimeout(hybridTimeout);\n        hybridTimeout = null;\n      }\n\n      if (pushToTalkTimeout) {\n        clearTimeout(pushToTalkTimeout);\n        pushToTalkTimeout = null;\n      }\n\n      currentMicMode = newMode;\n\n      // Recreate the talk button with new mode\n      if (talkButton && containerElement) {\n        const oldButton = talkButton;\n        talkButton = createTalkButton();\n        containerElement.replaceChild(talkButton, oldButton);\n      }\n\n      return true;\n    },\n\n    // Get default microphone configuration (for reference)\n    getDefaultMicConfig: () => ({\n      useDefaultMic: useDefaultMic,\n      micPosition: micPosition,\n      micMode: currentMicMode,\n      isDefaultMicVisible: !!talkButton,\n    }),\n\n    // Speech recognition methods\n    isSpeechRecognitionSupported: () => isSpeechRecognitionSupported,\n\n    getRecognizedText: () => getRecognizedText(),\n\n    startSpeechRecognition: () => {\n      if (isSpeechRecognitionSupported) {\n        return startSpeechRecognition();\n      }\n      return false;\n    },\n\n    stopSpeechRecognition: () => {\n      if (isSpeechRecognitionSupported) {\n        stopSpeechRecognition();\n      }\n    },\n  };\n\n  // Start initialization\n  initialize();\n\n  return playerAPI;\n}\n\n/**\n * Main Flamflix SDK Class - The only interface users should interact with\n */\nclass FlamflixSDK {\n  #accessToken;\n  #projectId;\n  #baseURL;\n\n  constructor(accessToken, projectId) {\n    if (!accessToken) {\n      throw new Error(\"Access token is required\");\n    }\n    if (!projectId) {\n      throw new Error(\"Project ID is required\");\n    }\n\n    this.#accessToken = accessToken;\n    this.#projectId = projectId;\n    this.#baseURL =\n      \"https://fi.development.flamapis.com/flamflix-consumption-svc/api/v1\";\n  }\n\n  /**\n   * Private method to make API calls with access token\n   */\n  async #makeAPICall(endpoint, options = {}) {\n    const url = `${this.#baseURL}${endpoint}`;\n\n    try {\n      const response = await fetch(url, options);\n\n      if (!response.ok) {\n        let errorMessage = `API call failed: ${response.status} ${response.statusText}`;\n\n        // Try to get error message from response body\n        try {\n          const errorData = await response.json();\n          if (errorData.message) {\n            errorMessage = errorData.message;\n          } else if (errorData.error) {\n            errorMessage = errorData.error;\n          }\n        } catch (parseError) {\n          // If parsing fails, use the default error message\n        }\n\n        const apiError = new Error(errorMessage);\n        apiError.status = response.status;\n        apiError.statusText = response.statusText;\n        throw apiError;\n      }\n\n      return await response.json();\n    } catch (error) {\n      console.error(`API call to ${endpoint} failed:`, error);\n      throw error;\n    }\n  }\n\n  /**\n   * Private method to get welcome and idle videos\n   */\n  async #getWelcomeVideo() {\n    // Hardcoded demo config - will be replaced with actual API later\n\n    const res = await this.#makeAPICall(\n      `/flamflix/welcome/${this.#projectId}`,\n      {\n        method: \"GET\",\n        headers: {\n          \"x-api-key\": `Bearer ${this.#accessToken}`,\n        },\n      }\n    );\n\n    return {\n      welcome: {\n        src: res?.results?.welcome_video?.hls,\n        isalpha: res?.results?.is_alpha,\n        isHorizontal: res?.results?.is_horizontal,\n        streamType: \"hls\",\n      },\n      idle: {\n        src: res?.results?.idle_video?.hls,\n        isalpha: res?.results?.is_alpha,\n        isHorizontal: res?.results?.is_horizontal,\n        streamType: \"hls\",\n      },\n    };\n  }\n\n  /**\n   * Private method to process audio to video\n   */\n  async #processAudioToVideo(audioBlob, recognizedText = null) {\n    try {\n      let requestBody;\n\n      // Fallback to audio processing (keep existing logic)\n      const wavBlob = await convertWebMToWav(audioBlob);\n      const base64Audio = await blobToBase64(wavBlob);\n\n      if (recognizedText && recognizedText) {\n        requestBody = { audio_text: recognizedText, use_stt: false };\n      } else {\n        requestBody = { query_vector: base64Audio, use_stt: true };\n      }\n\n      const res = await this.#makeAPICall(\n        `/flamflix/search/${this.#projectId}`,\n        {\n          method: \"POST\",\n          headers: {\n            \"Content-Type\": \"application/json\",\n            \"x-api-key\": `Bearer ${this.#accessToken}`,\n          },\n          body: JSON.stringify(requestBody),\n        }\n      );\n\n      // Return the response from the API\n      if (\n        res?.results?.received_answer !== undefined &&\n        res?.results?.received_answer === false\n      ) {\n        return {\n          src: res?.results?.answer_fallback_video?.hls,\n          isalpha: res?.results?.is_alpha,\n          isHorizontal: res?.results?.is_horizontal,\n          streamType: \"hls\",\n        };\n      }\n\n      if (res?.results?.videos?.hls) {\n        return {\n          src: res?.results?.videos?.hls,\n          isalpha: res?.results?.is_alpha,\n          isHorizontal: res?.results?.is_horizontal,\n          streamType: \"hls\",\n        };\n      }\n\n      return {\n        src: res?.results?.videos?.hls,\n        isalpha: res?.results?.is_alpha,\n        isHorizontal: res?.results?.is_horizontal,\n        streamType: \"hls\",\n      };\n    } catch (error) {\n      console.error(\"Error processing audio to video:\", error);\n      throw error;\n    }\n  }\n\n  /**\n   * Initialize player with container and options - The main public method\n   * @param {HTMLElement|string} container - Container element or CSS selector\n   * @param {Object} options - Configuration options\n   * @param {string} options.micPosition - Position: 'top-left', 'top-right', 'bottom-left', 'bottom-right', 'center' (default: 'top-right')\n   * @param {string} options.micMode - Microphone mode: 'toggle', 'push-to-talk', 'hybrid' (default: 'push-to-talk')\n   * @param {boolean} options.useDefaultMic - Whether to show the default microphone button (default: true)\n   * @returns {Object} Player instance with essential control methods\n   */\n  init(container, options = {}) {\n    // Get container element\n    let containerElement;\n    if (typeof container === \"string\") {\n      containerElement = document.querySelector(container);\n    } else if (container instanceof Element) {\n      containerElement = container;\n    } else if (container && container.current) {\n      // Handle React ref\n      containerElement = container.current;\n    }\n\n    if (!containerElement) {\n      throw new Error(\"Container element not found\");\n    }\n\n    // Check if container already has a Flamflix player\n    if (\n      containerElement.querySelector(\"#flamflix-talk-button\") ||\n      containerElement.querySelector(\".shaka-player-container\")\n    ) {\n      throw new Error(\n        \"Container already has a Flamflix player. Please reset first or use a different container.\"\n      );\n    }\n\n    // Inject SDK instance methods into options\n    const enhancedOptions = {\n      ...options,\n      _sdkInstance: {\n        getWelcomeVideo: () => this.#getWelcomeVideo(),\n        processAudioToVideo: (audioBlob, recognizedText) =>\n          this.#processAudioToVideo(audioBlob, recognizedText),\n      },\n    };\n\n    // Create player with container and enhanced options\n    const player = createFlamflixPlayer(containerElement, enhancedOptions);\n\n    return player;\n  }\n}\n\nfunction initializeFlamflix(container, options = {}) {\n  if (!options.accessToken) {\n    throw new Error(\"Access token is required in options.accessToken\");\n  }\n\n  if (!options.projectId) {\n    throw new Error(\"Project ID is required in options.projectId\");\n  }\n\n  const sdk = new FlamflixSDK(options.accessToken, options.projectId);\n  return sdk.init(container, options);\n}\n\n// Export only the main SDK class\nexport { FlamflixSDK };\n\n// Default export\nexport default FlamflixSDK;\n\n// For UMD builds, expose globally\nif (typeof window !== \"undefined\") {\n  window.FlamflixSDK = FlamflixSDK;\n  // Keep backward compatibility\n  window.initializeFlamflix = initializeFlamflix;\n}\n"],"names":["audioBufferToWav","buffer","numChannels","numberOfChannels","sampleRate","format","bitDepth","bytesPerSample","blockAlign","length","arrayBuffer","ArrayBuffer","view","DataView","writeString","offset","string","i","setUint8","charCodeAt","setUint32","setUint16","channel","sample","Math","max","min","getChannelData","setInt16","Blob","type","blobToBase64","blob","Promise","resolve","reject","reader","FileReader","onload","result","base64","split","onerror","readAsDataURL","convertWebMToWav","webmBlob","audioContext","window","AudioContext","webkitAudioContext","audioBuffer","decodeAudioData","wavBlob","close","error","checkMicrophonePermission","navigator","permissions","console","warn","state","supported","message","permissionStatus","query","name","createCanvasRenderer","options","videoElement","container","width","height","style","objectFit","onError","filters","preserveDrawingBuffer","className","enableAlphaProcessing","isHorizontal","frameRate","canvasElement","animationFrameId","isRendering","containerElement","lastTime","createCanvasElement","canvas","document","createElement","canvasStyle","maxWidth","display","Object","assign","processVerticalAlpha","imageData","data","newImageData","ImageData","newData","halfHeight","y","x","colorY","colorIndex","alphaY","alphaIndex","outputIndex","r","g","b","alpha","processHorizontalAlpha","halfWidth","colorX","alphaX","startRenderLoop","ctx","getContext","Error","draw","time","paused","ended","elapsed","interval","requestAnimationFrame","targetWidth","videoWidth","targetHeight","videoHeight","outputWidth","outputHeight","clearRect","tempCanvas","tempCtx","drawImage","getImageData","processedImageData","keys","rendererAPI","applyAllFilters","putImageData","stopRenderLoop","cancelAnimationFrame","initialize","appendChild","start","stop","getCanvas","updateAlphaSettings","newEnableAlphaProcessing","newIsHorizontal","newFrameRate","filterFunc","entries","destroy","removeChild","createFlamflixPlayer","micPosition","micMode","useDefaultMic","canvasRenderer","player","isLoading","mediaRecorder","audioChunks","isRecording","audioStream","talkButton","isProcessingAudio","recordedAudioBlob","recordedAudioURL","speechRecognition","isSpeechRecognitionSupported","recognizedText","initializeSpeechRecognition","SpeechRecognition","webkitSpeechRecognition","continuous","interimResults","lang","onstart","onresult","event","interimTranscript","finalTranscript","resultIndex","results","transcript","isFinal","startSpeechRecognition","stopSpeechRecognition","getRecognizedText","setTimeout","trim","currentMicMode","hybridPressStartTime","hybridMinPressTime","hybridTimeout","pushToTalkPressStartTime","pushToTalkMinPressTime","pushToTalkTimeout","currentSrc","currentIsAlpha","currentIsHorizontal","actualStreamType","isWelcomeVideo","isIdleVideo","idleVideoConfig","welcomeVideoConfig","getContainerElement","querySelector","Element","current","startAudioRecording","playIdleVideo","updateTalkButton","microphonePermission","mediaDevices","getUserMedia","audio","echoCancellation","noiseSuppression","autoGainControl","mimeType","MediaRecorder","ondataavailable","size","push","onstop","audioBlob","URL","revokeObjectURL","createObjectURL","videoConfig","processAudioToVideo","src","isalpha","streamType","load","loadError","loop","muted","readyState","addEventListener","once","initCanvasRenderer","startCanvasWhenPlaying","handleVideoPlay","removeEventListener","handleResponseVideoEnd","play","hasPlayed","playWhenReady","playErr","processingError","getTracks","forEach","track","showError","stopAudioRecording","showLoading","labelElement","buttonElement","disabled","backgroundColor","color","innerHTML","textContent","transformOrigin","padding","alignItems","justifyContent","minWidth","minHeight","boxShadow","createTalkButton","wrapper","id","head","wrapperStyle","position","zIndex","flexDirection","gap","button","micConfig","html","border","borderRadius","cursor","transform","label","labelStyle","fontSize","textAlign","whiteSpace","fontFamily","textShadow","pointerEvents","userSelect","fontWeight","positionMap","top","left","right","bottom","center","e","preventDefault","Date","now","handleMouseUp","pressDuration","clearTimeout","handleTouchEnd","stopPropagation","passive","handleHybridMouseUp","handleHybridTouchEnd","_label","_wrapper","startIdleCanvasWhenPlaying","handleIdleVideoPlay","_sdkInstance","getWelcomeAndIdleVideos","getWelcomeVideo","createVideoElement","video","controls","autoplay","playsInline","disablePictureInPicture","crossOrigin","setAttribute","videoStyle","maxHeight","renderer","hideLoading","loadingDiv","remove","errorMessage","errorDiv","errorContent","errorTitle","margin","errorText","initPlayer","shaka","polyfill","installAll","Player","isBrowserSupported","attach","defaultConfig","streaming","bufferBehind","bufferingGoal","rebufferingGoal","ignoreTextStreamFailures","retryParameters","timeout","maxAttempts","backoffFactor","abr","enabled","manifest","configure","playerError","detail","code","handlePlay","handlePause","err","loadShakaScript","script","loadWelcomeVideo","videoConfigs","welcome","idle","startWelcomeCanvasWhenPlaying","handleWelcomeVideoPlay","handleWelcomeVideoEnd","existingClassName","containerStyles","playerAPI","pause","reset","currentTime","unload","contains","startRecording","stopRecording","setVolume","volume","getVolume","getRecordedAudio","playRecordedAudio","Audio","isProcessing","getMicMode","setMicMode","newMode","includes","oldButton","replaceChild","getDefaultMicConfig","isDefaultMicVisible","_accessToken","WeakMap","_projectId","_baseURL","_FlamflixSDK_brand","WeakSet","FlamflixSDK","constructor","accessToken","projectId","_classPrivateMethodInitSpec","_classPrivateFieldInitSpec","_classPrivateFieldSet","init","enhancedOptions","_assertClassBrand","_getWelcomeVideo","call","_processAudioToVideo","_makeAPICall","endpoint","url","_classPrivateFieldGet","response","fetch","ok","status","statusText","errorData","json","parseError","apiError","_res$results","_res$results2","_res$results3","_res$results4","_res$results5","_res$results6","res","method","headers","welcome_video","hls","is_alpha","is_horizontal","idle_video","_res$results7","_res$results8","_res$results10","_res$results14","_res$results15","_res$results16","requestBody","base64Audio","audio_text","use_stt","query_vector","body","JSON","stringify","received_answer","undefined","_res$results9","_res$results0","_res$results1","answer_fallback_video","videos","_res$results11","_res$results12","_res$results13","initializeFlamflix","sdk"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;;AAKA,SAASA,gBAAgBA,CAACC,MAAM,EAAE;AAChC,EAAA,MAAMC,WAAW,GAAGD,MAAM,CAACE,gBAAgB;AAC3C,EAAA,MAAMC,UAAU,GAAGH,MAAM,CAACG,UAAU;EACpC,MAAMC,MAAM,GAAG,CAAC;EAChB,MAAMC,QAAQ,GAAG,EAAE;AACnB,EAAA,MAAMC,cAAc,GAAGD,QAAQ,GAAG,CAAC;AACnC,EAAA,MAAME,UAAU,GAAGN,WAAW,GAAGK,cAAc;AAC/C,EAAA,MAAME,MAAM,GAAGR,MAAM,CAACQ,MAAM;AAC5B,EAAA,MAAMC,WAAW,GAAG,IAAIC,WAAW,CACjC,EAAE,GAAGF,MAAM,GAAGP,WAAW,GAAGK,cAC9B,CAAC;AACD,EAAA,MAAMK,IAAI,GAAG,IAAIC,QAAQ,CAACH,WAAW,CAAC;AAEtC,EAAA,MAAMI,WAAW,GAAGA,CAACC,MAAM,EAAEC,MAAM,KAAK;AACtC,IAAA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGD,MAAM,CAACP,MAAM,EAAEQ,CAAC,EAAE,EAAE;AACtCL,MAAAA,IAAI,CAACM,QAAQ,CAACH,MAAM,GAAGE,CAAC,EAAED,MAAM,CAACG,UAAU,CAACF,CAAC,CAAC,CAAC;AACjD,IAAA;EACF,CAAC;AAEDH,EAAAA,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC;AACtBF,EAAAA,IAAI,CAACQ,SAAS,CAAC,CAAC,EAAE,EAAE,GAAGX,MAAM,GAAGP,WAAW,GAAGK,cAAc,EAAE,IAAI,CAAC;AACnEO,EAAAA,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC;AACtBA,EAAAA,WAAW,CAAC,EAAE,EAAE,MAAM,CAAC;EACvBF,IAAI,CAACQ,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC;EAC5BR,IAAI,CAACS,SAAS,CAAC,EAAE,EAAEhB,MAAM,EAAE,IAAI,CAAC;EAChCO,IAAI,CAACS,SAAS,CAAC,EAAE,EAAEnB,WAAW,EAAE,IAAI,CAAC;EACrCU,IAAI,CAACQ,SAAS,CAAC,EAAE,EAAEhB,UAAU,EAAE,IAAI,CAAC;EACpCQ,IAAI,CAACQ,SAAS,CAAC,EAAE,EAAEhB,UAAU,GAAGI,UAAU,EAAE,IAAI,CAAC;EACjDI,IAAI,CAACS,SAAS,CAAC,EAAE,EAAEb,UAAU,EAAE,IAAI,CAAC;EACpCI,IAAI,CAACS,SAAS,CAAC,EAAE,EAAEf,QAAQ,EAAE,IAAI,CAAC;AAClCQ,EAAAA,WAAW,CAAC,EAAE,EAAE,MAAM,CAAC;AACvBF,EAAAA,IAAI,CAACQ,SAAS,CAAC,EAAE,EAAEX,MAAM,GAAGP,WAAW,GAAGK,cAAc,EAAE,IAAI,CAAC;EAE/D,IAAIQ,MAAM,GAAG,EAAE;EACf,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGR,MAAM,EAAEQ,CAAC,EAAE,EAAE;IAC/B,KAAK,IAAIK,OAAO,GAAG,CAAC,EAAEA,OAAO,GAAGpB,WAAW,EAAEoB,OAAO,EAAE,EAAE;MACtD,MAAMC,MAAM,GAAGC,IAAI,CAACC,GAAG,CACrB,EAAE,EACFD,IAAI,CAACE,GAAG,CAAC,CAAC,EAAEzB,MAAM,CAAC0B,cAAc,CAACL,OAAO,CAAC,CAACL,CAAC,CAAC,CAC/C,CAAC;MACDL,IAAI,CAACgB,QAAQ,CAACb,MAAM,EAAEQ,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC;AAC5CR,MAAAA,MAAM,IAAI,CAAC;AACb,IAAA;AACF,EAAA;AAEA,EAAA,OAAO,IAAIc,IAAI,CAAC,CAACnB,WAAW,CAAC,EAAE;AAAEoB,IAAAA,IAAI,EAAE;AAAY,GAAC,CAAC;AACvD;;AAEA;AACA,SAASC,YAAYA,CAACC,IAAI,EAAE;AAC1B,EAAA,OAAO,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;AACtC,IAAA,MAAMC,MAAM,GAAG,IAAIC,UAAU,EAAE;IAC/BD,MAAM,CAACE,MAAM,GAAG,MAAM;AACpB,MAAA,MAAMC,MAAM,GAAGH,MAAM,CAACG,MAAM;MAC5B,MAAMC,MAAM,GAAGD,MAAM,CAACE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;MACnCP,OAAO,CAACM,MAAM,CAAC;IACjB,CAAC;IACDJ,MAAM,CAACM,OAAO,GAAGP,MAAM;AACvBC,IAAAA,MAAM,CAACO,aAAa,CAACX,IAAI,CAAC;AAC5B,EAAA,CAAC,CAAC;AACJ;;AAEA;AACA,eAAeY,gBAAgBA,CAACC,QAAQ,EAAE;AACxC,EAAA,OAAO,IAAIZ,OAAO,CAAC,OAAOC,OAAO,EAAEC,MAAM,KAAK;IAC5C,IAAI;AACF;MACA,MAAMW,YAAY,GAAG,KAAKC,MAAM,CAACC,YAAY,IAC3CD,MAAM,CAACE,kBAAkB,GAAG;;AAE9B;AACA,MAAA,MAAMvC,WAAW,GAAG,MAAMmC,QAAQ,CAACnC,WAAW,EAAE;;AAEhD;MACA,MAAMwC,WAAW,GAAG,MAAMJ,YAAY,CAACK,eAAe,CAACzC,WAAW,CAAC;;AAEnE;AACA,MAAA,MAAM0C,OAAO,GAAGpD,gBAAgB,CAACkD,WAAW,CAAC;;AAE7C;AACA,MAAA,MAAMJ,YAAY,CAACO,KAAK,EAAE;MAE1BnB,OAAO,CAACkB,OAAO,CAAC;IAClB,CAAC,CAAC,OAAOE,KAAK,EAAE;MACdnB,MAAM,CAACmB,KAAK,CAAC;AACf,IAAA;AACF,EAAA,CAAC,CAAC;AACJ;;AAEA;AACA,eAAeC,yBAAyBA,GAAG;AACzC;AACA,EAAA,IAAI,CAACC,SAAS,CAACC,WAAW,EAAE;AAC1BC,IAAAA,OAAO,CAACC,IAAI,CAAC,+CAA+C,CAAC;IAC7D,OAAO;AACLC,MAAAA,KAAK,EAAE,SAAS;AAChBC,MAAAA,SAAS,EAAE,KAAK;AAChBC,MAAAA,OAAO,EAAE;KACV;AACH,EAAA;;AAEA;EACA,MAAMC,gBAAgB,GAAG,MAAMP,SAAS,CAACC,WAAW,CAACO,KAAK,CAAC;AACzDC,IAAAA,IAAI,EAAE;AACR,GAAC,CAAC;EAEF,OAAO;IACLL,KAAK,EAAEG,gBAAgB,CAACH,KAAK;AAAE;AAC/BC,IAAAA,SAAS,EAAE,IAAI;AACfC,IAAAA,OAAO,EAAE,CAAA,yBAAA,EAA4BC,gBAAgB,CAACH,KAAK,CAAA;GAC5D;AACH;;AAEA;AACA,SAASM,oBAAoBA,CAACC,OAAO,GAAG,EAAE,EAAE;EAC1C,MAAM;IACJC,YAAY;IACZC,SAAS;AACTC,IAAAA,KAAK,GAAG,MAAM;AACdC,IAAAA,MAAM,GAAG,MAAM;IACfC,KAAK,GAAG,EAAE;AACVC,IAAAA,SAAS,GAAG,SAAS;IACrBC,OAAO;IACPC,OAAO,GAAG,EAAE;AACZC,IAAAA,qBAAqB,GAAG,KAAK;AAC7BC,IAAAA,SAAS,GAAG;AACd,GAAC,GAAGV,OAAO;;AAEX;AACA,EAAA,IAAIW,qBAAqB,GAAGX,OAAO,CAACW,qBAAqB,IAAI,KAAK;AAClE,EAAA,IAAIC,YAAY,GAAGZ,OAAO,CAACY,YAAY,IAAI,KAAK;AAChD,EAAA,IAAIC,SAAS,GAAGb,OAAO,CAACa,SAAS,IAAI,EAAE;;AAEvC;EACA,IAAIC,aAAa,GAAG,IAAI;EACxB,IAAIC,gBAAgB,GAAG,IAAI;EAC3B,IAAIC,WAAW,GAAG,KAAK;EACvB,IAAIC,gBAAgB,GAAGf,SAAS;EAChC,IAAIgB,QAAQ,GAAG,CAAC;;AAEhB;EACA,SAASC,mBAAmBA,GAAG;AAC7B,IAAA,MAAMC,MAAM,GAAGC,QAAQ,CAACC,aAAa,CAAC,QAAQ,CAAC;AAE/C,IAAA,IAAIZ,SAAS,EAAE;MACbU,MAAM,CAACV,SAAS,GAAGA,SAAS;AAC9B,IAAA;AAEA,IAAA,MAAMa,WAAW,GAAG;MAClBpB,KAAK,EAAE,OAAOA,KAAK,KAAK,QAAQ,GAAG,CAAA,EAAGA,KAAK,CAAA,EAAA,CAAI,GAAGA,KAAK;MACvDC,MAAM,EAAE,OAAOA,MAAM,KAAK,QAAQ,GAAG,CAAA,EAAGA,MAAM,CAAA,EAAA,CAAI,GAAGA,MAAM;AAC3DoB,MAAAA,QAAQ,EAAE,MAAM;AAChBlB,MAAAA,SAAS,EAAEA,SAAS;AACpBmB,MAAAA,OAAO,EAAE,OAAO;MAChB,GAAGpB;KACJ;IAEDqB,MAAM,CAACC,MAAM,CAACP,MAAM,CAACf,KAAK,EAAEkB,WAAW,CAAC;AAExC,IAAA,IAAId,qBAAqB,EAAE;MACzBW,MAAM,CAACX,qBAAqB,GAAG,IAAI;AACrC,IAAA;AAEA,IAAA,OAAOW,MAAM;AACf,EAAA;;AAEA;EACA,SAASQ,oBAAoBA,CAACC,SAAS,EAAE;IACvC,MAAM;MAAEC,IAAI;MAAE3B,KAAK;AAAEC,MAAAA;AAAO,KAAC,GAAGyB,SAAS;IACzC,MAAME,YAAY,GAAG,IAAIC,SAAS,CAAC7B,KAAK,EAAEC,MAAM,GAAG,CAAC,CAAC;AACrD,IAAA,MAAM6B,OAAO,GAAGF,YAAY,CAACD,IAAI;AACjC,IAAA,MAAMI,UAAU,GAAG9B,MAAM,GAAG,CAAC;IAE7B,KAAK,IAAI+B,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGD,UAAU,EAAEC,CAAC,EAAE,EAAE;MACnC,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGjC,KAAK,EAAEiC,CAAC,EAAE,EAAE;QAC9B,MAAMC,MAAM,GAAGF,CAAC;QAChB,MAAMG,UAAU,GAAG,CAACD,MAAM,GAAGlC,KAAK,GAAGiC,CAAC,IAAI,CAAC;AAC3C,QAAA,MAAMG,MAAM,GAAGF,MAAM,GAAGH,UAAU;QAClC,MAAMM,UAAU,GAAG,CAACD,MAAM,GAAGpC,KAAK,GAAGiC,CAAC,IAAI,CAAC;QAC3C,MAAMK,WAAW,GAAG,CAACN,CAAC,GAAGhC,KAAK,GAAGiC,CAAC,IAAI,CAAC;AAEvC,QAAA,MAAMM,CAAC,GAAGZ,IAAI,CAACQ,UAAU,CAAC;AAC1B,QAAA,MAAMK,CAAC,GAAGb,IAAI,CAACQ,UAAU,GAAG,CAAC,CAAC;AAC9B,QAAA,MAAMM,CAAC,GAAGd,IAAI,CAACQ,UAAU,GAAG,CAAC,CAAC;AAC9B,QAAA,MAAMO,KAAK,GAAGf,IAAI,CAACU,UAAU,CAAC;AAE9BP,QAAAA,OAAO,CAACQ,WAAW,CAAC,GAAGC,CAAC;AACxBT,QAAAA,OAAO,CAACQ,WAAW,GAAG,CAAC,CAAC,GAAGE,CAAC;AAC5BV,QAAAA,OAAO,CAACQ,WAAW,GAAG,CAAC,CAAC,GAAGG,CAAC;AAC5BX,QAAAA,OAAO,CAACQ,WAAW,GAAG,CAAC,CAAC,GAAGI,KAAK;AAClC,MAAA;AACF,IAAA;AAEA,IAAA,OAAOd,YAAY;AACrB,EAAA;;AAEA;EACA,SAASe,sBAAsBA,CAACjB,SAAS,EAAE;IACzC,MAAM;MAAEC,IAAI;MAAE3B,KAAK;AAAEC,MAAAA;AAAO,KAAC,GAAGyB,SAAS;IACzC,MAAME,YAAY,GAAG,IAAIC,SAAS,CAAC7B,KAAK,GAAG,CAAC,EAAEC,MAAM,CAAC;AACrD,IAAA,MAAM6B,OAAO,GAAGF,YAAY,CAACD,IAAI;AACjC,IAAA,MAAMiB,SAAS,GAAG5C,KAAK,GAAG,CAAC;IAE3B,KAAK,IAAIgC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG/B,MAAM,EAAE+B,CAAC,EAAE,EAAE;MAC/B,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGW,SAAS,EAAEX,CAAC,EAAE,EAAE;QAClC,MAAMY,MAAM,GAAGZ,CAAC;QAChB,MAAMC,MAAM,GAAGF,CAAC;QAChB,MAAMG,UAAU,GAAG,CAACD,MAAM,GAAGlC,KAAK,GAAG6C,MAAM,IAAI,CAAC;AAChD,QAAA,MAAMC,MAAM,GAAGD,MAAM,GAAGD,SAAS;QACjC,MAAMP,UAAU,GAAG,CAACH,MAAM,GAAGlC,KAAK,GAAG8C,MAAM,IAAI,CAAC;QAChD,MAAMR,WAAW,GAAG,CAACN,CAAC,GAAGY,SAAS,GAAGX,CAAC,IAAI,CAAC;AAE3C,QAAA,MAAMM,CAAC,GAAGZ,IAAI,CAACQ,UAAU,CAAC;AAC1B,QAAA,MAAMK,CAAC,GAAGb,IAAI,CAACQ,UAAU,GAAG,CAAC,CAAC;AAC9B,QAAA,MAAMM,CAAC,GAAGd,IAAI,CAACQ,UAAU,GAAG,CAAC,CAAC;AAC9B,QAAA,MAAMO,KAAK,GAAGf,IAAI,CAACU,UAAU,CAAC;AAE9BP,QAAAA,OAAO,CAACQ,WAAW,CAAC,GAAGC,CAAC;AACxBT,QAAAA,OAAO,CAACQ,WAAW,GAAG,CAAC,CAAC,GAAGE,CAAC;AAC5BV,QAAAA,OAAO,CAACQ,WAAW,GAAG,CAAC,CAAC,GAAGG,CAAC;AAC5BX,QAAAA,OAAO,CAACQ,WAAW,GAAG,CAAC,CAAC,GAAGI,KAAK;AAClC,MAAA;AACF,IAAA;AAEA,IAAA,OAAOd,YAAY;AACrB,EAAA;;AAEA;EACA,SAASmB,eAAeA,GAAG;AACzB,IAAA,IAAI,CAACjD,YAAY,IAAI,CAACa,aAAa,EAAE;AACnCvB,MAAAA,OAAO,CAACC,IAAI,CAAC,kDAAkD,CAAC;AAChE,MAAA;AACF,IAAA;AAEA,IAAA,MAAM2D,GAAG,GAAGrC,aAAa,CAACsC,UAAU,CAAC,IAAI,CAAC;IAC1C,IAAI,CAACD,GAAG,EAAE;AACR,MAAA,MAAMhE,KAAK,GAAG,IAAIkE,KAAK,CAAC,sCAAsC,CAAC;AAC/D9D,MAAAA,OAAO,CAACJ,KAAK,CAAC,kBAAkB,EAAEA,KAAK,CAAC;AACxC,MAAA,IAAIoB,OAAO,EAAEA,OAAO,CAACpB,KAAK,CAAC;AAC3B,MAAA;AACF,IAAA;AAEA6B,IAAAA,WAAW,GAAG,IAAI;IAElB,SAASsC,IAAIA,CAACC,IAAI,EAAE;MAClB,IAAI,CAACvC,WAAW,IAAI,CAACf,YAAY,IAAI,CAACa,aAAa,EAAE;AAErD,MAAA,IAAIH,qBAAqB,EAAE;AACzB,QAAA,IAAIV,YAAY,CAACuD,MAAM,IAAIvD,YAAY,CAACwD,KAAK,EAAE;AAE/C,QAAA,MAAMC,OAAO,GAAGH,IAAI,GAAGrC,QAAQ;AAC/B,QAAA,MAAMyC,QAAQ,GAAG,IAAI,GAAG9C,SAAS;QAEjC,IAAI6C,OAAO,GAAGC,QAAQ,EAAE;AACtB,UAAA,IAAI3C,WAAW,EAAE;AACfD,YAAAA,gBAAgB,GAAG6C,qBAAqB,CAACN,IAAI,CAAC;AAChD,UAAA;AACA,UAAA;AACF,QAAA;AACApC,QAAAA,QAAQ,GAAGqC,IAAI;AACjB,MAAA;MAEA,IAAI;AACF,QAAA,MAAMM,WAAW,GAAG5D,YAAY,CAAC6D,UAAU,IAAI,CAAC;AAChD,QAAA,MAAMC,YAAY,GAAG9D,YAAY,CAAC+D,WAAW,IAAI,CAAC;QAElD,IAAIH,WAAW,IAAIE,YAAY,EAAE;AAC/B,UAAA,IAAIpD,qBAAqB,EAAE;YACzB,MAAMsD,WAAW,GAAGrD,YAAY,GAAGiD,WAAW,GAAG,CAAC,GAAGA,WAAW;YAChE,MAAMK,YAAY,GAAGtD,YAAY,GAAGmD,YAAY,GAAGA,YAAY,GAAG,CAAC;YAEnE,IAAIjD,aAAa,CAACX,KAAK,KAAK8D,WAAW,EACrCnD,aAAa,CAACX,KAAK,GAAG8D,WAAW;YACnC,IAAInD,aAAa,CAACV,MAAM,KAAK8D,YAAY,EACvCpD,aAAa,CAACV,MAAM,GAAG8D,YAAY;YAErC,IAAI5D,SAAS,KAAK,SAAS,EAAE;AAC3BQ,cAAAA,aAAa,CAACT,KAAK,CAACF,KAAK,GACvB,OAAOA,KAAK,KAAK,QAAQ,GAAG,CAAA,EAAGA,KAAK,CAAA,EAAA,CAAI,GAAGA,KAAK;AAClDW,cAAAA,aAAa,CAACT,KAAK,CAACD,MAAM,GACxB,OAAOA,MAAM,KAAK,QAAQ,GAAG,CAAA,EAAGA,MAAM,CAAA,EAAA,CAAI,GAAGA,MAAM;AACvD,YAAA;YAEA+C,GAAG,CAACgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAEF,WAAW,EAAEC,YAAY,CAAC;AAE9C,YAAA,MAAME,UAAU,GAAG/C,QAAQ,CAACC,aAAa,CAAC,QAAQ,CAAC;YACnD8C,UAAU,CAACjE,KAAK,GAAG0D,WAAW;YAC9BO,UAAU,CAAChE,MAAM,GAAG2D,YAAY;AAChC,YAAA,MAAMM,OAAO,GAAGD,UAAU,CAAChB,UAAU,CAAC,IAAI,CAAC;AAE3C,YAAA,IAAIiB,OAAO,EAAE;AACXA,cAAAA,OAAO,CAACC,SAAS,CAACrE,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE4D,WAAW,EAAEE,YAAY,CAAC;AAChE,cAAA,MAAMlC,SAAS,GAAGwC,OAAO,CAACE,YAAY,CACpC,CAAC,EACD,CAAC,EACDV,WAAW,EACXE,YACF,CAAC;AACD,cAAA,IAAIS,kBAAkB,GAAG5D,YAAY,GACjCkC,sBAAsB,CAACjB,SAAS,CAAC,GACjCD,oBAAoB,CAACC,SAAS,CAAC;cAEnC,IAAIH,MAAM,CAAC+C,IAAI,CAACjE,OAAO,CAAC,CAAClE,MAAM,GAAG,CAAC,EAAE;AACnCkI,gBAAAA,kBAAkB,GAChBE,WAAW,CAACC,eAAe,CAACH,kBAAkB,CAAC;AACnD,cAAA;cAEArB,GAAG,CAACyB,YAAY,CAACJ,kBAAkB,EAAE,CAAC,EAAE,CAAC,CAAC;AAC5C,YAAA;AACF,UAAA,CAAC,MAAM;YACL,IAAI1D,aAAa,CAACX,KAAK,KAAK0D,WAAW,EACrC/C,aAAa,CAACX,KAAK,GAAG0D,WAAW;YACnC,IAAI/C,aAAa,CAACV,MAAM,KAAK2D,YAAY,EACvCjD,aAAa,CAACV,MAAM,GAAG2D,YAAY;YAErC,IAAIzD,SAAS,KAAK,SAAS,EAAE;AAC3BQ,cAAAA,aAAa,CAACT,KAAK,CAACF,KAAK,GACvB,OAAOA,KAAK,KAAK,QAAQ,GAAG,CAAA,EAAGA,KAAK,CAAA,EAAA,CAAI,GAAGA,KAAK;AAClDW,cAAAA,aAAa,CAACT,KAAK,CAACD,MAAM,GACxB,OAAOA,MAAM,KAAK,QAAQ,GAAG,CAAA,EAAGA,MAAM,CAAA,EAAA,CAAI,GAAGA,MAAM;AACvD,YAAA;YAEA+C,GAAG,CAACgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAEN,WAAW,EAAEE,YAAY,CAAC;AAC9CZ,YAAAA,GAAG,CAACmB,SAAS,CAACrE,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE4D,WAAW,EAAEE,YAAY,CAAC;AAC9D,UAAA;AACF,QAAA;MACF,CAAC,CAAC,OAAO5E,KAAK,EAAE;AACdI,QAAAA,OAAO,CAACJ,KAAK,CAAC,6BAA6B,EAAEA,KAAK,CAAC;AACnD,QAAA,IAAIoB,OAAO,EAAEA,OAAO,CAACpB,KAAK,CAAC;AAC7B,MAAA;AAEA,MAAA,IAAI6B,WAAW,EAAE;AACfD,QAAAA,gBAAgB,GAAG6C,qBAAqB,CAACN,IAAI,CAAC;AAChD,MAAA;AACF,IAAA;IAEA,IAAIvC,gBAAgB,KAAK,IAAI,EAAE;AAC7BA,MAAAA,gBAAgB,GAAG6C,qBAAqB,CAACN,IAAI,CAAC;AAChD,IAAA;AACF,EAAA;EAEA,SAASuB,cAAcA,GAAG;AACxB7D,IAAAA,WAAW,GAAG,KAAK;IACnB,IAAID,gBAAgB,KAAK,IAAI,EAAE;MAC7B+D,oBAAoB,CAAC/D,gBAAgB,CAAC;AACtCA,MAAAA,gBAAgB,GAAG,IAAI;AACzB,IAAA;AACF,EAAA;;AAEA;EACA,SAASgE,UAAUA,GAAG;IACpB,IAAI;MACF,IAAI,CAAC9E,YAAY,EAAE;AACjB,QAAA,MAAM,IAAIoD,KAAK,CAAC,2BAA2B,CAAC;AAC9C,MAAA;MAEA,IAAI,CAACpC,gBAAgB,EAAE;AACrB,QAAA,MAAM,IAAIoC,KAAK,CAAC,+BAA+B,CAAC;AAClD,MAAA;MAEAvC,aAAa,GAAGK,mBAAmB,EAAE;AACrCF,MAAAA,gBAAgB,CAAC+D,WAAW,CAAClE,aAAa,CAAC;AAC3C,MAAA,OAAO,IAAI;IACb,CAAC,CAAC,OAAO3B,KAAK,EAAE;AACdI,MAAAA,OAAO,CAACJ,KAAK,CAAC,uCAAuC,EAAEA,KAAK,CAAC;AAC7D,MAAA,IAAIoB,OAAO,EAAEA,OAAO,CAACpB,KAAK,CAAC;AAC3B,MAAA,OAAO,KAAK;AACd,IAAA;AACF,EAAA;;AAEA;AACA,EAAA,MAAMuF,WAAW,GAAG;IAClBO,KAAK,EAAEA,MAAM;MACX,IAAI,CAACnE,aAAa,EAAE;AAClBvB,QAAAA,OAAO,CAACC,IAAI,CAAC,iCAAiC,CAAC;AAC/C,QAAA,OAAO,KAAK;AACd,MAAA;AACA0D,MAAAA,eAAe,EAAE;AACjB,MAAA,OAAO,IAAI;IACb,CAAC;IAEDgC,IAAI,EAAEA,MAAM;AACVL,MAAAA,cAAc,EAAE;IAClB,CAAC;IAEDM,SAAS,EAAEA,MAAMrE,aAAa;AAC9BsC,IAAAA,UAAU,EAAEA,MAAOtC,aAAa,GAAGA,aAAa,CAACsC,UAAU,CAAC,IAAI,CAAC,GAAG,IAAK;IACzEpC,WAAW,EAAEA,MAAMA,WAAW;AAE9BoE,IAAAA,mBAAmB,EAAEA,CACnBC,wBAAwB,EACxBC,eAAe,EACfC,YAAY,KACT;AACH,MAAA,IAAI,OAAOF,wBAAwB,KAAK,SAAS,EAAE;AACjD1E,QAAAA,qBAAqB,GAAG0E,wBAAwB;AAClD,MAAA;AACA,MAAA,IAAI,OAAOC,eAAe,KAAK,SAAS,EAAE;AACxC1E,QAAAA,YAAY,GAAG0E,eAAe;AAChC,MAAA;MACA,IAAI,OAAOC,YAAY,KAAK,QAAQ,IAAIA,YAAY,GAAG,CAAC,EAAE;AACxD1E,QAAAA,SAAS,GAAG0E,YAAY;AAC1B,MAAA;IACF,CAAC;IAEDZ,eAAe,EAAG9C,SAAS,IAAK;MAC9B,IAAIzD,MAAM,GAAGyD,SAAS;AACtB,MAAA,KAAK,MAAM,CAAC/B,IAAI,EAAE0F,UAAU,CAAC,IAAI9D,MAAM,CAAC+D,OAAO,CAACjF,OAAO,CAAC,EAAE;QACxD,IAAI;AACFpC,UAAAA,MAAM,GAAGoH,UAAU,CAACpH,MAAM,CAAC,IAAIA,MAAM;QACvC,CAAC,CAAC,OAAOe,KAAK,EAAE;UACdI,OAAO,CAACC,IAAI,CAAC,CAAA,QAAA,EAAWM,IAAI,CAAA,SAAA,CAAW,EAAEX,KAAK,CAAC;AACjD,QAAA;AACF,MAAA;AACA,MAAA,OAAOf,MAAM;IACf,CAAC;IAEDsH,OAAO,EAAEA,MAAM;AACbb,MAAAA,cAAc,EAAE;MAChB,IAAI/D,aAAa,IAAIG,gBAAgB,EAAE;QACrC,IAAI;AACFA,UAAAA,gBAAgB,CAAC0E,WAAW,CAAC7E,aAAa,CAAC;QAC7C,CAAC,CAAC,OAAO3B,KAAK,EAAE;AACdI,UAAAA,OAAO,CAACC,IAAI,CAAC,yCAAyC,EAAEL,KAAK,CAAC;AAChE,QAAA;AACF,MAAA;AACA2B,MAAAA,aAAa,GAAG,IAAI;AACpBG,MAAAA,gBAAgB,GAAG,IAAI;AACzB,IAAA;GACD;EAED,IAAI8D,UAAU,EAAE,EAAE;AAChB,IAAA,OAAOL,WAAW;AACpB,EAAA,CAAC,MAAM;AACL,IAAA,OAAO,IAAI;AACb,EAAA;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASkB,oBAAoBA,CAAC1F,SAAS,EAAEF,OAAO,GAAG,EAAE,EAAE;EACrD,MAAM;AACJ6F,IAAAA,WAAW,GAAG,WAAW;AACzBC,IAAAA,OAAO,GAAG,cAAc;AACxBC,IAAAA,aAAa,GAAG;AAClB,GAAC,GAAG/F,OAAO;;AAEX;AACA;EACA,IAAIC,YAAY,GAAG,IAAI;EACvB,IAAI+F,cAAc,GAAG,IAAI;EACzB,IAAIC,MAAM,GAAG,IAAI;EACjB,IAAIC,SAAS,GAAG,IAAI;EACpB,IAAI/G,KAAK,GAAG,IAAI;EAChB,IAAI8B,gBAAgB,GAAG,IAAI;;AAE3B;EACA,IAAIkF,aAAa,GAAG,IAAI;EACxB,IAAIC,WAAW,GAAG,EAAE;EACpB,IAAIC,WAAW,GAAG,KAAK;EACvB,IAAIC,WAAW,GAAG,IAAI;EACtB,IAAIC,UAAU,GAAG,IAAI;EACrB,IAAIC,iBAAiB,GAAG,KAAK;AAC7B,EAAA,IAAIC,iBAAiB,GAAG,IAAI,CAAC;AAC7B,EAAA,IAAIC,gBAAgB,GAAG,IAAI,CAAC;;AAE5B;EACA,IAAIC,iBAAiB,GAAG,IAAI;EAC5B,IAAIC,4BAA4B,GAAG,KAAK;EACxC,IAAIC,cAAc,GAAG,EAAE;;AAEvB;EACA,SAASC,2BAA2BA,GAAG;AACrC;IACA,MAAMC,iBAAiB,GACrBnI,MAAM,CAACmI,iBAAiB,IAAInI,MAAM,CAACoI,uBAAuB;IAE5D,IAAI,CAACD,iBAAiB,EAAE;AACtBxH,MAAAA,OAAO,CAACC,IAAI,CAAC,kDAAkD,CAAC;AAChEoH,MAAAA,4BAA4B,GAAG,KAAK;AACpC,MAAA,OAAO,KAAK;AACd,IAAA;IAEA,IAAI;AACFD,MAAAA,iBAAiB,GAAG,IAAII,iBAAiB,EAAE;;AAE3C;MACAJ,iBAAiB,CAACM,UAAU,GAAG,IAAI;MACnCN,iBAAiB,CAACO,cAAc,GAAG,IAAI;AACvCP,MAAAA,iBAAiB,CAACQ,IAAI,GAAG,OAAO,CAAC;;AAEjC;MACAR,iBAAiB,CAACS,OAAO,GAAG,MAAM;AAChCP,QAAAA,cAAc,GAAG,EAAE;MACrB,CAAC;AAEDF,MAAAA,iBAAiB,CAACU,QAAQ,GAAIC,KAAK,IAAK;QACtC,IAAIC,iBAAiB,GAAG,EAAE;QAC1B,IAAIC,eAAe,GAAG,EAAE;AAExB,QAAA,KAAK,IAAI1K,CAAC,GAAGwK,KAAK,CAACG,WAAW,EAAE3K,CAAC,GAAGwK,KAAK,CAACI,OAAO,CAACpL,MAAM,EAAEQ,CAAC,EAAE,EAAE;AAC7D,UAAA,MAAM6K,UAAU,GAAGL,KAAK,CAACI,OAAO,CAAC5K,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC6K,UAAU;UACjD,IAAIL,KAAK,CAACI,OAAO,CAAC5K,CAAC,CAAC,CAAC8K,OAAO,EAAE;AAC5BJ,YAAAA,eAAe,IAAIG,UAAU;AAC/B,UAAA,CAAC,MAAM;AACLJ,YAAAA,iBAAiB,IAAII,UAAU;AACjC,UAAA;AACF,QAAA;;AAEA;QACAd,cAAc,GAAGW,eAAe,GAAGD,iBAAiB;;AAEpD;MACF,CAAC;AAEDZ,MAAAA,iBAAiB,CAACpI,OAAO,GAAI+I,KAAK,IAAK;QACrC/H,OAAO,CAACJ,KAAK,CAAC,2BAA2B,EAAEmI,KAAK,CAACnI,KAAK,CAAC;MACzD,CAAC;AAEDyH,MAAAA,4BAA4B,GAAG,IAAI;AACnC,MAAA,OAAO,IAAI;IACb,CAAC,CAAC,OAAOzH,KAAK,EAAE;AACdI,MAAAA,OAAO,CAACJ,KAAK,CAAC,0CAA0C,EAAEA,KAAK,CAAC;AAChEyH,MAAAA,4BAA4B,GAAG,KAAK;AACpC,MAAA,OAAO,KAAK;AACd,IAAA;AACF,EAAA;;AAEA;EACA,SAASiB,sBAAsBA,GAAG;AAChC,IAAA,IAAI,CAACjB,4BAA4B,IAAI,CAACD,iBAAiB,EAAE;AACvDpH,MAAAA,OAAO,CAACC,IAAI,CAAC,kCAAkC,CAAC;AAChD,MAAA,OAAO,KAAK;AACd,IAAA;IAEA,IAAI;MACFmH,iBAAiB,CAAC1B,KAAK,EAAE;AACzB,MAAA,OAAO,IAAI;IACb,CAAC,CAAC,OAAO9F,KAAK,EAAE;AACdI,MAAAA,OAAO,CAACJ,KAAK,CAAC,qCAAqC,EAAEA,KAAK,CAAC;AAC3D,MAAA,OAAO,KAAK;AACd,IAAA;AACF,EAAA;;AAEA;EACA,SAAS2I,qBAAqBA,GAAG;IAC/B,IAAI,CAACnB,iBAAiB,EAAE;IAExB,IAAI;MACFA,iBAAiB,CAACzB,IAAI,EAAE;IAC1B,CAAC,CAAC,OAAO/F,KAAK,EAAE;AACdI,MAAAA,OAAO,CAACJ,KAAK,CAAC,oCAAoC,EAAEA,KAAK,CAAC;AAC5D,IAAA;AACF,EAAA;;AAEA;EACA,eAAe4I,iBAAiBA,GAAG;AACjC;IACA,MAAM,IAAIjK,OAAO,CAAEC,OAAO,IAAKiK,UAAU,CAACjK,OAAO,EAAE,GAAG,CAAC,CAAC;AACxD,IAAA,OAAO8I,cAAc,CAACoB,IAAI,EAAE;AAC9B,EAAA;;AAEA;EACA,IAAIC,cAAc,GAAGpC,OAAO;EAC5B,IAAIqC,oBAAoB,GAAG,CAAC;AAC5B,EAAA,IAAIC,kBAAkB,GAAG,GAAG,CAAC;EAC7B,IAAIC,aAAa,GAAG,IAAI;EACxB,IAAIC,wBAAwB,GAAG,CAAC;AAChC,EAAA,IAAIC,sBAAsB,GAAG,GAAG,CAAC;EACjC,IAAIC,iBAAiB,GAAG,IAAI;;AAE5B;EACA,IAAIC,UAAU,GAAG,IAAI;EACrB,IAAIC,cAAc,GAAG,KAAK;EAC1B,IAAIC,mBAAmB,GAAG,KAAK;EAC/B,IAAIC,gBAAgB,GAAG,KAAK;EAC5B,IAAIC,cAAc,GAAG,KAAK;EAC1B,IAAIC,WAAW,GAAG,KAAK;EACvB,IAAIC,eAAe,GAAG,IAAI;EAC1B,IAAIC,kBAAkB,GAAG,IAAI;;AAE7B;EACA,SAASC,mBAAmBA,GAAG;AAC7B,IAAA,IAAI,OAAO/I,SAAS,KAAK,QAAQ,EAAE;AACjC,MAAA,OAAOmB,QAAQ,CAAC6H,aAAa,CAAChJ,SAAS,CAAC;AAC1C,IAAA,CAAC,MAAM,IAAIA,SAAS,YAAYiJ,OAAO,EAAE;AACvC,MAAA,OAAOjJ,SAAS;AAClB,IAAA;AACA,IAAA,IAAIA,SAAS,IAAIA,SAAS,CAACkJ,OAAO,EAAE;MAClC,OAAOlJ,SAAS,CAACkJ,OAAO;AAC1B,IAAA;AACA,IAAA,OAAO,IAAI;AACb,EAAA;;AAEA;EACA,eAAeC,mBAAmBA,GAAG;AACnC,IAAA,IAAI7C,iBAAiB,EAAE;AACrB,MAAA;AACF,IAAA;IAEA,IAAI;MACF,IAAI,CAACsC,WAAW,EAAE;QAChB,MAAMQ,aAAa,EAAE;AACvB,MAAA;AAEA9C,MAAAA,iBAAiB,GAAG,KAAK;MACzB+C,gBAAgB,CAAC,IAAI,CAAC;AACtB,MAAA,MAAMC,oBAAoB,GAAG,MAAMpK,yBAAyB,EAAE;AAC9DkH,MAAAA,WAAW,GAAG,MAAMjH,SAAS,CAACoK,YAAY,CAACC,YAAY,CAAC;AACtDC,QAAAA,KAAK,EAAE;AACLC,UAAAA,gBAAgB,EAAE,IAAI;AACtBC,UAAAA,gBAAgB,EAAE,IAAI;AACtBC,UAAAA,eAAe,EAAE;AACnB;AACF,OAAC,CAAC;AACF,MAAA,IAAIN,oBAAoB,CAAC/J,KAAK,KAAK,SAAS,EAAE;QAC5C8J,gBAAgB,CAAC,KAAK,CAAC;AACvB,QAAA;AACF,MAAA;;AAEA;AACA,MAAA,IAAI3C,4BAA4B,EAAE;AAChCiB,QAAAA,sBAAsB,EAAE;AAC1B,MAAA;MAEA,MAAM,IAAI/J,OAAO,CAAEC,OAAO,IAAKiK,UAAU,CAACjK,OAAO,EAAE,GAAG,CAAC,CAAC;AAExD,MAAA,MAAMiC,OAAO,GAAG;AACd+J,QAAAA,QAAQ,EAAE;OACX;AAED5D,MAAAA,aAAa,GAAG,IAAI6D,aAAa,CAAC1D,WAAW,EAAEtG,OAAO,CAAC;AACvDoG,MAAAA,WAAW,GAAG,EAAE;AAEhBD,MAAAA,aAAa,CAAC8D,eAAe,GAAG,UAAU3C,KAAK,EAAE;QAC/C,IAAIA,KAAK,CAACxF,IAAI,IAAIwF,KAAK,CAACxF,IAAI,CAACoI,IAAI,GAAG,CAAC,EAAE;AACrC9D,UAAAA,WAAW,CAAC+D,IAAI,CAAC7C,KAAK,CAACxF,IAAI,CAAC;AAC9B,QAAA;MACF,CAAC;MAEDqE,aAAa,CAACiE,MAAM,GAAG,kBAAkB;AACvC,QAAA,IAAI5D,iBAAiB,EAAE;AACrB,UAAA;AACF,QAAA;;AAEA;QACA,IAAI,CAACJ,WAAW,IAAIA,WAAW,CAAC9J,MAAM,KAAK,CAAC,EAAE;AAC5CiD,UAAAA,OAAO,CAACC,IAAI,CAAC,0BAA0B,CAAC;AACxC6G,UAAAA,WAAW,GAAG,KAAK;AACnBG,UAAAA,iBAAiB,GAAG,KAAK;UACzB+C,gBAAgB,CAAC,KAAK,CAAC;AACvB;UACA,MAAMD,aAAa,EAAE;AACrB,UAAA;AACF,QAAA;AAEA9C,QAAAA,iBAAiB,GAAG,IAAI;QACxB+C,gBAAgB,CAAC,IAAI,CAAC;QAEtB,IAAI;AACF,UAAA,MAAMQ,QAAQ,GAAG5D,aAAa,CAAC4D,QAAQ,IAAI,YAAY;AACvD,UAAA,MAAMM,SAAS,GAAG,IAAI3M,IAAI,CAAC0I,WAAW,EAAE;AAAEzI,YAAAA,IAAI,EAAEoM;AAAS,WAAC,CAAC;AAE3DtD,UAAAA,iBAAiB,GAAG4D,SAAS;AAC7B,UAAA,IAAI3D,gBAAgB,EAAE;AACpB4D,YAAAA,GAAG,CAACC,eAAe,CAAC7D,gBAAgB,CAAC;AACvC,UAAA;AACAA,UAAAA,gBAAgB,GAAG4D,GAAG,CAACE,eAAe,CAACH,SAAS,CAAC;UAEjD,IAAI;AACF;;AAEA,YAAA,MAAMxD,cAAc,GAAG,MAAMkB,iBAAiB,EAAE;;AAEhD;YACA,MAAM0C,WAAW,GAAG,MAAMC,mBAAmB,CAC3CL,SAAS,EACTxD,cACF,CAAC;YAED4B,UAAU,GAAGgC,WAAW,CAACE,GAAG;YAC5BjC,cAAc,GAAG+B,WAAW,CAACG,OAAO;YACpCjC,mBAAmB,GAAG8B,WAAW,CAAC7J,YAAY;AAC9CgI,YAAAA,gBAAgB,GAAG6B,WAAW,CAACI,UAAU,IAAI,KAAK;AAClDhC,YAAAA,cAAc,GAAG,KAAK;AACtBC,YAAAA,WAAW,GAAG,KAAK;YACnB,IAAI7C,MAAM,IAAIwC,UAAU,EAAE;cACxB,IAAI;AACF,gBAAA,MAAMxC,MAAM,CAAC6E,IAAI,CAACrC,UAAU,CAAC;cAC/B,CAAC,CAAC,OAAOsC,SAAS,EAAE;AAClBxL,gBAAAA,OAAO,CAACJ,KAAK,CAAC,sBAAsB,EAAE4L,SAAS,CAAC;AAChD;gBACA,MAAMzB,aAAa,EAAE;AACrB,gBAAA,MAAMyB,SAAS;AACjB,cAAA;;AAEA;cACA9K,YAAY,CAAC+K,IAAI,GAAG,KAAK;AAEzB,cAAA,IAAItC,cAAc,EAAE;AAClBzI,gBAAAA,YAAY,CAACI,KAAK,CAACoB,OAAO,GAAG,MAAM;gBACnCxB,YAAY,CAACgL,KAAK,GAAG,KAAK;AAC1B,gBAAA,IAAIhL,YAAY,CAACiL,UAAU,GAAG,CAAC,EAAE;kBAC/BjL,YAAY,CAACkL,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,EAAE;AACpDC,oBAAAA,IAAI,EAAE;AACR,mBAAC,CAAC;AACJ,gBAAA;AACF,cAAA,CAAC,MAAM;AACLnL,gBAAAA,YAAY,CAACI,KAAK,CAACoB,OAAO,GAAG,OAAO;gBACpCxB,YAAY,CAACgL,KAAK,GAAG,KAAK;AAC5B,cAAA;AAEA,cAAA,IAAIvC,cAAc,EAAE;AAClBzI,gBAAAA,YAAY,CAACI,KAAK,CAACoB,OAAO,GAAG,MAAM;;AAEnC;gBACA,IAAI,CAACuE,cAAc,EAAE;kBACnBA,cAAc,GAAGqF,kBAAkB,EAAE;AACvC,gBAAA;AAEA,gBAAA,IAAIrF,cAAc,EAAE;AAClB;kBACAA,cAAc,CAACd,IAAI,EAAE;;AAErB;kBACAc,cAAc,CAACZ,mBAAmB,CAChC,IAAI,EACJuD,mBAAmB,EACnB,EACF,CAAC;;AAED;kBACA,MAAM2C,sBAAsB,GAAGA,MAAM;AACnC,oBAAA,MAAMlK,MAAM,GAAG4E,cAAc,CAACb,SAAS,EAAE;AACzC,oBAAA,IAAI/D,MAAM,EAAE;AACVA,sBAAAA,MAAM,CAACf,KAAK,CAACoB,OAAO,GAAG,OAAO;AAChC,oBAAA;oBACAuE,cAAc,CAACf,KAAK,EAAE;kBACxB,CAAC;;AAED;kBACA,MAAMsG,eAAe,GAAGA,MAAM;AAC5BtL,oBAAAA,YAAY,CAACuL,mBAAmB,CAAC,MAAM,EAAED,eAAe,CAAC;AACzD;AACAvD,oBAAAA,UAAU,CAACsD,sBAAsB,EAAE,GAAG,CAAC;kBACzC,CAAC;AAEDrL,kBAAAA,YAAY,CAACkL,gBAAgB,CAAC,MAAM,EAAEI,eAAe,EAAE;AACrDH,oBAAAA,IAAI,EAAE;AACR,mBAAC,CAAC;AACJ,gBAAA;AACF,cAAA,CAAC,MAAM;AACLnL,gBAAAA,YAAY,CAACI,KAAK,CAACoB,OAAO,GAAG,OAAO;;AAEpC;AACA,gBAAA,IAAIuE,cAAc,EAAE;kBAClBA,cAAc,CAACd,IAAI,EAAE;AACrB,kBAAA,MAAM9D,MAAM,GAAG4E,cAAc,CAACb,SAAS,EAAE;AACzC,kBAAA,IAAI/D,MAAM,EAAE;AACVA,oBAAAA,MAAM,CAACf,KAAK,CAACoB,OAAO,GAAG,MAAM;AAC/B,kBAAA;AACF,gBAAA;AACF,cAAA;;AAEA;AACA,cAAA,MAAMgK,sBAAsB,GAAG,YAAY;AACzCxL,gBAAAA,YAAY,CAACuL,mBAAmB,CAC9B,OAAO,EACPC,sBACF,CAAC;gBACD,MAAMnC,aAAa,EAAE;cACvB,CAAC;AACDrJ,cAAAA,YAAY,CAACkL,gBAAgB,CAAC,OAAO,EAAEM,sBAAsB,EAAE;AAC7DL,gBAAAA,IAAI,EAAE;AACR,eAAC,CAAC;cAEF,IAAI;AACF,gBAAA,IAAInL,YAAY,CAACiL,UAAU,IAAI,CAAC,EAAE;AAChC,kBAAA,MAAMjL,YAAY,CAACyL,IAAI,EAAE;AAC3B,gBAAA,CAAC,MAAM;kBACL,IAAIC,SAAS,GAAG,KAAK;AAErB,kBAAA,MAAMC,aAAa,GAAG,YAAY;AAChC,oBAAA,IAAID,SAAS,EAAE;AACfA,oBAAAA,SAAS,GAAG,IAAI;oBAEhB,IAAI;AACF,sBAAA,MAAM1L,YAAY,CAACyL,IAAI,EAAE;oBAC3B,CAAC,CAAC,OAAOG,OAAO,EAAE;AAChBtM,sBAAAA,OAAO,CAACC,IAAI,CACV,oCAAoC,EACpCqM,OACF,CAAC;AACH,oBAAA;kBACF,CAAC;AAED5L,kBAAAA,YAAY,CAACkL,gBAAgB,CAAC,SAAS,EAAES,aAAa,EAAE;AACtDR,oBAAAA,IAAI,EAAE;AACR,mBAAC,CAAC;AACJ,gBAAA;cACF,CAAC,CAAC,OAAOS,OAAO,EAAE;AAChBtM,gBAAAA,OAAO,CAACC,IAAI,CAAC,kBAAkB,EAAEqM,OAAO,CAAC;AAC3C,cAAA;;AAEA;AACF,YAAA,CAAC,MAAM;AACLtM,cAAAA,OAAO,CAACJ,KAAK,CAAC,8CAA8C,CAAC;AAC7D;cACA,MAAMmK,aAAa,EAAE;AACrB,cAAA,MAAM,IAAIjG,KAAK,CAAC,yCAAyC,CAAC;AAC5D,YAAA;UACF,CAAC,CAAC,OAAOlE,KAAK,EAAE;AACdI,YAAAA,OAAO,CAACJ,KAAK,CAAC,4BAA4B,EAAEA,KAAK,CAAC;AAClD;YACA,MAAMmK,aAAa,EAAE;AACvB,UAAA;QACF,CAAC,CAAC,OAAOwC,eAAe,EAAE;AACxBvM,UAAAA,OAAO,CAACJ,KAAK,CACX,qCAAqC,EACrC2M,eACF,CAAC;AACD;UACA,MAAMxC,aAAa,EAAE;AACvB,QAAA,CAAC,SAAS;AACR9C,UAAAA,iBAAiB,GAAG,KAAK;UACzB+C,gBAAgB,CAAC,KAAK,CAAC;AACzB,QAAA;AAEA,QAAA,IAAIjD,WAAW,EAAE;AACfA,UAAAA,WAAW,CAACyF,SAAS,EAAE,CAACC,OAAO,CAAEC,KAAK,IAAKA,KAAK,CAAC/G,IAAI,EAAE,CAAC;AACxDoB,UAAAA,WAAW,GAAG,IAAI;AACpB,QAAA;AAEAD,QAAAA,WAAW,GAAG,KAAK;QACnBkD,gBAAgB,CAAC,KAAK,CAAC;MACzB,CAAC;AAEDA,MAAAA,gBAAgB,EAAE;AAClBpD,MAAAA,aAAa,CAAClB,KAAK,CAAC,GAAG,CAAC;AACxBoB,MAAAA,WAAW,GAAG,IAAI;AAClBkD,MAAAA,gBAAgB,EAAE;IACpB,CAAC,CAAC,OAAOpK,KAAK,EAAE;AACdI,MAAAA,OAAO,CAACJ,KAAK,CAAC,6BAA6B,EAAEA,KAAK,CAAC;MACnD+M,SAAS,CAAC,wDAAwD,CAAC;AAEnE3C,MAAAA,gBAAgB,EAAE;AAClBlD,MAAAA,WAAW,GAAG,KAAK;MACnBG,iBAAiB,GAAG,KAAK,CAAC;AAC1B+C,MAAAA,gBAAgB,EAAE;AACpB,IAAA;AACF,EAAA;EAEA,SAAS4C,kBAAkBA,GAAG;IAC5B,IAAI;AACF,MAAA,IAAIhG,aAAa,IAAIA,aAAa,CAAC1G,KAAK,KAAK,WAAW,EAAE;QACxD0G,aAAa,CAACjB,IAAI,EAAE;AACtB,MAAA;IACF,CAAC,CAAC,OAAO/F,KAAK,EAAE;AACdI,MAAAA,OAAO,CAACC,IAAI,CAAC,gCAAgC,EAAEL,KAAK,CAAC;AACvD,IAAA;;AAEA;AACA,IAAA,IAAIyH,4BAA4B,EAAE;AAChCkB,MAAAA,qBAAqB,EAAE;AACzB,IAAA;;AAEA;AACA,IAAA,IAAIxB,WAAW,EAAE;MACf,IAAI;AACFA,QAAAA,WAAW,CAACyF,SAAS,EAAE,CAACC,OAAO,CAAEC,KAAK,IAAKA,KAAK,CAAC/G,IAAI,EAAE,CAAC;MAC1D,CAAC,CAAC,OAAO/F,KAAK,EAAE;AACdI,QAAAA,OAAO,CAACC,IAAI,CAAC,qCAAqC,EAAEL,KAAK,CAAC;AAC5D,MAAA;AACAmH,MAAAA,WAAW,GAAG,IAAI;AACpB,IAAA;;AAEA;AACAiD,IAAAA,gBAAgB,EAAE;AACpB,EAAA;AAEA,EAAA,SAASA,gBAAgBA,CAAC6C,WAAW,GAAG,KAAK,EAAE;IAC7C,IAAI,CAAC7F,UAAU,EAAE;;AAEjB;AACA,IAAA,MAAM8F,YAAY,GAAG9F,UAAU,CAAC2C,aAAa,CAAC,qBAAqB,CAAC;AACpE,IAAA,MAAMoD,aAAa,GAAG/F,UAAU,CAAC2C,aAAa,CAAC,uBAAuB,CAAC;IAEvE,IAAI,CAACoD,aAAa,EAAE;AAEpB,IAAA,IAAI9F,iBAAiB,EAAE;AACrB;MACA8F,aAAa,CAACC,QAAQ,GAAG,IAAI;AAC7BD,MAAAA,aAAa,CAACjM,KAAK,CAACmM,eAAe,GAAG,SAAS;AAC/CF,MAAAA,aAAa,CAACjM,KAAK,CAACoM,KAAK,GAAG,SAAS;MACrCH,aAAa,CAACI,SAAS,GAAG;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAA,CAAO;AACD;AACA,MAAA,IAAIL,YAAY,EAAE;QAChBA,YAAY,CAACM,WAAW,GAAG,qBAAqB;AAClD,MAAA;IACF,CAAC,MAAM,IAAItG,WAAW,EAAE;MACtBiG,aAAa,CAACC,QAAQ,GAAG,KAAK;AAC9BD,MAAAA,aAAa,CAACjM,KAAK,CAACmM,eAAe,GAAG,SAAS;AAC/CF,MAAAA,aAAa,CAACjM,KAAK,CAACoM,KAAK,GAAG,SAAS;AACrCH,MAAAA,aAAa,CAACjM,KAAK,CAACuM,eAAe,GAAG,QAAQ;AAC9CN,MAAAA,aAAa,CAACjM,KAAK,CAACwM,OAAO,GAAG,GAAG;AACjCP,MAAAA,aAAa,CAACjM,KAAK,CAACoB,OAAO,GAAG,MAAM;AACpC6K,MAAAA,aAAa,CAACjM,KAAK,CAACyM,UAAU,GAAG,QAAQ;AACzCR,MAAAA,aAAa,CAACjM,KAAK,CAAC0M,cAAc,GAAG,QAAQ;AAC7CT,MAAAA,aAAa,CAACjM,KAAK,CAACF,KAAK,GAAG,MAAM;AAClCmM,MAAAA,aAAa,CAACjM,KAAK,CAACD,MAAM,GAAG,MAAM;AACnCkM,MAAAA,aAAa,CAACjM,KAAK,CAAC2M,QAAQ,GAAG,MAAM;AACrCV,MAAAA,aAAa,CAACjM,KAAK,CAAC4M,SAAS,GAAG,MAAM;MACtCX,aAAa,CAACI,SAAS,GAAG,CAAA,oNAAA,CAAsN;AAChP;AACA,MAAA,IAAIL,YAAY,EAAE;AAChB;QACA,IAAInE,cAAc,KAAK,cAAc,EAAE;UACrCmE,YAAY,CAACM,WAAW,GAAG,iBAAiB;AAC9C,QAAA,CAAC,MAAM;UACLN,YAAY,CAACM,WAAW,GAAG,uBAAuB;AACpD,QAAA;AACF,MAAA;AACF,IAAA,CAAC,MAAM;MACLL,aAAa,CAACC,QAAQ,GAAG,KAAK;AAC9BD,MAAAA,aAAa,CAACjM,KAAK,CAACmM,eAAe,GAAG,SAAS;AAC/CF,MAAAA,aAAa,CAACjM,KAAK,CAACwM,OAAO,GAAG,MAAM;AACpCP,MAAAA,aAAa,CAACjM,KAAK,CAAC6M,SAAS,GAAG,2BAA2B;AAC3DZ,MAAAA,aAAa,CAACjM,KAAK,CAACuM,eAAe,GAAG,QAAQ;AAC9CN,MAAAA,aAAa,CAACjM,KAAK,CAACF,KAAK,GAAG,MAAM;AAClCmM,MAAAA,aAAa,CAACjM,KAAK,CAACD,MAAM,GAAG,MAAM;AACnCkM,MAAAA,aAAa,CAACjM,KAAK,CAAC2M,QAAQ,GAAG,MAAM;AACrCV,MAAAA,aAAa,CAACjM,KAAK,CAAC4M,SAAS,GAAG,MAAM;AACtCX,MAAAA,aAAa,CAACjM,KAAK,CAACoB,OAAO,GAAG,MAAM;AACpC6K,MAAAA,aAAa,CAACjM,KAAK,CAACyM,UAAU,GAAG,QAAQ;AACzCR,MAAAA,aAAa,CAACjM,KAAK,CAAC0M,cAAc,GAAG,QAAQ;MAC7CT,aAAa,CAACI,SAAS,GAAG,CAAA,0OAAA,CAA4O;;AAEtQ;AACA,MAAA,IAAIL,YAAY,EAAE;AAChB;QACA,IAAInE,cAAc,KAAK,cAAc,EAAE;UACrCmE,YAAY,CAACM,WAAW,GAAG,gBAAgB;AAC7C,QAAA,CAAC,MAAM;UACLN,YAAY,CAACM,WAAW,GAAG,kBAAkB;AAC/C,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;EAEA,SAASQ,gBAAgBA,GAAG;AAC1B;AACA,IAAA,MAAMC,OAAO,GAAG/L,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;IAC7C8L,OAAO,CAACC,EAAE,GAAG,sBAAsB;;AAEnC;AACA,IAAA,MAAMhN,KAAK,GAAGgB,QAAQ,CAACC,aAAa,CAAC,OAAO,CAAC;IAC7CjB,KAAK,CAACsM,WAAW,GAAG;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,CAAK;AACDtL,IAAAA,QAAQ,CAACiM,IAAI,CAACtI,WAAW,CAAC3E,KAAK,CAAC;;AAEhC;AACA,IAAA,MAAMkN,YAAY,GAAG;AACnBC,MAAAA,QAAQ,EAAE,UAAU;AACpBC,MAAAA,MAAM,EAAE,IAAI;AACZhM,MAAAA,OAAO,EAAE,MAAM;AACfiM,MAAAA,aAAa,EAAE,KAAK;AACpBZ,MAAAA,UAAU,EAAE,QAAQ;AACpBa,MAAAA,GAAG,EAAE,KAAK;AACVxN,MAAAA,KAAK,EAAE,aAAa;AAAE;AACtB6M,MAAAA,QAAQ,EAAE;KACX;IAEDtL,MAAM,CAACC,MAAM,CAACyL,OAAO,CAAC/M,KAAK,EAAEkN,YAAY,CAAC;AAE1C,IAAA,MAAMK,MAAM,GAAGvM,QAAQ,CAACC,aAAa,CAAC,QAAQ,CAAC;IAC/CsM,MAAM,CAACP,EAAE,GAAG,sBAAsB;;AAElC;AACA,IAAA,MAAMQ,SAAS,GAAG;AAChBC,MAAAA,IAAI,EAAE,CAAA,0OAAA,CAA4O;AAClPzN,MAAAA,KAAK,EAAE;AACLF,QAAAA,KAAK,EAAE,MAAM;AACbC,QAAAA,MAAM,EAAE,MAAM;AACd4M,QAAAA,QAAQ,EAAE,MAAM;AAChBC,QAAAA,SAAS,EAAE,MAAM;AACjBJ,QAAAA,OAAO,EAAE,MAAM;AACfL,QAAAA,eAAe,EAAE,SAAS;AAC1BuB,QAAAA,MAAM,EAAE,MAAM;AACdC,QAAAA,YAAY,EAAE,MAAM;AACpBC,QAAAA,MAAM,EAAE,SAAS;AACjBxM,QAAAA,OAAO,EAAE,MAAM;AACfqL,QAAAA,UAAU,EAAE,QAAQ;AACpBC,QAAAA,cAAc,EAAE,QAAQ;AACxBG,QAAAA,SAAS,EAAE,2BAA2B;AACtCN,QAAAA,eAAe,EAAE,QAAQ;AACzBsB,QAAAA,SAAS,EAAE;OACZ;AACDV,MAAAA,QAAQ,EAAE3H;KACX;;AAED;AACA,IAAA,MAAMsI,KAAK,GAAG9M,QAAQ,CAACC,aAAa,CAAC,MAAM,CAAC;IAC5C6M,KAAK,CAACd,EAAE,GAAG,oBAAoB;AAC/B;IACA,IAAInF,cAAc,KAAK,cAAc,EAAE;MACrCiG,KAAK,CAACxB,WAAW,GAAG,gBAAgB;AACtC,IAAA,CAAC,MAAM;MACLwB,KAAK,CAACxB,WAAW,GAAG,kBAAkB;AACxC,IAAA;;AAEA;AACA,IAAA,MAAMyB,UAAU,GAAG;AACjBC,MAAAA,QAAQ,EAAE,MAAM;AAChB5B,MAAAA,KAAK,EAAE,SAAS;AAChB6B,MAAAA,SAAS,EAAE,QAAQ;AACnB9B,MAAAA,eAAe,EAAE,SAAS;AAC1B+B,MAAAA,UAAU,EAAE,QAAQ;AACpBC,MAAAA,UAAU,EAAE,mBAAmB;AAC/BC,MAAAA,UAAU,EAAE,2BAA2B;AACvCC,MAAAA,aAAa,EAAE,MAAM;AACrB7B,MAAAA,OAAO,EAAE,SAAS;AAClBmB,MAAAA,YAAY,EAAE,KAAK;AACnBW,MAAAA,UAAU,EAAE,MAAM;AAClBC,MAAAA,UAAU,EAAE,KAAK;AACjBnN,MAAAA,OAAO,EAAE,MAAM;AACfqL,MAAAA,UAAU,EAAE,QAAQ;AACpBC,MAAAA,cAAc,EAAE,QAAQ;AACxBgB,MAAAA,MAAM,EAAE,mBAAmB;AAC3Bb,MAAAA,SAAS,EAAE,0CAA0C;AACrD/M,MAAAA,KAAK,EAAE,MAAM;AAAE;MACf8M,SAAS,EAAE,MAAM;KAClB;IAEDvL,MAAM,CAACC,MAAM,CAACwM,KAAK,CAAC9N,KAAK,EAAE+N,UAAU,CAAC;IAElB;AAClBR,MAAAA,MAAM,CAAClB,SAAS,GAAGmB,SAAS,CAACC,IAAI;AACnC,IAAA;IAIApM,MAAM,CAACC,MAAM,CAACiM,MAAM,CAACvN,KAAK,EAAEwN,SAAS,CAACxN,KAAK,CAAC;;AAE5C;AACA,IAAA,MAAMwO,WAAW,GAAG;AAClB,MAAA,UAAU,EAAE;AACVC,QAAAA,GAAG,EAAE,MAAM;AACXC,QAAAA,IAAI,EAAE,MAAM;AACZC,QAAAA,KAAK,EAAE,MAAM;AACbC,QAAAA,MAAM,EAAE;OACT;AACD,MAAA,WAAW,EAAE;AACXH,QAAAA,GAAG,EAAE,MAAM;AACXE,QAAAA,KAAK,EAAE,MAAM;AACbD,QAAAA,IAAI,EAAE,MAAM;AACZE,QAAAA,MAAM,EAAE;OACT;AACD,MAAA,aAAa,EAAE;AACbA,QAAAA,MAAM,EAAE,MAAM;AACdF,QAAAA,IAAI,EAAE,MAAM;AACZC,QAAAA,KAAK,EAAE,MAAM;AACbF,QAAAA,GAAG,EAAE;OACN;AACD,MAAA,cAAc,EAAE;AACdG,QAAAA,MAAM,EAAE,MAAM;AACdD,QAAAA,KAAK,EAAE,MAAM;AACbD,QAAAA,IAAI,EAAE,MAAM;AACZD,QAAAA,GAAG,EAAE;OACN;AACDI,MAAAA,MAAM,EAAE;AACNJ,QAAAA,GAAG,EAAE,KAAK;AACVC,QAAAA,IAAI,EAAE,KAAK;AACXb,QAAAA,SAAS,EAAE,uBAAuB;AAClCc,QAAAA,KAAK,EAAE,MAAM;AACbC,QAAAA,MAAM,EAAE;OACT;AACD,MAAA,eAAe,EAAE;AACfA,QAAAA,MAAM,EAAE,MAAM;AACdF,QAAAA,IAAI,EAAE,KAAK;AACXb,QAAAA,SAAS,EAAE,oBAAoB;AAC/Bc,QAAAA,KAAK,EAAE,MAAM;AACbF,QAAAA,GAAG,EAAE;OACN;AACD,MAAA,YAAY,EAAE;AACZA,QAAAA,GAAG,EAAE,MAAM;AACXC,QAAAA,IAAI,EAAE,KAAK;AACXb,QAAAA,SAAS,EAAE,oBAAoB;AAC/Bc,QAAAA,KAAK,EAAE,MAAM;AACbC,QAAAA,MAAM,EAAE;OACT;AACD,MAAA,aAAa,EAAE;AACbF,QAAAA,IAAI,EAAE,MAAM;AACZD,QAAAA,GAAG,EAAE,KAAK;AACVZ,QAAAA,SAAS,EAAE,oBAAoB;AAC/Bc,QAAAA,KAAK,EAAE,MAAM;AACbC,QAAAA,MAAM,EAAE;OACT;AACD,MAAA,cAAc,EAAE;AACdD,QAAAA,KAAK,EAAE,MAAM;AACbF,QAAAA,GAAG,EAAE,KAAK;AACVZ,QAAAA,SAAS,EAAE,oBAAoB;AAC/Ba,QAAAA,IAAI,EAAE,MAAM;AACZE,QAAAA,MAAM,EAAE;AACV;KACD;AAED,IAAA,IAAIJ,WAAW,CAAChB,SAAS,CAACL,QAAQ,CAAC,EAAE;AACnC9L,MAAAA,MAAM,CAACC,MAAM,CAACyL,OAAO,CAAC/M,KAAK,EAAEwO,WAAW,CAAChB,SAAS,CAACL,QAAQ,CAAC,CAAC;AAC/D,IAAA;;AAEA;AACAJ,IAAAA,OAAO,CAACpI,WAAW,CAACmJ,KAAK,CAAC;AAC1Bf,IAAAA,OAAO,CAACpI,WAAW,CAAC4I,MAAM,CAAC;IAE3B,IAAI1F,cAAc,KAAK,QAAQ,EAAE;MAC/B,IAAI0F,MAAM,CAACrB,QAAQ,EAAE;AACnB,QAAA,OAAOa,OAAO;AAChB,MAAA;AACAQ,MAAAA,MAAM,CAACzC,gBAAgB,CAAC,OAAO,EAAE,MAAM;AACrC,QAAA,IAAI9E,WAAW,EAAE;AACf8F,UAAAA,kBAAkB,EAAE;AACtB,QAAA,CAAC,MAAM;AACL9C,UAAAA,mBAAmB,EAAE;AACvB,QAAA;AACF,MAAA,CAAC,CAAC;AACJ,IAAA,CAAC,MAAM,IAAInB,cAAc,KAAK,cAAc,EAAE;MAC5C,IAAI0F,MAAM,CAACrB,QAAQ,EAAE;AACnB,QAAA,OAAOa,OAAO;AAChB,MAAA;AACAQ,MAAAA,MAAM,CAACzC,gBAAgB,CAAC,WAAW,EAAGgE,CAAC,IAAK;QAC1CA,CAAC,CAACC,cAAc,EAAE;AAClB9G,QAAAA,wBAAwB,GAAG+G,IAAI,CAACC,GAAG,EAAE;AAErC,QAAA,IAAI,CAACjJ,WAAW,IAAI,CAACG,iBAAiB,EAAE;UACtCgC,iBAAiB,GAAGR,UAAU,CAAC,MAAM;AACnC,YAAA,IAAI,CAAC3B,WAAW,IAAI,CAACG,iBAAiB,EAAE;AACtC6C,cAAAA,mBAAmB,EAAE;AACvB,YAAA;UACF,CAAC,EAAEd,sBAAsB,CAAC;AAC5B,QAAA;AACF,MAAA,CAAC,CAAC;;AAEF;MACA,MAAMgH,aAAa,GAAIJ,CAAC,IAAK;QAC3BA,CAAC,CAACC,cAAc,EAAE;QAClB,IAAIxB,MAAM,CAACrB,QAAQ,EAAE;AACnB,UAAA;AACF,QAAA;QACA,MAAMiD,aAAa,GAAGH,IAAI,CAACC,GAAG,EAAE,GAAGhH,wBAAwB;AAE3D,QAAA,IAAIE,iBAAiB,EAAE;UACrBiH,YAAY,CAACjH,iBAAiB,CAAC;AAC/BA,UAAAA,iBAAiB,GAAG,IAAI;AAC1B,QAAA;AAEA,QAAA,IAAIgH,aAAa,IAAIjH,sBAAsB,IAAIlC,WAAW,EAAE;AAC1D8F,UAAAA,kBAAkB,EAAE;AACtB,QAAA;;AAEA;AACA9K,QAAAA,QAAQ,CAACmK,mBAAmB,CAAC,SAAS,EAAE+D,aAAa,CAAC;MACxD,CAAC;AAED3B,MAAAA,MAAM,CAACzC,gBAAgB,CAAC,SAAS,EAAEoE,aAAa,CAAC;;AAEjD;AACA3B,MAAAA,MAAM,CAACzC,gBAAgB,CAAC,WAAW,EAAE,MAAM;AACzC9J,QAAAA,QAAQ,CAAC8J,gBAAgB,CAAC,SAAS,EAAEoE,aAAa,CAAC;AACrD,MAAA,CAAC,CAAC;;AAEF;MACA,MAAMG,cAAc,GAAIP,CAAC,IAAK;AAC5B;QACA,IAAIvB,MAAM,CAACrB,QAAQ,EAAE;AACnB,UAAA;AACF,QAAA;QAEA4C,CAAC,CAACC,cAAc,EAAE;AAClBD,QAAAA,CAAC,CAACQ,eAAe,EAAE,CAAC;;QAEpB,MAAMH,aAAa,GAAGH,IAAI,CAACC,GAAG,EAAE,GAAGhH,wBAAwB;;AAE3D;AACA,QAAA,IAAIE,iBAAiB,EAAE;UACrBiH,YAAY,CAACjH,iBAAiB,CAAC;AAC/BA,UAAAA,iBAAiB,GAAG,IAAI;AAC1B,QAAA;AAEA,QAAA,IAAIgH,aAAa,IAAIjH,sBAAsB,IAAIlC,WAAW,EAAE;AAC1D;AACA8F,UAAAA,kBAAkB,EAAE;AACtB,QAAA;;AAEA;AACA9K,QAAAA,QAAQ,CAACmK,mBAAmB,CAAC,UAAU,EAAEkE,cAAc,CAAC;AACxDrO,QAAAA,QAAQ,CAACmK,mBAAmB,CAAC,aAAa,EAAEkE,cAAc,CAAC;MAC7D,CAAC;AAED9B,MAAAA,MAAM,CAACzC,gBAAgB,CACrB,YAAY,EACXgE,CAAC,IAAK;AACL;QACA,IAAIvB,MAAM,CAACrB,QAAQ,EAAE;AACnB,UAAA;AACF,QAAA;QAEA4C,CAAC,CAACC,cAAc,EAAE;AAClBD,QAAAA,CAAC,CAACQ,eAAe,EAAE,CAAC;;AAEpBrH,QAAAA,wBAAwB,GAAG+G,IAAI,CAACC,GAAG,EAAE;AAErC,QAAA,IAAI,CAACjJ,WAAW,IAAI,CAACG,iBAAiB,EAAE;AACtC;UACAgC,iBAAiB,GAAGR,UAAU,CAAC,MAAM;AACnC,YAAA,IAAI,CAAC3B,WAAW,IAAI,CAACG,iBAAiB,EAAE;AACtC6C,cAAAA,mBAAmB,EAAE;AACvB,YAAA;UACF,CAAC,EAAEd,sBAAsB,CAAC;AAC5B,QAAA;;AAEA;AACAlH,QAAAA,QAAQ,CAAC8J,gBAAgB,CAAC,UAAU,EAAEuE,cAAc,EAAE;AACpDE,UAAAA,OAAO,EAAE;AACX,SAAC,CAAC;AACFvO,QAAAA,QAAQ,CAAC8J,gBAAgB,CAAC,aAAa,EAAEuE,cAAc,EAAE;AACvDE,UAAAA,OAAO,EAAE;AACX,SAAC,CAAC;AACJ,MAAA,CAAC,EACD;AAAEA,QAAAA,OAAO,EAAE;AAAM,OACnB,CAAC;AAEDhC,MAAAA,MAAM,CAACzC,gBAAgB,CAAC,UAAU,EAAEuE,cAAc,EAAE;AAAEE,QAAAA,OAAO,EAAE;AAAM,OAAC,CAAC;AACvEhC,MAAAA,MAAM,CAACzC,gBAAgB,CAAC,aAAa,EAAEuE,cAAc,EAAE;AACrDE,QAAAA,OAAO,EAAE;AACX,OAAC,CAAC;;AAEF;AACF,IAAA,CAAC,MAAM,IAAI1H,cAAc,KAAK,QAAQ,EAAE;AACtC;MACA,MAAM2H,mBAAmB,GAAIV,CAAC,IAAK;QACjCA,CAAC,CAACC,cAAc,EAAE;QAClB,IAAIxB,MAAM,CAACrB,QAAQ,EAAE;AACnB,UAAA;AACF,QAAA;QACA,MAAMiD,aAAa,GAAGH,IAAI,CAACC,GAAG,EAAE,GAAGnH,oBAAoB;AAEvD,QAAA,IAAIE,aAAa,EAAE;UACjBoH,YAAY,CAACpH,aAAa,CAAC;AAC3BA,UAAAA,aAAa,GAAG,IAAI;AACtB,QAAA;QAEA,IAAImH,aAAa,GAAGpH,kBAAkB,EAAE;AACtC,UAAA,IAAI/B,WAAW,EAAE;AACf8F,YAAAA,kBAAkB,EAAE;AACtB,UAAA,CAAC,MAAM;AACL9C,YAAAA,mBAAmB,EAAE;AACvB,UAAA;AACF,QAAA,CAAC,MAAM;AACL;AACA,UAAA,IAAIhD,WAAW,EAAE;AACf8F,YAAAA,kBAAkB,EAAE;AACtB,UAAA;AACF,QAAA;;AAEA;AACA9K,QAAAA,QAAQ,CAACmK,mBAAmB,CAAC,SAAS,EAAEqE,mBAAmB,CAAC;MAC9D,CAAC;AAEDjC,MAAAA,MAAM,CAACzC,gBAAgB,CAAC,WAAW,EAAGgE,CAAC,IAAK;QAC1CA,CAAC,CAACC,cAAc,EAAE;QAClB,IAAIxB,MAAM,CAACrB,QAAQ,EAAE;AACnB,UAAA;AACF,QAAA;AACApE,QAAAA,oBAAoB,GAAGkH,IAAI,CAACC,GAAG,EAAE;AAEjC,QAAA,IAAI,CAACjJ,WAAW,IAAI,CAACG,iBAAiB,EAAE;UACtC6B,aAAa,GAAGL,UAAU,CAAC,MAAM;YAC/B,IAAI,CAAC3B,WAAW,EAAE;AAChBgD,cAAAA,mBAAmB,EAAE;AACvB,YAAA;UACF,CAAC,EAAEjB,kBAAkB,CAAC;AACxB,QAAA;;AAEA;AACA/G,QAAAA,QAAQ,CAAC8J,gBAAgB,CAAC,SAAS,EAAE0E,mBAAmB,CAAC;AAC3D,MAAA,CAAC,CAAC;AAEFjC,MAAAA,MAAM,CAACzC,gBAAgB,CAAC,SAAS,EAAE0E,mBAAmB,CAAC;;AAEvD;MACA,MAAMC,oBAAoB,GAAIX,CAAC,IAAK;AAClC;QACA,IAAIvB,MAAM,CAACrB,QAAQ,EAAE;AACnB,UAAA;AACF,QAAA;QAEA4C,CAAC,CAACC,cAAc,EAAE;QAClB,MAAMI,aAAa,GAAGH,IAAI,CAACC,GAAG,EAAE,GAAGnH,oBAAoB;AAEvD,QAAA,IAAIE,aAAa,EAAE;UACjBoH,YAAY,CAACpH,aAAa,CAAC;AAC3BA,UAAAA,aAAa,GAAG,IAAI;AACtB,QAAA;QAEA,IAAImH,aAAa,GAAGpH,kBAAkB,EAAE;AACtC;AACA,UAAA,IAAI/B,WAAW,EAAE;AACf;AACA8F,YAAAA,kBAAkB,EAAE;AACtB,UAAA,CAAC,MAAM;AACL9C,YAAAA,mBAAmB,EAAE;AACvB,UAAA;AACF,QAAA,CAAC,MAAM;AACL;AACA,UAAA,IAAIhD,WAAW,EAAE;AACf8F,YAAAA,kBAAkB,EAAE;AACtB,UAAA;AACF,QAAA;;AAEA;AACA9K,QAAAA,QAAQ,CAACmK,mBAAmB,CAAC,UAAU,EAAEsE,oBAAoB,CAAC;AAC9DzO,QAAAA,QAAQ,CAACmK,mBAAmB,CAAC,aAAa,EAAEsE,oBAAoB,CAAC;MACnE,CAAC;AAEDlC,MAAAA,MAAM,CAACzC,gBAAgB,CACrB,YAAY,EACXgE,CAAC,IAAK;AACL;QACA,IAAIvB,MAAM,CAACrB,QAAQ,EAAE;AACnB,UAAA;AACF,QAAA;QAEA4C,CAAC,CAACC,cAAc,EAAE;AAClBjH,QAAAA,oBAAoB,GAAGkH,IAAI,CAACC,GAAG,EAAE;AAEjC,QAAA,IAAI,CAACjJ,WAAW,IAAI,CAACG,iBAAiB,EAAE;UACtC6B,aAAa,GAAGL,UAAU,CAAC,MAAM;YAC/B,IAAI,CAAC3B,WAAW,EAAE;AAChBgD,cAAAA,mBAAmB,EAAE;AACvB,YAAA;UACF,CAAC,EAAEjB,kBAAkB,CAAC;AACxB,QAAA;;AAEA;AACA/G,QAAAA,QAAQ,CAAC8J,gBAAgB,CAAC,UAAU,EAAE2E,oBAAoB,EAAE;AAC1DF,UAAAA,OAAO,EAAE;AACX,SAAC,CAAC;AACFvO,QAAAA,QAAQ,CAAC8J,gBAAgB,CAAC,aAAa,EAAE2E,oBAAoB,EAAE;AAC7DF,UAAAA,OAAO,EAAE;AACX,SAAC,CAAC;AACJ,MAAA,CAAC,EACD;AAAEA,QAAAA,OAAO,EAAE;AAAM,OACnB,CAAC;AAEDhC,MAAAA,MAAM,CAACzC,gBAAgB,CAAC,UAAU,EAAE2E,oBAAoB,EAAE;AACxDF,QAAAA,OAAO,EAAE;AACX,OAAC,CAAC;AACFhC,MAAAA,MAAM,CAACzC,gBAAgB,CAAC,aAAa,EAAE2E,oBAAoB,EAAE;AAC3DF,QAAAA,OAAO,EAAE;AACX,OAAC,CAAC;AACJ,IAAA;;AAEA;IACAhC,MAAM,CAACmC,MAAM,GAAG5B,KAAK;IACrBP,MAAM,CAACoC,QAAQ,GAAG5C,OAAO;AAEzB,IAAA,OAAOA,OAAO;AAChB,EAAA;;AAEA;EACA,eAAe9D,aAAaA,GAAG;AAC7B,IAAA,IAAI,CAACP,eAAe,IAAI,CAAC9C,MAAM,EAAE;IAEjC,IAAI;MACFwC,UAAU,GAAGM,eAAe,CAAC4B,GAAG;MAChCjC,cAAc,GAAGK,eAAe,CAAC6B,OAAO;MACxCjC,mBAAmB,GAAGI,eAAe,CAACnI,YAAY;AAClDgI,MAAAA,gBAAgB,GAAGG,eAAe,CAAC8B,UAAU,IAAI,KAAK;AACtDhC,MAAAA,cAAc,GAAG,KAAK;AACtBC,MAAAA,WAAW,GAAG,IAAI;AAElB,MAAA,MAAM7C,MAAM,CAAC6E,IAAI,CAACrC,UAAU,CAAC;AAC7BxI,MAAAA,YAAY,CAAC+K,IAAI,GAAG,IAAI,CAAC;;AAEzB,MAAA,IAAItC,cAAc,EAAE;AAClBzI,QAAAA,YAAY,CAACI,KAAK,CAACoB,OAAO,GAAG,MAAM;AACnCxB,QAAAA,YAAY,CAACgL,KAAK,GAAG,IAAI,CAAC;;AAE1B;QACA,IAAI,CAACjF,cAAc,EAAE;UACnBA,cAAc,GAAGqF,kBAAkB,EAAE;AACvC,QAAA;AAEA,QAAA,IAAIrF,cAAc,EAAE;AAClB;UACAA,cAAc,CAACd,IAAI,EAAE;;AAErB;UACAc,cAAc,CAACZ,mBAAmB,CAAC,IAAI,EAAEuD,mBAAmB,EAAE,EAAE,CAAC;;AAEjE;UACA,MAAMsH,0BAA0B,GAAGA,MAAM;AACvC,YAAA,MAAM7O,MAAM,GAAG4E,cAAc,CAACb,SAAS,EAAE;AACzC,YAAA,IAAI/D,MAAM,EAAE;AACVA,cAAAA,MAAM,CAACf,KAAK,CAACoB,OAAO,GAAG,OAAO;AAChC,YAAA;YACAuE,cAAc,CAACf,KAAK,EAAE;UACxB,CAAC;;AAED;UACA,MAAMiL,mBAAmB,GAAGA,MAAM;AAChCjQ,YAAAA,YAAY,CAACuL,mBAAmB,CAAC,MAAM,EAAE0E,mBAAmB,CAAC;AAC7D;AACAlI,YAAAA,UAAU,CAACiI,0BAA0B,EAAE,GAAG,CAAC;UAC7C,CAAC;AAEDhQ,UAAAA,YAAY,CAACkL,gBAAgB,CAAC,MAAM,EAAE+E,mBAAmB,EAAE;AACzD9E,YAAAA,IAAI,EAAE;AACR,WAAC,CAAC;AACJ,QAAA;AACF,MAAA,CAAC,MAAM;AACLnL,QAAAA,YAAY,CAACI,KAAK,CAACoB,OAAO,GAAG,OAAO;QACpCxB,YAAY,CAACgL,KAAK,GAAG,IAAI;;AAEzB;AACA,QAAA,IAAIjF,cAAc,EAAE;UAClBA,cAAc,CAACd,IAAI,EAAE;AACrB,UAAA,MAAM9D,MAAM,GAAG4E,cAAc,CAACb,SAAS,EAAE;AACzC,UAAA,IAAI/D,MAAM,EAAE;AACVA,YAAAA,MAAM,CAACf,KAAK,CAACoB,OAAO,GAAG,MAAM;AAC/B,UAAA;AACF,QAAA;AACF,MAAA;AAEA,MAAA,MAAMxB,YAAY,CAACyL,IAAI,EAAE;IAC3B,CAAC,CAAC,OAAOvM,KAAK,EAAE;AACdI,MAAAA,OAAO,CAACJ,KAAK,CAAC,4BAA4B,EAAEA,KAAK,CAAC;AACpD,IAAA;AACF,EAAA;;AAEA;AACA,EAAA,eAAeuL,mBAAmBA,CAACL,SAAS,EAAExD,cAAc,GAAG,IAAI,EAAE;IACnE,OAAO,MAAM7G,OAAO,CAACmQ,YAAY,CAACzF,mBAAmB,CACnDL,SAAS,EACTxD,cACF,CAAC;AACH,EAAA;EAEA,eAAeuJ,uBAAuBA,GAAG;AACvC,IAAA,OAAO,MAAMpQ,OAAO,CAACmQ,YAAY,CAACE,eAAe,EAAE;AACrD,EAAA;;AAEA;AACA;EACA,SAASC,kBAAkBA,GAAG;AAC5B,IAAA,MAAMC,KAAK,GAAGlP,QAAQ,CAACC,aAAa,CAAC,OAAO,CAAC;IAC7CiP,KAAK,CAACC,QAAQ,GAAG,KAAK;IACtBD,KAAK,CAACE,QAAQ,GAAG,KAAK;IACtBF,KAAK,CAACtF,KAAK,GAAG,KAAK;IACnBsF,KAAK,CAACG,WAAW,GAAG,IAAI;IACxBH,KAAK,CAACI,uBAAuB,GAAG,IAAI;IACpCJ,KAAK,CAACK,WAAW,GAAG,WAAW;;AAE/B;AACAL,IAAAA,KAAK,CAACM,YAAY,CAAC,yBAAyB,EAAE,EAAE,CAAC;AACjDN,IAAAA,KAAK,CAACM,YAAY,CAChB,cAAc,EACd,0CACF,CAAC;AAED,IAAA,MAAMC,UAAU,GAAG;AACjB3Q,MAAAA,KAAK,EAAE,MAAM;AACbC,MAAAA,MAAM,EAAE,MAAM;AACdoB,MAAAA,QAAQ,EAAE,MAAM;AAChBuP,MAAAA,SAAS,EAAE,MAAM;AACjBzQ,MAAAA,SAAS,EAAE,SAAS;AACpBmB,MAAAA,OAAO,EAAE;KACV;IAEDC,MAAM,CAACC,MAAM,CAAC4O,KAAK,CAAClQ,KAAK,EAAEyQ,UAAU,CAAC;AACtC,IAAA,OAAOP,KAAK;AACd,EAAA;;AAEA;EACA,SAASlF,kBAAkBA,GAAG;IAC5B,IAAI,CAAC3C,cAAc,IAAI,CAACzI,YAAY,IAAI,CAACgB,gBAAgB,EAAE;AACzD,MAAA,OAAO,IAAI;AACb,IAAA;IAEA,IAAI;MACF,MAAM+P,QAAQ,GAAGjR,oBAAoB,CAAC;AACpCE,QAAAA,YAAY,EAAEA,YAAY;AAC1BC,QAAAA,SAAS,EAAEe,gBAAgB;AAC3Bd,QAAAA,KAAK,EAAE,MAAM;AACbC,QAAAA,MAAM,EAAE,MAAM;QACdC,KAAK,EAAE,EAAE;AACTC,QAAAA,SAAS,EAAE,SAAS;AACpBK,QAAAA,qBAAqB,EAAE,IAAI;AAC3BC,QAAAA,YAAY,EAAE+H,mBAAmB;AACjC9H,QAAAA,SAAS,EAAE,EAAE;QACbN,OAAO,EAAGpB,KAAK,IAAK;AAClBI,UAAAA,OAAO,CAACJ,KAAK,CAAC,wBAAwB,EAAEA,KAAK,CAAC;AAChD,QAAA;AACF,OAAC,CAAC;AAEF,MAAA,OAAO6R,QAAQ;IACjB,CAAC,CAAC,OAAO7R,KAAK,EAAE;AACdI,MAAAA,OAAO,CAACJ,KAAK,CAAC,iCAAiC,EAAEA,KAAK,CAAC;AACvD,MAAA,OAAO,IAAI;AACb,IAAA;AACF,EAAA;EAEA,SAAS+D,eAAeA,GAAG;AACzB,IAAA,IAAI8C,cAAc,EAAE;MAClBA,cAAc,CAACf,KAAK,EAAE;AACxB,IAAA;AACF,EAAA;EAEA,SAASJ,cAAcA,GAAG;AACxB,IAAA,IAAImB,cAAc,EAAE;MAClBA,cAAc,CAACd,IAAI,EAAE;AACvB,IAAA;AACF,EAAA;;AAEA;EACA,SAAS+L,WAAWA,GAAG;IACrB,IAAI,CAAChQ,gBAAgB,EAAE;AACvB,IAAA,MAAMiQ,UAAU,GAAGjQ,gBAAgB,CAACiI,aAAa,CAAC,gBAAgB,CAAC;AACnE,IAAA,IAAIgI,UAAU,EAAE;MACdA,UAAU,CAACC,MAAM,EAAE;AACrB,IAAA;AACF,EAAA;;AAEA;EACA,SAASjF,SAASA,CAACkF,YAAY,EAAE;IAC/B,IAAI,CAACnQ,gBAAgB,EAAE;IAEvBA,gBAAgB,CAACyL,SAAS,GAAG,EAAE;AAE/B,IAAA,MAAM2E,QAAQ,GAAGhQ,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;IAC9C+P,QAAQ,CAAC3Q,SAAS,GAAG,oBAAoB;AAEzC,IAAA,MAAM4Q,YAAY,GAAGjQ,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;AAClDI,IAAAA,MAAM,CAACC,MAAM,CAAC2P,YAAY,CAACjR,KAAK,EAAE;AAChCwM,MAAAA,OAAO,EAAE,MAAM;AACfL,MAAAA,eAAe,EAAE,SAAS;AAC1BC,MAAAA,KAAK,EAAE,SAAS;AAChBsB,MAAAA,MAAM,EAAE,mBAAmB;AAC3BC,MAAAA,YAAY,EAAE,KAAK;AACnBM,MAAAA,SAAS,EAAE,QAAQ;AACnBD,MAAAA,QAAQ,EAAE,MAAM;AAChBjO,MAAAA,MAAM,EAAE,MAAM;AACdoO,MAAAA,UAAU,EAAE;AACd,KAAC,CAAC;AAEF,IAAA,MAAM+C,UAAU,GAAGlQ,QAAQ,CAACC,aAAa,CAAC,IAAI,CAAC;IAC/CiQ,UAAU,CAAC5E,WAAW,GAAG,oBAAoB;AAC7C4E,IAAAA,UAAU,CAAClR,KAAK,CAACmR,MAAM,GAAG,YAAY;AAEtC,IAAA,MAAMC,SAAS,GAAGpQ,QAAQ,CAACC,aAAa,CAAC,GAAG,CAAC;IAC7CmQ,SAAS,CAAC9E,WAAW,GAAGyE,YAAY;AACpCK,IAAAA,SAAS,CAACpR,KAAK,CAACmR,MAAM,GAAG,YAAY;AAErCF,IAAAA,YAAY,CAACtM,WAAW,CAACuM,UAAU,CAAC;AACpCD,IAAAA,YAAY,CAACtM,WAAW,CAACyM,SAAS,CAAC;AACnCJ,IAAAA,QAAQ,CAACrM,WAAW,CAACsM,YAAY,CAAC;AAClCrQ,IAAAA,gBAAgB,CAAC+D,WAAW,CAACqM,QAAQ,CAAC;AACxC,EAAA;;AAEA;EACA,eAAeK,UAAUA,GAAG;IAC1B,IAAI;AACF,MAAA,IAAI,CAAC9S,MAAM,CAAC+S,KAAK,EAAE;AACjB,QAAA,MAAM,IAAItO,KAAK,CAAC,yBAAyB,CAAC;AAC5C,MAAA;MAEA,IAAI,CAACpD,YAAY,EAAE;AACjB,QAAA,MAAM,IAAIoD,KAAK,CAAC,2BAA2B,CAAC;AAC9C,MAAA;AAEAzE,MAAAA,MAAM,CAAC+S,KAAK,CAACC,QAAQ,CAACC,UAAU,EAAE;MAElC,IAAI,CAACjT,MAAM,CAAC+S,KAAK,CAACG,MAAM,CAACC,kBAAkB,EAAE,EAAE;AAC7C,QAAA,MAAM,IAAI1O,KAAK,CAAC,uBAAuB,CAAC;AAC1C,MAAA;MAEA4C,MAAM,GAAG,IAAIrH,MAAM,CAAC+S,KAAK,CAACG,MAAM,EAAE;AAClC7L,MAAAA,MAAM,CAAC+L,MAAM,CAAC/R,YAAY,CAAC;AAE3B,MAAA,MAAMgS,aAAa,GAAG;AACpBC,QAAAA,SAAS,EAAE;AACTC,UAAAA,YAAY,EAAE,EAAE;AAAE;AAClBC,UAAAA,aAAa,EAAE,CAAC;AAAE;AAClBC,UAAAA,eAAe,EAAE,CAAC;AAAE;AACpBC,UAAAA,wBAAwB,EAAE,IAAI;AAAE;AAChCC,UAAAA,eAAe,EAAE;AACfC,YAAAA,OAAO,EAAE,KAAK;AAAE;AAChBC,YAAAA,WAAW,EAAE,CAAC;AAAE;YAChBC,aAAa,EAAE,GAAG;AACpB;SACD;AACDC,QAAAA,GAAG,EAAE;UACHC,OAAO,EAAE,KAAK;SACf;AACDC,QAAAA,QAAQ,EAAE;AACRN,UAAAA,eAAe,EAAE;AACfC,YAAAA,OAAO,EAAE,KAAK;AAAE;AAChBC,YAAAA,WAAW,EAAE,CAAC;AAAE;YAChBC,aAAa,EAAE,GAAG;AACpB;AACF;OACD;AAEDzM,MAAAA,MAAM,CAAC6M,SAAS,CAACb,aAAa,CAAC;AAE/BhM,MAAAA,MAAM,CAACkF,gBAAgB,CAAC,OAAO,EAAG7D,KAAK,IAAK;AAC1C,QAAA,MAAMyL,WAAW,GAAGzL,KAAK,CAAC0L,MAAM;AAChCzT,QAAAA,OAAO,CAACJ,KAAK,CAAC,qBAAqB,EAAE4T,WAAW,CAAC;QACjD,MAAM3B,YAAY,GAAG,CAAA,cAAA,EACnB2B,WAAW,CAACpT,OAAO,IAAIoT,WAAW,CAACE,IAAI,CAAA,CACvC;AACF9T,QAAAA,KAAK,GAAGiS,YAAY;QACpBlF,SAAS,CAACkF,YAAY,CAAC;AACzB,MAAA,CAAC,CAAC;MAEF,MAAM8B,UAAU,GAAGA,MAAM;AACvBhQ,QAAAA,eAAe,EAAE;MACnB,CAAC;MAED,MAAMiQ,WAAW,GAAGA,MAAM;AACxBtO,QAAAA,cAAc,EAAE;MAClB,CAAC;AAED5E,MAAAA,YAAY,CAACkL,gBAAgB,CAAC,MAAM,EAAE+H,UAAU,CAAC;AACjDjT,MAAAA,YAAY,CAACkL,gBAAgB,CAAC,OAAO,EAAEgI,WAAW,CAAC;AACnDlT,MAAAA,YAAY,CAACkL,gBAAgB,CAAC,OAAO,EAAEgI,WAAW,CAAC;AAEnDjN,MAAAA,SAAS,GAAG,KAAK;AACjB/G,MAAAA,KAAK,GAAG,IAAI;IACd,CAAC,CAAC,OAAOiU,GAAG,EAAE;AACZ7T,MAAAA,OAAO,CAACJ,KAAK,CAAC,oCAAoC,EAAEiU,GAAG,CAAC;MACxDjU,KAAK,GAAGiU,GAAG,CAACzT,OAAO;AACnBuG,MAAAA,SAAS,GAAG,KAAK;AACjB+K,MAAAA,WAAW,EAAE;AACb/E,MAAAA,SAAS,CAACkH,GAAG,CAACzT,OAAO,CAAC;AACxB,IAAA;AACF,EAAA;;AAEA;EACA,SAAS0T,eAAeA,GAAG;AACzB,IAAA,OAAO,IAAIvV,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtC,IAAIY,MAAM,CAAC+S,KAAK,EAAE;AAChB5T,QAAAA,OAAO,EAAE;AACT,QAAA;AACF,MAAA;AAEA,MAAA,MAAMuV,MAAM,GAAGjS,QAAQ,CAACC,aAAa,CAAC,QAAQ,CAAC;MAC/CgS,MAAM,CAAC3I,GAAG,GACR,oFAAoF;MACtF2I,MAAM,CAACnV,MAAM,GAAGJ,OAAO;MACvBuV,MAAM,CAAC/U,OAAO,GAAG,MAAMP,MAAM,CAAC,IAAIqF,KAAK,CAAC,6BAA6B,CAAC,CAAC;AACvEhC,MAAAA,QAAQ,CAACiM,IAAI,CAACtI,WAAW,CAACsO,MAAM,CAAC;AACnC,IAAA,CAAC,CAAC;AACJ,EAAA;;AAEA;EACA,eAAeC,gBAAgBA,GAAG;IAChC,IAAI;AACF;AACA,MAAA,MAAMC,YAAY,GAAG,MAAMpD,uBAAuB,EAAE;;AAEpD;MACApH,kBAAkB,GAAGwK,YAAY,CAACC,OAAO;MACzC1K,eAAe,GAAGyK,YAAY,CAACE,IAAI;;AAEnC;MACAjL,UAAU,GAAGO,kBAAkB,CAAC2B,GAAG;MACnCjC,cAAc,GAAGM,kBAAkB,CAAC4B,OAAO;MAC3CjC,mBAAmB,GAAGK,kBAAkB,CAACpI,YAAY;AACrDgI,MAAAA,gBAAgB,GAAGI,kBAAkB,CAAC6B,UAAU,IAAI,KAAK;AACzDhC,MAAAA,cAAc,GAAG,IAAI;AACrBC,MAAAA,WAAW,GAAG,KAAK;MAEnB,IAAI7C,MAAM,IAAIwC,UAAU,EAAE;AACxB,QAAA,MAAMxC,MAAM,CAAC6E,IAAI,CAACrC,UAAU,CAAC;;AAE7B;QACAxI,YAAY,CAAC+K,IAAI,GAAG,KAAK;AAEzB,QAAA,IAAItC,cAAc,EAAE;AAClBzI,UAAAA,YAAY,CAACI,KAAK,CAACoB,OAAO,GAAG,MAAM;UACnCxB,YAAY,CAACgL,KAAK,GAAG,KAAK;;AAE1B;UACA,IAAI,CAACjF,cAAc,EAAE;YACnBA,cAAc,GAAGqF,kBAAkB,EAAE;AACvC,UAAA;AAEA,UAAA,IAAIrF,cAAc,EAAE;AAClB;YACAA,cAAc,CAACd,IAAI,EAAE;;AAErB;YACAc,cAAc,CAACZ,mBAAmB,CAAC,IAAI,EAAEuD,mBAAmB,EAAE,EAAE,CAAC;;AAEjE;YACA,MAAMgL,6BAA6B,GAAGA,MAAM;AAC1C,cAAA,MAAMvS,MAAM,GAAG4E,cAAc,CAACb,SAAS,EAAE;AACzC,cAAA,IAAI/D,MAAM,EAAE;AACVA,gBAAAA,MAAM,CAACf,KAAK,CAACoB,OAAO,GAAG,OAAO;AAChC,cAAA;cACAuE,cAAc,CAACf,KAAK,EAAE;YACxB,CAAC;;AAED;YACA,MAAM2O,sBAAsB,GAAGA,MAAM;AACnC3T,cAAAA,YAAY,CAACuL,mBAAmB,CAAC,MAAM,EAAEoI,sBAAsB,CAAC;AAChE;AACA5L,cAAAA,UAAU,CAAC2L,6BAA6B,EAAE,GAAG,CAAC;YAChD,CAAC;AAED1T,YAAAA,YAAY,CAACkL,gBAAgB,CAAC,MAAM,EAAEyI,sBAAsB,EAAE;AAC5DxI,cAAAA,IAAI,EAAE;AACR,aAAC,CAAC;AACJ,UAAA;AACF,QAAA,CAAC,MAAM;AACLnL,UAAAA,YAAY,CAACI,KAAK,CAACoB,OAAO,GAAG,OAAO;UACpCxB,YAAY,CAACgL,KAAK,GAAG,KAAK;;AAE1B;AACA,UAAA,IAAIjF,cAAc,EAAE;YAClBA,cAAc,CAACd,IAAI,EAAE;AACrB,YAAA,MAAM9D,MAAM,GAAG4E,cAAc,CAACb,SAAS,EAAE;AACzC,YAAA,IAAI/D,MAAM,EAAE;AACVA,cAAAA,MAAM,CAACf,KAAK,CAACoB,OAAO,GAAG,MAAM;AAC/B,YAAA;AACF,UAAA;AACF,QAAA;;AAEA;AACA,QAAA,MAAMoS,qBAAqB,GAAG,YAAY;AACxC5T,UAAAA,YAAY,CAACuL,mBAAmB,CAAC,OAAO,EAAEqI,qBAAqB,CAAC;UAChE,MAAMvK,aAAa,EAAE;QACvB,CAAC;AACDrJ,QAAAA,YAAY,CAACkL,gBAAgB,CAAC,OAAO,EAAE0I,qBAAqB,EAAE;AAC5DzI,UAAAA,IAAI,EAAE;AACR,SAAC,CAAC;;AAEF;QACA,IAAI;AACF,UAAA,MAAMnL,YAAY,CAACyL,IAAI,EAAE;QAC3B,CAAC,CAAC,OAAOG,OAAO,EAAE;AAChBtM,UAAAA,OAAO,CAACC,IAAI,CAAC,oCAAoC,EAAEqM,OAAO,CAAC;AAC3D;UACA,MAAMvC,aAAa,EAAE;AACvB,QAAA;AACF,MAAA;IACF,CAAC,CAAC,OAAOnK,KAAK,EAAE;AACdI,MAAAA,OAAO,CAACJ,KAAK,CAAC,+BAA+B,EAAEA,KAAK,CAAC;AACrD;AACA,MAAA,IAAI4J,eAAe,EAAE;QACnB,MAAMO,aAAa,EAAE;AACvB,MAAA,CAAC,MAAM;AACL4C,QAAAA,SAAS,CAAC/M,KAAK,CAACQ,OAAO,IAAI,8BAA8B,CAAC;AAC5D,MAAA;AACF,IAAA;AACF,EAAA;;AAEA;EACA,eAAeoF,UAAUA,GAAG;IAC1B,IAAI;MACF9D,gBAAgB,GAAGgI,mBAAmB,EAAE;MACxC,IAAI,CAAChI,gBAAgB,EAAE;AACrB,QAAA,MAAM,IAAIoC,KAAK,CAAC,6BAA6B,CAAC;AAChD,MAAA;AAEA,MAAA,MAAMyQ,iBAAiB,GAAG7S,gBAAgB,CAACP,SAAS,IAAI,EAAE;MAC1DO,gBAAgB,CAACP,SAAS,GACxB,CAAA,EAAGoT,iBAAiB,CAAA,uBAAA,CAAyB,CAAC7L,IAAI,EAAE;AAEtD,MAAA,MAAM8L,eAAe,GAAG;AACtBvG,QAAAA,QAAQ,EAAEvM,gBAAgB,CAACZ,KAAK,CAACmN,QAAQ,IAAI;OAC9C;MACD9L,MAAM,CAACC,MAAM,CAACV,gBAAgB,CAACZ,KAAK,EAAE0T,eAAe,CAAC;MAEtD9T,YAAY,GAAGqQ,kBAAkB,EAAE;AACnCrQ,MAAAA,YAAY,CAACI,KAAK,CAACoB,OAAO,GAAG,MAAM;AACnCR,MAAAA,gBAAgB,CAAC+D,WAAW,CAAC/E,YAAY,CAAC;;AAE1C;AACA,MAAA,IAAI8F,aAAa,EAAE;QACjBQ,UAAU,GAAG4G,gBAAgB,EAAE;AAC/BlM,QAAAA,gBAAgB,CAAC+D,WAAW,CAACuB,UAAU,CAAC;AAC1C,MAAA;;AAEA;AACAO,MAAAA,2BAA2B,EAAE;MAE7B,MAAMuM,eAAe,EAAE;MACvB,MAAM3B,UAAU,EAAE;;AAElB;MACA,MAAM6B,gBAAgB,EAAE;AAExBtC,MAAAA,WAAW,EAAE;AACb/K,MAAAA,SAAS,GAAG,KAAK;IACnB,CAAC,CAAC,OAAOkN,GAAG,EAAE;AACZ7T,MAAAA,OAAO,CAACJ,KAAK,CAAC,8BAA8B,EAAEiU,GAAG,CAAC;MAClDjU,KAAK,GAAGiU,GAAG,CAACzT,OAAO;AACnBuG,MAAAA,SAAS,GAAG,KAAK;AACjB+K,MAAAA,WAAW,EAAE;AACb/E,MAAAA,SAAS,CAACkH,GAAG,CAACzT,OAAO,CAAC;AACxB,IAAA;AACF,EAAA;;AAEA;AACA,EAAA,MAAMqU,SAAS,GAAG;AAChB;IACAtI,IAAI,EAAE,YAAY;AAChB,MAAA,IAAIzL,YAAY,EAAE;AAChB,QAAA,MAAMA,YAAY,CAACyL,IAAI,EAAE;AAC3B,MAAA;IACF,CAAC;IAEDuI,KAAK,EAAEA,MAAM;AACX,MAAA,IAAIhU,YAAY,EAAE;QAChBA,YAAY,CAACgU,KAAK,EAAE;AACtB,MAAA;IACF,CAAC;IAEDC,KAAK,EAAEA,MAAM;AACX,MAAA,IAAI7N,WAAW,EAAE;AACf8F,QAAAA,kBAAkB,EAAE;AACtB,MAAA;;AAEA;AACA,MAAA,IAAIvF,4BAA4B,EAAE;AAChCkB,QAAAA,qBAAqB,EAAE;AACzB,MAAA;AAEA,MAAA,IAAI7H,YAAY,EAAE;QAChBA,YAAY,CAACgU,KAAK,EAAE;QACpBhU,YAAY,CAACkU,WAAW,GAAG,CAAC;AAC5BlU,QAAAA,YAAY,CAACI,KAAK,CAACoB,OAAO,GAAG,MAAM;QACnCxB,YAAY,CAAC0K,GAAG,GAAG,EAAE;AACvB,MAAA;AAEA,MAAA,IAAI1E,MAAM,EAAE;QACV,IAAI;UACFA,MAAM,CAACmO,MAAM,EAAE;QACjB,CAAC,CAAC,OAAOjV,KAAK,EAAE;AACdI,UAAAA,OAAO,CAACC,IAAI,CAAC,yBAAyB,EAAEL,KAAK,CAAC;AAChD,QAAA;AACF,MAAA;AAEA,MAAA,IAAI6G,cAAc,EAAE;QAClBA,cAAc,CAACN,OAAO,EAAE;AACxBM,QAAAA,cAAc,GAAG,IAAI;AACvB,MAAA;AAEA,MAAA,IAAIO,UAAU,EAAE;AACdF,QAAAA,WAAW,GAAG,KAAK;AACnB;QACA,IAAI;UACF,IAAIpF,gBAAgB,IAAIA,gBAAgB,CAACoT,QAAQ,CAAC9N,UAAU,CAAC,EAAE;AAC7DtF,YAAAA,gBAAgB,CAAC0E,WAAW,CAACY,UAAU,CAAC;AAC1C,UAAA;QACF,CAAC,CAAC,OAAOpH,KAAK,EAAE;AACdI,UAAAA,OAAO,CAACC,IAAI,CAAC,6BAA6B,EAAEL,KAAK,CAAC;AACpD,QAAA;AACAoH,QAAAA,UAAU,GAAG,IAAI;AACnB,MAAA;;AAEA;AACA,MAAA,IAAIG,gBAAgB,EAAE;AACpB4D,QAAAA,GAAG,CAACC,eAAe,CAAC7D,gBAAgB,CAAC;AACrCA,QAAAA,gBAAgB,GAAG,IAAI;AACzB,MAAA;AACAD,MAAAA,iBAAiB,GAAG,IAAI;;AAExB;AACAI,MAAAA,cAAc,GAAG,EAAE;AAEnB4B,MAAAA,UAAU,GAAG,IAAI;AACjBC,MAAAA,cAAc,GAAG,KAAK;AACtBC,MAAAA,mBAAmB,GAAG,KAAK;AAC3BnC,MAAAA,iBAAiB,GAAG,KAAK;AACzBoC,MAAAA,gBAAgB,GAAG,KAAK;AACxBC,MAAAA,cAAc,GAAG,KAAK;AACtBC,MAAAA,WAAW,GAAG,KAAK;;AAEnB;AACAC,MAAAA,eAAe,GAAG,IAAI;AACtBC,MAAAA,kBAAkB,GAAG,IAAI;IAC3B,CAAC;IAEDsL,cAAc,EAAEA,MAAM;MACpB,IAAI,CAACjO,WAAW,EAAE;AAChBgD,QAAAA,mBAAmB,EAAE;AACvB,MAAA;IACF,CAAC;IAEDkL,aAAa,EAAEA,MAAM;AACnB,MAAA,IAAIlO,WAAW,EAAE;AACf8F,QAAAA,kBAAkB,EAAE;AACtB,MAAA;IACF,CAAC;AAED;IACAqI,SAAS,EAAGC,MAAM,IAAK;AACrB,MAAA,IAAIxU,YAAY,EAAE;AAChBA,QAAAA,YAAY,CAACwU,MAAM,GAAGpX,IAAI,CAACC,GAAG,CAAC,CAAC,EAAED,IAAI,CAACE,GAAG,CAAC,CAAC,EAAEkX,MAAM,CAAC,CAAC;AACxD,MAAA;IACF,CAAC;IAEDC,SAAS,EAAEA,MAAM;AACf,MAAA,OAAOzU,YAAY,GAAGA,YAAY,CAACwU,MAAM,GAAG,CAAC;IAC/C,CAAC;AAED;IACAE,gBAAgB,EAAEA,MAAM;AACtB,MAAA,OAAOlO,iBAAiB;IAC1B,CAAC;IAEDmO,iBAAiB,EAAEA,MAAM;AACvB,MAAA,IAAIlO,gBAAgB,EAAE;AACpB,QAAA,MAAMiD,KAAK,GAAG,IAAIkL,KAAK,CAACnO,gBAAgB,CAAC;AACzC,QAAA,OAAOiD,KAAK,CAAC+B,IAAI,EAAE;AACrB,MAAA,CAAC,MAAM;AACLnM,QAAAA,OAAO,CAACC,IAAI,CAAC,6BAA6B,CAAC;QAC3C,OAAO1B,OAAO,CAACE,MAAM,CAAC,IAAIqF,KAAK,CAAC,6BAA6B,CAAC,CAAC;AACjE,MAAA;IACF,CAAC;AAED;IACA6C,SAAS,EAAEA,MAAMA,SAAS;IAE1BG,WAAW,EAAEA,MAAMA,WAAW;IAE9ByO,YAAY,EAAEA,MAAMtO,iBAAiB;AAErC;IACAuO,UAAU,EAAEA,MAAM7M,cAAc;IAEhC8M,UAAU,EAAGC,OAAO,IAAK;AACvB,MAAA,IAAI,CAAC,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,CAAC,CAACC,QAAQ,CAACD,OAAO,CAAC,EAAE;AAC3D1V,QAAAA,OAAO,CAACC,IAAI,CACV,6DACF,CAAC;AACD,QAAA,OAAO,KAAK;AACd,MAAA;;AAEA;AACA,MAAA,IAAI6G,WAAW,EAAE;AACf8F,QAAAA,kBAAkB,EAAE;AACtB,MAAA;;AAEA;AACA,MAAA,IAAI9D,aAAa,EAAE;QACjBoH,YAAY,CAACpH,aAAa,CAAC;AAC3BA,QAAAA,aAAa,GAAG,IAAI;AACtB,MAAA;AAEA,MAAA,IAAIG,iBAAiB,EAAE;QACrBiH,YAAY,CAACjH,iBAAiB,CAAC;AAC/BA,QAAAA,iBAAiB,GAAG,IAAI;AAC1B,MAAA;AAEAN,MAAAA,cAAc,GAAG+M,OAAO;;AAExB;MACA,IAAI1O,UAAU,IAAItF,gBAAgB,EAAE;QAClC,MAAMkU,SAAS,GAAG5O,UAAU;QAC5BA,UAAU,GAAG4G,gBAAgB,EAAE;AAC/BlM,QAAAA,gBAAgB,CAACmU,YAAY,CAAC7O,UAAU,EAAE4O,SAAS,CAAC;AACtD,MAAA;AAEA,MAAA,OAAO,IAAI;IACb,CAAC;AAED;IACAE,mBAAmB,EAAEA,OAAO;AAC1BtP,MAAAA,aAAa,EAAEA,aAAa;AAC5BF,MAAAA,WAAW,EAAEA,WAAW;AACxBC,MAAAA,OAAO,EAAEoC,cAAc;MACvBoN,mBAAmB,EAAE,CAAC,CAAC/O;AACzB,KAAC,CAAC;AAEF;IACAK,4BAA4B,EAAEA,MAAMA,4BAA4B;AAEhEmB,IAAAA,iBAAiB,EAAEA,MAAMA,iBAAiB,EAAE;IAE5CF,sBAAsB,EAAEA,MAAM;AAC5B,MAAA,IAAIjB,4BAA4B,EAAE;QAChC,OAAOiB,sBAAsB,EAAE;AACjC,MAAA;AACA,MAAA,OAAO,KAAK;IACd,CAAC;IAEDC,qBAAqB,EAAEA,MAAM;AAC3B,MAAA,IAAIlB,4BAA4B,EAAE;AAChCkB,QAAAA,qBAAqB,EAAE;AACzB,MAAA;AACF,IAAA;GACD;;AAED;AACA/C,EAAAA,UAAU,EAAE;AAEZ,EAAA,OAAOiP,SAAS;AAClB;;AAEA;AACA;AACA;AAFA,IAAAuB,YAAA,oBAAAC,OAAA,EAAA;AAAA,IAAAC,UAAA,oBAAAD,OAAA,EAAA;AAAA,IAAAE,QAAA,oBAAAF,OAAA,EAAA;AAAA,IAAAG,kBAAA,oBAAAC,OAAA,EAAA;AAGA,MAAMC,WAAW,CAAC;AAKhBC,EAAAA,WAAWA,CAACC,WAAW,EAAEC,SAAS,EAAE;AAcpC;AACF;AACA;AAFEC,IAAAA,2BAAA,OAAAN,kBAAA,CAAA;AAlBAO,IAAAA,0BAAA,OAAAX,YAAY,EAAA,MAAA,CAAA;AACZW,IAAAA,0BAAA,OAAAT,UAAU,EAAA,MAAA,CAAA;AACVS,IAAAA,0BAAA,OAAAR,QAAQ,EAAA,MAAA,CAAA;IAGN,IAAI,CAACK,WAAW,EAAE;AAChB,MAAA,MAAM,IAAI1S,KAAK,CAAC,0BAA0B,CAAC;AAC7C,IAAA;IACA,IAAI,CAAC2S,SAAS,EAAE;AACd,MAAA,MAAM,IAAI3S,KAAK,CAAC,wBAAwB,CAAC;AAC3C,IAAA;AAEA8S,IAAAA,sBAAA,CAAKZ,YAAY,EAAjB,IAAI,EAAgBQ,WAAJ,CAAC;AACjBI,IAAAA,sBAAA,CAAKV,UAAU,EAAf,IAAI,EAAcO,SAAJ,CAAC;AACfG,IAAAA,sBAAA,CAAKT,QAAQ,EAAb,IAAI,EACF,qEADU,CAAC;AAEf,EAAA;AAsIA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACEU,EAAAA,IAAIA,CAAClW,SAAS,EAAEF,OAAO,GAAG,EAAE,EAAE;AAC5B;AACA,IAAA,IAAIiB,gBAAgB;AACpB,IAAA,IAAI,OAAOf,SAAS,KAAK,QAAQ,EAAE;AACjCe,MAAAA,gBAAgB,GAAGI,QAAQ,CAAC6H,aAAa,CAAChJ,SAAS,CAAC;AACtD,IAAA,CAAC,MAAM,IAAIA,SAAS,YAAYiJ,OAAO,EAAE;AACvClI,MAAAA,gBAAgB,GAAGf,SAAS;AAC9B,IAAA,CAAC,MAAM,IAAIA,SAAS,IAAIA,SAAS,CAACkJ,OAAO,EAAE;AACzC;MACAnI,gBAAgB,GAAGf,SAAS,CAACkJ,OAAO;AACtC,IAAA;IAEA,IAAI,CAACnI,gBAAgB,EAAE;AACrB,MAAA,MAAM,IAAIoC,KAAK,CAAC,6BAA6B,CAAC;AAChD,IAAA;;AAEA;AACA,IAAA,IACEpC,gBAAgB,CAACiI,aAAa,CAAC,uBAAuB,CAAC,IACvDjI,gBAAgB,CAACiI,aAAa,CAAC,yBAAyB,CAAC,EACzD;AACA,MAAA,MAAM,IAAI7F,KAAK,CACb,2FACF,CAAC;AACH,IAAA;;AAEA;AACA,IAAA,MAAMgT,eAAe,GAAG;AACtB,MAAA,GAAGrW,OAAO;AACVmQ,MAAAA,YAAY,EAAE;AACZE,QAAAA,eAAe,EAAEA,MAAMiG,iBAAA,CAAAX,kBAAA,EAAA,IAAI,EAACY,gBAAe,CAAC,CAAAC,IAAA,CAArB,IAAI,CAAmB;QAC9C9L,mBAAmB,EAAEA,CAACL,SAAS,EAAExD,cAAc,KAC7CyP,iBAAA,CAAAX,kBAAA,EAAA,IAAI,EAACc,oBAAmB,CAAC,CAAAD,IAAA,CAAzB,IAAI,EAAsBnM,SAAS,EAAExD,cAAc;AACvD;KACD;;AAED;AACA,IAAA,MAAMZ,MAAM,GAAGL,oBAAoB,CAAC3E,gBAAgB,EAAEoV,eAAe,CAAC;AAEtE,IAAA,OAAOpQ,MAAM;AACf,EAAA;AACF;AAAC,eAAAyQ,aAnLoBC,QAAQ,EAAE3W,OAAO,GAAG,EAAE,EAAE;EACzC,MAAM4W,GAAG,GAAG,CAAA,EAAGC,sBAAA,CAAKnB,QAAQ,EAAb,IAAY,CAAC,CAAA,EAAGiB,QAAQ,CAAA,CAAE;EAEzC,IAAI;IACF,MAAMG,QAAQ,GAAG,MAAMC,KAAK,CAACH,GAAG,EAAE5W,OAAO,CAAC;AAE1C,IAAA,IAAI,CAAC8W,QAAQ,CAACE,EAAE,EAAE;MAChB,IAAI5F,YAAY,GAAG,CAAA,iBAAA,EAAoB0F,QAAQ,CAACG,MAAM,CAAA,CAAA,EAAIH,QAAQ,CAACI,UAAU,CAAA,CAAE;;AAE/E;MACA,IAAI;AACF,QAAA,MAAMC,SAAS,GAAG,MAAML,QAAQ,CAACM,IAAI,EAAE;QACvC,IAAID,SAAS,CAACxX,OAAO,EAAE;UACrByR,YAAY,GAAG+F,SAAS,CAACxX,OAAO;AAClC,QAAA,CAAC,MAAM,IAAIwX,SAAS,CAAChY,KAAK,EAAE;UAC1BiS,YAAY,GAAG+F,SAAS,CAAChY,KAAK;AAChC,QAAA;MACF,CAAC,CAAC,OAAOkY,UAAU,EAAE;AACnB;AAAA,MAAA;AAGF,MAAA,MAAMC,QAAQ,GAAG,IAAIjU,KAAK,CAAC+N,YAAY,CAAC;AACxCkG,MAAAA,QAAQ,CAACL,MAAM,GAAGH,QAAQ,CAACG,MAAM;AACjCK,MAAAA,QAAQ,CAACJ,UAAU,GAAGJ,QAAQ,CAACI,UAAU;AACzC,MAAA,MAAMI,QAAQ;AAChB,IAAA;AAEA,IAAA,OAAO,MAAMR,QAAQ,CAACM,IAAI,EAAE;EAC9B,CAAC,CAAC,OAAOjY,KAAK,EAAE;IACdI,OAAO,CAACJ,KAAK,CAAC,CAAA,YAAA,EAAewX,QAAQ,CAAA,QAAA,CAAU,EAAExX,KAAK,CAAC;AACvD,IAAA,MAAMA,KAAK;AACb,EAAA;AACF;AAEA;AACF;AACA;AAFE,eAAAoX,mBAGyB;EAAA,IAAAgB,YAAA,EAAAC,aAAA,EAAAC,aAAA,EAAAC,aAAA,EAAAC,aAAA,EAAAC,aAAA;AACvB;;EAEA,MAAMC,GAAG,GAAG,MAAMvB,iBAAA,CAAAX,kBAAA,EAAA,IAAI,EAACe,YAAW,CAAC,CAAAF,IAAA,CAAjB,IAAI,EACpB,CAAA,kBAAA,EAAqBK,sBAAA,CAAKpB,UAAU,EAAf,IAAc,CAAC,CAAA,CAAE,EACtC;AACEqC,IAAAA,MAAM,EAAE,KAAK;AACbC,IAAAA,OAAO,EAAE;AACP,MAAA,WAAW,EAAE,CAAA,OAAA,EAAUlB,sBAAA,CAAKtB,YAAY,EAAjB,IAAgB,CAAC,CAAA;AAC1C;AACF,GAAC,CACF;EAED,OAAO;AACL9B,IAAAA,OAAO,EAAE;MACP9I,GAAG,EAAEkN,GAAG,KAAA,IAAA,IAAHA,GAAG,gBAAAN,YAAA,GAAHM,GAAG,CAAEnQ,OAAO,MAAA,IAAA,IAAA6P,YAAA,KAAA,MAAA,IAAA,CAAAA,YAAA,GAAZA,YAAA,CAAcS,aAAa,cAAAT,YAAA,KAAA,MAAA,GAAA,MAAA,GAA3BA,YAAA,CAA6BU,GAAG;AACrCrN,MAAAA,OAAO,EAAEiN,GAAG,KAAA,IAAA,IAAHA,GAAG,gBAAAL,aAAA,GAAHK,GAAG,CAAEnQ,OAAO,MAAA,IAAA,IAAA8P,aAAA,KAAA,MAAA,GAAA,MAAA,GAAZA,aAAA,CAAcU,QAAQ;AAC/BtX,MAAAA,YAAY,EAAEiX,GAAG,KAAA,IAAA,IAAHA,GAAG,gBAAAJ,aAAA,GAAHI,GAAG,CAAEnQ,OAAO,MAAA,IAAA,IAAA+P,aAAA,KAAA,MAAA,GAAA,MAAA,GAAZA,aAAA,CAAcU,aAAa;AACzCtN,MAAAA,UAAU,EAAE;KACb;AACD6I,IAAAA,IAAI,EAAE;MACJ/I,GAAG,EAAEkN,GAAG,KAAA,IAAA,IAAHA,GAAG,gBAAAH,aAAA,GAAHG,GAAG,CAAEnQ,OAAO,MAAA,IAAA,IAAAgQ,aAAA,KAAA,MAAA,IAAA,CAAAA,aAAA,GAAZA,aAAA,CAAcU,UAAU,cAAAV,aAAA,KAAA,MAAA,GAAA,MAAA,GAAxBA,aAAA,CAA0BO,GAAG;AAClCrN,MAAAA,OAAO,EAAEiN,GAAG,KAAA,IAAA,IAAHA,GAAG,gBAAAF,aAAA,GAAHE,GAAG,CAAEnQ,OAAO,MAAA,IAAA,IAAAiQ,aAAA,KAAA,MAAA,GAAA,MAAA,GAAZA,aAAA,CAAcO,QAAQ;AAC/BtX,MAAAA,YAAY,EAAEiX,GAAG,KAAA,IAAA,IAAHA,GAAG,gBAAAD,aAAA,GAAHC,GAAG,CAAEnQ,OAAO,MAAA,IAAA,IAAAkQ,aAAA,KAAA,MAAA,GAAA,MAAA,GAAZA,aAAA,CAAcO,aAAa;AACzCtN,MAAAA,UAAU,EAAE;AACd;GACD;AACH;AAEA;AACF;AACA;AAFE,eAAA4L,qBAG2BpM,SAAS,EAAExD,cAAc,GAAG,IAAI,EAAE;EAC3D,IAAI;IAAA,IAAAwR,aAAA,EAAAC,aAAA,EAAAC,cAAA,EAAAC,cAAA,EAAAC,cAAA,EAAAC,cAAA;AACF,IAAA,IAAIC,WAAW;;AAEf;AACA,IAAA,MAAM1Z,OAAO,GAAG,MAAMR,gBAAgB,CAAC4L,SAAS,CAAC;AACjD,IAAA,MAAMuO,WAAW,GAAG,MAAMhb,YAAY,CAACqB,OAAO,CAAC;IAE/C,IAAI4H,cAAc,IAAIA,cAAc,EAAE;AACpC8R,MAAAA,WAAW,GAAG;AAAEE,QAAAA,UAAU,EAAEhS,cAAc;AAAEiS,QAAAA,OAAO,EAAE;OAAO;AAC9D,IAAA,CAAC,MAAM;AACLH,MAAAA,WAAW,GAAG;AAAEI,QAAAA,YAAY,EAAEH,WAAW;AAAEE,QAAAA,OAAO,EAAE;OAAM;AAC5D,IAAA;IAEA,MAAMjB,GAAG,GAAG,MAAMvB,iBAAA,CAAAX,kBAAA,EAAA,IAAI,EAACe,YAAW,CAAC,CAAAF,IAAA,CAAjB,IAAI,EACpB,CAAA,iBAAA,EAAoBK,sBAAA,CAAKpB,UAAU,EAAf,IAAc,CAAC,CAAA,CAAE,EACrC;AACEqC,MAAAA,MAAM,EAAE,MAAM;AACdC,MAAAA,OAAO,EAAE;AACP,QAAA,cAAc,EAAE,kBAAkB;AAClC,QAAA,WAAW,EAAE,CAAA,OAAA,EAAUlB,sBAAA,CAAKtB,YAAY,EAAjB,IAAgB,CAAC,CAAA;OACzC;AACDyD,MAAAA,IAAI,EAAEC,IAAI,CAACC,SAAS,CAACP,WAAW;AAClC,KAAC,CACF;;AAED;AACA,IAAA,IACE,CAAAd,GAAG,KAAA,IAAA,IAAHA,GAAG,KAAA,KAAA,CAAA,IAAA,CAAAQ,aAAA,GAAHR,GAAG,CAAEnQ,OAAO,cAAA2Q,aAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAZA,aAAA,CAAcc,eAAe,MAAKC,SAAS,IAC3C,CAAAvB,GAAG,KAAA,IAAA,IAAHA,GAAG,KAAA,KAAA,CAAA,IAAA,CAAAS,aAAA,GAAHT,GAAG,CAAEnQ,OAAO,MAAA,IAAA,IAAA4Q,aAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAZA,aAAA,CAAca,eAAe,MAAK,KAAK,EACvC;AAAA,MAAA,IAAAE,aAAA,EAAAC,aAAA,EAAAC,aAAA;MACA,OAAO;QACL5O,GAAG,EAAEkN,GAAG,KAAA,IAAA,IAAHA,GAAG,gBAAAwB,aAAA,GAAHxB,GAAG,CAAEnQ,OAAO,MAAA,IAAA,IAAA2R,aAAA,KAAA,KAAA,CAAA,IAAA,CAAAA,aAAA,GAAZA,aAAA,CAAcG,qBAAqB,cAAAH,aAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAnCA,aAAA,CAAqCpB,GAAG;AAC7CrN,QAAAA,OAAO,EAAEiN,GAAG,KAAA,IAAA,IAAHA,GAAG,gBAAAyB,aAAA,GAAHzB,GAAG,CAAEnQ,OAAO,MAAA,IAAA,IAAA4R,aAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAZA,aAAA,CAAcpB,QAAQ;AAC/BtX,QAAAA,YAAY,EAAEiX,GAAG,KAAA,IAAA,IAAHA,GAAG,gBAAA0B,aAAA,GAAH1B,GAAG,CAAEnQ,OAAO,MAAA,IAAA,IAAA6R,aAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAZA,aAAA,CAAcpB,aAAa;AACzCtN,QAAAA,UAAU,EAAE;OACb;AACH,IAAA;IAEA,IAAIgN,GAAG,aAAHA,GAAG,KAAA,KAAA,CAAA,IAAA,CAAAU,cAAA,GAAHV,GAAG,CAAEnQ,OAAO,MAAA,IAAA,IAAA6Q,cAAA,gBAAAA,cAAA,GAAZA,cAAA,CAAckB,MAAM,MAAA,IAAA,IAAAlB,cAAA,KAAA,KAAA,CAAA,IAApBA,cAAA,CAAsBN,GAAG,EAAE;AAAA,MAAA,IAAAyB,cAAA,EAAAC,cAAA,EAAAC,cAAA;MAC7B,OAAO;QACLjP,GAAG,EAAEkN,GAAG,KAAA,IAAA,IAAHA,GAAG,gBAAA6B,cAAA,GAAH7B,GAAG,CAAEnQ,OAAO,MAAA,IAAA,IAAAgS,cAAA,KAAA,KAAA,CAAA,IAAA,CAAAA,cAAA,GAAZA,cAAA,CAAcD,MAAM,cAAAC,cAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAApBA,cAAA,CAAsBzB,GAAG;AAC9BrN,QAAAA,OAAO,EAAEiN,GAAG,KAAA,IAAA,IAAHA,GAAG,gBAAA8B,cAAA,GAAH9B,GAAG,CAAEnQ,OAAO,MAAA,IAAA,IAAAiS,cAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAZA,cAAA,CAAczB,QAAQ;AAC/BtX,QAAAA,YAAY,EAAEiX,GAAG,KAAA,IAAA,IAAHA,GAAG,gBAAA+B,cAAA,GAAH/B,GAAG,CAAEnQ,OAAO,MAAA,IAAA,IAAAkS,cAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAZA,cAAA,CAAczB,aAAa;AACzCtN,QAAAA,UAAU,EAAE;OACb;AACH,IAAA;IAEA,OAAO;MACLF,GAAG,EAAEkN,GAAG,KAAA,IAAA,IAAHA,GAAG,gBAAAW,cAAA,GAAHX,GAAG,CAAEnQ,OAAO,MAAA,IAAA,IAAA8Q,cAAA,KAAA,KAAA,CAAA,IAAA,CAAAA,cAAA,GAAZA,cAAA,CAAciB,MAAM,cAAAjB,cAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAApBA,cAAA,CAAsBP,GAAG;AAC9BrN,MAAAA,OAAO,EAAEiN,GAAG,KAAA,IAAA,IAAHA,GAAG,gBAAAY,cAAA,GAAHZ,GAAG,CAAEnQ,OAAO,MAAA,IAAA,IAAA+Q,cAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAZA,cAAA,CAAcP,QAAQ;AAC/BtX,MAAAA,YAAY,EAAEiX,GAAG,KAAA,IAAA,IAAHA,GAAG,gBAAAa,cAAA,GAAHb,GAAG,CAAEnQ,OAAO,MAAA,IAAA,IAAAgR,cAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAZA,cAAA,CAAcP,aAAa;AACzCtN,MAAAA,UAAU,EAAE;KACb;EACH,CAAC,CAAC,OAAO1L,KAAK,EAAE;AACdI,IAAAA,OAAO,CAACJ,KAAK,CAAC,kCAAkC,EAAEA,KAAK,CAAC;AACxD,IAAA,MAAMA,KAAK;AACb,EAAA;AACF;AAsDF,SAAS0a,kBAAkBA,CAAC3Z,SAAS,EAAEF,OAAO,GAAG,EAAE,EAAE;AACnD,EAAA,IAAI,CAACA,OAAO,CAAC+V,WAAW,EAAE;AACxB,IAAA,MAAM,IAAI1S,KAAK,CAAC,iDAAiD,CAAC;AACpE,EAAA;AAEA,EAAA,IAAI,CAACrD,OAAO,CAACgW,SAAS,EAAE;AACtB,IAAA,MAAM,IAAI3S,KAAK,CAAC,6CAA6C,CAAC;AAChE,EAAA;AAEA,EAAA,MAAMyW,GAAG,GAAG,IAAIjE,WAAW,CAAC7V,OAAO,CAAC+V,WAAW,EAAE/V,OAAO,CAACgW,SAAS,CAAC;AACnE,EAAA,OAAO8D,GAAG,CAAC1D,IAAI,CAAClW,SAAS,EAAEF,OAAO,CAAC;AACrC;;AAQA;AACA,IAAI,OAAOpB,MAAM,KAAK,WAAW,EAAE;EACjCA,MAAM,CAACiX,WAAW,GAAGA,WAAW;AAChC;EACAjX,MAAM,CAACib,kBAAkB,GAAGA,kBAAkB;AAChD;;;;;"}