@slkiser/opencode-quota 2.11.1 → 2.13.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.
Files changed (43) hide show
  1. package/README.md +45 -16
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/anthropic.d.ts +44 -34
  6. package/dist/lib/anthropic.d.ts.map +1 -1
  7. package/dist/lib/anthropic.js +393 -117
  8. package/dist/lib/anthropic.js.map +1 -1
  9. package/dist/lib/config.d.ts.map +1 -1
  10. package/dist/lib/config.js +9 -0
  11. package/dist/lib/config.js.map +1 -1
  12. package/dist/lib/entries.d.ts +1 -0
  13. package/dist/lib/entries.d.ts.map +1 -1
  14. package/dist/lib/minimax-auth.d.ts +29 -0
  15. package/dist/lib/minimax-auth.d.ts.map +1 -0
  16. package/dist/lib/minimax-auth.js +61 -0
  17. package/dist/lib/minimax-auth.js.map +1 -0
  18. package/dist/lib/provider-metadata.d.ts.map +1 -1
  19. package/dist/lib/provider-metadata.js +2 -0
  20. package/dist/lib/provider-metadata.js.map +1 -1
  21. package/dist/lib/quota-status.d.ts +1 -0
  22. package/dist/lib/quota-status.d.ts.map +1 -1
  23. package/dist/lib/quota-status.js +61 -0
  24. package/dist/lib/quota-status.js.map +1 -1
  25. package/dist/lib/types.d.ts +22 -0
  26. package/dist/lib/types.d.ts.map +1 -1
  27. package/dist/lib/types.js +1 -0
  28. package/dist/lib/types.js.map +1 -1
  29. package/dist/plugin.d.ts.map +1 -1
  30. package/dist/plugin.js +52 -23
  31. package/dist/plugin.js.map +1 -1
  32. package/dist/providers/anthropic.d.ts +2 -4
  33. package/dist/providers/anthropic.d.ts.map +1 -1
  34. package/dist/providers/anthropic.js +10 -6
  35. package/dist/providers/anthropic.js.map +1 -1
  36. package/dist/providers/minimax-coding-plan.d.ts +19 -0
  37. package/dist/providers/minimax-coding-plan.d.ts.map +1 -0
  38. package/dist/providers/minimax-coding-plan.js +219 -0
  39. package/dist/providers/minimax-coding-plan.js.map +1 -0
  40. package/dist/providers/registry.d.ts.map +1 -1
  41. package/dist/providers/registry.js +2 -0
  42. package/dist/providers/registry.js.map +1 -1
  43. package/package.json +1 -1
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  - Automatic quota toasts after assistant responses
6
6
  - Manual `/quota`, `/pricing_refresh`, and `/tokens_*` commands for deeper local reporting with zero context window pollution
7
7
 
8
- **Quota providers**: Anthropic (Claude), GitHub Copilot, OpenAI (Plus/Pro), Cursor, Qwen Code, Alibaba Coding Plan, Chutes AI, Firmware AI, Google Antigravity, Z.ai coding plan, and NanoGPT.
8
+ **Quota providers**: Anthropic (Claude), GitHub Copilot, OpenAI (Plus/Pro), Cursor, Qwen Code, Alibaba Coding Plan, MiniMax Coding Plan, Chutes AI, Firmware AI, Google Antigravity, Z.ai coding plan, and NanoGPT.
9
9
 
10
10
  **Token reports**: All models and providers in [models.dev](https://models.dev), plus deterministic local pricing for Cursor Auto/Composer and Cursor model aliases that are not on models.dev.
11
11
 
@@ -78,7 +78,7 @@ That is enough for most installs. Providers are auto-detected from your existing
78
78
 
79
79
  | Provider | Auto setup | How it works |
80
80
  | --- | --- | --- |
81
- | **Anthropic (Claude)** | Needs [quick setup](#anthropic-quick-setup) | Claude Code credentials or env. |
81
+ | **Anthropic (Claude)** | Needs [quick setup](#anthropic-quick-setup) | Local Claude CLI auth/status probe. |
82
82
  | **GitHub Copilot** | Usually | OpenCode auth; PAT only for managed billing. |
83
83
  | **OpenAI** | Yes | OpenCode auth. |
84
84
  | **Cursor** | Needs [quick setup](#cursor-quick-setup) | Companion auth plugin + `provider.cursor`. |
@@ -89,25 +89,24 @@ That is enough for most installs. Providers are auto-detected from your existing
89
89
  | **NanoGPT** | Usually | User/global OpenCode config, env, or auth.json. |
90
90
  | **Google Antigravity** | Needs [quick setup](#google-antigravity-quick-setup) | Companion auth plugin. |
91
91
  | **Z.ai** | Yes | OpenCode auth. |
92
+ | **MiniMax Coding Plan** | Yes | Existing OpenCode provider config + auth.json `minimax-coding-plan` section. |
92
93
 
93
94
  <a id="anthropic-quick-setup"></a>
94
95
  <details>
95
96
  <summary><strong>Quick setup: Anthropic (Claude)</strong></summary>
96
97
 
97
- Anthropic quota support uses Claude Code credentials and surfaces the 5-hour and 7-day rate-limit windows.
98
+ Anthropic quota support now checks the local Claude CLI instead of passing Claude consumer OAuth tokens directly to Anthropic APIs.
98
99
 
99
- Credential resolution order:
100
-
101
- 1. `~/.claude/.credentials.json` → `claudeAiOauth.accessToken`
102
- 2. `CLAUDE_CODE_OAUTH_TOKEN` environment variable
100
+ If Claude Code is already installed and authenticated, this usually works automatically. Otherwise:
103
101
 
104
- OpenCode `auth.json` is not used for Anthropic quota resolution.
102
+ 1. Install Claude Code so `claude` is available on your `PATH`.
103
+ 2. Run `claude auth login`.
104
+ 3. Confirm `claude auth status` succeeds locally.
105
+ 4. Confirm OpenCode is configured with the `anthropic` provider.
105
106
 
106
- If Claude Code is already installed and authenticated, this usually works automatically. Otherwise:
107
+ If Claude lives at a custom path, set `experimental.quotaToast.anthropicBinaryPath`. The default is `claude`.
107
108
 
108
- 1. Run Claude Code once so it writes `~/.claude/.credentials.json`.
109
- 2. If needed, set `CLAUDE_CODE_OAUTH_TOKEN` manually as a fallback.
110
- 3. Confirm OpenCode is configured with the `anthropic` provider.
109
+ If you use Anthropic via API key in OpenCode, model usage still works normally. This plugin only shows Anthropic quota rows when the local Claude CLI exposes quota windows.
111
110
 
112
111
  For behavior details and troubleshooting, see [Anthropic notes](#anthropic-notes).
113
112
 
@@ -202,14 +201,18 @@ There is no `/token` command. The reporting commands are the `/tokens_*` family.
202
201
  <details>
203
202
  <summary><strong>Anthropic (Claude)</strong></summary>
204
203
 
205
- Quota is fetched from `GET https://api.anthropic.com/api/oauth/usage` using a Claude Code OAuth access token.
204
+ The plugin probes the local Claude CLI with `anthropicBinaryPath --version` and `anthropicBinaryPath auth status`. By default `anthropicBinaryPath` is `claude`, so standard installs work without extra config. It does not pass Claude Free/Pro/Max OAuth tokens directly to Anthropic endpoints.
205
+
206
+ If the Claude CLI exposes 5-hour and 7-day quota windows in local structured output, the plugin shows them. If the CLI only exposes auth state, Anthropic quota rows are skipped and `/quota_status` explains why.
206
207
 
207
208
  **Troubleshooting:**
208
209
 
209
210
  | Problem | Solution |
210
211
  | --- | --- |
211
- | "No credentials found" | Run Claude Code once so it writes `~/.claude/.credentials.json`, or set `CLAUDE_CODE_OAUTH_TOKEN` |
212
- | "Invalid or expired token" | Refresh `~/.claude/.credentials.json` by re-authenticating Claude Code, or update `CLAUDE_CODE_OAUTH_TOKEN` |
212
+ | `claude` not found | Install Claude Code and make sure `claude` is on your `PATH` |
213
+ | Claude installed at a custom path | Set `experimental.quotaToast.anthropicBinaryPath` to the Claude executable path |
214
+ | Not authenticated | Run `claude auth login`, then confirm `claude auth status` works |
215
+ | Authenticated but no quota rows | Your local Claude CLI version did not expose quota windows; run `/quota_status` for the exact probe result |
213
216
  | Plugin not detected | Confirm OpenCode is configured with the `anthropic` provider |
214
217
 
215
218
  </details>
@@ -315,6 +318,31 @@ Example fallback tier:
315
318
 
316
319
  </details>
317
320
 
321
+
322
+ <a id="minimax-coding-plan-notes"></a>
323
+ <details>
324
+ <summary><strong>MiniMax Coding Plan</strong></summary>
325
+
326
+ If OpenCode is already configured with the `minimax-coding-plan` provider and your `auth.json` has a `minimax-coding-plan` entry, quota detection works automatically. No additional plugin is required.
327
+
328
+ The plugin reads `key` first and falls back to `access` from that auth entry. Quota is fetched from the MiniMax API using those stored credentials.
329
+
330
+ Example `auth.json` entry:
331
+
332
+ ```json
333
+ {
334
+ "minimax-coding-plan": {
335
+ "type": "api",
336
+ "key": "YOUR_MINIMAX_API_KEY"
337
+ }
338
+ }
339
+ ```
340
+
341
+ - `MiniMax-M*` models — rolling 5-hour interval + weekly
342
+ - `/quota_status` shows auth detection, API-key diagnostics, live quota state, and endpoint errors
343
+
344
+ </details>
345
+
318
346
  <a id="firmware-ai-notes"></a>
319
347
  <details>
320
348
  <summary><strong>Firmware AI</strong></summary>
@@ -418,6 +446,7 @@ Workspace-local config can still customize display/report behavior, but user/glo
418
446
  | `enableToast` | `true` | Show popup toasts |
419
447
  | `toastStyle` | `classic` | Toast layout: `classic` or `grouped` |
420
448
  | `enabledProviders` | `"auto"` | Auto-detect providers, or set an explicit provider list |
449
+ | `anthropicBinaryPath` | `"claude"` | Command/path used for local Claude CLI probing; override this for custom installs or shim locations |
421
450
  | `minIntervalMs` | `300000` | Minimum fetch interval between provider updates |
422
451
  | `toastDurationMs` | `9000` | Toast duration in milliseconds |
423
452
  | `showOnIdle` | `true` | Show toast on idle trigger |
@@ -479,7 +508,7 @@ MIT
479
508
 
480
509
  OpenCode Quota is not built by the OpenCode team and is not affiliated with OpenCode or any provider listed above.
481
510
 
482
- The Anthropic provider uses the documented OAuth usage endpoint with Claude Code credentials from `~/.claude/.credentials.json` or `CLAUDE_CODE_OAUTH_TOKEN`.
511
+ Anthropic quota detection is delegated to the local Claude CLI/runtime. OpenCode Anthropic API-key usage is unaffected, but this plugin only surfaces Anthropic quota rows when the local Claude CLI exposes them.
483
512
 
484
513
  ## Star History
485
514
 
package/dist/index.d.ts CHANGED
@@ -6,5 +6,5 @@
6
6
  * @packageDocumentation
7
7
  */
8
8
  export { QuotaToastPlugin } from "./plugin.js";
9
- export type { QuotaToastConfig, GoogleModelId, PricingSnapshotSource, CopilotEnterpriseUsageResult, CopilotOrganizationUsageResult, CopilotQuotaResult, GoogleQuotaResult, GoogleModelQuota, } from "./lib/types.js";
9
+ export type { QuotaToastConfig, GoogleModelId, PricingSnapshotSource, CopilotEnterpriseUsageResult, CopilotOrganizationUsageResult, CopilotQuotaResult, GoogleQuotaResult, GoogleModelQuota, MiniMaxResult, MiniMaxResultEntry, } from "./lib/types.js";
10
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACrB,4BAA4B,EAC5B,8BAA8B,EAC9B,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACrB,4BAA4B,EAC5B,8BAA8B,EAC9B,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,GACnB,MAAM,gBAAgB,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,8EAA8E;AAC9E,iFAAiF;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAc/C,yEAAyE;AACzE,wCAAwC;AAExC,6EAA6E;AAC7E,uFAAuF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,8EAA8E;AAC9E,iFAAiF;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAgB/C,yEAAyE;AACzE,wCAAwC;AAExC,6EAA6E;AAC7E,uFAAuF"}
@@ -1,20 +1,23 @@
1
1
  /**
2
- * Anthropic Claude quota fetcher.
2
+ * Anthropic Claude quota probing.
3
3
  *
4
- * Reads a Claude Code OAuth access token from local Claude credentials and
5
- * queries the Anthropic usage API to surface 5-hour and 7-day rate-limit
6
- * windows.
7
- *
8
- * Supported credential sources:
9
- * 1. ~/.claude/.credentials.json → claudeAiOauth.accessToken
10
- * 2. CLAUDE_CODE_OAUTH_TOKEN environment variable
4
+ * Uses the local Claude CLI/runtime to detect install/auth state and surface
5
+ * quota windows only when the official runtime exposes them locally. This
6
+ * module does not read Claude consumer OAuth tokens or call Anthropic's OAuth
7
+ * usage endpoint directly.
11
8
  */
12
- declare const CREDENTIALS_PATH: string;
13
9
  export interface AnthropicQuotaWindow {
14
- /** Used percentage [0..100]. */
15
- used_percentage: number;
16
- /** ISO timestamp when this window resets. */
17
- resets_at: string;
10
+ utilization?: number;
11
+ used_percentage?: number;
12
+ usedPercentage?: number;
13
+ used_percent?: number;
14
+ usedPercent?: number;
15
+ percent_used?: number;
16
+ percentUsed?: number;
17
+ resets_at?: string;
18
+ resetsAt?: string;
19
+ reset_at?: string;
20
+ resetAt?: string;
18
21
  }
19
22
  export interface AnthropicUsageResponse {
20
23
  five_hour: AnthropicQuotaWindow;
@@ -36,28 +39,35 @@ export interface AnthropicQuotaError {
36
39
  error: string;
37
40
  }
38
41
  export type AnthropicResult = AnthropicQuotaResult | AnthropicQuotaError | null;
39
- interface ClaudeCredentials {
40
- claudeAiOauth?: {
41
- accessToken?: string;
42
- expiresAt?: number;
43
- };
42
+ export type AnthropicAuthStatus = "authenticated" | "unauthenticated" | "unknown";
43
+ export type AnthropicQuotaSource = "claude-auth-status-json" | "none";
44
+ export interface AnthropicDiagnostics {
45
+ installed: boolean;
46
+ version: string | null;
47
+ authStatus: AnthropicAuthStatus;
48
+ quotaSupported: boolean;
49
+ quotaSource: AnthropicQuotaSource;
50
+ checkedCommands: string[];
51
+ message?: string;
52
+ quota?: AnthropicQuotaResult;
44
53
  }
45
- export interface ResolvedAnthropicCredentials {
46
- accessToken: string;
47
- expiresAt?: number;
48
- source: "file" | "env";
54
+ export interface AnthropicProbeOptions {
55
+ binaryPath?: string;
49
56
  }
50
- declare function readCredentialsFile(): ClaudeCredentials | null;
51
- export declare function resolveAnthropicCredentialsFromFile(credentials: ClaudeCredentials | null | undefined): ResolvedAnthropicCredentials | null;
52
- export declare function resolveAnthropicCredentials(): Promise<ResolvedAnthropicCredentials | null>;
53
- export declare function hasAnthropicCredentialsConfigured(): Promise<boolean>;
57
+ export type ClaudeCommandInvocation = {
58
+ file: string;
59
+ args: string[];
60
+ display: string;
61
+ };
62
+ export declare function resolveAnthropicBinaryPath(binaryPath?: string): string;
63
+ export declare function buildClaudeCommandInvocation(binaryPath: string, args: string[], runtime?: {
64
+ platform?: NodeJS.Platform;
65
+ comspec?: string;
66
+ }): ClaudeCommandInvocation;
54
67
  declare function parseUsageResponse(data: unknown): AnthropicQuotaResult | null;
55
- /**
56
- * Query the Anthropic OAuth usage API for Claude rate-limit windows.
57
- *
58
- * Returns null when no credentials are found (provider not configured).
59
- * Returns an error result when credentials exist but the fetch fails.
60
- */
61
- export declare function queryAnthropicQuota(): Promise<AnthropicResult>;
62
- export { CREDENTIALS_PATH, parseUsageResponse, readCredentialsFile };
68
+ export declare function clearAnthropicDiagnosticsCacheForTests(): void;
69
+ export declare function getAnthropicDiagnostics(options?: AnthropicProbeOptions): Promise<AnthropicDiagnostics>;
70
+ export declare function hasAnthropicCredentialsConfigured(options?: AnthropicProbeOptions): Promise<boolean>;
71
+ export declare function queryAnthropicQuota(options?: AnthropicProbeOptions): Promise<AnthropicResult>;
72
+ export { parseUsageResponse };
63
73
  //# sourceMappingURL=anthropic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/lib/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,QAAA,MAAM,gBAAgB,QAAkD,CAAC;AAMzE,MAAM,WAAW,oBAAoB;IACnC,gCAAgC;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,oBAAoB,CAAC;IAChC,SAAS,EAAE,oBAAoB,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,SAAS,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAChE;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG,mBAAmB,GAAG,IAAI,CAAC;AAEhF,UAAU,iBAAiB;IACzB,aAAa,CAAC,EAAE;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;CACxB;AAUD,iBAAS,mBAAmB,IAAI,iBAAiB,GAAG,IAAI,CAWvD;AAED,wBAAgB,mCAAmC,CACjD,WAAW,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,GAChD,4BAA4B,GAAG,IAAI,CAgBrC;AAED,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,4BAA4B,GAAG,IAAI,CAAC,CAEhG;AAED,wBAAsB,iCAAiC,IAAI,OAAO,CAAC,OAAO,CAAC,CAE1E;AAwBD,iBAAS,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,oBAAoB,GAAG,IAAI,CAyBtE;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,eAAe,CAAC,CAyEpE;AAED,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,CAAC"}
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/lib/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,oBAAoB,CAAC;IAChC,SAAS,EAAE,oBAAoB,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,SAAS,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAChE;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG,mBAAmB,GAAG,IAAI,CAAC;AAChF,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAAG,iBAAiB,GAAG,SAAS,CAAC;AAClF,MAAM,MAAM,oBAAoB,GAAG,yBAAyB,GAAG,MAAM,CAAC;AAEtE,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,mBAAmB,CAAC;IAChC,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,oBAAoB,CAAC;IAClC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAWD,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAiBF,wBAAgB,0BAA0B,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAGtE;AAgBD,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7D,uBAAuB,CAiBzB;AAsHD,iBAAS,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,oBAAoB,GAAG,IAAI,CAiBtE;AAwRD,wBAAgB,sCAAsC,IAAI,IAAI,CAE7D;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CA6C/B;AAED,wBAAsB,iCAAiC,CACrD,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,eAAe,CAAC,CAY1B;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC"}