Skills

Skills

Skills to pliki instrukcji w formacie Markdown, które uczą agenta, jak i kiedy używać narzędzi. Każda umiejętność znajduje się w katalogu zawierającym plik SKILL.md z metadanymi YAML frontmatter oraz treścią w formacie Markdown. OpenClaw ładuje wbudowane umiejętności wraz ze wszystkimi lokalnymi nadpisaniami i filtruje je podczas ładowania na podstawie środowiska, konfiguracji oraz dostępności plików binarnych.

Kolejność ładowania

OpenClaw ładuje umiejętności z poniższych źródeł, zaczynając od źródła o najwyższym priorytecie. Gdy ta sama nazwa umiejętności występuje w wielu miejscach, wygrywa źródło o najwyższym priorytecie.

Priorytet Źródło Ścieżka
1 — najwyższy Umiejętności obszaru roboczego <workspace>/skills
2 Umiejętności agenta projektu <workspace>/.agents/skills
3 Osobiste umiejętności agenta ~/.agents/skills
4 Zarządzane / lokalne umiejętności ~/.openclaw/skills
5 Wbudowane umiejętności dostarczane z instalacją
6 — najniższy Dodatkowe katalogi skills.load.extraDirs + umiejętności Pluginów

Katalogi główne umiejętności obsługują układy grupowane. OpenClaw wykrywa umiejętność, gdy plik SKILL.md występuje w dowolnym miejscu pod skonfigurowanym katalogiem głównym (do 6 poziomów głębokości):

text
<workspace>/skills/research/SKILL.md          ✓ znaleziono jako "research"<workspace>/skills/personal/research/SKILL.md ✓ również znaleziono jako "research"

Ścieżka folderu służy wyłącznie do organizacji. Nazwa umiejętności i polecenie z ukośnikiem pochodzą z pola name w metadanych frontmatter (lub z nazwy katalogu, gdy brakuje pola name). Listy dozwolonych umiejętności agentów (poniżej) również dopasowują tę wartość name.

Umiejętności hostowane przez Node

Połączony bezobsługowy Node może publikować umiejętności zainstalowane w swoim aktywnym katalogu umiejętności OpenClaw (domyślnie ~/.openclaw/skills; obowiązują nadpisania środowiskowe profilu). Pojawiają się one na standardowej liście umiejętności agenta, gdy Node jest połączony, i znikają po jego rozłączeniu. W przypadku kolizji lokalna umiejętność lub umiejętność Gateway zachowuje swoją nazwę; umiejętność Node otrzymuje deterministyczną nazwę z prefiksem Node. W wersji 1 umiejętności hostowanych przez Node nazwa katalogu musi odpowiadać polu name w metadanych frontmatter umiejętności.

Wpis umiejętności zawiera lokalizator Node. Jego pliki, odwołania względne oraz pliki binarne znajdują się na Node, dlatego ładuj i wykonuj go za pomocą exec host=node node=<node-id>. Po zmianie plików umiejętności uruchom ponownie hosta Node. Informacje o parowaniu i wyłącznikach znajdziesz w sekcji Węzły.

Umiejętności poszczególnych agentów a umiejętności współdzielone

W konfiguracjach wieloagentowych każdy agent ma własny obszar roboczy. Użyj ścieżki odpowiadającej wymaganej widoczności:

Zakres Ścieżka Widoczność
Dla agenta <workspace>/skills Tylko ten agent
Dla agenta projektu <workspace>/.agents/skills Tylko agent tego obszaru roboczego
Osobiste dla agenta ~/.agents/skills Wszyscy agenci na tym komputerze
Współdzielone zarządzane ~/.openclaw/skills Wszyscy agenci na tym komputerze
Dodatkowe katalogi skills.load.extraDirs Wszyscy agenci na tym komputerze

Listy dozwolonych umiejętności agentów

Lokalizacja umiejętności (priorytet) oraz jej widoczność (który agent może jej używać) są oddzielnymi mechanizmami kontroli. Użyj list dozwolonych, aby ograniczyć umiejętności widoczne dla agenta, niezależnie od źródła, z którego są ładowane.

json5
{  agents: {    defaults: {      skills: ["github", "weather"], // wspólna konfiguracja bazowa    },    list: [      { id: "writer" }, // dziedziczy github, weather      { id: "docs", skills: ["docs-search"] }, // całkowicie zastępuje wartości domyślne      { id: "locked-down", skills: [] }, // brak umiejętności    ],  },}
Reguły list dozwolonych
  • Pomiń agents.defaults.skills, aby domyślnie nie ograniczać żadnych umiejętności.
  • Pomiń agents.list[].skills, aby odziedziczyć agents.defaults.skills.
  • Ustaw agents.list[].skills: [], aby nie udostępniać temu agentowi żadnych umiejętności.
  • Niepusta lista agents.list[].skills jest zbiorem ostatecznym — nie jest łączona z wartościami domyślnymi.
  • Wynikowa lista dozwolonych obowiązuje podczas budowania promptów, wykrywania poleceń z ukośnikiem, synchronizacji piaskownicy oraz tworzenia migawek umiejętności.
  • Nie jest to granica autoryzacji powłoki hosta. Jeśli ten sam agent może używać exec, ogranicz tę powłokę osobno za pomocą piaskownicy, izolacji użytkownika systemu operacyjnego, list zabronionych/dozwolonych poleceń exec oraz poświadczeń przypisanych do zasobów.

Pluginy i umiejętności

Pluginy mogą dostarczać własne umiejętności przez wskazanie katalogów skills w pliku openclaw.plugin.json (ścieżki względem katalogu głównego Pluginu). Umiejętności Pluginu są ładowane, gdy Plugin jest włączony — na przykład Plugin przeglądarki dostarcza umiejętność browser-automation do wieloetapowego sterowania przeglądarką.

Katalogi umiejętności Pluginów są łączone na tym samym niskim poziomie priorytetu co skills.load.extraDirs, dlatego umiejętność o tej samej nazwie pochodząca ze źródła wbudowanego, zarządzanego, agenta lub obszaru roboczego ma nad nimi pierwszeństwo. Dostępność samej umiejętności Pluginu kontroluj za pomocą metadata.openclaw.requires w jej metadanych frontmatter, tak jak w przypadku każdej innej umiejętności.

Pełny opis systemu Pluginów znajdziesz w sekcjach Pluginy i Narzędzia.

Warsztat umiejętności

Warsztat umiejętności to kolejka propozycji między agentem a aktywnymi plikami umiejętności. Gdy agent wykryje pracę nadającą się do ponownego wykorzystania, przygotowuje propozycję zamiast zapisywać ją bezpośrednio w pliku SKILL.md. Zanim cokolwiek się zmieni, musisz ją przejrzeć i zatwierdzić.

bash
openclaw skills workshop listopenclaw skills workshop inspect <proposal-id>openclaw skills workshop apply <proposal-id>

Pełny cykl życia, dokumentację CLI oraz konfigurację opisano w sekcji Warsztat umiejętności.

Instalowanie z ClawHub

ClawHub to publiczny rejestr umiejętności. Do instalowania i aktualizowania używaj poleceń openclaw skills, a do publikowania i synchronizacji — CLI clawhub.

Działanie Polecenie
Zainstaluj umiejętność w obszarze roboczym openclaw skills install @owner/<slug>
Zainstaluj z repozytorium Git openclaw skills install git:owner/repo@ref
Zainstaluj lokalny katalog umiejętności openclaw skills install ./path/to/skill --as my-tool
Zainstaluj dla wszystkich lokalnych agentów openclaw skills install @owner/<slug> --global
Zaktualizuj wszystkie umiejętności obszaru roboczego openclaw skills update --all
Zaktualizuj współdzieloną zarządzaną umiejętność openclaw skills update @owner/<slug> --global
Zaktualizuj wszystkie współdzielone zarządzane umiejętności openclaw skills update --all --global
Zweryfikuj zakres zaufania umiejętności openclaw skills verify @owner/<slug>
Wyświetl wygenerowaną kartę umiejętności openclaw skills verify @owner/<slug> --card
Opublikuj / zsynchronizuj przez CLI ClawHub clawhub sync --all
Szczegóły instalacji

openclaw skills install domyślnie instaluje w katalogu skills/ aktywnego obszaru roboczego. Dodaj --global, aby zainstalować we współdzielonym katalogu ~/.openclaw/skills, widocznym dla wszystkich lokalnych agentów, chyba że ograniczają go listy dozwolonych umiejętności agentów.

Instalacje z Git i źródeł lokalnych oczekują pliku SKILL.md w katalogu głównym źródła. Identyfikator pochodzi z pola name w metadanych frontmatter pliku SKILL.md, jeśli jest prawidłowe, a w przeciwnym razie z nazwy katalogu lub repozytorium. Użyj --as <slug>, aby go zastąpić. openclaw skills update śledzi wyłącznie instalacje z ClawHub — aby odświeżyć źródła Git lub lokalne, zainstaluj je ponownie.

Weryfikacja i skanowanie zabezpieczeń

openclaw skills verify @owner/<slug> wysyła do ClawHub żądanie zakresu zaufania clawhub.skill.verify.v1 dla umiejętności. Zainstalowane umiejętności ClawHub są weryfikowane względem wersji i rejestru zapisanych w pliku .clawhub/origin.json. Same identyfikatory pozostają akceptowane w przypadku istniejących zainstalowanych lub jednoznacznych umiejętności, ale odwołania zawierające właściciela pozwalają uniknąć niejednoznaczności wydawcy.

Strony umiejętności w ClawHub przed instalacją pokazują stan najnowszego skanowania zabezpieczeń, wraz ze stronami szczegółów dla VirusTotal, ClawScan oraz analizy statycznej. Polecenie kończy się kodem różnym od zera, gdy ClawHub oznaczy weryfikację jako nieudaną. Wydawcy mogą rozwiązywać problemy z fałszywymi alarmami za pomocą panelu ClawHub lub polecenia clawhub skill rescan @owner/<slug>.

Instalacje z prywatnych archiwów

Klienci Gateway wymagający dostarczania poza ClawHub mogą przygotować archiwum ZIP umiejętności za pomocą skills.upload.begin, skills.upload.chunk oraz skills.upload.commit, a następnie zainstalować je za pomocą skills.install({ source: "upload", ... }). Ta ścieżka jest domyślnie wyłączona i wymaga ustawienia skills.install.allowUploadedArchives: true w pliku openclaw.json. Standardowe instalacje z ClawHub nigdy nie wymagają tego ustawienia.

Bezpieczeństwo

Ograniczenie ścieżek

Wykrywanie umiejętności w obszarze roboczym, dla agenta projektu oraz w dodatkowych katalogach akceptuje wyłącznie katalogi główne umiejętności, których rozwiązana ścieżka rzeczywista pozostaje wewnątrz skonfigurowanego katalogu głównego, chyba że skills.load.allowSymlinkTargets jawnie oznacza docelowy katalog główny jako zaufany. Warsztat umiejętności zapisuje przez takie zaufane cele tylko wtedy, gdy włączono skills.workshop.allowSymlinkTargetWrites. Zarządzany katalog ~/.openclaw/skills oraz osobisty katalog ~/.agents/skills mogą zawierać foldery umiejętności będące dowiązaniami symbolicznymi, ale rzeczywista ścieżka każdego pliku SKILL.md nadal musi pozostawać wewnątrz rozwiązanego katalogu tej umiejętności.

Zasady instalacji operatora

Skonfiguruj security.installPolicy, aby przed kontynuowaniem instalacji umiejętności uruchamiać zaufane lokalne polecenie zasad. Zasady otrzymują metadane oraz przygotowaną ścieżkę źródłową, dotyczą ścieżek ClawHub, przesyłania, Git, lokalnych, aktualizacji oraz instalatorów zależności i blokują operację, gdy polecenie nie może zwrócić prawidłowej decyzji.

Zakres wstrzykiwania sekretów

skills.entries.*.env oraz skills.entries.*.apiKey wstrzykują sekrety do procesu hosta wyłącznie na czas danej tury agenta — nie do piaskownicy. Nie umieszczaj sekretów w promptach ani dziennikach.

Szerszy model zagrożeń i listy kontrolne zabezpieczeń znajdziesz w sekcji Bezpieczeństwo.

Format SKILL.md

Każda umiejętność wymaga co najmniej pól name oraz description w metadanych frontmatter:

markdown
---name: image-labdescription: Generowanie lub edytowanie obrazów za pomocą przepływu pracy obsługiwanego przez dostawcę--- Gdy użytkownik poprosi o wygenerowanie obrazu, użyj narzędzia `image_generate`...

Opcjonalne klucze frontmatter

homepagestring

Adres URL wyświetlany jako „Witryna” w interfejsie Skills systemu macOS. Obsługiwany również przez metadata.openclaw.homepage.

user-invocablebooleandefault: true

Gdy ustawiono true, Skills jest udostępniany jako polecenie z ukośnikiem wywoływane przez użytkownika.

disable-model-invocationbooleandefault: false

Gdy ustawiono true, OpenClaw nie umieszcza instrukcji Skills w standardowym prompcie agenta. Skills pozostaje dostępny jako polecenie z ukośnikiem, jeśli user-invocable również ma wartość true.

command-dispatch"tool"

Po ustawieniu na tool polecenie z ukośnikiem pomija model i jest kierowane bezpośrednio do zarejestrowanego narzędzia.

command-toolstring

Nazwa narzędzia wywoływanego po ustawieniu command-dispatch: tool.

command-arg-mode"raw"default: raw

W przypadku kierowania do narzędzia przekazuje do niego nieprzetworzony ciąg argumentów bez analizy po stronie rdzenia. Narzędzie otrzymuje { command: "<raw args>", commandName: "<slash command>", skillName: "<skill name>" }.

Bramkowanie

OpenClaw filtruje Skills podczas ładowania za pomocą metadata.openclaw (obiektu JSON5 osadzonego we frontmatter; zobacz uwagę dotyczącą analizy powyżej). Skills bez bloku metadata.openclaw jest zawsze dopuszczany, chyba że został jawnie wyłączony.

markdown
---name: image-labdescription: Generate or edit images via a provider-backed image workflowmetadata:  {    "openclaw":      {        "requires": { "bins": ["uv"], "env": ["GEMINI_API_KEY"], "config": ["browser.enabled"] },        "primaryEnv": "GEMINI_API_KEY",      },  }---
alwaysboolean

Gdy ustawiono true, zawsze uwzględnia Skills i pomija wszystkie pozostałe bramki.

emojistring

Opcjonalny emoji wyświetlany w interfejsie Skills systemu macOS.

homepagestring

Opcjonalny adres URL wyświetlany jako „Witryna” w interfejsie Skills systemu macOS.

os("darwin" | "linux" | "win32")[]

Filtr platformy. Po ustawieniu Skills jest dopuszczany tylko w wymienionych systemach operacyjnych.

requires.binsstring[]

Każdy plik wykonywalny musi istnieć w PATH.

requires.anyBinsstring[]

Co najmniej jeden plik wykonywalny musi istnieć w PATH.

requires.envstring[]

Każda zmienna środowiskowa musi istnieć w procesie lub zostać dostarczona przez konfigurację.

requires.configstring[]

Każda ścieżka w openclaw.json musi mieć wartość logicznie prawdziwą.

primaryEnvstring

Nazwa zmiennej środowiskowej powiązanej z skills.entries.<name>.apiKey.

installobject[]

Opcjonalne specyfikacje instalatora używane przez interfejs Skills systemu macOS (brew / node / go / uv / download).

Specyfikacje instalatora

Specyfikacje instalatora określają, jak interfejs Skills systemu macOS ma zainstalować zależność:

markdown
---name: geminidescription: Use Gemini CLI for coding assistance and Google search lookups.metadata:  {    "openclaw":      {        "emoji": "♊️",        "requires": { "bins": ["gemini"] },        "install":          [            {              "id": "brew",              "kind": "brew",              "formula": "gemini-cli",              "bins": ["gemini"],              "label": "Install Gemini CLI (brew)",            },          ],      },  }---
Reguły wyboru instalatora
  • Gdy wymieniono wiele instalatorów, Gateway wybiera jedną preferowaną opcję (brew, jeśli jest dostępny, w przeciwnym razie node).
  • Jeśli wszystkie instalatory mają typ download, OpenClaw wyświetla każdy wpis, aby można było zobaczyć wszystkie dostępne artefakty.
  • Specyfikacje mogą zawierać os: ["darwin"|"linux"|"win32"], aby filtrować według platformy.
  • Instalacje Node uwzględniają skills.install.nodeManager w openclaw.json (domyślnie: npm; opcje: npm / pnpm / yarn / bun). Dotyczy to wyłącznie instalacji Skills; środowiskiem wykonawczym Gateway nadal powinien być Node.
  • Kolejność preferencji instalatora Gateway: Homebrew → uv → skonfigurowany menedżer node → go → download.
Szczegóły poszczególnych instalatorów
  • Homebrew: OpenClaw nie instaluje automatycznie Homebrew ani nie przekształca formuł brew w polecenia systemowego menedżera pakietów. W kontenerach Linux bez brew instalatory korzystające wyłącznie z brew są ukryte; użyj niestandardowego obrazu lub zainstaluj zależność ręcznie.
  • Go: OpenClaw wymaga Go 1.21 lub nowszego do automatycznych instalacji Skills. Jeśli brakuje go, a Homebrew jest dostępny, OpenClaw najpierw instaluje Go za pomocą Homebrew; w systemie Linux bez Homebrew może zamiast tego użyć apt-get jako użytkownik root lub przez niewymagające hasła sudo, jeśli odświeżony kandydat golang-go spełnia wymaganie minimalnej wersji. Właściwe polecenie go install dla zależności zawsze wskazuje dedykowany katalog plików wykonywalnych zarządzany przez OpenClaw (bin Homebrew w przypadku nowej instalacji, w przeciwnym razie ~/.local/bin), a nie skonfigurowany GOBIN — własne zmienne środowiskowe GOBIN, GOPATH i GOTOOLCHAIN są odczytywane, ale nigdy nadpisywane.
  • Pobieranie: url (wymagane), archive (tar.gz | tar.bz2 | zip), extract (domyślnie: automatycznie po wykryciu archiwum), stripComponents, targetDir (domyślnie: ~/.openclaw/tools/<skillKey>).
Uwagi dotyczące izolacji

requires.bins jest sprawdzane na hoście podczas ładowania Skills. Jeśli agent działa w piaskownicy, plik wykonywalny musi również istnieć wewnątrz kontenera. Zainstaluj go za pomocą agents.defaults.sandbox.docker.setupCommand lub niestandardowego obrazu. setupCommand jest uruchamiane raz po utworzeniu kontenera i wymaga dostępu wychodzącego do sieci, zapisywalnego głównego systemu plików oraz użytkownika root w piaskownicy.

Nadpisywanie konfiguracji

Włączaj i konfiguruj dołączone lub zarządzane Skills w sekcji skills.entries pliku ~/.openclaw/openclaw.json:

json5
{  skills: {    entries: {      "image-lab": {        enabled: true,        apiKey: { source: "env", provider: "default", id: "GEMINI_API_KEY" },        env: { GEMINI_API_KEY: "GEMINI_KEY_HERE" },        config: {          endpoint: "https://example.invalid",          model: "nano-pro",        },      },      peekaboo: { enabled: true },      sag: { enabled: false },    },  },}
enabledboolean

Wartość false wyłącza Skills, nawet jeśli jest dołączony lub zainstalowany. Dołączony Skills coding-agent wymaga jawnego włączenia — ustaw skills.entries.coding-agent.enabled: true i upewnij się, że zainstalowano i uwierzytelniono jeden z obsługiwanych interfejsów CLI: claude, codex, opencode lub inny.

apiKeystring | { source, provider, id }

Pole pomocnicze dla Skills deklarujących metadata.openclaw.primaryEnv. Obsługuje zwykły ciąg tekstowy lub obiekt SecretRef.

envRecord<string, string��-��f���z�������k�)
configobject

Opcjonalny zbiór niestandardowych pól konfiguracji poszczególnych Skills.

allowBundledstring[]

Opcjonalna lista dozwolonych wyłącznie dla dołączonych Skills. Po jej ustawieniu dopuszczane są tylko dołączone Skills znajdujące się na liście. Nie ma to wpływu na zarządzane Skills ani Skills z przestrzeni roboczej.

Wstrzykiwanie środowiska

Po rozpoczęciu działania agenta OpenClaw:

  • Odczytuje metadane Skills

    OpenClaw ustala obowiązującą listę Skills dla agenta, stosując reguły bramkowania, listy dozwolonych i nadpisania konfiguracji.

  • Wstrzykuje zmienne środowiskowe i klucze API

    skills.entries.<key>.env oraz skills.entries.<key>.apiKey są stosowane do process.env na czas działania.

  • Tworzy prompt systemowy

    Dopuszczone Skills są kompilowane do zwartego bloku XML i wstrzykiwane do promptu systemowego.

  • Przywraca środowisko

    Po zakończeniu działania pierwotne środowisko zostaje przywrócone.

  • W przypadku dołączonego backendu claude-cli OpenClaw dodatkowo zapisuje ten sam zrzut dopuszczonych Skills jako tymczasowy Plugin Claude Code i przekazuje go przez --plugin-dir. Inne backendy CLI używają wyłącznie katalogu promptu.

    Zrzuty i odświeżanie

    OpenClaw tworzy zrzut dopuszczonych Skills w chwili rozpoczęcia sesji i ponownie wykorzystuje tę listę we wszystkich kolejnych turach sesji. Zmiany Skills lub konfiguracji zaczynają obowiązywać w następnej nowej sesji.

    Skills są odświeżane w trakcie sesji w dwóch przypadkach:

    • Mechanizm obserwujący Skills wykryje zmianę pliku SKILL.md.
    • Połączy się nowy dopuszczony zdalny węzeł.

    Odświeżona lista jest używana w następnej turze agenta. Jeśli obowiązująca lista Skills dozwolonych dla agenta ulegnie zmianie, OpenClaw odświeża zrzut, aby zachować zgodność widocznych Skills.

    Mechanizm obserwujący Skills

    Domyślnie OpenClaw obserwuje foldery Skills i aktualizuje zrzut po zmianie plików SKILL.md. Skonfiguruj to w skills.load:

    json5
    {  skills: {    load: {      extraDirs: ["~/Projects/agent-scripts/skills"],      allowSymlinkTargets: ["~/Projects/manager/skills"],      watch: true, // default      watchDebounceMs: 250, // default    },  },}

    Użyj allowSymlinkTargets w przypadku celowo utworzonych układów dowiązań symbolicznych, w których dowiązanie katalogu głównego Skills wskazuje poza skonfigurowany katalog główny, na przykład <workspace>/skills/manager -> ~/Projects/manager/skills. Włącz skills.workshop.allowSymlinkTargetWrites tylko wtedy, gdy Skill Workshop ma również stosować propozycje za pośrednictwem tych zaufanych ścieżek z dowiązaniami symbolicznymi.

    Zdalne węzły macOS (Gateway w systemie Linux)

    Jeśli Gateway działa w systemie Linux, ale połączony jest węzeł macOS z dozwolonym system.run, OpenClaw może uznać Skills przeznaczone wyłącznie dla macOS za dopuszczone, gdy wymagane pliki wykonywalne są dostępne w tym węźle. Agent powinien uruchamiać te Skills za pomocą narzędzia exec z ustawieniem host=node.

    Węzły offline nie powodują wyświetlania Skills dostępnych wyłącznie zdalnie. Jeśli węzeł przestanie odpowiadać na sondy plików wykonywalnych, OpenClaw usuwa z pamięci podręcznej dopasowania tych plików.

    Wpływ na liczbę tokenów

    Gdy Skills są dopuszczone, OpenClaw wstrzykuje zwarty blok XML do promptu systemowego. Koszt jest deterministyczny i rośnie liniowo dla każdego Skills:

    • Narzut bazowy (tylko gdy dopuszczony jest co najmniej 1 Skills): stały blok tekstu wprowadzającego oraz otoczka <available_skills>.
    • Na Skills: około 97 znaków + długości pól name, description i location.
    • Ucieczka znaków XML rozwija & < > " ' do encji, dodając po kilka znaków na każde wystąpienie.
    • Przy około 4 znakach na token 97 znaków ≈ 24 tokeny na Skills przed uwzględnieniem długości pól.

    Jeśli renderowany blok przekroczyłby skonfigurowany budżet promptu (skills.limits.maxSkillsPromptChars), OpenClaw najpierw zachowuje tyle tożsamości Skills (nazwę, lokalizację i wersję), ile może zmieścić kompaktowy format bez opisów. Następnie wykorzystuje pozostały budżet na skrócone opisy. Jeśli nie pozostał budżet na opisy, są one pomijane. Prompt zawiera uwagę wskazującą na openclaw skills check, gdy wymagane jest kompaktowe formatowanie lub skrócenie listy.

    Opisy powinny być krótkie i treściwe, aby zminimalizować narzut promptu.

    Powiązane materiały

    Was this useful?
    On this page

    On this page