@neetru/cli 2.4.0 → 2.6.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 +93 -148
- package/dist/commands/artifact-registry.d.ts +7 -0
- package/dist/commands/artifact-registry.js +60 -0
- package/dist/commands/artifact-registry.js.map +1 -0
- package/dist/commands/bootstrap.d.ts +7 -0
- package/dist/commands/bootstrap.js +328 -0
- package/dist/commands/bootstrap.js.map +1 -0
- package/dist/commands/env.d.ts +11 -0
- package/dist/commands/env.js +91 -0
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/hosting-write.d.ts +6 -0
- package/dist/commands/hosting-write.js +52 -0
- package/dist/commands/hosting-write.js.map +1 -0
- package/dist/commands/logs.d.ts +2 -0
- package/dist/commands/logs.js +201 -28
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/ops.d.ts +58 -0
- package/dist/commands/ops.js +359 -0
- package/dist/commands/ops.js.map +1 -0
- package/dist/index.js +97 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,192 +1,137 @@
|
|
|
1
1
|
# @neetru/cli
|
|
2
2
|
|
|
3
|
-
> Developer Kit oficial da Neetru —
|
|
3
|
+
> Developer Kit oficial da Neetru — scaffolding, IA Neetru-aware, deploy de produtos SaaS, gestão de workspaces, bancos isolados por produto, e mais 40+ comandos pra operar todo o ecossistema Neetru via terminal.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
<p>
|
|
6
|
+
<img alt="npm" src="https://img.shields.io/npm/v/@neetru/cli?logo=npm">
|
|
7
|
+
<img alt="downloads" src="https://img.shields.io/npm/dm/@neetru/cli?logo=npm">
|
|
8
|
+
<img alt="Node" src="https://img.shields.io/badge/node-%3E%3D22-339933?logo=node.js&logoColor=white">
|
|
9
|
+
<img alt="license" src="https://img.shields.io/badge/license-MIT-22c55e">
|
|
10
|
+
</p>
|
|
6
11
|
|
|
7
12
|
## Instalação
|
|
8
13
|
|
|
9
14
|
```bash
|
|
10
15
|
npm install -g @neetru/cli
|
|
11
|
-
neetru --version
|
|
12
16
|
```
|
|
13
17
|
|
|
14
|
-
|
|
18
|
+
Bootstrap completo da máquina dev (Node, gcloud, Docker, Firebase CLI, deps NPM, GCP ADC):
|
|
15
19
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
> **Novo em `2.2.0`?** Veja [v2.2.0 — Fluxo end-to-end](#v220--fluxo-end-to-end) abaixo: 5 comandos novos que fecham o bootstrap completo no terminal.
|
|
19
|
-
|
|
20
|
-
## Topologia de produto Neetru
|
|
21
|
-
|
|
22
|
-
```
|
|
23
|
-
┌─────────────┐ build/promote ┌──────────────┐
|
|
24
|
-
│ Workspace │ ─────────────────► │ Server (VM) │
|
|
25
|
-
│ prototipação│ │ ou Cloud Run│
|
|
26
|
-
│ no Core │ │ produção │
|
|
27
|
-
└─────────────┘ └──────────────┘
|
|
28
|
-
neetru neetru
|
|
29
|
-
status / logs / open build / deploy
|
|
20
|
+
```bash
|
|
21
|
+
neetru bootstrap
|
|
30
22
|
```
|
|
31
23
|
|
|
32
|
-
|
|
33
|
-
- **Server / Cloud Run** = ambiente físico de produção. Quando o produto matura no workspace, você empacota (`neetru build`) e promove (`neetru deploy`) pra VM gerenciada pelo agent ou Cloud Run.
|
|
34
|
-
|
|
35
|
-
## Começo rápido
|
|
24
|
+
Login no Core via OAuth Device Code Flow:
|
|
36
25
|
|
|
37
26
|
```bash
|
|
38
|
-
# 1. Login (abre browser para Device Code OAuth)
|
|
39
27
|
neetru login
|
|
40
|
-
|
|
41
|
-
# 2. Valida config + conexão
|
|
42
|
-
neetru validate
|
|
43
|
-
|
|
44
|
-
# 3. Cria um projeto novo
|
|
45
|
-
neetru init meu-saas --type nextjs
|
|
46
|
-
cd meu-saas
|
|
47
|
-
|
|
48
|
-
# 4. Vê status do workspace (se você já tem um criado em UI Core)
|
|
49
|
-
neetru status --client-id <oauthClientId>
|
|
50
|
-
|
|
51
|
-
# 5. Acompanha logs em tempo real
|
|
52
|
-
neetru logs --client-id <oauthClientId> -f
|
|
53
|
-
|
|
54
|
-
# 6. Quando estiver pronto pra produção: publica no catálogo + builda + deploya
|
|
55
|
-
neetru publish --draft
|
|
56
|
-
neetru build
|
|
57
|
-
neetru deploy --target=vm
|
|
58
28
|
```
|
|
59
29
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
A linha `2.2.0` (2026-05-16) fecha o ciclo completo de bootstrap de um SaaS Neetru a partir do terminal — antes, criar produto + workspace exigia ida à UI staff.
|
|
63
|
-
|
|
64
|
-
| Comando | O que faz | Doc |
|
|
65
|
-
|---|---|---|
|
|
66
|
-
| `neetru products create` | Registra um produto novo em `products/{id}` (registry interno do ProductOS). | [`products.md`](../docs/sistema/manuais/devex/cli-reference/products.md) |
|
|
67
|
-
| `neetru workspaces list` | Lista workspaces com filtros (`--product`, `--customer`, `--env`, `--status`). | [`workspaces.md`](../docs/sistema/manuais/devex/cli-reference/workspaces.md) |
|
|
68
|
-
| `neetru workspaces get <id>` | Detalhes completos de um workspace (sem expor `oauthClientSecret`). | [`workspaces.md`](../docs/sistema/manuais/devex/cli-reference/workspaces.md) |
|
|
69
|
-
| `neetru workspaces open <id>` | Abre o painel `/workspaces/<id>` no browser (best-effort cross-platform). | [`workspaces.md`](../docs/sistema/manuais/devex/cli-reference/workspaces.md) |
|
|
70
|
-
| `neetru new <name>` | **Macro end-to-end:** produto + workspace + scaffold local + abre browser. Pra prototipagem rápida e onboarding. | [`new-macro.md`](../docs/sistema/manuais/devex/cli-reference/new-macro.md) |
|
|
30
|
+
Validar estado:
|
|
71
31
|
|
|
72
32
|
```bash
|
|
73
|
-
|
|
74
|
-
neetru new pedidos-pro
|
|
75
|
-
cd pedidos-pro && npm install && npm run dev
|
|
33
|
+
neetru doctor
|
|
76
34
|
```
|
|
77
35
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
## Comandos
|
|
81
|
-
|
|
82
|
-
### Auth
|
|
83
|
-
|
|
84
|
-
| Comando | O que faz |
|
|
85
|
-
|---|---|
|
|
86
|
-
| `neetru login` | Device Code OAuth (RFC 8628). Abre browser. `--token nrt_…` para CI. |
|
|
87
|
-
| `neetru logout` | Apaga credenciais locais. |
|
|
88
|
-
| `neetru whoami` | Mostra identidade da chave atual. `--json` para scripts. |
|
|
89
|
-
|
|
90
|
-
### Produtos (registry interno — ProductOS)
|
|
91
|
-
|
|
92
|
-
| Comando | O que faz |
|
|
93
|
-
|---|---|
|
|
94
|
-
| `neetru products create` | Cria produto em `products/{id}` (interativo ou via flags). v2.2.0. |
|
|
95
|
-
| `neetru products list` | Lista produtos do registry interno. `--status`, `--limit`, `--json`. |
|
|
96
|
-
| `neetru products publish <slug>` | Toggle visibility do catálogo público para um produto já cadastrado. |
|
|
97
|
-
| `neetru products unpublish <slug>` | Esconde da landing (mantém doc). |
|
|
98
|
-
| `neetru products db ...` | Per-product database management (Phase A — 8 subcomandos). |
|
|
99
|
-
|
|
100
|
-
### Workspaces (prototipação no Core)
|
|
36
|
+
## Quickstart — criar produto SaaS novo
|
|
101
37
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
| `neetru workspaces create` | Cria workspace vinculado a (produto × customer × env). |
|
|
106
|
-
| `neetru workspaces list` | Lista workspaces com filtros. v2.2.0. |
|
|
107
|
-
| `neetru workspaces get <id>` | Detalhes completos. v2.2.0. |
|
|
108
|
-
| `neetru workspaces open <id>` | Abre `/workspaces/<id>` no browser. v2.2.0. |
|
|
109
|
-
| `neetru workspaces advance <id>` | Promove bundle version no workspace. |
|
|
110
|
-
| `neetru init <name>` | Scaffold de projeto Next.js ou Node API. `--type nextjs\|node-api`. |
|
|
111
|
-
| `neetru status --client-id <id>` | Status do workspace: build/deploy último, domínio, tier. `--json` para scripts. |
|
|
112
|
-
| `neetru logs --client-id <id>` | Logs do workspace; `-f` follow, `-n` lines, `--since 30m`, `--level error`. |
|
|
113
|
-
| `neetru validate` | Health check da config local + conexão com Core. |
|
|
114
|
-
| `neetru open [target]` | Abre página do painel: `dashboard\|builds\|logs\|workspaces\|products\|servers`. |
|
|
115
|
-
| `neetru config set <key> <value>` | Define configuração local. |
|
|
116
|
-
| `neetru config get [key]` | Lê configuração. Sem arg = lista tudo. |
|
|
117
|
-
| `neetru config path` | Mostra caminho do arquivo de config. |
|
|
118
|
-
|
|
119
|
-
### Catálogo
|
|
38
|
+
```bash
|
|
39
|
+
neetru new gestovendas --env=dev --tier=dev --customer=neetru
|
|
40
|
+
```
|
|
120
41
|
|
|
121
|
-
|
|
122
|
-
|---|---|
|
|
123
|
-
| `neetru publish` | Registra produto em `public_products/`. `--draft` para não aparecer público. |
|
|
124
|
-
| `neetru publish --unpublish` | Despublica (mantém doc). |
|
|
42
|
+
Cria produto + workspace + scaffold local Next.js 15 + instala deps + abre cockpit no browser.
|
|
125
43
|
|
|
126
|
-
|
|
44
|
+
## Comandos principais
|
|
127
45
|
|
|
128
46
|
| Comando | O que faz |
|
|
129
47
|
|---|---|
|
|
130
|
-
| `neetru
|
|
131
|
-
| `neetru
|
|
132
|
-
|
|
133
|
-
|
|
48
|
+
| `neetru bootstrap` | Setup da máquina dev (binários + deps + ADC) |
|
|
49
|
+
| `neetru login` / `logout` / `whoami` | Auth OAuth Device Code Flow |
|
|
50
|
+
| `neetru doctor` | Diagnóstico saúde (5 checks rápidos) |
|
|
51
|
+
| `neetru new <slug>` | Criar produto completo (registry + workspace + scaffold) |
|
|
52
|
+
| `neetru init <name>` | Só scaffold local Next.js + Firebase |
|
|
53
|
+
| `neetru add <feature>` | Adicionar features ao scaffold (auth, billing, etc) |
|
|
54
|
+
| `neetru deploy` | Pipeline de deploy interativo (cloud-run / vm / workspace) |
|
|
55
|
+
| `neetru build` | Empacotar produto em tarball pra deploy |
|
|
56
|
+
| `neetru promote` | Promover dev → staging → prod |
|
|
57
|
+
| `neetru env switch <target>` | Trocar `NEETRU_ENV` no `.env.local` |
|
|
58
|
+
| `neetru env set --service=X --set KEY=VAL` | Setar env vars de serviço Cloud Run |
|
|
59
|
+
| `neetru ar create <name>` | Criar repositório Artifact Registry |
|
|
60
|
+
| `neetru hosting create-mapping --service=X --domain=Y` | Domain mapping |
|
|
61
|
+
| `neetru db create --product=X --engine=postgres` | Criar banco por produto |
|
|
62
|
+
| `neetru db engines` | Listar engines disponíveis (firestore, postgres, mysql) |
|
|
63
|
+
| `neetru cloud-run pause/resume/delete <service>` | Controle Cloud Run |
|
|
64
|
+
| `neetru products list/create/update` | Registry de produtos |
|
|
65
|
+
| `neetru workspaces create/list/get/advance` | Instâncias por cliente |
|
|
66
|
+
| `neetru deployments create/rollback` | Histórico de deploys |
|
|
67
|
+
| `neetru tenants list/create/update/suspend` | Gerenciar tenants |
|
|
68
|
+
| `neetru audit tail` | Tail de `audit_logs/` em tempo real |
|
|
69
|
+
| `neetru billing summary` | Resumo de billing |
|
|
70
|
+
| `neetru servers list/provision/deactivate` | Gerenciar servidores |
|
|
71
|
+
| `neetru agent release/yank/canary` | Gerenciar releases do agente |
|
|
72
|
+
| `neetru support tickets list/reply/assign` | Suporte inbox staff |
|
|
73
|
+
| `neetru dns zones list` / `hosting list` | Listar DNS + customer domains |
|
|
74
|
+
| `neetru builds list` | Listar Cloud Build |
|
|
75
|
+
| `neetru dr exports/restore` | Disaster Recovery |
|
|
76
|
+
| `neetru logs` | Ver logs de produtos |
|
|
77
|
+
| `neetru status` | Visão geral do ecossistema |
|
|
78
|
+
| `neetru open <produto>` | Abrir cockpit do produto no browser |
|
|
79
|
+
| `neetru ai` | REPL IA Neetru-aware (Claude/OpenAI/Gemini) |
|
|
80
|
+
| `neetru ui` | Menu interativo do CLI |
|
|
81
|
+
| `neetru publish` | Publicar produto no catálogo público |
|
|
82
|
+
| `neetru fn deploy` | Deploy de Cloud Functions |
|
|
83
|
+
| `neetru upgrade` | Auto-update do CLI |
|
|
84
|
+
| `neetru autocomplete <bash\|zsh\|pwsh>` | Gerar script autocomplete |
|
|
85
|
+
|
|
86
|
+
**Atalhos:** `neetru ar` = `artifact-registry`, `neetru menu` = `ui`.
|
|
87
|
+
|
|
88
|
+
40+ subcomandos. Quase todos suportam `--json` pra automação.
|
|
134
89
|
|
|
135
|
-
|
|
136
|
-
|---|---|
|
|
137
|
-
| `neetru ai` | REPL interativo Claude/OpenAI/Gemini com contexto Neetru-aware. `--model auto\|claude\|openai\|gemini`. |
|
|
90
|
+
## Configuração
|
|
138
91
|
|
|
139
|
-
|
|
92
|
+
Config persiste em `~/.config/neetru-cli/` (Linux/macOS) ou `%APPDATA%\neetru-cli\` (Windows):
|
|
140
93
|
|
|
141
|
-
|
|
|
94
|
+
| Chave | Valor |
|
|
142
95
|
|---|---|
|
|
143
|
-
| `
|
|
144
|
-
| `
|
|
145
|
-
| `
|
|
146
|
-
| `neetru config set telemetry.enabled <true\|false>` | Telemetria opt-in (default off). Quando true, CLI envia eventos anonimizados pra `POST /sdk/v1/telemetry/log`. Nunca envia tokens, paths absolutos ou conteúdo de arquivos. |
|
|
96
|
+
| `neetruApiKey` | Token Bearer `nrt_<keyId>_<secret>` (gerado por `neetru login`) |
|
|
97
|
+
| `coreUrl` | URL base do Core (default `https://core.neetru.com`) |
|
|
98
|
+
| `telemetry.enabled` | Telemetry opt-in (default `false`) |
|
|
147
99
|
|
|
148
|
-
|
|
100
|
+
```bash
|
|
101
|
+
neetru config set telemetry.enabled true
|
|
102
|
+
neetru config get coreUrl
|
|
103
|
+
neetru config path # mostra caminho do config file
|
|
104
|
+
```
|
|
149
105
|
|
|
150
|
-
|
|
106
|
+
## Output JSON
|
|
151
107
|
|
|
152
108
|
```bash
|
|
153
|
-
|
|
154
|
-
|
|
109
|
+
neetru products list --json | jq '.[] | select(.status == "ativo")'
|
|
110
|
+
neetru audit tail --json | jq 'select(.action | startswith("billing"))'
|
|
155
111
|
```
|
|
156
112
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
```json
|
|
160
|
-
{
|
|
161
|
-
"$schema": "https://neetru.com/schema/neetru.config.json",
|
|
162
|
-
"slug": "meu-saas",
|
|
163
|
-
"name": "Meu SaaS",
|
|
164
|
-
"runtime": "nextjs",
|
|
165
|
-
"publish": {
|
|
166
|
-
"tagline": "Resumo curto, 2-120 chars",
|
|
167
|
-
"description": "Descrição detalhada, 10-2000 chars",
|
|
168
|
-
"iconKey": "spark",
|
|
169
|
-
"status": "soon",
|
|
170
|
-
"order": 100
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
```
|
|
113
|
+
## Auth & Segurança
|
|
174
114
|
|
|
175
|
-
|
|
115
|
+
- **OAuth Device Code Flow** (RFC 8628) pra login interativo — não armazena password
|
|
116
|
+
- **Tokens** salvos em `conf` cross-platform, permissões 0600 em Unix
|
|
117
|
+
- **Rate-limit** por método HTTP: GET 120/min, POST/PUT/PATCH 30/min, DELETE 5/min
|
|
118
|
+
- **Step-up MFA** (TOTP) obrigatório em operações destrutivas: `--mfa-token <code>` ou prompt
|
|
119
|
+
- **Dry-run** disponível em comandos de mutação: `--dry-run` mostra efeito SEM aplicar
|
|
176
120
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
| 4 | erro de servidor ou rede |
|
|
184
|
-
| 5 | recurso não implementado |
|
|
121
|
+
## Stack
|
|
122
|
+
|
|
123
|
+
- TypeScript 5 ESM-first
|
|
124
|
+
- Node 22+ (LTS)
|
|
125
|
+
- Sem `node-fetch`/`axios`: fetch global nativo
|
|
126
|
+
- Commander 11 (CLI framework) + Inquirer 12 (prompts) + Chalk 5 + Ora (spinners)
|
|
185
127
|
|
|
186
|
-
##
|
|
128
|
+
## Mais info
|
|
187
129
|
|
|
188
|
-
|
|
130
|
+
- **Repo:** [github.com/Neetru/neetru-core](https://github.com/Neetru/neetru-core)
|
|
131
|
+
- **Docs:** [docs.neetru.com](https://docs.neetru.com)
|
|
132
|
+
- **SDK complementar:** `npm install @neetru/sdk`
|
|
133
|
+
- **Issues / suporte:** abrir issue no repo ou `neetru support`
|
|
189
134
|
|
|
190
|
-
##
|
|
135
|
+
## Licença
|
|
191
136
|
|
|
192
|
-
MIT © Neetru
|
|
137
|
+
MIT © Neetru
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type StepUpOptions } from '../lib/cli-write.js';
|
|
2
|
+
export interface ArtifactRegistryCreateOptions extends StepUpOptions {
|
|
3
|
+
location?: string;
|
|
4
|
+
format?: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function runArtifactRegistryCreate(name: string, opts: ArtifactRegistryCreateOptions): Promise<void>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `neetru artifact-registry create <name>` — cria repositório no Artifact Registry.
|
|
3
|
+
*
|
|
4
|
+
* Use case típico: setup one-shot por produto SaaS antes do primeiro deploy.
|
|
5
|
+
* Após criado, `docker push <location>-docker.pkg.dev/neetru/<name>/<image>:<tag>`
|
|
6
|
+
* passa a funcionar.
|
|
7
|
+
*
|
|
8
|
+
* Endpoint: POST /api/cli/v1/artifact-registry
|
|
9
|
+
* body: { name, location, format?, description? }
|
|
10
|
+
*
|
|
11
|
+
* Não exige step-up MFA (criação não-destrutiva). Admin only.
|
|
12
|
+
*/
|
|
13
|
+
import ora from 'ora';
|
|
14
|
+
import { apiRequest } from '../lib/api-client.js';
|
|
15
|
+
import { requireToken, handleApiError, printWriteResult, } from '../lib/cli-write.js';
|
|
16
|
+
import { log } from '../utils/logger.js';
|
|
17
|
+
export async function runArtifactRegistryCreate(name, opts) {
|
|
18
|
+
if (!name) {
|
|
19
|
+
log.error('Uso: neetru artifact-registry create <name> [--location=us-central1] [--format=DOCKER]');
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
const location = opts.location ?? 'us-central1';
|
|
23
|
+
const format = (opts.format ?? 'DOCKER').toUpperCase();
|
|
24
|
+
const token = await requireToken(opts.json);
|
|
25
|
+
const spinner = opts.json
|
|
26
|
+
? null
|
|
27
|
+
: ora({
|
|
28
|
+
text: `Criando repositório ${name} em ${location} (${format})…`,
|
|
29
|
+
color: 'blue',
|
|
30
|
+
}).start();
|
|
31
|
+
const path = `/api/cli/v1/artifact-registry${opts.dryRun ? '?dryRun=true' : ''}`;
|
|
32
|
+
let res;
|
|
33
|
+
try {
|
|
34
|
+
res = await apiRequest(path, {
|
|
35
|
+
method: 'POST',
|
|
36
|
+
token,
|
|
37
|
+
body: { name, location, format, description: opts.description },
|
|
38
|
+
});
|
|
39
|
+
spinner?.stop();
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
spinner?.fail('Falha ao criar repositório.');
|
|
43
|
+
handleApiError(error, opts.json);
|
|
44
|
+
}
|
|
45
|
+
const humanMessage = res.done
|
|
46
|
+
? `Repositório ${res.name} criado em ${res.location}. Push: ${res.pushExample}`
|
|
47
|
+
: `Criação iniciada — operação ${res.operationName ?? '(?)'} ainda em andamento. Confirme via Console ou aguarde uns segundos antes do primeiro push.`;
|
|
48
|
+
printWriteResult(res.dryRun
|
|
49
|
+
? res
|
|
50
|
+
: {
|
|
51
|
+
name: res.name,
|
|
52
|
+
location: res.location,
|
|
53
|
+
format: res.format,
|
|
54
|
+
done: res.done,
|
|
55
|
+
operationName: res.operationName,
|
|
56
|
+
dockerHost: res.dockerHost,
|
|
57
|
+
pushExample: res.pushExample,
|
|
58
|
+
}, humanMessage, opts.json);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=artifact-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-registry.js","sourceRoot":"","sources":["../../src/commands/artifact-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,GAEjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAQzC,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,IAAY,EACZ,IAAmC;IAEnC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,GAAG,CAAC,KAAK,CAAC,wFAAwF,CAAC,CAAC;QACpG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,aAAa,CAAC;IAChD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAEvD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI;QACvB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,GAAG,CAAC;YACF,IAAI,EAAE,uBAAuB,IAAI,OAAO,QAAQ,KAAK,MAAM,IAAI;YAC/D,KAAK,EAAE,MAAM;SACd,CAAC,CAAC,KAAK,EAAE,CAAC;IAEf,MAAM,IAAI,GAAG,gCAAgC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAEjF,IAAI,GAWH,CAAC;IACF,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,KAAK;YACL,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;SAChE,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC7C,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI;QAC3B,CAAC,CAAC,eAAe,GAAG,CAAC,IAAI,cAAc,GAAG,CAAC,QAAQ,WAAW,GAAG,CAAC,WAAW,EAAE;QAC/E,CAAC,CAAC,+BAA+B,GAAG,CAAC,aAAa,IAAI,KAAK,2FAA2F,CAAC;IAEzJ,gBAAgB,CACd,GAAG,CAAC,MAAM;QACR,CAAC,CAAC,GAAG;QACL,CAAC,CAAC;YACE,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,WAAW,EAAE,GAAG,CAAC,WAAW;SAC7B,EACL,YAAY,EACZ,IAAI,CAAC,IAAI,CACV,CAAC;AACJ,CAAC"}
|