@genspark/cli 1.0.3 → 1.0.5

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 CHANGED
@@ -1,8 +1,50 @@
1
- # Genspark CLI (gsk)
2
-
3
- Command-line interface for [Genspark](https://www.genspark.ai) AI services. Provides web search, content crawling, image/video/audio generation, file management, and more.
4
-
5
- Results go to stdout as JSON, progress/debug info goes to stderrideal for integration with AI agents and automation pipelines.
1
+ # Genspark CLI (`gsk`)
2
+
3
+ **One CLI. Every AI capability.** Search, generate, analyze, communicate all from your terminal.
4
+
5
+ `gsk` is the command-line interface for the [Genspark](https://www.genspark.ai) AI platform. It unifies **30+ AI tools** behind a single binary: web search, image/video/audio generation with 40+ models, document analysis, media transcription, cloud file management, email, calendar, AI phone calls, stock data, and autonomous AI agents all with clean JSON output for seamless integration with AI coding assistants, automation pipelines, and scripts.
6
+
7
+ ### Capability Map
8
+
9
+ | Category | What You Get |
10
+ |----------|-------------|
11
+ | 🔍 **Search** | Web search, image search |
12
+ | 📄 **Documents** | Crawl pages, summarize PDFs/docs |
13
+ | 🎨 **Images** | 16 models: GPT Image, Gemini, Flux 2, Imagen 4, Recraft, Ideogram, Seedream ... |
14
+ | 🎬 **Videos** | 14 models: Kling V3, Veo 3.1, Sora 2, Hailuo, Wan, Runway, PixVerse, Seedance ... |
15
+ | 🎵 **Audio** | 14 models: Gemini TTS, ElevenLabs, MiniMax, Mureka, CassetteAI, Lyria 2 ... |
16
+ | 🧠 **Analysis** | Image/video/audio understanding, OCR, video style replication |
17
+ | 📝 **Transcribe** | Whisper, Gemini, ElevenLabs Scribe |
18
+ | ☁️ **AI Drive** | Cloud file storage, download, compress |
19
+ | 📧 **Email** | Gmail & Outlook: read, search, send |
20
+ | 📅 **Calendar** | Google & Outlook: list, create events |
21
+ | 📞 **Phone** | AI-powered phone calls to businesses |
22
+ | 📈 **Stocks** | Real-time stock prices |
23
+ | 🤖 **Agents** | Podcasts, docs, slides, deep research, websites, batch media generation |
24
+ | 🔊 **Voice** | Voice cloning, voice changer |
25
+
26
+ ## Table of Contents
27
+
28
+ - [Installation](#installation)
29
+ - [Quick Start](#quick-start)
30
+ - [Authentication](#authentication)
31
+ - [Commands](#commands)
32
+ - [Search & Crawl](#search--crawl)
33
+ - [Image Generation](#image-generation)
34
+ - [Video Generation](#video-generation)
35
+ - [Audio Generation](#audio-generation)
36
+ - [Media Analysis & Transcription](#media-analysis--transcription)
37
+ - [AI Drive (Cloud Storage)](#ai-drive-cloud-storage)
38
+ - [AI Agents & Tasks](#ai-agents--tasks)
39
+ - [Email](#email)
40
+ - [Calendar](#calendar)
41
+ - [AI Phone Calls](#ai-phone-calls)
42
+ - [Stock Prices](#stock-prices)
43
+ - [Utilities](#utilities)
44
+ - [Available Models](#available-models)
45
+ - [Configuration](#configuration)
46
+ - [Output Conventions](#output-conventions)
47
+ - [License](#license)
6
48
 
7
49
  ## Installation
8
50
 
@@ -48,6 +90,13 @@ export GSK_API_KEY="gsk_..."
48
90
  gsk search "query" --api-key "gsk_..."
49
91
  ```
50
92
 
93
+ To check your current identity:
94
+
95
+ ```bash
96
+ gsk login-info
97
+ gsk me # shorthand
98
+ ```
99
+
51
100
  To log out:
52
101
 
53
102
  ```bash
@@ -95,20 +144,42 @@ gsk list-tools
95
144
  gsk ls
96
145
  ```
97
146
 
98
- ### web_search (alias: `search`)
147
+ ### login-info (alias: `me`)
99
148
 
100
- Search the web.
149
+ Show your current account info — email, name, and membership plan.
101
150
 
102
151
  ```bash
103
- gsk search "latest AI news"
104
- gsk search "latest AI news" -n 5
105
- gsk search "最新のAIニュース" -l ja
152
+ gsk login-info
153
+ gsk me
154
+ ```
155
+
156
+ ### init-opencode
157
+
158
+ Generate an `.opencode.json` config file for [OpenCode](https://opencode.ai), pre-configured to use Genspark's LLM proxy with your API key.
159
+
160
+ ```bash
161
+ # Generate with default model (claude-opus-4-6-1m)
162
+ gsk init-opencode
163
+
164
+ # Specify a different default model
165
+ gsk init-opencode --model claude-sonnet-4-6
166
+
167
+ # Write to a custom path
168
+ gsk init-opencode -o ./my-project/.opencode.json
106
169
  ```
107
170
 
108
171
  | Option | Default | Description |
109
172
  |--------|---------|-------------|
110
- | `-n, --num <count>` | `10` | Number of results (1-50) |
111
- | `-l, --language <code>` | | Language code (e.g., `en`, `zh`, `ja`) |
173
+ | `--model <name>` | `claude-opus-4-6-1m` | Default model for OpenCode |
174
+ | `-o, --out <path>` | `.opencode.json` (cwd) | Output file path |
175
+
176
+ ### web_search (alias: `search`)
177
+
178
+ Search the web.
179
+
180
+ ```bash
181
+ gsk search "latest AI news"
182
+ ```
112
183
 
113
184
  ### crawler (alias: `crawl`)
114
185
 
@@ -116,24 +187,20 @@ Extract content from a web page or document.
116
187
 
117
188
  ```bash
118
189
  gsk crawl "https://example.com/article"
119
- gsk crawl "https://example.com/gallery" --images
120
- gsk crawl "https://example.com/page" --no-text --images
121
190
  ```
122
191
 
123
- | Option | Default | Description |
124
- |--------|---------|-------------|
125
- | `--no-text` | extract text | Skip text content extraction |
126
- | `-i, --images` | `false` | Include image URLs in response |
127
-
128
192
  ### summarize_large_document (alias: `summarize`)
129
193
 
130
194
  Analyze a document and answer questions about it.
131
195
 
132
196
  ```bash
133
- gsk summarize "https://example.com/report.pdf" "What are the key findings?"
197
+ gsk summarize "https://example.com/report.pdf" --question "What are the key findings?"
134
198
  ```
135
199
 
136
- Arguments: `<url>` `<question>`
200
+ | Option | Description |
201
+ |--------|-------------|
202
+ | `<url>` | Document URL (**required**, positional) |
203
+ | `--question <text>` | Question about the document |
137
204
 
138
205
  ### image_search (alias: `img-search`)
139
206
 
@@ -296,9 +363,15 @@ gsk drive move -p "/old-path/file.txt" --target_path "/new-path/file.txt"
296
363
  gsk drive download_video --video_url "https://example.com/video.mp4" --target_folder "/videos"
297
364
  gsk drive download_file --file_url "https://example.com/doc.pdf" --target_folder "/docs"
298
365
 
299
- # Upload content to AI-Drive
366
+ # Upload inline text content to AI-Drive
300
367
  gsk drive upload --file_content "Hello World" --upload_path "/notes/hello.txt"
301
368
 
369
+ # Upload a local file directly to AI-Drive (streaming, supports 100MB+ files)
370
+ gsk drive upload --local_file ./report.pdf --upload_path /docs/report.pdf
371
+ gsk drive upload --local_file ./video.mp4 --upload_path /videos/demo.mp4
372
+ gsk drive upload --local_file ./photo.png # upload_path defaults to /photo.png
373
+ gsk drive upload --local_file ./doc.pdf --upload_path /docs/doc.pdf --override # overwrite existing
374
+
302
375
  # Get readable URL for a file
303
376
  gsk drive get_readable_url -p "/documents/report.pdf"
304
377
 
@@ -318,8 +391,10 @@ gsk drive decompress -p "/archive.zip"
318
391
  | `--audio_url <url>` | — | Audio URL for download_audio action |
319
392
  | `--file_url <url>` | — | File URL for download_file action |
320
393
  | `--file_name <name>` | — | Custom file name for downloads |
321
- | `--file_content <text>` | — | Content to upload |
322
- | `--upload_path <path>` | — | Destination path for upload |
394
+ | `--file_content <text>` | — | Inline text content to upload |
395
+ | `--local_file <path>` | — | Local file path to upload directly to AI-Drive (streaming, no size limit) |
396
+ | `--upload_path <path>` | — | Destination path for upload (defaults to `/<filename>` for `--local_file`) |
397
+ | `--override` | `false` | Overwrite an existing file at the destination path |
323
398
 
324
399
  ### create_task (alias: `task`)
325
400
 
@@ -356,6 +431,189 @@ gsk stock AAPL
356
431
  gsk stock MSFT
357
432
  ```
358
433
 
434
+ ### email
435
+
436
+ Read and send emails from your connected Gmail or Outlook account.
437
+
438
+ > **Requirements:** Connect Gmail or Outlook in [Genspark Account Settings → Integrations](https://www.genspark.ai/settings/integrations).
439
+
440
+ #### email list
441
+
442
+ List emails from a folder.
443
+
444
+ ```bash
445
+ # List inbox (default)
446
+ gsk email list
447
+
448
+ # List sent folder, limit to 5 emails
449
+ gsk email list sent -n 5
450
+
451
+ # List only unread emails
452
+ gsk email list --unread_only
453
+
454
+ # List emails after a specific date
455
+ gsk email list --after_date 2026-03-01
456
+
457
+ # Use a specific account (when multiple accounts are connected)
458
+ gsk email list -a user@gmail.com
459
+ ```
460
+
461
+ | Option | Default | Description |
462
+ |--------|---------|-------------|
463
+ | `[folder]` | `inbox` | Folder: `inbox`, `sent`, `drafts`, `trash`, `spam`, `archive`, or a custom label |
464
+ | `-n, --limit <n>` | `20` | Maximum number of emails to return |
465
+ | `--unread_only` | `false` | Return only unread emails |
466
+ | `--after_date <YYYY-MM-DD>` | — | Return emails after this date |
467
+ | `--before_date <YYYY-MM-DD>` | — | Return emails before this date |
468
+ | `-a, --from_account <email>` | — | Account email address (for multi-account) |
469
+
470
+ #### email read
471
+
472
+ Read a specific email by ID.
473
+
474
+ ```bash
475
+ # Read a specific email (get ID from email list output)
476
+ gsk email read 19cbfecd7fb14d46
477
+
478
+ # Ask a specific question about the email
479
+ gsk email read 19cbfecd7fb14d46 "What action is required?"
480
+
481
+ # Specify account for multi-account setups
482
+ gsk email read 19cbfecd7fb14d46 -a user@gmail.com
483
+ ```
484
+
485
+ | Option | Default | Description |
486
+ |--------|---------|-------------|
487
+ | `<id>` | — | Email ID from `email list` or `email search` (**required**) |
488
+ | `-a, --from_account <email>` | — | Account email address (for multi-account) |
489
+
490
+ #### email search
491
+
492
+ Search emails using a query string.
493
+
494
+ ```bash
495
+ # Search by subject
496
+ gsk email search "meeting agenda"
497
+
498
+ # Gmail query syntax
499
+ gsk email search "from:boss@company.com subject:budget"
500
+
501
+ # Search with date range
502
+ gsk email search "invoice" --after_date 2026-01-01 --before_date 2026-03-01
503
+
504
+ # Limit results
505
+ gsk email search "quarterly report" -n 5
506
+ ```
507
+
508
+ | Option | Default | Description |
509
+ |--------|---------|-------------|
510
+ | `<query>` | — | Search query (Gmail GQL or Outlook KQL) (**required**) |
511
+ | `-n, --limit <n>` | `20` | Maximum number of results |
512
+ | `--after_date <YYYY-MM-DD>` | — | Return emails after this date |
513
+ | `--before_date <YYYY-MM-DD>` | — | Return emails before this date |
514
+ | `-a, --from_account <email>` | — | Account email address (for multi-account) |
515
+
516
+ #### email send
517
+
518
+ Send a new email.
519
+
520
+ ```bash
521
+ # Send a plain text email
522
+ gsk email send --to recipient@example.com --subject "Hello" --body "Hi there!"
523
+
524
+ # Send to multiple recipients
525
+ gsk email send --to "alice@example.com,bob@example.com" --subject "Team Update" --body "..."
526
+
527
+ # Send HTML email
528
+ gsk email send --to user@example.com --subject "Newsletter" --body "<h1>Title</h1><p>...</p>" --content_type text/html
529
+
530
+ # Send with CC and BCC
531
+ gsk email send --to recipient@example.com --subject "Meeting" --body "..." --cc manager@company.com --bcc archive@company.com
532
+
533
+ # Send from a specific account
534
+ gsk email send --to user@example.com --subject "Hi" --body "..." -a sender@gmail.com
535
+ ```
536
+
537
+ | Option | Default | Description |
538
+ |--------|---------|-------------|
539
+ | `--to <addresses>` | — | Recipient(s), comma-separated (**required**) |
540
+ | `--subject <text>` | — | Email subject (**required**) |
541
+ | `--body <text>` | — | Email body (**required**) |
542
+ | `--cc <addresses>` | — | CC recipient(s), comma-separated |
543
+ | `--bcc <addresses>` | — | BCC recipient(s), comma-separated |
544
+ | `--content_type <type>` | `text/plain` | Body content type: `text/plain` or `text/html` |
545
+ | `-a, --from_account <email>` | — | Account to send from (for multi-account) |
546
+
547
+ ### calendar
548
+
549
+ List and create calendar events from your connected Google Calendar or Outlook account.
550
+
551
+ > **Requirements:** Connect Google Calendar or Outlook in [Genspark Account Settings → Integrations](https://www.genspark.ai/settings/integrations).
552
+
553
+ #### calendar list
554
+
555
+ List upcoming calendar events.
556
+
557
+ ```bash
558
+ # List events in the next 7 days (default)
559
+ gsk calendar list
560
+
561
+ # List events in a specific time range
562
+ gsk calendar list --time_min 2026-03-10T00:00:00Z --time_max 2026-03-15T23:59:59Z
563
+
564
+ # Search for events by keyword
565
+ gsk calendar list --filter_query "standup"
566
+
567
+ # Use a specific calendar account
568
+ gsk calendar list -a user@gmail.com
569
+ ```
570
+
571
+ | Option | Default | Description |
572
+ |--------|---------|-------------|
573
+ | `--time_min <ISO8601>` | now | Start of time range (e.g., `2026-03-10T00:00:00Z`) |
574
+ | `--time_max <ISO8601>` | +7 days | End of time range |
575
+ | `--filter_query <text>` | — | Filter events by title/subject keyword |
576
+ | `-a, --from_account <email>` | — | Calendar account email (for multi-account) |
577
+
578
+ #### calendar create
579
+
580
+ Create a new calendar event.
581
+
582
+ ```bash
583
+ # Create a simple event
584
+ gsk calendar create --summary "Team Meeting" --start_time "2026-03-10T14:00:00-08:00" --end_time "2026-03-10T15:00:00-08:00"
585
+
586
+ # Create an event with details
587
+ gsk calendar create \
588
+ --summary "Q1 Planning" \
589
+ --start_time "2026-03-15T09:00:00-08:00" \
590
+ --end_time "2026-03-15T11:00:00-08:00" \
591
+ --description "Quarterly planning session" \
592
+ --location "Conference Room A" \
593
+ --time_zone "America/Los_Angeles"
594
+
595
+ # Create an event with attendees (sends invitations)
596
+ gsk calendar create \
597
+ --summary "Interview" \
598
+ --start_time "2026-03-12T10:00:00-08:00" \
599
+ --end_time "2026-03-12T11:00:00-08:00" \
600
+ --attendees candidate@example.com interviewer@company.com
601
+
602
+ # Create on a specific calendar account
603
+ gsk calendar create --summary "Personal Event" --start_time "..." --end_time "..." -a user@gmail.com
604
+ ```
605
+
606
+ | Option | Default | Description |
607
+ |--------|---------|-------------|
608
+ | `--summary <title>` | — | Event title (**required**) |
609
+ | `--start_time <ISO8601>` | — | Start time with timezone offset (**required**) |
610
+ | `--end_time <ISO8601>` | — | End time with timezone offset (**required**) |
611
+ | `--description <text>` | — | Event description |
612
+ | `--location <text>` | — | Event location |
613
+ | `--attendees <emails...>` | — | Attendee email address(es) (sends invitations) |
614
+ | `--time_zone <tz>` | `UTC` | Timezone name (e.g., `America/Los_Angeles`) |
615
+ | `-a, --from_account <email>` | — | Calendar account email (for multi-account) |
616
+
359
617
  ## Local File Handling
360
618
 
361
619
  Most commands that accept URLs also accept local file paths. The CLI automatically uploads local files before passing them to the API:
package/dist/client.d.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * API Client for Genspark Tool CLI
3
3
  */
4
- import type { GlobalOptions, ApiResponse, ToolListResponse, FileUploadUrlRequest, FileUploadUrlResponse, FileDownloadRequest, FileDownloadResponse } from "./types.js";
4
+ import type { GlobalOptions, ApiResponse, ToolListResponse, UserInfo, FileUploadUrlRequest, FileUploadUrlResponse, FileDownloadRequest, FileDownloadResponse } from './types.js';
5
5
  /**
6
6
  * Make an unauthenticated request to the backend.
7
7
  * Used for device-flow auth endpoints that don't require an API key.
8
8
  */
9
- export declare function unauthenticatedRequest<T>(baseUrl: string, endpoint: string, method?: "GET" | "POST", body?: unknown): Promise<T>;
9
+ export declare function unauthenticatedRequest<T>(baseUrl: string, endpoint: string, method?: 'GET' | 'POST', body?: unknown): Promise<T>;
10
10
  export declare class ApiClient {
11
11
  private baseUrl;
12
12
  private apiKey;
@@ -15,6 +15,10 @@ export declare class ApiClient {
15
15
  private projectId?;
16
16
  constructor(options: GlobalOptions);
17
17
  private request;
18
+ /**
19
+ * Simple JSON request (non-streaming) for endpoints that return plain JSON.
20
+ */
21
+ private requestJson;
18
22
  /**
19
23
  * List available tools with full schemas
20
24
  */
@@ -31,5 +35,22 @@ export declare class ApiClient {
31
35
  * Get a downloadable URL for a file wrapper URL
32
36
  */
33
37
  getDownloadUrl(params: FileDownloadRequest): Promise<ApiResponse<FileDownloadResponse>>;
38
+ /**
39
+ * Get current user info (email, name, plan)
40
+ */
41
+ getMe(): Promise<UserInfo>;
42
+ /**
43
+ * Get OpenCode configuration JSON
44
+ */
45
+ getOpencodeConfig(model?: string): Promise<Record<string, unknown>>;
46
+ /**
47
+ * Streaming NDJSON request that processes lines as they arrive.
48
+ * Calls onDebug for each debug/heartbeat message and returns the final result.
49
+ * Suitable for long-running operations like phone calls.
50
+ */
51
+ requestStreaming<T>(endpoint: string, body: unknown, onDebug: (msg: {
52
+ message: string;
53
+ [key: string]: unknown;
54
+ }) => void): Promise<ApiResponse<T>>;
34
55
  }
35
56
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,KAAK,GAAG,MAAc,EAC9B,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,CAAC,CAAC,CAoBZ;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,SAAS,CAAC,CAAS;gBAEf,OAAO,EAAE,aAAa;YAQpB,OAAO;IA+JrB;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAS5C;;OAEG;IACG,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,WAAW,CAAC;IAIvB;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAQ9C;;OAEG;IACG,cAAc,CAClB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;CAG9C"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,YAAY,CAAA;AAEnB;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,KAAK,GAAG,MAAc,EAC9B,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,CAAC,CAAC,CAoBZ;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAC,CAAQ;gBAEd,OAAO,EAAE,aAAa;YAQpB,OAAO;IA+JrB;;OAEG;YACW,WAAW;IAoDzB;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAS5C;;OAEG;IACG,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,WAAW,CAAC;IAIvB;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAQ9C;;OAEG;IACG,cAAc,CAClB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAI7C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC;IAIhC;;OAEG;IACG,iBAAiB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAKzE;;;;OAIG;IACG,gBAAgB,CAAC,CAAC,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,KAAK,IAAI,GAClE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CAmG3B"}