@cogitator-ai/voice 0.1.13 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +128 -84
- package/dist/audio.d.ts +7 -0
- package/dist/audio.d.ts.map +1 -1
- package/dist/audio.js +40 -3
- package/dist/audio.js.map +1 -1
- package/dist/cogitator-runner.d.ts +34 -0
- package/dist/cogitator-runner.d.ts.map +1 -0
- package/dist/cogitator-runner.js +28 -0
- package/dist/cogitator-runner.js.map +1 -0
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/dist/pipeline/index.d.ts +2 -2
- package/dist/pipeline/index.d.ts.map +1 -1
- package/dist/pipeline/index.js.map +1 -1
- package/dist/pipeline/pipeline-session.d.ts +20 -2
- package/dist/pipeline/pipeline-session.d.ts.map +1 -1
- package/dist/pipeline/pipeline-session.js +187 -63
- package/dist/pipeline/pipeline-session.js.map +1 -1
- package/dist/pipeline/voice-pipeline.d.ts +12 -7
- package/dist/pipeline/voice-pipeline.d.ts.map +1 -1
- package/dist/pipeline/voice-pipeline.js +14 -4
- package/dist/pipeline/voice-pipeline.js.map +1 -1
- package/dist/realtime/gemini-realtime.d.ts +15 -3
- package/dist/realtime/gemini-realtime.d.ts.map +1 -1
- package/dist/realtime/gemini-realtime.js +140 -94
- package/dist/realtime/gemini-realtime.js.map +1 -1
- package/dist/realtime/openai-realtime.d.ts +10 -1
- package/dist/realtime/openai-realtime.d.ts.map +1 -1
- package/dist/realtime/openai-realtime.js +140 -69
- package/dist/realtime/openai-realtime.js.map +1 -1
- package/dist/realtime/realtime-session.d.ts +10 -0
- package/dist/realtime/realtime-session.d.ts.map +1 -1
- package/dist/realtime/realtime-session.js +60 -7
- package/dist/realtime/realtime-session.js.map +1 -1
- package/dist/stt/deepgram-stt.d.ts +3 -0
- package/dist/stt/deepgram-stt.d.ts.map +1 -1
- package/dist/stt/deepgram-stt.js +104 -55
- package/dist/stt/deepgram-stt.js.map +1 -1
- package/dist/stt/openai-stt.d.ts +5 -0
- package/dist/stt/openai-stt.d.ts.map +1 -1
- package/dist/stt/openai-stt.js +87 -17
- package/dist/stt/openai-stt.js.map +1 -1
- package/dist/tools.d.ts +3 -3
- package/dist/transport/ws-transport.d.ts +6 -7
- package/dist/transport/ws-transport.d.ts.map +1 -1
- package/dist/transport/ws-transport.js +58 -20
- package/dist/transport/ws-transport.js.map +1 -1
- package/dist/tts/elevenlabs-tts.d.ts.map +1 -1
- package/dist/tts/elevenlabs-tts.js +26 -16
- package/dist/tts/elevenlabs-tts.js.map +1 -1
- package/dist/types.d.ts +38 -16
- package/dist/types.d.ts.map +1 -1
- package/dist/vad/silero-vad.d.ts +14 -1
- package/dist/vad/silero-vad.d.ts.map +1 -1
- package/dist/vad/silero-vad.js +101 -25
- package/dist/vad/silero-vad.js.map +1 -1
- package/dist/voice-agent.d.ts +14 -0
- package/dist/voice-agent.d.ts.map +1 -1
- package/dist/voice-agent.js +112 -23
- package/dist/voice-agent.js.map +1 -1
- package/package.json +15 -13
|
@@ -1,125 +1,148 @@
|
|
|
1
1
|
import { EventEmitter } from 'node:events';
|
|
2
2
|
import { WebSocket } from 'ws';
|
|
3
|
-
const DEFAULT_MODEL = 'gemini-
|
|
3
|
+
const DEFAULT_MODEL = 'gemini-3.8-live';
|
|
4
|
+
const DEFAULT_VOICE = 'Puck';
|
|
4
5
|
const BASE_URL = 'wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent';
|
|
5
6
|
const CONNECT_TIMEOUT_MS = 30_000;
|
|
7
|
+
const INPUT_MIME_TYPE = 'audio/pcm;rate=16000';
|
|
8
|
+
function rawDataToString(data) {
|
|
9
|
+
if (Array.isArray(data))
|
|
10
|
+
return Buffer.concat(data).toString();
|
|
11
|
+
if (data instanceof ArrayBuffer)
|
|
12
|
+
return Buffer.from(new Uint8Array(data)).toString();
|
|
13
|
+
return data.toString();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Gemini Live API adapter. Input audio is PCM16 mono at 16kHz,
|
|
17
|
+
* output audio is PCM16 mono at 24kHz.
|
|
18
|
+
*/
|
|
6
19
|
export class GeminiRealtimeAdapter extends EventEmitter {
|
|
7
20
|
config;
|
|
8
21
|
model;
|
|
9
22
|
ws = null;
|
|
23
|
+
connected = false;
|
|
24
|
+
modelTurnActive = false;
|
|
10
25
|
interrupting = false;
|
|
26
|
+
userTranscript = '';
|
|
27
|
+
assistantTranscript = '';
|
|
28
|
+
assistantText = '';
|
|
11
29
|
constructor(config) {
|
|
12
30
|
super();
|
|
13
31
|
this.config = config;
|
|
14
32
|
this.model = config.model ?? DEFAULT_MODEL;
|
|
15
33
|
}
|
|
34
|
+
get isConnected() {
|
|
35
|
+
return this.connected;
|
|
36
|
+
}
|
|
16
37
|
async connect() {
|
|
17
38
|
if (this.ws) {
|
|
18
39
|
throw new Error('Already connected or connecting — call close() first');
|
|
19
40
|
}
|
|
20
|
-
const url = `${BASE_URL}?key=${this.config.apiKey}`;
|
|
21
41
|
return new Promise((resolve, reject) => {
|
|
22
42
|
let settled = false;
|
|
23
|
-
const
|
|
24
|
-
if (settled)
|
|
25
|
-
return;
|
|
26
|
-
settled = true;
|
|
27
|
-
clearTimeout(timer);
|
|
28
|
-
resolve();
|
|
29
|
-
};
|
|
30
|
-
const settleReject = (err) => {
|
|
43
|
+
const settle = (err) => {
|
|
31
44
|
if (settled)
|
|
32
45
|
return;
|
|
33
46
|
settled = true;
|
|
34
47
|
clearTimeout(timer);
|
|
35
|
-
|
|
48
|
+
if (err)
|
|
49
|
+
reject(err);
|
|
50
|
+
else
|
|
51
|
+
resolve();
|
|
36
52
|
};
|
|
37
|
-
const ws = new WebSocket(
|
|
53
|
+
const ws = new WebSocket(BASE_URL, {
|
|
54
|
+
headers: { 'x-goog-api-key': this.config.apiKey },
|
|
55
|
+
});
|
|
38
56
|
this.ws = ws;
|
|
39
57
|
const timer = setTimeout(() => {
|
|
40
|
-
this.ws
|
|
58
|
+
if (this.ws === ws)
|
|
59
|
+
this.ws = null;
|
|
41
60
|
ws.removeAllListeners();
|
|
42
|
-
ws.
|
|
43
|
-
|
|
61
|
+
ws.on('error', () => { });
|
|
62
|
+
ws.terminate();
|
|
63
|
+
settle(new Error(`Connect timed out after ${CONNECT_TIMEOUT_MS}ms`));
|
|
44
64
|
}, CONNECT_TIMEOUT_MS);
|
|
45
65
|
ws.on('open', () => {
|
|
46
66
|
this.sendSetup();
|
|
47
67
|
});
|
|
48
68
|
ws.on('message', (data) => {
|
|
49
|
-
const buf = Array.isArray(data)
|
|
50
|
-
? Buffer.concat(data)
|
|
51
|
-
: data instanceof ArrayBuffer
|
|
52
|
-
? Buffer.from(new Uint8Array(data))
|
|
53
|
-
: data;
|
|
54
|
-
const raw = buf.toString();
|
|
55
69
|
let msg;
|
|
56
70
|
try {
|
|
57
|
-
msg = JSON.parse(
|
|
71
|
+
msg = JSON.parse(rawDataToString(data));
|
|
58
72
|
}
|
|
59
73
|
catch {
|
|
60
74
|
this.emit('error', new Error('Failed to parse WebSocket message'));
|
|
61
75
|
return;
|
|
62
76
|
}
|
|
77
|
+
if (msg.error) {
|
|
78
|
+
const err = new Error(msg.error.message ?? `Gemini error (code: ${msg.error.code ?? 'unknown'})`);
|
|
79
|
+
if (settled)
|
|
80
|
+
this.emit('error', err);
|
|
81
|
+
else
|
|
82
|
+
settle(err);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
63
85
|
if (msg.setupComplete) {
|
|
86
|
+
this.connected = true;
|
|
64
87
|
this.emit('connected');
|
|
65
|
-
|
|
88
|
+
settle();
|
|
66
89
|
return;
|
|
67
90
|
}
|
|
68
|
-
if (msg.
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
return;
|
|
91
|
+
if (msg.serverContent) {
|
|
92
|
+
this.handleServerContent(msg.serverContent);
|
|
93
|
+
}
|
|
94
|
+
if (msg.toolCall?.functionCalls?.length) {
|
|
95
|
+
void this.handleToolCalls(msg.toolCall.functionCalls);
|
|
74
96
|
}
|
|
75
|
-
this.handleMessage(msg);
|
|
76
97
|
});
|
|
77
98
|
ws.on('error', (err) => {
|
|
78
|
-
|
|
79
|
-
|
|
99
|
+
if (settled)
|
|
100
|
+
this.emit('error', err);
|
|
101
|
+
else
|
|
102
|
+
settle(err);
|
|
80
103
|
});
|
|
81
104
|
ws.on('close', (code, reason) => {
|
|
82
105
|
const reasonStr = reason.toString() || 'connection closed';
|
|
83
|
-
this.ws
|
|
84
|
-
|
|
85
|
-
|
|
106
|
+
if (this.ws === ws)
|
|
107
|
+
this.ws = null;
|
|
108
|
+
const wasConnected = this.connected;
|
|
109
|
+
this.resetTurn();
|
|
110
|
+
this.connected = false;
|
|
111
|
+
settle(new Error(`WebSocket closed before connect (code ${code}): ${reasonStr}`));
|
|
112
|
+
if (wasConnected)
|
|
113
|
+
this.emit('disconnected', code, reasonStr);
|
|
86
114
|
});
|
|
87
115
|
});
|
|
88
116
|
}
|
|
89
117
|
pushAudio(chunk) {
|
|
90
118
|
this.send({
|
|
91
119
|
realtimeInput: {
|
|
92
|
-
|
|
93
|
-
{
|
|
94
|
-
mimeType: 'audio/pcm;rate=16000',
|
|
95
|
-
data: chunk.toString('base64'),
|
|
96
|
-
},
|
|
97
|
-
],
|
|
120
|
+
audio: { mimeType: INPUT_MIME_TYPE, data: chunk.toString('base64') },
|
|
98
121
|
},
|
|
99
122
|
});
|
|
100
123
|
}
|
|
101
124
|
sendText(text) {
|
|
102
|
-
this.send({
|
|
103
|
-
clientContent: {
|
|
104
|
-
turns: [{ role: 'user', parts: [{ text }] }],
|
|
105
|
-
turnComplete: true,
|
|
106
|
-
},
|
|
107
|
-
});
|
|
125
|
+
this.send({ realtimeInput: { text } });
|
|
108
126
|
}
|
|
109
127
|
/**
|
|
110
128
|
* Gemini Live barge-in is driven by incoming user audio, not a control message.
|
|
111
|
-
*
|
|
112
|
-
* turn completes
|
|
129
|
+
* While a model turn is in progress this drops the remaining model audio until
|
|
130
|
+
* the turn completes, simulating an interruption on the consumer side.
|
|
113
131
|
*/
|
|
114
132
|
interrupt() {
|
|
115
|
-
this.
|
|
133
|
+
if (this.modelTurnActive) {
|
|
134
|
+
this.interrupting = true;
|
|
135
|
+
}
|
|
116
136
|
}
|
|
117
137
|
close() {
|
|
118
138
|
const ws = this.ws;
|
|
139
|
+
this.connected = false;
|
|
140
|
+
this.resetTurn();
|
|
119
141
|
if (!ws)
|
|
120
142
|
return;
|
|
121
143
|
this.ws = null;
|
|
122
144
|
ws.removeAllListeners();
|
|
145
|
+
ws.on('error', () => { });
|
|
123
146
|
ws.close();
|
|
124
147
|
}
|
|
125
148
|
sendSetup() {
|
|
@@ -129,17 +152,15 @@ export class GeminiRealtimeAdapter extends EventEmitter {
|
|
|
129
152
|
responseModalities: ['AUDIO'],
|
|
130
153
|
speechConfig: {
|
|
131
154
|
voiceConfig: {
|
|
132
|
-
prebuiltVoiceConfig: {
|
|
133
|
-
voiceName: this.config.voice ?? 'Puck',
|
|
134
|
-
},
|
|
155
|
+
prebuiltVoiceConfig: { voiceName: this.config.voice ?? DEFAULT_VOICE },
|
|
135
156
|
},
|
|
136
157
|
},
|
|
137
158
|
},
|
|
159
|
+
inputAudioTranscription: {},
|
|
160
|
+
outputAudioTranscription: {},
|
|
138
161
|
};
|
|
139
162
|
if (this.config.instructions) {
|
|
140
|
-
setup.systemInstruction = {
|
|
141
|
-
parts: [{ text: this.config.instructions }],
|
|
142
|
-
};
|
|
163
|
+
setup.systemInstruction = { parts: [{ text: this.config.instructions }] };
|
|
143
164
|
}
|
|
144
165
|
if (this.config.tools?.length) {
|
|
145
166
|
setup.tools = [
|
|
@@ -154,64 +175,89 @@ export class GeminiRealtimeAdapter extends EventEmitter {
|
|
|
154
175
|
}
|
|
155
176
|
this.send({ setup });
|
|
156
177
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
this.
|
|
161
|
-
return;
|
|
178
|
+
handleServerContent(content) {
|
|
179
|
+
const inputText = content.inputTranscription?.text;
|
|
180
|
+
if (inputText) {
|
|
181
|
+
this.userTranscript += inputText;
|
|
162
182
|
}
|
|
163
|
-
|
|
164
|
-
|
|
183
|
+
const outputText = content.outputTranscription?.text;
|
|
184
|
+
const parts = content.modelTurn?.parts ?? [];
|
|
185
|
+
if (parts.length > 0 || outputText) {
|
|
186
|
+
this.modelTurnActive = true;
|
|
187
|
+
this.flushUserTranscript();
|
|
165
188
|
}
|
|
166
|
-
if (
|
|
167
|
-
|
|
189
|
+
if (outputText) {
|
|
190
|
+
this.assistantTranscript += outputText;
|
|
168
191
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
this.emit('transcript', part.text, 'assistant');
|
|
178
|
-
}
|
|
192
|
+
for (const part of parts) {
|
|
193
|
+
if (part.thought)
|
|
194
|
+
continue;
|
|
195
|
+
if (part.inlineData?.data && !this.interrupting) {
|
|
196
|
+
this.emit('audio', Buffer.from(part.inlineData.data, 'base64'));
|
|
197
|
+
}
|
|
198
|
+
if (part.text) {
|
|
199
|
+
this.assistantText += part.text;
|
|
179
200
|
}
|
|
180
201
|
}
|
|
202
|
+
if (content.interrupted) {
|
|
203
|
+
this.flushAssistantTranscript();
|
|
204
|
+
this.modelTurnActive = false;
|
|
205
|
+
this.interrupting = false;
|
|
206
|
+
this.emit('speech_start');
|
|
207
|
+
}
|
|
181
208
|
if (content.turnComplete) {
|
|
209
|
+
this.flushUserTranscript();
|
|
210
|
+
this.flushAssistantTranscript();
|
|
211
|
+
this.modelTurnActive = false;
|
|
182
212
|
this.interrupting = false;
|
|
183
213
|
this.emit('turn_end');
|
|
184
214
|
}
|
|
185
215
|
}
|
|
216
|
+
flushUserTranscript() {
|
|
217
|
+
const text = this.userTranscript.trim();
|
|
218
|
+
this.userTranscript = '';
|
|
219
|
+
if (text)
|
|
220
|
+
this.emit('transcript', text, 'user');
|
|
221
|
+
}
|
|
222
|
+
flushAssistantTranscript() {
|
|
223
|
+
const text = (this.assistantTranscript || this.assistantText).trim();
|
|
224
|
+
this.assistantTranscript = '';
|
|
225
|
+
this.assistantText = '';
|
|
226
|
+
if (text)
|
|
227
|
+
this.emit('transcript', text, 'assistant');
|
|
228
|
+
}
|
|
229
|
+
resetTurn() {
|
|
230
|
+
this.modelTurnActive = false;
|
|
231
|
+
this.interrupting = false;
|
|
232
|
+
this.userTranscript = '';
|
|
233
|
+
this.assistantTranscript = '';
|
|
234
|
+
this.assistantText = '';
|
|
235
|
+
}
|
|
186
236
|
async handleToolCalls(calls) {
|
|
187
|
-
const
|
|
237
|
+
const ws = this.ws;
|
|
238
|
+
const functionResponses = await Promise.all(calls.map(async (call, index) => {
|
|
188
239
|
const id = call.id ?? `${call.name}-${index}`;
|
|
189
|
-
|
|
240
|
+
const args = call.args ?? {};
|
|
241
|
+
this.emit('tool_call', call.name, args);
|
|
190
242
|
const tool = this.config.tools?.find((t) => t.name === call.name);
|
|
191
243
|
if (!tool) {
|
|
192
|
-
return {
|
|
193
|
-
id,
|
|
194
|
-
name: call.name,
|
|
195
|
-
response: { result: JSON.stringify({ error: `Unknown tool: ${call.name}` }) },
|
|
196
|
-
};
|
|
244
|
+
return { id, name: call.name, response: { error: `Unknown tool: ${call.name}` } };
|
|
197
245
|
}
|
|
198
|
-
let result;
|
|
199
246
|
try {
|
|
200
|
-
const output = await tool.execute(
|
|
201
|
-
|
|
247
|
+
const output = await tool.execute(args);
|
|
248
|
+
return { id, name: call.name, response: { result: output ?? null } };
|
|
202
249
|
}
|
|
203
250
|
catch (err) {
|
|
204
|
-
|
|
251
|
+
return {
|
|
252
|
+
id,
|
|
253
|
+
name: call.name,
|
|
254
|
+
response: { error: err instanceof Error ? err.message : String(err) },
|
|
255
|
+
};
|
|
205
256
|
}
|
|
206
|
-
return {
|
|
207
|
-
id,
|
|
208
|
-
name: call.name,
|
|
209
|
-
response: { result },
|
|
210
|
-
};
|
|
211
257
|
}));
|
|
212
|
-
this.
|
|
213
|
-
|
|
214
|
-
});
|
|
258
|
+
if (this.ws !== ws)
|
|
259
|
+
return;
|
|
260
|
+
this.send({ toolResponse: { functionResponses } });
|
|
215
261
|
}
|
|
216
262
|
send(data) {
|
|
217
263
|
const ws = this.ws;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini-realtime.js","sourceRoot":"","sources":["../../src/realtime/gemini-realtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAG/B,MAAM,aAAa,GAAG,
|
|
1
|
+
{"version":3,"file":"gemini-realtime.js","sourceRoot":"","sources":["../../src/realtime/gemini-realtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,11 +10,18 @@ interface OpenAIRealtimeEvents {
|
|
|
10
10
|
turn_end: [];
|
|
11
11
|
error: [error: Error];
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* OpenAI Realtime API (GA interface) adapter. Audio in both directions is
|
|
15
|
+
* PCM16 mono at 24kHz.
|
|
16
|
+
*/
|
|
13
17
|
export declare class OpenAIRealtimeAdapter extends EventEmitter<OpenAIRealtimeEvents> {
|
|
14
18
|
private readonly config;
|
|
15
19
|
private readonly model;
|
|
16
20
|
private ws;
|
|
21
|
+
private connected;
|
|
22
|
+
private responseActive;
|
|
17
23
|
constructor(config: RealtimeSessionConfig);
|
|
24
|
+
get isConnected(): boolean;
|
|
18
25
|
connect(): Promise<void>;
|
|
19
26
|
pushAudio(chunk: Buffer): void;
|
|
20
27
|
sendText(text: string): void;
|
|
@@ -22,7 +29,9 @@ export declare class OpenAIRealtimeAdapter extends EventEmitter<OpenAIRealtimeEv
|
|
|
22
29
|
close(): void;
|
|
23
30
|
private sendSessionUpdate;
|
|
24
31
|
private handleMessage;
|
|
25
|
-
private
|
|
32
|
+
private handleResponseDone;
|
|
33
|
+
private handleToolCalls;
|
|
34
|
+
private executeToolCall;
|
|
26
35
|
private send;
|
|
27
36
|
}
|
|
28
37
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-realtime.d.ts","sourceRoot":"","sources":["../../src/realtime/openai-realtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-realtime.d.ts","sourceRoot":"","sources":["../../src/realtime/openai-realtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AASzD,UAAU,oBAAoB;IAC5B,SAAS,EAAE,EAAE,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC;IACvD,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,YAAY,EAAE,EAAE,CAAC;IACjB,QAAQ,EAAE,EAAE,CAAC;IACb,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;CACvB;AAkBD;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,YAAY,CAAC,oBAAoB,CAAC;IAC3E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAS;gBAEnB,MAAM,EAAE,qBAAqB;IAMzC,IAAI,WAAW,IAAI,OAAO,CAEzB;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA6D9B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAO9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAY5B,SAAS,IAAI,IAAI;IAKjB,KAAK,IAAI,IAAI;IAWb,OAAO,CAAC,iBAAiB;IAkCzB,OAAO,CAAC,aAAa;IA8DrB,OAAO,CAAC,kBAAkB;YA2BZ,eAAe;YAcf,eAAe;IAkC7B,OAAO,CAAC,IAAI;CAMb"}
|