{"version":3,"sources":["../src/stt.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { VAD as BaseVAD, VADEventType, type VADStream } from '@livekit/agents';\nimport { VAD } from '@livekit/agents-plugin-silero';\nimport { stt } from '@livekit/agents-plugins-test';\nimport { AudioFrame } from '@livekit/rtc-node';\nimport type OpenAI from 'openai';\nimport { describe, expect, it, vi } from 'vitest';\nimport { WebSocketServer } from 'ws';\nimport type { SpeechStream } from './stt.js';\nimport {\n  STT,\n  _normalizeRealtimeTurnDetection,\n  buildRealtimeSttUrl,\n  buildRealtimeTranscriptionConfig,\n} from './stt.js';\n\nconst hasOpenAIApiKey = Boolean(process.env.OPENAI_API_KEY);\n\nclass FakeVAD extends BaseVAD {\n  label = 'fake-vad';\n\n  stream(): VADStream {\n    return {} as VADStream;\n  }\n}\n\nclass EndOnFrameVAD extends BaseVAD {\n  label = 'end-on-frame-vad';\n\n  stream(): VADStream {\n    let resolveNext: ((result: IteratorResult<{ type: VADEventType }>) => void) | undefined;\n    const stream = {\n      [Symbol.asyncIterator]() {\n        return stream;\n      },\n      next() {\n        return new Promise<IteratorResult<{ type: VADEventType }>>((resolve) => {\n          resolveNext = resolve;\n        });\n      },\n      pushFrame() {\n        resolveNext?.({ done: false, value: { type: VADEventType.END_OF_SPEECH } });\n        resolveNext = undefined;\n      },\n      endInput() {},\n      close() {},\n    };\n    return stream as unknown as VADStream;\n  }\n}\n\nasync function waitFor(ready: () => boolean): Promise<void> {\n  for (let attempt = 0; attempt < 200; attempt++) {\n    if (ready()) return;\n    await new Promise((resolve) => setTimeout(resolve, 5));\n  }\n  throw new Error('timed out waiting for condition');\n}\n\nfunction transcriptionOf(message: Record<string, unknown>): Record<string, unknown> | undefined {\n  const session = message.session as Record<string, unknown> | undefined;\n  const audio = session?.audio as Record<string, unknown> | undefined;\n  const input = audio?.input as Record<string, unknown> | undefined;\n  return input?.transcription as Record<string, unknown> | undefined;\n}\n\ndescribe('OpenAI STT options', () => {\n  it('defaults to realtime whisper streaming', () => {\n    const openai = new STT({ apiKey: 'test-key', vad: new FakeVAD({ updateInterval: 1 }) });\n\n    expect(openai.model).toBe('gpt-realtime-whisper');\n    expect(openai.capabilities.streaming).toBe(true);\n    expect(openai.capabilities.interimResults).toBe(true);\n    expect(openai.capabilities.alignedTranscript).toBe(false);\n  });\n\n  it('supports explicitly opting into batch STT', () => {\n    const openai = new STT({ apiKey: 'test-key', useRealtime: false });\n\n    expect(openai.model).toBe('whisper-1');\n    expect(openai.capabilities.streaming).toBe(false);\n    expect(() => openai.stream()).toThrow(/useRealtime/i);\n  });\n\n  it('keeps Groq and OVHcloud helper instances in batch mode', () => {\n    const groq = STT.withGroq({ apiKey: 'test-key' });\n    const ovhcloud = STT.withOVHcloud({ apiKey: 'test-key' });\n\n    expect(groq.capabilities.streaming).toBe(false);\n    expect(() => groq.stream()).toThrow(/useRealtime/i);\n    expect(ovhcloud.capabilities.streaming).toBe(false);\n    expect(() => ovhcloud.stream()).toThrow(/useRealtime/i);\n  });\n\n  it('preserves the current model when updateOptions enables realtime without a model', () => {\n    const vad = new FakeVAD({ updateInterval: 1 });\n    const openai = new STT({\n      apiKey: 'test-key',\n      model: 'gpt-4o-realtime-preview',\n      useRealtime: false,\n      vad,\n    });\n\n    openai.updateOptions({ useRealtime: true, vad });\n\n    expect(openai.model).toBe('gpt-4o-realtime-preview');\n  });\n\n  it('removes closed speech streams before propagating option updates', () => {\n    const vad = new FakeVAD({ updateInterval: 1 });\n    const openai = new STT({ apiKey: 'test-key', vad });\n    const stream = openai.stream() as SpeechStream;\n    const updateOptions = vi.spyOn(stream, '_updateOptions');\n\n    stream.close();\n    openai.updateOptions({ vad });\n\n    expect(updateOptions).not.toHaveBeenCalled();\n  });\n\n  it('sends keywords and plural languages to context-hint models', () => {\n    expect(\n      buildRealtimeTranscriptionConfig({\n        model: 'gpt-live-transcribe',\n        prompt: 'A customer support call.',\n        keywords: ['premium plan', 'AC-42'],\n        languages: ['en', 'fr'],\n      }),\n    ).toEqual({\n      model: 'gpt-live-transcribe',\n      prompt: 'A customer support call.',\n      keywords: ['premium plan', 'AC-42'],\n      languages: ['en', 'fr'],\n    });\n  });\n\n  it('omits a prompt that was not set', () => {\n    expect(\n      buildRealtimeTranscriptionConfig({ model: 'gpt-transcribe', languages: ['en'] }),\n    ).not.toHaveProperty('prompt');\n  });\n\n  it('normalizes context-hint languages to unique ISO-639 base codes', () => {\n    const config = buildRealtimeTranscriptionConfig({\n      model: 'gpt-transcribe',\n      languages: ['en-US', 'yue', 'zh-CN', 'zh-TW'],\n    });\n\n    expect(config.languages).toEqual(['en', 'yue', 'zh']);\n  });\n\n  it('keeps singular language on earlier models', () => {\n    const config = buildRealtimeTranscriptionConfig({\n      model: 'gpt-4o-mini-transcribe',\n      languages: ['en-US'],\n      keywords: [],\n    });\n\n    expect(config.language).toBe('en');\n    expect(config).not.toHaveProperty('languages');\n    expect(config).not.toHaveProperty('keywords');\n  });\n\n  it('omits language when detection is enabled', () => {\n    const config = buildRealtimeTranscriptionConfig({\n      model: 'gpt-4o-mini-transcribe',\n      languages: [],\n    });\n\n    expect(config).not.toHaveProperty('language');\n  });\n\n  it('rejects unsupported plural languages and keywords', () => {\n    expect(\n      () =>\n        new STT({\n          apiKey: 'test-key',\n          model: 'gpt-4o-transcribe',\n          language: ['en', 'fr'],\n          useRealtime: false,\n        }),\n    ).toThrow(/accepts a single language/);\n    expect(\n      () =>\n        new STT({\n          apiKey: 'test-key',\n          model: 'gpt-4o-transcribe',\n          keywords: ['AC-42'],\n          useRealtime: false,\n        }),\n    ).toThrow(/keywords are only supported/);\n  });\n\n  it('rejects a model switch before applying incompatible hints', () => {\n    const openai = new STT({\n      apiKey: 'test-key',\n      model: 'gpt-live-transcribe',\n      keywords: ['AC-42'],\n      language: ['en', 'fr'],\n      vad: null,\n    });\n\n    expect(() => openai.updateOptions({ model: 'gpt-4o-transcribe' })).toThrow(\n      /keywords are only supported/,\n    );\n    expect(openai.model).toBe('gpt-live-transcribe');\n    expect(openai.capabilities.keyterms).toBe(true);\n  });\n\n  it.each([\n    ['gpt-transcribe', true],\n    ['gpt-live-transcribe', true],\n    ['gpt-4o-transcribe', false],\n    ['whisper-1', false],\n  ])('sets keyterm capability for %s', (model, supported) => {\n    const openai = new STT({ apiKey: 'test-key', model, useRealtime: false });\n    expect(openai.capabilities.keyterms).toBe(supported);\n  });\n\n  it.each([\n    'gpt-live-transcribe',\n    'gpt-realtime-whisper',\n    'gpt-4o-transcribe',\n    'gpt-4o-mini-transcribe',\n    'whisper-1',\n  ])('preserves the target realtime default for %s', (model) => {\n    const openai = new STT({ apiKey: 'test-key', model, vad: null });\n    expect(openai.capabilities.streaming).toBe(true);\n  });\n\n  it('requires realtime transport when switching to a realtime-only model', () => {\n    const openai = new STT({\n      apiKey: 'test-key',\n      model: 'gpt-transcribe',\n      useRealtime: false,\n    });\n\n    expect(() => openai.updateOptions({ model: 'gpt-live-transcribe' })).toThrow(\n      /served only over the realtime API/,\n    );\n  });\n\n  it('loads the bundled VAD for realtime-only models', () => {\n    const openai = new STT({ apiKey: 'test-key', model: 'gpt-live-transcribe' });\n    expect(() => openai.stream().close()).not.toThrow();\n  });\n\n  it('accepts realtime transport and VAD supplied with a realtime-only model switch', () => {\n    const vad = new FakeVAD({ updateInterval: 1 });\n    const openai = new STT({\n      apiKey: 'test-key',\n      model: 'gpt-4o-mini-transcribe',\n      useRealtime: false,\n    });\n\n    expect(() =>\n      openai.updateOptions({ model: 'gpt-live-transcribe', useRealtime: true, vad }),\n    ).not.toThrow();\n    expect(openai.capabilities.streaming).toBe(true);\n  });\n\n  it('warns and drops temperature for realtime transcription', () => {\n    const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});\n\n    new STT({\n      apiKey: 'test-key',\n      model: 'gpt-4o-mini-transcribe',\n      temperature: 0.2,\n      vad: null,\n    });\n\n    expect(warn).toHaveBeenCalledWith(expect.stringContaining('temperature is not supported'));\n    warn.mockRestore();\n  });\n\n  it('fills in server_vad when turn detection omits its discriminator', () => {\n    expect(\n      _normalizeRealtimeTurnDetection('gpt-4o-mini-transcribe', {\n        silence_duration_ms: 800,\n      }),\n    ).toEqual({ type: 'server_vad', silence_duration_ms: 800 });\n  });\n\n  it('rejects turn detection for gpt-live-transcribe', () => {\n    expect(\n      _normalizeRealtimeTurnDetection('gpt-live-transcribe', { type: 'server_vad' }),\n    ).toBeNull();\n  });\n\n  it('rejects turn detection for versioned realtime-only model names', () => {\n    expect(\n      _normalizeRealtimeTurnDetection('gpt-live-transcribe-2026-01-01', {\n        type: 'server_vad',\n      }),\n    ).toBeNull();\n  });\n\n  it('merges session keyterms behind user keywords', () => {\n    const openai = new STT({\n      apiKey: 'test-key',\n      model: 'gpt-live-transcribe',\n      keywords: ['AC-42', 'billing'],\n      vad: null,\n    });\n    const stream = openai.stream() as SpeechStream;\n    const updateOptions = vi.spyOn(stream, '_updateOptions');\n\n    openai._updateSessionKeyterms(['billing', 'Acme Corp']);\n\n    expect(updateOptions).toHaveBeenCalledWith(\n      expect.objectContaining({ keywords: ['AC-42', 'billing', 'Acme Corp'] }),\n    );\n    stream.close();\n  });\n\n  it('falls back to the last specified language when detection is disabled', () => {\n    const openai = new STT({\n      apiKey: 'test-key',\n      model: 'gpt-live-transcribe',\n      language: 'en',\n      vad: null,\n    });\n    openai.updateOptions({ language: 'de' });\n    openai.updateOptions({ detectLanguage: true });\n    const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});\n\n    openai.updateOptions({ detectLanguage: false });\n    const stream = openai.stream() as SpeechStream;\n\n    expect(stream.languages).toEqual(['de']);\n    expect(warn).toHaveBeenCalledWith(expect.stringContaining('falling back to de'));\n    warn.mockRestore();\n    stream.close();\n  });\n});\n\ndescribe('OpenAI STT file transcription context', () => {\n  it('sends plural hints and reports the detected language', async () => {\n    const create = vi\n      .fn()\n      .mockResolvedValue({ text: 'bonjour, hello', languages: [{ code: 'fr' }] });\n    const client = { audio: { transcriptions: { create } } } as unknown as OpenAI;\n    const openai = new STT({\n      apiKey: 'test-key',\n      client,\n      model: 'gpt-transcribe',\n      language: ['en', 'fr'],\n      keywords: ['premium plan', 'AC-42'],\n      useRealtime: false,\n    });\n\n    const event = await openai.recognize([new AudioFrame(new Int16Array(2400), 24000, 1, 2400)]);\n\n    expect(create).toHaveBeenCalledWith(\n      expect.objectContaining({\n        model: 'gpt-transcribe',\n        languages: ['en', 'fr'],\n        keywords: ['premium plan', 'AC-42'],\n      }),\n      expect.any(Object),\n    );\n    expect(event.alternatives?.[0].language).toBe('fr');\n  });\n});\n\ndescribe('OpenAI realtime STT context', () => {\n  it('updates hints in place and reconnects for a model change', async () => {\n    const server = new WebSocketServer({ port: 0 });\n    await new Promise<void>((resolve) => server.once('listening', resolve));\n    const address = server.address();\n    if (typeof address === 'string' || address === null) throw new Error('missing server address');\n    const messages: Record<string, unknown>[] = [];\n    let connections = 0;\n    server.on('connection', (socket) => {\n      connections += 1;\n      socket.on('message', (data) => messages.push(JSON.parse(data.toString())));\n    });\n    const openai = new STT({\n      apiKey: 'test-key',\n      baseURL: `http://127.0.0.1:${address.port}/v1`,\n      model: 'gpt-live-transcribe',\n      vad: null,\n    });\n    const stream = openai.stream();\n\n    await waitFor(() => messages.length === 1);\n    openai.updateOptions({ keywords: ['Acme Corp'], prompt: 'a support call' });\n    await waitFor(() => messages.length === 2);\n    expect(messages[1]).toMatchObject({\n      session: {\n        audio: {\n          input: {\n            transcription: { keywords: ['Acme Corp'], prompt: 'a support call' },\n          },\n        },\n      },\n    });\n    expect(connections).toBe(1);\n\n    openai.updateOptions({ keywords: [], prompt: '' });\n    await waitFor(() => messages.length === 3);\n    expect(messages[2]).toMatchObject({\n      session: { audio: { input: { transcription: { keywords: [], prompt: '' } } } },\n    });\n\n    openai.updateOptions({ detectLanguage: true });\n    await waitFor(() => connections === 2 && messages.length === 4);\n    expect(\n      (\n        ((messages[3]!.session as Record<string, unknown>).audio as Record<string, unknown>)\n          .input as Record<string, unknown>\n      ).transcription,\n    ).not.toHaveProperty('languages');\n\n    openai.updateOptions({ model: 'gpt-4o-mini-transcribe', keywords: [], language: 'fr' });\n    const samples = 24000 / 20;\n    stream.pushFrame(new AudioFrame(new Int16Array(samples), 24000, 1, samples));\n    await waitFor(\n      () =>\n        connections === 3 &&\n        messages.some((message) => message.type === 'input_audio_buffer.append'),\n    );\n    const modelUpdate = messages.find(\n      (message) => transcriptionOf(message)?.model === 'gpt-4o-mini-transcribe',\n    );\n    expect(modelUpdate).toMatchObject({\n      session: {\n        audio: {\n          input: {\n            transcription: { model: 'gpt-4o-mini-transcribe', language: 'fr' },\n            turn_detection: { type: 'server_vad' },\n          },\n        },\n      },\n    });\n\n    stream.close();\n    await new Promise<void>((resolve) => server.close(() => resolve()));\n  });\n\n  it('commits from client VAD when server turn detection is disabled', async () => {\n    const server = new WebSocketServer({ port: 0 });\n    await new Promise<void>((resolve) => server.once('listening', resolve));\n    const address = server.address();\n    if (typeof address === 'string' || address === null) throw new Error('missing server address');\n    const messages: Record<string, unknown>[] = [];\n    server.on('connection', (socket) => {\n      socket.on('message', (data) => messages.push(JSON.parse(data.toString())));\n    });\n    const openai = new STT({\n      apiKey: 'test-key',\n      baseURL: `http://127.0.0.1:${address.port}/v1`,\n      model: 'gpt-4o-transcribe',\n      turnDetection: null,\n      vad: new EndOnFrameVAD({ updateInterval: 1 }),\n    });\n    const stream = openai.stream();\n    await waitFor(() => messages.length === 1);\n\n    const samples = 24000 / 20;\n    stream.pushFrame(new AudioFrame(new Int16Array(samples), 24000, 1, samples));\n    await waitFor(() => messages.some((message) => message.type === 'input_audio_buffer.commit'));\n\n    stream.close();\n    await new Promise<void>((resolve) => server.close(() => resolve()));\n  });\n\n  it('keeps each stream language independent', async () => {\n    const server = new WebSocketServer({ port: 0 });\n    await new Promise<void>((resolve) => server.once('listening', resolve));\n    const address = server.address();\n    if (typeof address === 'string' || address === null) throw new Error('missing server address');\n    const messages: Record<string, unknown>[] = [];\n    server.on('connection', (socket) => {\n      socket.on('message', (data) => messages.push(JSON.parse(data.toString())));\n    });\n    const openai = new STT({\n      apiKey: 'test-key',\n      baseURL: `http://127.0.0.1:${address.port}/v1`,\n      model: 'gpt-live-transcribe',\n      language: 'en',\n      vad: null,\n    });\n    const english = openai.stream() as SpeechStream;\n    const french = openai.stream({ language: 'fr' }) as SpeechStream;\n    await waitFor(() => messages.length === 2);\n\n    expect(english.languages).toEqual(['en']);\n    expect(french.languages).toEqual(['fr']);\n    french.updateOptions({ language: 'de' });\n    await waitFor(() => messages.length === 3);\n    expect(english.languages).toEqual(['en']);\n    expect(french.languages).toEqual(['de']);\n\n    english.close();\n    french.close();\n    await new Promise<void>((resolve) => server.close(() => resolve()));\n  });\n\n  it('reports the language detected by the realtime model', async () => {\n    const server = new WebSocketServer({ port: 0 });\n    await new Promise<void>((resolve) => server.once('listening', resolve));\n    const address = server.address();\n    if (typeof address === 'string' || address === null) throw new Error('missing server address');\n    server.on('connection', (socket) => {\n      socket.once('message', () => {\n        socket.send(\n          JSON.stringify({\n            type: 'conversation.item.input_audio_transcription.completed',\n            item_id: 'item_1',\n            transcript: 'bonjour, hello',\n            languages: [{ code: 'fr' }, { code: 'en' }],\n          }),\n        );\n      });\n    });\n    const openai = new STT({\n      apiKey: 'test-key',\n      baseURL: `http://127.0.0.1:${address.port}/v1`,\n      model: 'gpt-live-transcribe',\n      language: ['en', 'fr'],\n      vad: null,\n    });\n    const stream = openai.stream();\n\n    const event = await stream.next();\n\n    expect(event.value.alternatives?.[0]).toMatchObject({\n      text: 'bonjour, hello',\n      language: 'fr',\n    });\n    stream.close();\n    await new Promise<void>((resolve) => server.close(() => resolve()));\n  });\n});\n\ndescribe('buildRealtimeSttUrl', () => {\n  it('points at OpenAI realtime with intent but omits model on the native endpoint', () => {\n    // OpenAI's native /realtime endpoint rejects `?model=` with\n    // invalid_request_error.invalid_model when intent=transcription, so the\n    // model is conveyed via the subsequent session.update instead.\n    const url = new URL(buildRealtimeSttUrl(undefined, 'gpt-realtime-whisper'));\n\n    expect(url.protocol).toBe('wss:');\n    expect(url.host).toBe('api.openai.com');\n    expect(url.pathname).toBe('/v1/realtime');\n    expect(url.searchParams.get('intent')).toBe('transcription');\n    expect(url.searchParams.get('model')).toBe(null);\n  });\n\n  it('omits the model when an explicit baseURL still points at api.openai.com', () => {\n    const url = new URL(buildRealtimeSttUrl('https://api.openai.com/v1', 'gpt-4o-mini-transcribe'));\n\n    expect(url.host).toBe('api.openai.com');\n    expect(url.pathname).toBe('/v1/realtime');\n    expect(url.searchParams.get('intent')).toBe('transcription');\n    expect(url.searchParams.get('model')).toBe(null);\n  });\n\n  it('upgrades https baseURL to wss and appends /realtime when path is /v1', () => {\n    const url = new URL(\n      buildRealtimeSttUrl('https://gateway.example.com/v1', 'gpt-4o-mini-transcribe'),\n    );\n\n    expect(url.protocol).toBe('wss:');\n    expect(url.host).toBe('gateway.example.com');\n    expect(url.pathname).toBe('/v1/realtime');\n    expect(url.searchParams.get('model')).toBe('gpt-4o-mini-transcribe');\n  });\n\n  it('preserves an existing /realtime path without duplicating it', () => {\n    const url = new URL(\n      buildRealtimeSttUrl('wss://gateway.example.com/v1/realtime', 'gpt-realtime-whisper'),\n    );\n\n    expect(url.pathname).toBe('/v1/realtime');\n    expect(url.searchParams.get('model')).toBe('gpt-realtime-whisper');\n  });\n\n  it('appends /realtime to a non-/v1 path', () => {\n    const url = new URL(\n      buildRealtimeSttUrl('https://gateway.example.com/proxy/openai', 'gpt-realtime-whisper'),\n    );\n\n    expect(url.pathname).toBe('/proxy/openai/realtime');\n    expect(url.searchParams.get('intent')).toBe('transcription');\n    expect(url.searchParams.get('model')).toBe('gpt-realtime-whisper');\n  });\n\n  it('downgrades http baseURL to ws (not wss)', () => {\n    const url = new URL(\n      buildRealtimeSttUrl('http://gateway.example.com/v1', 'gpt-realtime-whisper'),\n    );\n\n    expect(url.protocol).toBe('ws:');\n    expect(url.host).toBe('gateway.example.com');\n    expect(url.pathname).toBe('/v1/realtime');\n    expect(url.searchParams.get('intent')).toBe('transcription');\n    expect(url.searchParams.get('model')).toBe('gpt-realtime-whisper');\n  });\n\n  it('downgrades http baseURL with a trailing slash to ws', () => {\n    const url = new URL(\n      buildRealtimeSttUrl('http://gateway.example.com/v1/', 'gpt-realtime-whisper'),\n    );\n\n    expect(url.protocol).toBe('ws:');\n    expect(url.pathname).toBe('/v1/realtime');\n  });\n});\n\nif (hasOpenAIApiKey) {\n  describe('OpenAI STT integration', async () => {\n    const vad = await VAD.load();\n    await stt(new STT({ useRealtime: false }), vad, { streaming: false });\n  });\n\n  describe('OpenAI STT realtime integration', async () => {\n    const vad = await VAD.load();\n    await stt(new STT({ vad }), vad, {\n      nonStreaming: false,\n    });\n  });\n} else {\n  describe('OpenAI', () => {\n    it.skip('requires OPENAI_API_KEY', () => {});\n  });\n}\n"],"mappings":";AAGA,oBAA6D;AAC7D,kCAAoB;AACpB,iCAAoB;AACpB,sBAA2B;AAE3B,oBAAyC;AACzC,gBAAgC;AAEhC,iBAKO;AAEP,MAAM,kBAAkB,QAAQ,QAAQ,IAAI,cAAc;AAE1D,MAAM,gBAAgB,cAAAA,IAAQ;AAAA,EAC5B,QAAQ;AAAA,EAER,SAAoB;AAClB,WAAO,CAAC;AAAA,EACV;AACF;AAEA,MAAM,sBAAsB,cAAAA,IAAQ;AAAA,EAClC,QAAQ;AAAA,EAER,SAAoB;AAClB,QAAI;AACJ,UAAM,SAAS;AAAA,MACb,CAAC,OAAO,aAAa,IAAI;AACvB,eAAO;AAAA,MACT;AAAA,MACA,OAAO;AACL,eAAO,IAAI,QAAgD,CAAC,YAAY;AACtE,wBAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,MACA,YAAY;AACV,mDAAc,EAAE,MAAM,OAAO,OAAO,EAAE,MAAM,2BAAa,cAAc,EAAE;AACzE,sBAAc;AAAA,MAChB;AAAA,MACA,WAAW;AAAA,MAAC;AAAA,MACZ,QAAQ;AAAA,MAAC;AAAA,IACX;AACA,WAAO;AAAA,EACT;AACF;AAEA,eAAe,QAAQ,OAAqC;AAC1D,WAAS,UAAU,GAAG,UAAU,KAAK,WAAW;AAC9C,QAAI,MAAM,EAAG;AACb,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,CAAC,CAAC;AAAA,EACvD;AACA,QAAM,IAAI,MAAM,iCAAiC;AACnD;AAEA,SAAS,gBAAgB,SAAuE;AAC9F,QAAM,UAAU,QAAQ;AACxB,QAAM,QAAQ,mCAAS;AACvB,QAAM,QAAQ,+BAAO;AACrB,SAAO,+BAAO;AAChB;AAAA,IAEA,wBAAS,sBAAsB,MAAM;AACnC,wBAAG,0CAA0C,MAAM;AACjD,UAAM,SAAS,IAAI,eAAI,EAAE,QAAQ,YAAY,KAAK,IAAI,QAAQ,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC;AAEtF,8BAAO,OAAO,KAAK,EAAE,KAAK,sBAAsB;AAChD,8BAAO,OAAO,aAAa,SAAS,EAAE,KAAK,IAAI;AAC/C,8BAAO,OAAO,aAAa,cAAc,EAAE,KAAK,IAAI;AACpD,8BAAO,OAAO,aAAa,iBAAiB,EAAE,KAAK,KAAK;AAAA,EAC1D,CAAC;AAED,wBAAG,6CAA6C,MAAM;AACpD,UAAM,SAAS,IAAI,eAAI,EAAE,QAAQ,YAAY,aAAa,MAAM,CAAC;AAEjE,8BAAO,OAAO,KAAK,EAAE,KAAK,WAAW;AACrC,8BAAO,OAAO,aAAa,SAAS,EAAE,KAAK,KAAK;AAChD,8BAAO,MAAM,OAAO,OAAO,CAAC,EAAE,QAAQ,cAAc;AAAA,EACtD,CAAC;AAED,wBAAG,0DAA0D,MAAM;AACjE,UAAM,OAAO,eAAI,SAAS,EAAE,QAAQ,WAAW,CAAC;AAChD,UAAM,WAAW,eAAI,aAAa,EAAE,QAAQ,WAAW,CAAC;AAExD,8BAAO,KAAK,aAAa,SAAS,EAAE,KAAK,KAAK;AAC9C,8BAAO,MAAM,KAAK,OAAO,CAAC,EAAE,QAAQ,cAAc;AAClD,8BAAO,SAAS,aAAa,SAAS,EAAE,KAAK,KAAK;AAClD,8BAAO,MAAM,SAAS,OAAO,CAAC,EAAE,QAAQ,cAAc;AAAA,EACxD,CAAC;AAED,wBAAG,mFAAmF,MAAM;AAC1F,UAAM,MAAM,IAAI,QAAQ,EAAE,gBAAgB,EAAE,CAAC;AAC7C,UAAM,SAAS,IAAI,eAAI;AAAA,MACrB,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,aAAa;AAAA,MACb;AAAA,IACF,CAAC;AAED,WAAO,cAAc,EAAE,aAAa,MAAM,IAAI,CAAC;AAE/C,8BAAO,OAAO,KAAK,EAAE,KAAK,yBAAyB;AAAA,EACrD,CAAC;AAED,wBAAG,mEAAmE,MAAM;AAC1E,UAAM,MAAM,IAAI,QAAQ,EAAE,gBAAgB,EAAE,CAAC;AAC7C,UAAM,SAAS,IAAI,eAAI,EAAE,QAAQ,YAAY,IAAI,CAAC;AAClD,UAAM,SAAS,OAAO,OAAO;AAC7B,UAAM,gBAAgB,iBAAG,MAAM,QAAQ,gBAAgB;AAEvD,WAAO,MAAM;AACb,WAAO,cAAc,EAAE,IAAI,CAAC;AAE5B,8BAAO,aAAa,EAAE,IAAI,iBAAiB;AAAA,EAC7C,CAAC;AAED,wBAAG,8DAA8D,MAAM;AACrE;AAAA,UACE,6CAAiC;AAAA,QAC/B,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,UAAU,CAAC,gBAAgB,OAAO;AAAA,QAClC,WAAW,CAAC,MAAM,IAAI;AAAA,MACxB,CAAC;AAAA,IACH,EAAE,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU,CAAC,gBAAgB,OAAO;AAAA,MAClC,WAAW,CAAC,MAAM,IAAI;AAAA,IACxB,CAAC;AAAA,EACH,CAAC;AAED,wBAAG,mCAAmC,MAAM;AAC1C;AAAA,UACE,6CAAiC,EAAE,OAAO,kBAAkB,WAAW,CAAC,IAAI,EAAE,CAAC;AAAA,IACjF,EAAE,IAAI,eAAe,QAAQ;AAAA,EAC/B,CAAC;AAED,wBAAG,kEAAkE,MAAM;AACzE,UAAM,aAAS,6CAAiC;AAAA,MAC9C,OAAO;AAAA,MACP,WAAW,CAAC,SAAS,OAAO,SAAS,OAAO;AAAA,IAC9C,CAAC;AAED,8BAAO,OAAO,SAAS,EAAE,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAC;AAAA,EACtD,CAAC;AAED,wBAAG,6CAA6C,MAAM;AACpD,UAAM,aAAS,6CAAiC;AAAA,MAC9C,OAAO;AAAA,MACP,WAAW,CAAC,OAAO;AAAA,MACnB,UAAU,CAAC;AAAA,IACb,CAAC;AAED,8BAAO,OAAO,QAAQ,EAAE,KAAK,IAAI;AACjC,8BAAO,MAAM,EAAE,IAAI,eAAe,WAAW;AAC7C,8BAAO,MAAM,EAAE,IAAI,eAAe,UAAU;AAAA,EAC9C,CAAC;AAED,wBAAG,4CAA4C,MAAM;AACnD,UAAM,aAAS,6CAAiC;AAAA,MAC9C,OAAO;AAAA,MACP,WAAW,CAAC;AAAA,IACd,CAAC;AAED,8BAAO,MAAM,EAAE,IAAI,eAAe,UAAU;AAAA,EAC9C,CAAC;AAED,wBAAG,qDAAqD,MAAM;AAC5D;AAAA,MACE,MACE,IAAI,eAAI;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,IAAI;AAAA,QACrB,aAAa;AAAA,MACf,CAAC;AAAA,IACL,EAAE,QAAQ,2BAA2B;AACrC;AAAA,MACE,MACE,IAAI,eAAI;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,UAAU,CAAC,OAAO;AAAA,QAClB,aAAa;AAAA,MACf,CAAC;AAAA,IACL,EAAE,QAAQ,6BAA6B;AAAA,EACzC,CAAC;AAED,wBAAG,6DAA6D,MAAM;AACpE,UAAM,SAAS,IAAI,eAAI;AAAA,MACrB,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU,CAAC,OAAO;AAAA,MAClB,UAAU,CAAC,MAAM,IAAI;AAAA,MACrB,KAAK;AAAA,IACP,CAAC;AAED,8BAAO,MAAM,OAAO,cAAc,EAAE,OAAO,oBAAoB,CAAC,CAAC,EAAE;AAAA,MACjE;AAAA,IACF;AACA,8BAAO,OAAO,KAAK,EAAE,KAAK,qBAAqB;AAC/C,8BAAO,OAAO,aAAa,QAAQ,EAAE,KAAK,IAAI;AAAA,EAChD,CAAC;AAED,mBAAG,KAAK;AAAA,IACN,CAAC,kBAAkB,IAAI;AAAA,IACvB,CAAC,uBAAuB,IAAI;AAAA,IAC5B,CAAC,qBAAqB,KAAK;AAAA,IAC3B,CAAC,aAAa,KAAK;AAAA,EACrB,CAAC,EAAE,kCAAkC,CAAC,OAAO,cAAc;AACzD,UAAM,SAAS,IAAI,eAAI,EAAE,QAAQ,YAAY,OAAO,aAAa,MAAM,CAAC;AACxE,8BAAO,OAAO,aAAa,QAAQ,EAAE,KAAK,SAAS;AAAA,EACrD,CAAC;AAED,mBAAG,KAAK;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,EAAE,gDAAgD,CAAC,UAAU;AAC5D,UAAM,SAAS,IAAI,eAAI,EAAE,QAAQ,YAAY,OAAO,KAAK,KAAK,CAAC;AAC/D,8BAAO,OAAO,aAAa,SAAS,EAAE,KAAK,IAAI;AAAA,EACjD,CAAC;AAED,wBAAG,uEAAuE,MAAM;AAC9E,UAAM,SAAS,IAAI,eAAI;AAAA,MACrB,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,aAAa;AAAA,IACf,CAAC;AAED,8BAAO,MAAM,OAAO,cAAc,EAAE,OAAO,sBAAsB,CAAC,CAAC,EAAE;AAAA,MACnE;AAAA,IACF;AAAA,EACF,CAAC;AAED,wBAAG,kDAAkD,MAAM;AACzD,UAAM,SAAS,IAAI,eAAI,EAAE,QAAQ,YAAY,OAAO,sBAAsB,CAAC;AAC3E,8BAAO,MAAM,OAAO,OAAO,EAAE,MAAM,CAAC,EAAE,IAAI,QAAQ;AAAA,EACpD,CAAC;AAED,wBAAG,iFAAiF,MAAM;AACxF,UAAM,MAAM,IAAI,QAAQ,EAAE,gBAAgB,EAAE,CAAC;AAC7C,UAAM,SAAS,IAAI,eAAI;AAAA,MACrB,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,aAAa;AAAA,IACf,CAAC;AAED;AAAA,MAAO,MACL,OAAO,cAAc,EAAE,OAAO,uBAAuB,aAAa,MAAM,IAAI,CAAC;AAAA,IAC/E,EAAE,IAAI,QAAQ;AACd,8BAAO,OAAO,aAAa,SAAS,EAAE,KAAK,IAAI;AAAA,EACjD,CAAC;AAED,wBAAG,0DAA0D,MAAM;AACjE,UAAM,OAAO,iBAAG,MAAM,SAAS,MAAM,EAAE,mBAAmB,MAAM;AAAA,IAAC,CAAC;AAElE,QAAI,eAAI;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,aAAa;AAAA,MACb,KAAK;AAAA,IACP,CAAC;AAED,8BAAO,IAAI,EAAE,qBAAqB,qBAAO,iBAAiB,8BAA8B,CAAC;AACzF,SAAK,YAAY;AAAA,EACnB,CAAC;AAED,wBAAG,mEAAmE,MAAM;AAC1E;AAAA,UACE,4CAAgC,0BAA0B;AAAA,QACxD,qBAAqB;AAAA,MACvB,CAAC;AAAA,IACH,EAAE,QAAQ,EAAE,MAAM,cAAc,qBAAqB,IAAI,CAAC;AAAA,EAC5D,CAAC;AAED,wBAAG,kDAAkD,MAAM;AACzD;AAAA,UACE,4CAAgC,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAAA,IAC/E,EAAE,SAAS;AAAA,EACb,CAAC;AAED,wBAAG,kEAAkE,MAAM;AACzE;AAAA,UACE,4CAAgC,kCAAkC;AAAA,QAChE,MAAM;AAAA,MACR,CAAC;AAAA,IACH,EAAE,SAAS;AAAA,EACb,CAAC;AAED,wBAAG,gDAAgD,MAAM;AACvD,UAAM,SAAS,IAAI,eAAI;AAAA,MACrB,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU,CAAC,SAAS,SAAS;AAAA,MAC7B,KAAK;AAAA,IACP,CAAC;AACD,UAAM,SAAS,OAAO,OAAO;AAC7B,UAAM,gBAAgB,iBAAG,MAAM,QAAQ,gBAAgB;AAEvD,WAAO,uBAAuB,CAAC,WAAW,WAAW,CAAC;AAEtD,8BAAO,aAAa,EAAE;AAAA,MACpB,qBAAO,iBAAiB,EAAE,UAAU,CAAC,SAAS,WAAW,WAAW,EAAE,CAAC;AAAA,IACzE;AACA,WAAO,MAAM;AAAA,EACf,CAAC;AAED,wBAAG,wEAAwE,MAAM;AAC/E,UAAM,SAAS,IAAI,eAAI;AAAA,MACrB,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU;AAAA,MACV,KAAK;AAAA,IACP,CAAC;AACD,WAAO,cAAc,EAAE,UAAU,KAAK,CAAC;AACvC,WAAO,cAAc,EAAE,gBAAgB,KAAK,CAAC;AAC7C,UAAM,OAAO,iBAAG,MAAM,SAAS,MAAM,EAAE,mBAAmB,MAAM;AAAA,IAAC,CAAC;AAElE,WAAO,cAAc,EAAE,gBAAgB,MAAM,CAAC;AAC9C,UAAM,SAAS,OAAO,OAAO;AAE7B,8BAAO,OAAO,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC;AACvC,8BAAO,IAAI,EAAE,qBAAqB,qBAAO,iBAAiB,oBAAoB,CAAC;AAC/E,SAAK,YAAY;AACjB,WAAO,MAAM;AAAA,EACf,CAAC;AACH,CAAC;AAAA,IAED,wBAAS,yCAAyC,MAAM;AACtD,wBAAG,wDAAwD,YAAY;AAnVzE;AAoVI,UAAM,SAAS,iBACZ,GAAG,EACH,kBAAkB,EAAE,MAAM,kBAAkB,WAAW,CAAC,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;AAC5E,UAAM,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE;AACvD,UAAM,SAAS,IAAI,eAAI;AAAA,MACrB,QAAQ;AAAA,MACR;AAAA,MACA,OAAO;AAAA,MACP,UAAU,CAAC,MAAM,IAAI;AAAA,MACrB,UAAU,CAAC,gBAAgB,OAAO;AAAA,MAClC,aAAa;AAAA,IACf,CAAC;AAED,UAAM,QAAQ,MAAM,OAAO,UAAU,CAAC,IAAI,2BAAW,IAAI,WAAW,IAAI,GAAG,MAAO,GAAG,IAAI,CAAC,CAAC;AAE3F,8BAAO,MAAM,EAAE;AAAA,MACb,qBAAO,iBAAiB;AAAA,QACtB,OAAO;AAAA,QACP,WAAW,CAAC,MAAM,IAAI;AAAA,QACtB,UAAU,CAAC,gBAAgB,OAAO;AAAA,MACpC,CAAC;AAAA,MACD,qBAAO,IAAI,MAAM;AAAA,IACnB;AACA,+BAAO,WAAM,iBAAN,mBAAqB,GAAG,QAAQ,EAAE,KAAK,IAAI;AAAA,EACpD,CAAC;AACH,CAAC;AAAA,IAED,wBAAS,+BAA+B,MAAM;AAC5C,wBAAG,4DAA4D,YAAY;AACzE,UAAM,SAAS,IAAI,0BAAgB,EAAE,MAAM,EAAE,CAAC;AAC9C,UAAM,IAAI,QAAc,CAAC,YAAY,OAAO,KAAK,aAAa,OAAO,CAAC;AACtE,UAAM,UAAU,OAAO,QAAQ;AAC/B,QAAI,OAAO,YAAY,YAAY,YAAY,KAAM,OAAM,IAAI,MAAM,wBAAwB;AAC7F,UAAM,WAAsC,CAAC;AAC7C,QAAI,cAAc;AAClB,WAAO,GAAG,cAAc,CAAC,WAAW;AAClC,qBAAe;AACf,aAAO,GAAG,WAAW,CAAC,SAAS,SAAS,KAAK,KAAK,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC;AAAA,IAC3E,CAAC;AACD,UAAM,SAAS,IAAI,eAAI;AAAA,MACrB,QAAQ;AAAA,MACR,SAAS,oBAAoB,QAAQ,IAAI;AAAA,MACzC,OAAO;AAAA,MACP,KAAK;AAAA,IACP,CAAC;AACD,UAAM,SAAS,OAAO,OAAO;AAE7B,UAAM,QAAQ,MAAM,SAAS,WAAW,CAAC;AACzC,WAAO,cAAc,EAAE,UAAU,CAAC,WAAW,GAAG,QAAQ,iBAAiB,CAAC;AAC1E,UAAM,QAAQ,MAAM,SAAS,WAAW,CAAC;AACzC,8BAAO,SAAS,CAAC,CAAC,EAAE,cAAc;AAAA,MAChC,SAAS;AAAA,QACP,OAAO;AAAA,UACL,OAAO;AAAA,YACL,eAAe,EAAE,UAAU,CAAC,WAAW,GAAG,QAAQ,iBAAiB;AAAA,UACrE;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AACD,8BAAO,WAAW,EAAE,KAAK,CAAC;AAE1B,WAAO,cAAc,EAAE,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC;AACjD,UAAM,QAAQ,MAAM,SAAS,WAAW,CAAC;AACzC,8BAAO,SAAS,CAAC,CAAC,EAAE,cAAc;AAAA,MAChC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,CAAC,GAAG,QAAQ,GAAG,EAAE,EAAE,EAAE;AAAA,IAC/E,CAAC;AAED,WAAO,cAAc,EAAE,gBAAgB,KAAK,CAAC;AAC7C,UAAM,QAAQ,MAAM,gBAAgB,KAAK,SAAS,WAAW,CAAC;AAC9D;AAAA,MAEM,SAAS,CAAC,EAAG,QAAoC,MAChD,MACH;AAAA,IACJ,EAAE,IAAI,eAAe,WAAW;AAEhC,WAAO,cAAc,EAAE,OAAO,0BAA0B,UAAU,CAAC,GAAG,UAAU,KAAK,CAAC;AACtF,UAAM,UAAU,OAAQ;AACxB,WAAO,UAAU,IAAI,2BAAW,IAAI,WAAW,OAAO,GAAG,MAAO,GAAG,OAAO,CAAC;AAC3E,UAAM;AAAA,MACJ,MACE,gBAAgB,KAChB,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,2BAA2B;AAAA,IAC3E;AACA,UAAM,cAAc,SAAS;AAAA,MAC3B,CAAC,YAAS;AAzahB;AAyamB,sCAAgB,OAAO,MAAvB,mBAA0B,WAAU;AAAA;AAAA,IACnD;AACA,8BAAO,WAAW,EAAE,cAAc;AAAA,MAChC,SAAS;AAAA,QACP,OAAO;AAAA,UACL,OAAO;AAAA,YACL,eAAe,EAAE,OAAO,0BAA0B,UAAU,KAAK;AAAA,YACjE,gBAAgB,EAAE,MAAM,aAAa;AAAA,UACvC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,MAAM;AACb,UAAM,IAAI,QAAc,CAAC,YAAY,OAAO,MAAM,MAAM,QAAQ,CAAC,CAAC;AAAA,EACpE,CAAC;AAED,wBAAG,kEAAkE,YAAY;AAC/E,UAAM,SAAS,IAAI,0BAAgB,EAAE,MAAM,EAAE,CAAC;AAC9C,UAAM,IAAI,QAAc,CAAC,YAAY,OAAO,KAAK,aAAa,OAAO,CAAC;AACtE,UAAM,UAAU,OAAO,QAAQ;AAC/B,QAAI,OAAO,YAAY,YAAY,YAAY,KAAM,OAAM,IAAI,MAAM,wBAAwB;AAC7F,UAAM,WAAsC,CAAC;AAC7C,WAAO,GAAG,cAAc,CAAC,WAAW;AAClC,aAAO,GAAG,WAAW,CAAC,SAAS,SAAS,KAAK,KAAK,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC;AAAA,IAC3E,CAAC;AACD,UAAM,SAAS,IAAI,eAAI;AAAA,MACrB,QAAQ;AAAA,MACR,SAAS,oBAAoB,QAAQ,IAAI;AAAA,MACzC,OAAO;AAAA,MACP,eAAe;AAAA,MACf,KAAK,IAAI,cAAc,EAAE,gBAAgB,EAAE,CAAC;AAAA,IAC9C,CAAC;AACD,UAAM,SAAS,OAAO,OAAO;AAC7B,UAAM,QAAQ,MAAM,SAAS,WAAW,CAAC;AAEzC,UAAM,UAAU,OAAQ;AACxB,WAAO,UAAU,IAAI,2BAAW,IAAI,WAAW,OAAO,GAAG,MAAO,GAAG,OAAO,CAAC;AAC3E,UAAM,QAAQ,MAAM,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,2BAA2B,CAAC;AAE5F,WAAO,MAAM;AACb,UAAM,IAAI,QAAc,CAAC,YAAY,OAAO,MAAM,MAAM,QAAQ,CAAC,CAAC;AAAA,EACpE,CAAC;AAED,wBAAG,0CAA0C,YAAY;AACvD,UAAM,SAAS,IAAI,0BAAgB,EAAE,MAAM,EAAE,CAAC;AAC9C,UAAM,IAAI,QAAc,CAAC,YAAY,OAAO,KAAK,aAAa,OAAO,CAAC;AACtE,UAAM,UAAU,OAAO,QAAQ;AAC/B,QAAI,OAAO,YAAY,YAAY,YAAY,KAAM,OAAM,IAAI,MAAM,wBAAwB;AAC7F,UAAM,WAAsC,CAAC;AAC7C,WAAO,GAAG,cAAc,CAAC,WAAW;AAClC,aAAO,GAAG,WAAW,CAAC,SAAS,SAAS,KAAK,KAAK,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC;AAAA,IAC3E,CAAC;AACD,UAAM,SAAS,IAAI,eAAI;AAAA,MACrB,QAAQ;AAAA,MACR,SAAS,oBAAoB,QAAQ,IAAI;AAAA,MACzC,OAAO;AAAA,MACP,UAAU;AAAA,MACV,KAAK;AAAA,IACP,CAAC;AACD,UAAM,UAAU,OAAO,OAAO;AAC9B,UAAM,SAAS,OAAO,OAAO,EAAE,UAAU,KAAK,CAAC;AAC/C,UAAM,QAAQ,MAAM,SAAS,WAAW,CAAC;AAEzC,8BAAO,QAAQ,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC;AACxC,8BAAO,OAAO,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC;AACvC,WAAO,cAAc,EAAE,UAAU,KAAK,CAAC;AACvC,UAAM,QAAQ,MAAM,SAAS,WAAW,CAAC;AACzC,8BAAO,QAAQ,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC;AACxC,8BAAO,OAAO,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC;AAEvC,YAAQ,MAAM;AACd,WAAO,MAAM;AACb,UAAM,IAAI,QAAc,CAAC,YAAY,OAAO,MAAM,MAAM,QAAQ,CAAC,CAAC;AAAA,EACpE,CAAC;AAED,wBAAG,uDAAuD,YAAY;AArfxE;AAsfI,UAAM,SAAS,IAAI,0BAAgB,EAAE,MAAM,EAAE,CAAC;AAC9C,UAAM,IAAI,QAAc,CAAC,YAAY,OAAO,KAAK,aAAa,OAAO,CAAC;AACtE,UAAM,UAAU,OAAO,QAAQ;AAC/B,QAAI,OAAO,YAAY,YAAY,YAAY,KAAM,OAAM,IAAI,MAAM,wBAAwB;AAC7F,WAAO,GAAG,cAAc,CAAC,WAAW;AAClC,aAAO,KAAK,WAAW,MAAM;AAC3B,eAAO;AAAA,UACL,KAAK,UAAU;AAAA,YACb,MAAM;AAAA,YACN,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,WAAW,CAAC,EAAE,MAAM,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,UAC5C,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AACD,UAAM,SAAS,IAAI,eAAI;AAAA,MACrB,QAAQ;AAAA,MACR,SAAS,oBAAoB,QAAQ,IAAI;AAAA,MACzC,OAAO;AAAA,MACP,UAAU,CAAC,MAAM,IAAI;AAAA,MACrB,KAAK;AAAA,IACP,CAAC;AACD,UAAM,SAAS,OAAO,OAAO;AAE7B,UAAM,QAAQ,MAAM,OAAO,KAAK;AAEhC,+BAAO,WAAM,MAAM,iBAAZ,mBAA2B,EAAE,EAAE,cAAc;AAAA,MAClD,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AACD,WAAO,MAAM;AACb,UAAM,IAAI,QAAc,CAAC,YAAY,OAAO,MAAM,MAAM,QAAQ,CAAC,CAAC;AAAA,EACpE,CAAC;AACH,CAAC;AAAA,IAED,wBAAS,uBAAuB,MAAM;AACpC,wBAAG,gFAAgF,MAAM;AAIvF,UAAM,MAAM,IAAI,QAAI,gCAAoB,QAAW,sBAAsB,CAAC;AAE1E,8BAAO,IAAI,QAAQ,EAAE,KAAK,MAAM;AAChC,8BAAO,IAAI,IAAI,EAAE,KAAK,gBAAgB;AACtC,8BAAO,IAAI,QAAQ,EAAE,KAAK,cAAc;AACxC,8BAAO,IAAI,aAAa,IAAI,QAAQ,CAAC,EAAE,KAAK,eAAe;AAC3D,8BAAO,IAAI,aAAa,IAAI,OAAO,CAAC,EAAE,KAAK,IAAI;AAAA,EACjD,CAAC;AAED,wBAAG,2EAA2E,MAAM;AAClF,UAAM,MAAM,IAAI,QAAI,gCAAoB,6BAA6B,wBAAwB,CAAC;AAE9F,8BAAO,IAAI,IAAI,EAAE,KAAK,gBAAgB;AACtC,8BAAO,IAAI,QAAQ,EAAE,KAAK,cAAc;AACxC,8BAAO,IAAI,aAAa,IAAI,QAAQ,CAAC,EAAE,KAAK,eAAe;AAC3D,8BAAO,IAAI,aAAa,IAAI,OAAO,CAAC,EAAE,KAAK,IAAI;AAAA,EACjD,CAAC;AAED,wBAAG,wEAAwE,MAAM;AAC/E,UAAM,MAAM,IAAI;AAAA,UACd,gCAAoB,kCAAkC,wBAAwB;AAAA,IAChF;AAEA,8BAAO,IAAI,QAAQ,EAAE,KAAK,MAAM;AAChC,8BAAO,IAAI,IAAI,EAAE,KAAK,qBAAqB;AAC3C,8BAAO,IAAI,QAAQ,EAAE,KAAK,cAAc;AACxC,8BAAO,IAAI,aAAa,IAAI,OAAO,CAAC,EAAE,KAAK,wBAAwB;AAAA,EACrE,CAAC;AAED,wBAAG,+DAA+D,MAAM;AACtE,UAAM,MAAM,IAAI;AAAA,UACd,gCAAoB,yCAAyC,sBAAsB;AAAA,IACrF;AAEA,8BAAO,IAAI,QAAQ,EAAE,KAAK,cAAc;AACxC,8BAAO,IAAI,aAAa,IAAI,OAAO,CAAC,EAAE,KAAK,sBAAsB;AAAA,EACnE,CAAC;AAED,wBAAG,uCAAuC,MAAM;AAC9C,UAAM,MAAM,IAAI;AAAA,UACd,gCAAoB,4CAA4C,sBAAsB;AAAA,IACxF;AAEA,8BAAO,IAAI,QAAQ,EAAE,KAAK,wBAAwB;AAClD,8BAAO,IAAI,aAAa,IAAI,QAAQ,CAAC,EAAE,KAAK,eAAe;AAC3D,8BAAO,IAAI,aAAa,IAAI,OAAO,CAAC,EAAE,KAAK,sBAAsB;AAAA,EACnE,CAAC;AAED,wBAAG,2CAA2C,MAAM;AAClD,UAAM,MAAM,IAAI;AAAA,UACd,gCAAoB,iCAAiC,sBAAsB;AAAA,IAC7E;AAEA,8BAAO,IAAI,QAAQ,EAAE,KAAK,KAAK;AAC/B,8BAAO,IAAI,IAAI,EAAE,KAAK,qBAAqB;AAC3C,8BAAO,IAAI,QAAQ,EAAE,KAAK,cAAc;AACxC,8BAAO,IAAI,aAAa,IAAI,QAAQ,CAAC,EAAE,KAAK,eAAe;AAC3D,8BAAO,IAAI,aAAa,IAAI,OAAO,CAAC,EAAE,KAAK,sBAAsB;AAAA,EACnE,CAAC;AAED,wBAAG,uDAAuD,MAAM;AAC9D,UAAM,MAAM,IAAI;AAAA,UACd,gCAAoB,kCAAkC,sBAAsB;AAAA,IAC9E;AAEA,8BAAO,IAAI,QAAQ,EAAE,KAAK,KAAK;AAC/B,8BAAO,IAAI,QAAQ,EAAE,KAAK,cAAc;AAAA,EAC1C,CAAC;AACH,CAAC;AAED,IAAI,iBAAiB;AACnB,8BAAS,0BAA0B,YAAY;AAC7C,UAAM,MAAM,MAAM,gCAAI,KAAK;AAC3B,cAAM,gCAAI,IAAI,eAAI,EAAE,aAAa,MAAM,CAAC,GAAG,KAAK,EAAE,WAAW,MAAM,CAAC;AAAA,EACtE,CAAC;AAED,8BAAS,mCAAmC,YAAY;AACtD,UAAM,MAAM,MAAM,gCAAI,KAAK;AAC3B,cAAM,gCAAI,IAAI,eAAI,EAAE,IAAI,CAAC,GAAG,KAAK;AAAA,MAC/B,cAAc;AAAA,IAChB,CAAC;AAAA,EACH,CAAC;AACH,OAAO;AACL,8BAAS,UAAU,MAAM;AACvB,qBAAG,KAAK,2BAA2B,MAAM;AAAA,IAAC,CAAC;AAAA,EAC7C,CAAC;AACH;","names":["BaseVAD"]}