Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
83849f9
feat(security): rate-limit public share endpoint + security headers (…
DavidsonGomes Apr 25, 2026
bca4ed0
feat(plugins): B2.0 public_pages capability — read-only token-bound p…
DavidsonGomes Apr 25, 2026
b5a2948
feat(plugins): B3 safe_uninstall — 3-step wizard, orphan table preser…
DavidsonGomes Apr 25, 2026
b7ce9aa
feat(plugins): writable_data requires_role + readonly_data current_us…
DavidsonGomes Apr 25, 2026
2b11701
feat(plugins): public_pages content negotiation — HTML shell for brow…
DavidsonGomes Apr 25, 2026
4511281
release: v0.33.0 — plugin contract bundle + install error surfacing (…
DavidsonGomes Apr 26, 2026
a567fd4
feat(providers): chat tool-calling via openclaude + explicit provider…
sistemabritto Jun 12, 2026
7224be3
fix(providers): derive NVIDIA_API_KEY for NVIDIA NIM base URLs
sistemabritto Jun 12, 2026
16eefb1
feat(providers): NVIDIA NIM image generation + hardening fixes
sistemabritto Jun 12, 2026
1525431
chore(deps): sync uv.lock with pyproject (flask-limiter)
sistemabritto Jun 12, 2026
f434803
feat(chat): rate-limited fetch with retry/backoff for OpenAI-compatib…
sistemabritto Jun 12, 2026
bf63d06
fix(dashboard): auto-reconnect agent terminal/chat WebSocket
sistemabritto Jun 12, 2026
dcacb4a
feat(terminal): conversation resume + per-tier agent models + provide…
sistemabritto Jun 12, 2026
afda74c
fix(dashboard): /costs page crash on image cost entries without token…
sistemabritto Jun 13, 2026
313a6ae
feat(skills): OpenAI Images API provider (gpt-image-2) in ai-image-cr…
sistemabritto Jun 13, 2026
d30e26e
docs(terminal): codexplan comment reflects gpt-5.5 mapping in opencla…
sistemabritto Jun 13, 2026
c8b722f
feat(dashboard): gpt-image-2 pricing with split token billing in imag…
sistemabritto Jun 13, 2026
abc351d
chore(gitignore): exclude private root workspace dirs, backups, and c…
sistemabritto Jun 13, 2026
dc729d9
feat(heartbeats): in-process handlers + provider fallback engine foun…
sistemabritto Jun 13, 2026
9cde198
feat(skills): int-evohub integration + social-ai-trends-blog pipeline
sistemabritto Jun 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions .claude/skills/ai-image-creator/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,23 @@ When the user mentions a model keyword in their image request, use the correspon
| `flux2` | [FLUX.2 Max](https://openrouter.ai/black-forest-labs/flux.2-max) | "flux2", "flux", "use flux" |
| `seedream` | [ByteDance SeedDream 4.5](https://openrouter.ai/bytedance-seed/seedream-4.5) | "seedream", "use seedream" |
| `gpt5` | [OpenAI GPT-5 Image](https://openrouter.ai/openai/gpt-5-image) | "gpt5", "gpt5 image", "use gpt5" |
| `nvidia-flux2-klein-4b` | BFL FLUX.2 Klein 4B via NVIDIA NIM (default for `--provider nvidia`) | "nvidia", "flux nvidia", "nvidia flux2" |
| `nvidia-flux-dev` | BFL FLUX.1-dev via NVIDIA NIM (30 steps, high quality) | "nvidia flux dev" |
| `nvidia-flux-schnell` | BFL FLUX.1-schnell via NVIDIA NIM (4 steps, fastest) | "nvidia schnell", "flux rápido" |
| `image2` | OpenAI GPT Image 2 via Images API direta (default for `--provider openai`) | "image2", "gpt image 2", "imagem openai" |

**OpenAI Images API notes (`image2`):**
- Requires a **platform API key** (`AI_IMG_CREATOR_OPENAI_KEY` or `OPENAI_API_KEY`, billing on platform.openai.com).
- **ChatGPT Plus / Codex OAuth tokens CANNOT generate images** — they lack the `api.model.images.request` scope (verified: API returns 401). Do not suggest the Codex login as an image path.
- `-a` maps to the supported sizes (1024x1024, 1536x1024, 1024x1536). `--image-size`, `-r` (reference images) and `--analyze` are not supported on this provider.
- Excellent text rendering (including Portuguese accents) — good choice for text-critical art.

**NVIDIA NIM notes:**
- Free tier with generous credits — good fallback when OpenRouter hits rate limits.
- Generation is fast (~2-5s). Output is JPEG, auto-converted to PNG via ImageMagick/ffmpeg.
- Dimensions are restricted (768-1344 per side, ≤1.06MP total) — `-a` maps to the closest supported size. `--image-size` is not supported.
- Text rendering (especially Portuguese accents like Ç/Ã) is hit-or-miss on all FLUX variants — for text-critical art, generate 2-3 candidates and pick, or use `gemini`/`gpt5` which render text reliably.
- Reference images (`-r`) and `--analyze` are not supported on the NVIDIA provider.

## Instructions

Expand Down Expand Up @@ -99,6 +116,7 @@ The script auto-loads env vars from the workspace `.env`. Choose provider based
- If `AI_IMG_CREATOR_CF_ACCOUNT_ID` + `AI_IMG_CREATOR_CF_GATEWAY_ID` + `AI_IMG_CREATOR_CF_TOKEN` are set → use default (gateway mode, no flag needed)
- If only `AI_IMG_CREATOR_OPENROUTER_KEY` is set → use default (`--provider openrouter`, implicit)
- If only `AI_IMG_CREATOR_GEMINI_KEY` is set → use `--provider google`
- If `NVIDIA_API_KEY` is set → `--provider nvidia` is available (FLUX models, free tier). Auto-selected when the model keyword starts with `nvidia-`
- **Do NOT use `source .env`** — the Python script loads it internally. Just run the command directly.

### Step 2: Run Generation Script
Expand Down Expand Up @@ -193,6 +211,7 @@ If the user needs resizing, format conversion, or other manipulation, first dete
| `AI_IMG_CREATOR_CF_TOKEN` | Gateway mode | Gateway auth token |
| `AI_IMG_CREATOR_OPENROUTER_KEY` | Direct OpenRouter | OpenRouter API key (`sk-or-...`) |
| `AI_IMG_CREATOR_GEMINI_KEY` | Direct Google | Google AI Studio API key |
| `NVIDIA_API_KEY` | NVIDIA NIM | NVIDIA API key (`nvapi-...`) — same key used by the dashboard NVIDIA provider |

Gateway mode activates when all 3 `CF_*` vars are set. Falls back to direct mode if gateway fails.

Expand Down
494 changes: 450 additions & 44 deletions .claude/skills/ai-image-creator/scripts/generate-image.py

Large diffs are not rendered by default.

129 changes: 129 additions & 0 deletions .claude/skills/int-evohub/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
---
name: int-evohub
description: "EvoHub API — Manage WhatsApp, Instagram, and Facebook channels via Evolution Hub proxy. Use when the user wants to connect/disconnect channels, check channel status, send messages via EvoHub, manage webhooks, or troubleshoot EvoHub integrations. Also trigger for 'evohub', 'hub evolution', 'instagram evohub', 'whatsapp evohub', 'conectar instagram', 'conectar whatsapp', 'status do canal'."
---

# EvoHub Integration

Proxy/hub for Meta APIs (WhatsApp, Instagram, Facebook) via Evolution Foundation.

## Configuration

All requests use:
- **Base URL:** `https://api.evohub.ai/api/v1`
- **Auth Header:** `Authorization: Bearer ${EVO_HUB_API_TOKEN}`
- **Token location:** `config/.env` → `EVO_HUB_API_TOKEN`

## Available Tools

### Bash Helper

Use `bash` to make raw API calls. Always include auth header.

```bash
TOKEN=$(python3 -c "
import re
with open('.env') as f:
for l in f:
m = re.match(r'^EVO_HUB_API_TOKEN=(.*)', l.strip())
if m: print(m.group(1))
")
BASE="https://api.evohub.ai/api/v1"

# Or simply:
grep EVO_HUB_API_TOKEN .env | cut -d= -f2
```

## API Reference

### User & Plan

| Endpoint | Method | Description |
|----------|--------|-------------|
| `/auth/me` | GET | Current user info |
| `/me/plan` | GET | Current plan details |
| `/me/limits` | GET | Plan limits and quotas |
| `/me/usage` | GET | Current usage stats |

### Channels

| Endpoint | Method | Description |
|----------|--------|-------------|
| `/channels` | GET | List all channels |
| `/channels/{id}` | GET | Channel details |
| `/channels/{id}` | DELETE | Remove a channel |

### Channel Types

Channels have `type` field:
- `whatsapp` — WhatsApp via Evolution
- `instagram` — Instagram via Meta Graph API
- `facebook` — Facebook Pages via Meta Graph API

Channel `status`: `active` | `inactive` | `pending`
Channel `connection_mode`: `byo` (bring your own Meta app) | `proxy` (shared)

### Instagram

| Endpoint | Method | Description |
|----------|--------|-------------|
| `/instagram/authorization` | GET | Generate Instagram OAuth URL |
| `/instagram/callback` | GET | OAuth callback — redirects after auth |
| `/instagram/webhook` | POST/GET | Manage Instagram webhook subscriptions |

### Facebook

| Endpoint | Method | Description |
|----------|--------|-------------|
| `/facebook/channel` | POST | Create Facebook channel |
| `/facebook/pages` | GET | List Facebook Pages |

### Webhooks

| Endpoint | Method | Description |
|----------|--------|-------------|
| `/webhooks` | GET | List all webhooks |
| `/webhooks` | POST | Create webhook |
| `/webhooks/{id}` | PUT | Update webhook |
| `/webhooks/{id}` | DELETE | Delete webhook |
| `/webhooks/event-types` | GET | Available event types |

## Common Operations

### List all channels

```bash
curl -s -H "Authorization: Bearer $TOKEN" \
"https://api.evohub.ai/api/v1/channels" | python3 -m json.tool
```

### Check user plan

```bash
curl -s -H "Authorization: Bearer $TOKEN" \
"https://api.evohub.ai/api/v1/me/plan" | python3 -m json.tool
```

### Generate Instagram auth URL

```bash
curl -s -H "Authorization: Bearer $TOKEN" \
"https://api.evohub.ai/api/v1/instagram/authorization" | python3 -m json.tool
```

### Disconnect a channel

```bash
curl -s -X DELETE -H "Authorization: Bearer $TOKEN" \
"https://api.evohub.ai/api/v1/channels/{channel_id}"
```

## Current State (as of setup)

| Channel | Type | ID | Status |
|---------|------|-----|--------|
| Gringo | whatsapp | `9d8220a9-e68a-423d-88fc-aa4efd2a61de` | inactive |
| sistemabritto | instagram | `541c6345-9269-41b4-9f39-25b2e775824c` | inactive |
| Sistema Britto | whatsapp | `8a278e5d-bbfb-48f9-a2da-58231550bdc2` | inactive |

**Plan:** Free — 1 BYO credential, 3 channels each (WhatsApp/FB/IG), no message limits.
87 changes: 87 additions & 0 deletions .claude/skills/social-ai-trends-blog/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
---
name: social-ai-trends-blog
description: >
Pesquisa semanal de trending topics de IA no X (Twitter) e gera 15 tópicos
virais para o blog Sistema Britto, cada um com gancho para os produtos
Evolution. Pipeline: coleta (X API) → ranqueamento por viralidade → síntese
editorial (Mako) → revisão de alinhamento (Sage) → aprovação humana (Felipe).
Use quando: "trending de IA", "pauta do blog", "tópicos virais da semana",
"o que está bombando em IA", ou no cronjob semanal (segunda 08:00).
---

# social-ai-trends-blog — Pauta semanal de IA para o blog

Transforma o hype real do X em pauta editorial acionável para o blog
(`blog.sistemabritto.com.br`, via `custom-int-ghost`), sempre puxando o gancho
para os produtos Evolution.

## Produtos para ancorar o gancho

| Produto | Ângulo de gancho |
|---|---|
| **Evolution API** | API open source de WhatsApp — dono da própria infra, sem lock-in |
| **Evo AI** | CRM + agentes de IA |
| **Evo CRM** | Gestão de relacionamento |
| **EvoGo** | Evolution Go |
| **Evo Academy** | Cursos — gancho para temas "aprenda IA" |
| **Evolution Summit** | Evento — gancho para tendências/futuro |

## Pipeline (5 fases + cron)

```
1. COLETA → fetch_ai_trends.py (X API v2 recent search, 7 dias, sort=relevancy)
2. RANQUEAMENTO→ score = likes + 2·RT + 1.5·quote + 0.5·reply + 1.5·bookmark + 0.001·impressions
+ clusterização por tema (regex) + filtro de ruído
3. SÍNTESE → @mako-marketing monta 15 tópicos: título + ângulo + gancho de produto
4. REVISÃO → @sage-strategy revisa alinhamento estratégico, originalidade e gancho
5. APROVAÇÃO → Felipe avalia a lista; só publica/agenda após feedback explícito
```

### Agentes

- **Executor:** `@mako-marketing` (Mako) — síntese editorial e ganchos
- **Supervisor:** `@sage-strategy` (Sage) — revisão de alinhamento e qualidade
- **Aprovador:** Felipe (humano) — nada vai pro ar sem o OK

## Como rodar (manual)

```bash
# 1. Coleta + ranqueamento (gera trends_raw.json)
python3 .claude/skills/social-ai-trends-blog/fetch_ai_trends.py --days 7 --per-query 100

# 2. Mako lê trends_raw.json e escreve [C]pauta-AAAA-WW.md (15 tópicos)
# 3. Sage revisa e anota; ajustes aplicados
# 4. Entrega a lista ao Felipe no Telegram/dashboard para aprovação
```

## Requisitos

- `SOCIAL_TWITTER_1_BEARER_TOKEN` no `.env` — tier **Basic** ou superior
(recent search com janela de 7 dias + `sort_order=relevancy`).
- Limite: janela máxima de 7 dias no recent search. Para histórico maior,
precisaria do endpoint full-archive (tier Pro/Enterprise).

## Saídas

| Arquivo | Conteúdo |
|---|---|
| `trends_raw.json` | Dados brutos: temas ranqueados + top tweets com métricas |
| `[C]pauta-AAAA-WW.md` | Os 15 tópicos finais (gerado pelo Mako, revisado pelo Sage) |

## Cronjob semanal

Segunda-feira 08:00 (America/Sao_Paulo). Roda a coleta + síntese + revisão e
notifica o Felipe no Telegram com os 15 tópicos para aprovação. **Não publica
automaticamente** — aprovação humana é obrigatória.

Registro do cron: ver `config/routines.yaml` (entrada `ai-trends-blog`) ou
agendar via `/schedule`.

## Anti-padrões

- ❌ Publicar sem aprovação do Felipe.
- ❌ Confiar só na contagem bruta de virais (tier Basic é amostra limitada) —
usar os **temas** como sinal e sintetizar pautas, não copiar tweets.
- ❌ Gancho forçado de produto onde não cabe — se o tema não conecta com
Evolution, marcar como "sem gancho" em vez de inventar.
- ❌ Repetir pautas de semanas anteriores sem checar histórico.
45 changes: 45 additions & 0 deletions .claude/skills/social-ai-trends-blog/[C]pauta-2026-W24.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Pauta de IA para o blog — Semana 24/2026 (09–13 jun)

> Fonte: X API (484 tweets, 7 dias, ordenados por relevância). Executor: Mako.
> Revisão: Sage. Status: **aguardando aprovação do Felipe.**

**Sinal da semana:** o tema mais viral de longe foi **"Open source AI must win"**
(svpino, omarsar0, dankvr, bindureddy, "Dario com medo do open source"). Isso
joga a favor do posicionamento da Evolution — somos open source. Aproveitar.

---

## Os 15 tópicos

| # | Título | Ângulo / por que bombou | Gancho de produto |
|---|--------|------------------------|-------------------|
| 1 | **Por que o futuro da IA é open source (e por que isso te beneficia)** | "Open source AI must win" foi o grito da semana no X | **Evolution API** — você é dono da infra, sem lock-in |
| 2 | **Construir em cima de API proprietária é uma bomba-relógio** | Tweet viral: "por que construir numa API que pode cortar seu acesso da noite pro dia?" | **Evolution API** open source vs. dependência de big tech |
| 3 | **Rodando IA no seu hardware: a fazenda de 30 Mac Minis** | Caso viral do "Marcus Chen" empilhando Mac Minis pra rodar IA barato | **EvoGo / self-hosting** — IA sob seu controle |
| 4 | **Agentic AI x AI Agents x IA Generativa: o glossário que 99% erra** | Tweet viral apontando que quase ninguém sabe a diferença | **Evo AI** — agentes de IA na prática |
| 5 | **O abismo de produtividade: quem usa IA entrega dias de trabalho em horas** | "The productivity gap is about to become terrifying" (viral) | **Evo AI + Evolution API** — automação de WhatsApp |
| 6 | **7 usos de agentes de IA que vão muito além do ChatGPT** | "Não entendo por que tanta gente ainda não usa agentes de IA" | **Evo AI** — agentes conectados ao seu negócio |
| 7 | **OpenAI, Anthropic e Google concordam num risco — o que vem aí** | Big labs alinhados num alerta = pauta de autoridade | Evolution Summit (tendências/futuro) |
| 8 | **IA na medicina: a melhor não é a que se vende como "IA médica"** | Estudo na Nature viralizou (glauber_doc) | Vertical de saúde — caso de uso Evo AI |
| 9 | **As 5 habilidades de IA que valem ouro em 2026** | "Learn AI skills" em alta (automação, image gen, vídeo) | **Evo Academy** — trilha de aprendizado |
| 10 | **Deepfakes indistinguíveis: como proteger sua marca** | Vídeo falso do "Roda Viva" viralizou (Boulos desmentiu) | WhatsApp oficial / verificação via **Evolution** |
| 11 | **Construindo agentes com n8n + IA: guia prático** | "Construí 47 agentes com n8n e Claude" (viral) | **Evolution API** como camada de WhatsApp dos agentes |
| 12 | **Como a IA está redesenhando workflows (e quem fica pra trás)** | "AI is reshaping how work gets done globally" | Automação com **Evolution + Evo AI** |
| 13 | **O impacto da IA no emprego e na economia: o que os dados mostram** | Sachsida (213 likes) alertando sobre impacto no emprego | Conteúdo de autoridade / topo de funil |
| 14 | **As empresas dos sonhos de quem trabalha com IA** | Ranking viral (Anthropic, OpenAI, DeepMind) | Cultura/recrutamento — branding Sistema Britto |
| 15 | **Aprenda IA de graça: os melhores recursos desta semana** | Aula de Stanford "Turning Electricity into Intelligence" viralizou | **Evo Academy** — curadoria + trilha própria |

---

## Revisão do Sage (supervisor)

- ✅ **Forte alinhamento (1, 2, 3, 11):** open source / self-hosting batem direto
com o DNA da Evolution. Priorizar estes 4 — é onde temos autoridade real.
- ✅ **Educacionais (4, 6, 9, 15):** ótimos pra topo de funil + Evo Academy.
- ⚠️ **Atenção (13, 14):** sem gancho de produto claro — usar como autoridade/branding,
não esperar conversão. Manter no máx. 1 por semana.
- ⚠️ **#8 (saúde):** validar se temos caso real de cliente Evo AI em saúde antes de publicar.
- 💡 Sugestão: começar a semana com o #1 (carro-chefe) e o #11 (prático/dev) —
ancoram o posicionamento open source enquanto o tema está quente.

**Veredito:** lista aprovada para envio ao Felipe.
71 changes: 71 additions & 0 deletions .claude/skills/social-ai-trends-blog/assets/THUMBNAIL-PRIMER.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Thumbnail Primer — Sistema Britto / blog + YouTube

Estilo modelado a partir de 3 referências do nicho IA (BR + gringo) enviadas
pelo Felipe. Ver `thumbnail-refs/`. Formato-alvo: **16:9 (1280×720)**,
reaproveitável como capa de vídeo no YouTube. Geração via **gpt-image-2 (OpenAI)**
na skill `ai-image-creator`.

## Padrão extraído das referências

### Bloco A — estilo BR (as do próprio Felipe — `ref-01-br-felipe.jpg`)
- Rosto do Felipe à direita/centro, expressão forte (sorriso confiante, dedo
apontando, ou surpresa). Recorte limpo com leve rim light.
- Ícones de app 3D glossy flutuando (Claude, Obsidian, ChatGPT, PIX).
- 1 seta branca desenhada à mão (curva), apontando pro elemento-chave.
- Fundo escuro com dados/dashboard, tons de **verde-limão** (marca).
- Texto curto e pesado + 1 badge de resultado/número (R$0,00, ROAS 3.90, ROI).
- Composição limpa, respira — credível, não poluído.

### Bloco B — estilo gringo (Hermes/Julian — `ref-02`, `ref-03`)
- Texto GIGANTE, 2-4 palavras, peso black, contorno grosso (stroke).
Ex: "IT'S MASSIVE", "100x UPGRADES", "THIS IS INSANE".
- Rosto em choque/empolgação (boca aberta).
- Neon/glow saturado (roxo, amarelo, vermelho), raios, badge "FREE" vermelho.
- Dashboard com gráfico subindo (prova/resultado).
- Altíssimo contraste, energia agressiva.

## Receita Sistema Britto (fusão A + B)

Pegar a **legibilidade e energia** do gringo + a **credibilidade e marca** do BR.

| Elemento | Regra |
|---|---|
| Proporção | 16:9, 1280×720 |
| Rosto | Felipe (do face-bank), 1/3 do quadro, expressão coerente com a pauta |
| Hook visual | objeto-símbolo no lado oposto: ícone de app / celular / dashboard / dinheiro / logo |
| Headline | 2-5 palavras, fonte black, branco ou verde-limão, stroke escuro grosso |
| Badge | opcional — número/resultado ou "GRÁTIS"/"NOVO" em círculo/retângulo |
| Fundo | escuro + glow verde-limão da marca (evitar roxo/amarelo gringo puro) |
| Seta | no máx. 1, branca, à mão, opcional |
| Limpeza | legível em tamanho pequeno; sem poluição; máx. 1 foco visual |
| Paleta | verde-limão (#A3E635 / lime) + cinza metálico + preto (cores da marca) |

## Template de prompt para gpt-image-2

```
Thumbnail 16:9 estilo YouTube, alta qualidade, para o nicho de IA/automação.
PESSOA: [rosto do face-bank — descrição/expressão: ex. "homem jovem de óculos,
sorriso confiante apontando"]. Posicionado no terço [esquerdo/direito].
HOOK VISUAL no lado oposto: [objeto — ex. "ícone 3D glossy do app X" / "gráfico
de dashboard subindo" / "celular com tela de vendas"].
TEXTO GRANDE em destaque: "[2-5 PALAVRAS]" — fonte black, branca com contorno
escuro grosso, alto contraste. [opcional: badge "[NÚMERO/GRÁTIS]"].
FUNDO escuro com glow verde-limão (#A3E635) da marca, tons cinza metálico.
Composição limpa, 1 foco visual, legível em tamanho pequeno. Sem poluição.
[opcional: 1 seta branca desenhada à mão apontando para o elemento-chave].
```

Para consistência de rosto, usar `ai-image-creator -r <foto do face-bank>`
(edição com imagem de referência).

## Face-bank

Pasta: `assets/face-bank/`. Felipe vai enviar fotos de rosto dele em várias
expressões (neutro, sorrindo, surpreso, apontando, sério/confiante). Quanto
mais variado, melhor o casamento com cada tipo de pauta.

## Anti-padrões de thumbnail
- ❌ Texto longo (>5 palavras) ou fonte fina — ilegível no feed.
- ❌ Mais de 1 foco visual — polui.
- ❌ Paleta roxo/amarelo gringo pura — fugir da marca; usar verde-limão.
- ❌ Promessa que o post não cumpre (clickbait vazio) — público BR é calejado.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading