`.
+До открывающего и после закрывающего тегов должна быть 1 пустая строка.
+
+Пример простого грида с компактными карточками:
+
+```
+
+- :fontawesome-brands-html5: Карточка №1
+- :fontawesome-brands-js: Карточка №2
+- :fontawesome-brands-css3: Карточка №3
+- :fontawesome-brands-internet-explorer: Карточка №4
+
+```
+
+Пример грида с многострочными карточками:
+
+```
+
+- :fontawesome-brands-html5: **Заголовок карточки №1**
+
+ ---
+
+ Многострочное содержимое карточки №1
+
+- :fontawesome-brands-js: **Заголовок карточки №2**
+
+ ---
+
+ Многострочное содержимое карточки №2
+
+- :fontawesome-brands-css3: **Заголовок карточки №3**
+
+ ---
+
+ Многострочное содержимое карточки №3
+
+- :fontawesome-brands-internet-explorer: **Заголовок карточки №4**
+
+ ---
+
+ Многострочное содержимое карточки №4
+
+```
+
+### Вкладки (табы)
+
+Позволяют уместить информацию на одном уровне, не растягивая страницу по высоте.
+
+Синтаксис:
+
+```
+=== "Заголовок вкладки 1"
+ Содержимое вкладки 1
+
+=== "Заголовок вкладки 2"
+ Содержимое вкладки 2
+```
+
+Содержимое вкладки отступается минимум на 4 пробела.
+Содержимое без отступа (в начале строки) находится вне вкладки.
+
+Для содержимого вкладки распространяются все те же markdown-правила, включая указанные в этом документе.
+
+До и после каждого заголовка вкладки должна быть 1 пустая строка.
+
+После содержимого последней вкладки должна быть 1 пустая строка.
+
+### Сноски
+
+Сноска позволяет добавить надстрочный индекс к слову, чтобы вынести пояснения в конец страницы, быстро переместиться к нему по клику на индекс и вернуться обратно.
+
+Синтаксис:
+
+```
+Lorem[^1] ipsum[^2] dolor sit amet, consectetur adipiscing elit.
+
+[^1]: однострочная сноска
+[^2]:
+ многострочная сноска
+ с отступом 4 пробела слева
+ на каждой строке
+```
+
+### Подсказки (тултипы) и аббревиатуры
+
+Они появляются при наведении мыши на какой-либо элемент на странице документа.
+
+Пример 1: иконка с подсказкой:
+`:material-information-outline:{ title="текст подсказки" }`
+
+Пример 2: ссылка с подсказкой:
+`[Hover me](https://example.com "I'm a tooltip!")`
+
+Пример 3: альтернативная ссылка с подсказкой:
+
+```
+[Hover me][example]
+
+ [example]: https://example.com "I'm a tooltip!"
+```
+
+### Горячие клавиши
+
+В общем случае, для указания корячих клавиш следует использовать тег `
`.
+Примеры: `B `, `Esc `
+
+Для описания комбинаций клавиш следует вставлять между каждой клавишей знак `+`, обрамлённый пробелами.
+Примеры: `Shift + A `, `Ctrl + K + 4 `
+
+Для MacOS-специфичных тем вставлять `+` не нужно.
+Примеры: `⌘ C `, `⇧ ⌘ P `
+
+Сопоставление пиктограмм с названиями клавиш (служебных и модификаторов) MacOS:
+
+- Базовые модификаторы:
+ - `⌘` - `Command` (`Cmd`)
+ - `⌥` - `Option` (`Alt`)
+ - `⌃` - `Control` (`Ctrl`)
+ - `⇧` - `Shift`
+ - `⇪` - `Caps Lock`
+- Навигация и управление:
+ - `⌫` - `Delete` (Backspace, удаление символа слева)
+ - `⌦` - `Forward Delete` (удаление символа справа, `Fn` + D`elete)
+ - `⏎` - `Return` (`Enter`)
+ - `⌕` - `Enter` на цифровой клавиатуре (в некоторых шрифтах)
+ - `⎋` - `Escape` (`Esc`)
+ - `⇥` - `Tab` (Табуляция)
+ - `⇤` - `Backtab` (`Shift` + `Tab`)
+ - `␣` - `Space` (Пробел)
+- Перемещение по тексту:
+ - `↖` - `Home` (Начало документа, `Fn` + `←`)
+ - `↘` - `End` (Конец документа, `Fn` + `→`)
+ - `⇞` - `Page Up` (Страница вверх, `Fn` + `↑`)
+ - `⇟` - `Page Down` (Страница вниз, `Fn` + `↓`)
+- Специальные и системные:
+ - `🌐` / `fn` — Функция (`Fn` / Кнопка смены языка/вызова эмодзи)
+ - `⏏` — `Eject` (Извлечение диска)
+
+### Кнопки
+
+- `[Серая кнопка](https://example.com/){ .md-button }`
+- `[Синяя кнопка](https://example.com/){ .md-button .md-button--primary }`
+- `[:fontawesome-solid-paper-plane: Кнопка серая с иконкой](https://example.com/){ .md-button }`
+- `[:fontawesome-solid-paper-plane: Кнопка синяя с иконкой](https://example.com/){ .md-button .md-button--primary }`
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..c97d802
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,6 @@
+/.git
+/.gitea
+/.gitignore
+/.cache
+Makefile
+.DS_Store
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..d3c3738
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,18 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+indent_style = space
+indent_size = 4
+trim_trailing_whitespace = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[*.{yaml,yml}]
+indent_size = 2
+
+[Makefile]
+indent_style = tab
diff --git a/.gitignore b/.gitignore
index 41b40db..5b28ba5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
-/.cache
-/site
+/.cache/
+/site/
+/__pycache__/
+.DS_Store
diff --git a/.kodarules b/.kodarules
new file mode 100644
index 0000000..9eecc2d
--- /dev/null
+++ b/.kodarules
@@ -0,0 +1,25 @@
+- Всегда используй навык koda-zensical
+- Всегда перечитывай файлы перед каждым изменением - пользователь уже мог внести изменения
+- При изменениях структуры проекта всегда актуализируй AGENTS.md
+- |
+ В структуре навигации файла `zensical.toml` всегда должен присутствовать закомментированный раздел `Debug`.
+ Это отладочные страницы с примерами, которые не должны попасть в итоговую документацию.
+ Этот раздел раскомментируется вручную по необходимости.
+- |
+ Для отладки используй команду `make site`.
+ В выводе команды могу быть предупреждения и ошибки в следующем формате:
+
+ ```
+ Warning: page does not exist
+ ╭─[ test.md:695:10 ]
+ │
+ 695 │ - [Edit](../edit/how-to-use-it.md) — редактирование кода
+ │ ────────────┬───────────
+ │ ╰───────────── page does not exist
+ ─────╯
+ ```
+ что означает буквально следующее: "в файле content/test.md в строке 695 в позиции 10 есть ссылка на несуществующую страницу."
+ Эти предупреждения надо всегда исправлять.
+
+- При изменениях структуры проекта и только при корректной сборке (без предупреждений и ошибок) всегда актуализируй `./AGENTS.md`
+- При доработке или расширении функционала этого проекта или синтаксиса всегда актуализируй скилл `./.agents/skills/koda-zensical`
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..afcfe0a
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,5 @@
+{
+ "recommendations": [
+ "0x10.mkdocs-material-preview"
+ ]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..9a3098a
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,5 @@
+{
+ "files.associations": {
+ "*.md": "python-markdown"
+ }
+}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 0000000..c814c6d
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,22 @@
+{
+ // See https://go.microsoft.com/fwlink/?LinkId=733558
+ // for the documentation about the tasks.json format
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "Живой предпросмотр (localhost:8000)",
+ "type": "shell",
+ "command": "make live"
+ },
+ {
+ "label": "Собрать статический сайт (./site)",
+ "type": "shell",
+ "command": "make site"
+ },
+ {
+ "label": "Собрать docker-образ со стат. сайтом",
+ "type": "shell",
+ "command": "make image"
+ }
+ ]
+}
diff --git a/Dockerfile b/Dockerfile
index efa6eed..7d9bbb3 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,9 +1,19 @@
-FROM squidfunk/mkdocs-material AS builder
+FROM zensical/zensical:latest AS builder
+ENV PYTHONPATH=/docs
COPY . /docs
-RUN mkdocs build
+RUN zensical build --clean
FROM nginx:alpine AS iptv-docs
+
+LABEL org.opencontainers.image.title="IPTV Checker"
+LABEL org.opencontainers.image.description="Documentation for our services and products"
LABEL org.opencontainers.image.authors="Anthony Axenov "
+LABEL org.opencontainers.image.url="https://m3u.su"
+LABEL org.opencontainers.image.vendor="Anthony Axenov"
+LABEL org.opencontainers.image.documentation="https://m3u.su/docs"
+LABEL org.opencontainers.image.licenses="MIT"
+LABEL org.opencontainers.image.source="https://git.axenov.dev/IPTV/docs"
+
COPY --from=builder /docs/site /usr/share/nginx/html
WORKDIR /usr/share/nginx/html
USER root
diff --git a/LICENSE b/LICENSE
index f801f54..e3c683c 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2025 Антон Аксенов (Anthony Axenov)
+Copyright (c) 2025-2026 Антон Аксенов (Anthony Axenov)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/Makefile b/Makefile
index 3fd0279..6ac79d9 100644
--- a/Makefile
+++ b/Makefile
@@ -1,49 +1,54 @@
-## image: Run mkdocs with live-reloading (localhost:3000)
+.DEFAULT_GOAL := help
+.PHONY: live site image push run help
+
+## live = Run zensical with live-reloading on http://localhost:8000
live:
- @echo "Wait until container starts and open http://localhost:3000 to see live preview"
- @docker run \
- --pull always \
+ @echo "*** Wait until container starts and open http://localhost:8000 to see live preview"
+ @docker stop iptv-docs-dev 2>/dev/null; \
+ docker run \
--rm \
--interactive \
--tty \
- --publish 3000:8000 \
+ --env PYTHONPATH=/docs \
+ --publish 8000:8000 \
--volume ${PWD}:/docs \
--name iptv-docs-dev \
- squidfunk/mkdocs-material:9.6.20
+ zensical/zensical:latest
-## image: Build local static site
+## site = Build a local static site
site:
- @echo "Wait until mkdocs finish"
- @docker run \
+ @echo "*** Wait until zensical finish"
+ @docker stop iptv-docs-dev 2>/dev/null; \
+ docker run \
--pull always \
--rm \
- --interactive \
- --tty \
+ --env PYTHONPATH=/docs \
--volume ${PWD}:/docs \
--name iptv-docs-dev \
- squidfunk/mkdocs-material:9.6.20 build
+ zensical/zensical:latest \
+ build \
+ --clean
-## image: Build docker image
+## image = Build a docker image
image:
- @docker build \
- --tag iptv-docs:latest \
- --tag git.axenov.dev/iptv/iptv-docs:latest \
- .
+ @docker build --tag git.axenov.dev/iptv/iptv-docs:latest:latest .
-## push: Push docker image to registry
-push:
- @docker push git.axenov.dev/iptv/iptv-docs:latest
-
-## run: Run docker image (localhost:3001)
+## run = Run docker container from image built with `make image` on http://localhost:8001
run:
- @echo "Wait until container starts and open http://localhost:3001 to see ready static website"
- @docker run \
+ @echo "*** Wait until container starts and open http://localhost:8001 to see ready static website"
+ @docker stop iptv-docs 2>/dev/null; \
+ docker run \
--rm \
- --publish 3001:80 \
+ --publish 8001:80 \
--name iptv-docs \
- git.axenov.dev/iptv/iptv-docs:latest
+ git.axenov.dev/iptv/iptv-docs:latest:latest
-## help: Show this message and exit
+# push = Push docker image built with `make image` to git.axenov.dev
+push:
+ @docker login git.axenov.dev; \
+ docker push git.axenov.dev/iptv/iptv-docs:latest:latest
+
+## help = Show this message and exit (default)
help: Makefile
@echo "Available recipes:"
- @sed -n 's/^##//p' $< | column -t -s ':' | sed -e 's/^/ /'
+ @sed -n 's/^##/ /p' $< | column -t -s '='
diff --git a/README.md b/README.md
index 82abbe3..e2b09ee 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
-# Документация m3u.su
+# Документация iptvc
-Как работать с документацией: [src/dev/docs.md](src/dev/docs.md)
+Как работать с документацией: [content/dev/docs.md](content/dev/docs.md)
## Лицензия
diff --git a/src/assets/css/custom.css b/content/_assets/css/custom.css
similarity index 100%
rename from src/assets/css/custom.css
rename to content/_assets/css/custom.css
diff --git a/src/assets/img/favicon/logo.png b/content/_assets/img/favicon/logo.png
similarity index 100%
rename from src/assets/img/favicon/logo.png
rename to content/_assets/img/favicon/logo.png
diff --git a/content/_assets/img/ionicons-name.jpg b/content/_assets/img/ionicons-name.jpg
new file mode 100644
index 0000000..4ce94f1
Binary files /dev/null and b/content/_assets/img/ionicons-name.jpg differ
diff --git a/src/assets/img/mobile-toc-btn.jpg b/content/_assets/img/mobile-toc-btn.jpg
similarity index 100%
rename from src/assets/img/mobile-toc-btn.jpg
rename to content/_assets/img/mobile-toc-btn.jpg
diff --git a/src/assets/img/paywalls/1.jpg b/content/_assets/img/paywalls/1.jpg
similarity index 100%
rename from src/assets/img/paywalls/1.jpg
rename to content/_assets/img/paywalls/1.jpg
diff --git a/src/assets/img/paywalls/2.jpg b/content/_assets/img/paywalls/2.jpg
similarity index 100%
rename from src/assets/img/paywalls/2.jpg
rename to content/_assets/img/paywalls/2.jpg
diff --git a/src/assets/img/paywalls/3.jpg b/content/_assets/img/paywalls/3.jpg
similarity index 100%
rename from src/assets/img/paywalls/3.jpg
rename to content/_assets/img/paywalls/3.jpg
diff --git a/src/assets/img/paywalls/4.jpg b/content/_assets/img/paywalls/4.jpg
similarity index 100%
rename from src/assets/img/paywalls/4.jpg
rename to content/_assets/img/paywalls/4.jpg
diff --git a/src/assets/img/paywalls/wink.jpg b/content/_assets/img/paywalls/wink.jpg
similarity index 100%
rename from src/assets/img/paywalls/wink.jpg
rename to content/_assets/img/paywalls/wink.jpg
diff --git a/src/assets/img/paywalls/wink2.jpg b/content/_assets/img/paywalls/wink2.jpg
similarity index 100%
rename from src/assets/img/paywalls/wink2.jpg
rename to content/_assets/img/paywalls/wink2.jpg
diff --git a/src/assets/img/players/iptv-web-player/add.jpg b/content/_assets/img/players/iptv-web-player/add.jpg
similarity index 100%
rename from src/assets/img/players/iptv-web-player/add.jpg
rename to content/_assets/img/players/iptv-web-player/add.jpg
diff --git a/src/assets/img/players/iptv-web-player/main.jpg b/content/_assets/img/players/iptv-web-player/main.jpg
similarity index 100%
rename from src/assets/img/players/iptv-web-player/main.jpg
rename to content/_assets/img/players/iptv-web-player/main.jpg
diff --git a/src/assets/img/players/iptvnator/add1.jpg b/content/_assets/img/players/iptvnator/add1.jpg
similarity index 100%
rename from src/assets/img/players/iptvnator/add1.jpg
rename to content/_assets/img/players/iptvnator/add1.jpg
diff --git a/src/assets/img/players/iptvnator/add2.jpg b/content/_assets/img/players/iptvnator/add2.jpg
similarity index 100%
rename from src/assets/img/players/iptvnator/add2.jpg
rename to content/_assets/img/players/iptvnator/add2.jpg
diff --git a/src/assets/img/players/iptvnator/main.jpg b/content/_assets/img/players/iptvnator/main.jpg
similarity index 100%
rename from src/assets/img/players/iptvnator/main.jpg
rename to content/_assets/img/players/iptvnator/main.jpg
diff --git a/src/assets/img/players/m3u/add1.jpg b/content/_assets/img/players/m3u/add1.jpg
similarity index 100%
rename from src/assets/img/players/m3u/add1.jpg
rename to content/_assets/img/players/m3u/add1.jpg
diff --git a/src/assets/img/players/m3u/add2.jpg b/content/_assets/img/players/m3u/add2.jpg
similarity index 100%
rename from src/assets/img/players/m3u/add2.jpg
rename to content/_assets/img/players/m3u/add2.jpg
diff --git a/src/assets/img/players/m3u/main.jpg b/content/_assets/img/players/m3u/main.jpg
similarity index 100%
rename from src/assets/img/players/m3u/main.jpg
rename to content/_assets/img/players/m3u/main.jpg
diff --git a/src/assets/img/players/m3u/ua1.jpg b/content/_assets/img/players/m3u/ua1.jpg
similarity index 100%
rename from src/assets/img/players/m3u/ua1.jpg
rename to content/_assets/img/players/m3u/ua1.jpg
diff --git a/src/assets/img/players/m3u/ua2.jpg b/content/_assets/img/players/m3u/ua2.jpg
similarity index 100%
rename from src/assets/img/players/m3u/ua2.jpg
rename to content/_assets/img/players/m3u/ua2.jpg
diff --git a/src/assets/img/players/televizo/add1.jpg b/content/_assets/img/players/televizo/add1.jpg
similarity index 100%
rename from src/assets/img/players/televizo/add1.jpg
rename to content/_assets/img/players/televizo/add1.jpg
diff --git a/src/assets/img/players/televizo/add2.jpg b/content/_assets/img/players/televizo/add2.jpg
similarity index 100%
rename from src/assets/img/players/televizo/add2.jpg
rename to content/_assets/img/players/televizo/add2.jpg
diff --git a/src/assets/img/players/televizo/add21.jpg b/content/_assets/img/players/televizo/add21.jpg
similarity index 100%
rename from src/assets/img/players/televizo/add21.jpg
rename to content/_assets/img/players/televizo/add21.jpg
diff --git a/src/assets/img/players/televizo/add22.jpg b/content/_assets/img/players/televizo/add22.jpg
similarity index 100%
rename from src/assets/img/players/televizo/add22.jpg
rename to content/_assets/img/players/televizo/add22.jpg
diff --git a/src/assets/img/players/televizo/main1.jpg b/content/_assets/img/players/televizo/main1.jpg
similarity index 100%
rename from src/assets/img/players/televizo/main1.jpg
rename to content/_assets/img/players/televizo/main1.jpg
diff --git a/src/assets/img/players/televizo/main2.jpg b/content/_assets/img/players/televizo/main2.jpg
similarity index 100%
rename from src/assets/img/players/televizo/main2.jpg
rename to content/_assets/img/players/televizo/main2.jpg
diff --git a/src/assets/img/players/vlc/add1-mob.jpg b/content/_assets/img/players/vlc/add1-mob.jpg
similarity index 100%
rename from src/assets/img/players/vlc/add1-mob.jpg
rename to content/_assets/img/players/vlc/add1-mob.jpg
diff --git a/src/assets/img/players/vlc/add1.jpg b/content/_assets/img/players/vlc/add1.jpg
similarity index 100%
rename from src/assets/img/players/vlc/add1.jpg
rename to content/_assets/img/players/vlc/add1.jpg
diff --git a/src/assets/img/players/vlc/add2-mob.jpg b/content/_assets/img/players/vlc/add2-mob.jpg
similarity index 100%
rename from src/assets/img/players/vlc/add2-mob.jpg
rename to content/_assets/img/players/vlc/add2-mob.jpg
diff --git a/src/assets/img/players/vlc/add2.jpg b/content/_assets/img/players/vlc/add2.jpg
similarity index 100%
rename from src/assets/img/players/vlc/add2.jpg
rename to content/_assets/img/players/vlc/add2.jpg
diff --git a/src/assets/img/players/vlc/main.jpg b/content/_assets/img/players/vlc/main.jpg
similarity index 100%
rename from src/assets/img/players/vlc/main.jpg
rename to content/_assets/img/players/vlc/main.jpg
diff --git a/src/assets/img/players/yuki-iptv/add.jpg b/content/_assets/img/players/yuki-iptv/add.jpg
similarity index 100%
rename from src/assets/img/players/yuki-iptv/add.jpg
rename to content/_assets/img/players/yuki-iptv/add.jpg
diff --git a/src/assets/img/players/yuki-iptv/main.jpg b/content/_assets/img/players/yuki-iptv/main.jpg
similarity index 100%
rename from src/assets/img/players/yuki-iptv/main.jpg
rename to content/_assets/img/players/yuki-iptv/main.jpg
diff --git a/src/assets/img/pls-details/ch-list.jpg b/content/_assets/img/pls-details/ch-list.jpg
similarity index 100%
rename from src/assets/img/pls-details/ch-list.jpg
rename to content/_assets/img/pls-details/ch-list.jpg
diff --git a/src/assets/img/pls-details/error.jpg b/content/_assets/img/pls-details/error.jpg
similarity index 100%
rename from src/assets/img/pls-details/error.jpg
rename to content/_assets/img/pls-details/error.jpg
diff --git a/src/assets/img/pls-details/filter.jpg b/content/_assets/img/pls-details/filter.jpg
similarity index 100%
rename from src/assets/img/pls-details/filter.jpg
rename to content/_assets/img/pls-details/filter.jpg
diff --git a/src/assets/img/pls-details/tab1.jpg b/content/_assets/img/pls-details/tab1.jpg
similarity index 100%
rename from src/assets/img/pls-details/tab1.jpg
rename to content/_assets/img/pls-details/tab1.jpg
diff --git a/src/assets/img/pls-details/tab2.jpg b/content/_assets/img/pls-details/tab2.jpg
similarity index 100%
rename from src/assets/img/pls-details/tab2.jpg
rename to content/_assets/img/pls-details/tab2.jpg
diff --git a/src/assets/img/pls-list/mobile.jpg b/content/_assets/img/pls-list/mobile.jpg
similarity index 100%
rename from src/assets/img/pls-list/mobile.jpg
rename to content/_assets/img/pls-list/mobile.jpg
diff --git a/src/assets/img/pls-list/pc.jpg b/content/_assets/img/pls-list/pc.jpg
similarity index 100%
rename from src/assets/img/pls-list/pc.jpg
rename to content/_assets/img/pls-list/pc.jpg
diff --git a/src/assets/img/status/details.jpg b/content/_assets/img/status/details.jpg
similarity index 100%
rename from src/assets/img/status/details.jpg
rename to content/_assets/img/status/details.jpg
diff --git a/src/assets/img/status/main.jpg b/content/_assets/img/status/main.jpg
similarity index 100%
rename from src/assets/img/status/main.jpg
rename to content/_assets/img/status/main.jpg
diff --git a/src/common/checks.md b/content/aggregator/checks.md
similarity index 100%
rename from src/common/checks.md
rename to content/aggregator/checks.md
diff --git a/src/faq.md b/content/aggregator/faq.md
similarity index 98%
rename from src/faq.md
rename to content/aggregator/faq.md
index c862979..bacbfcb 100644
--- a/src/faq.md
+++ b/content/aggregator/faq.md
@@ -262,23 +262,23 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
### Просят денег и/или подписку
??? quote "[Скриншот] Уважаемый клиент! Для возобновления просмотра Вам необходимо использовать не более 2 устройств"
- 
+ 
> Уважаемый клиент! Для возобновления просмотра Вам необходимо использовать не более 2 устройств.
> Обратитесь к поставщику контента для уточнения.
??? quote "[Скриншот] Ваша подписка не активна"
- 
+ 
> Ваша подписка не активна
> Your subscription is not active
??? quote "[Скриншот] Мы обнаружили систематическое нарушение правил использования нашего сервиса"
- 
+ 
> Мы обнаружили систематическое нарушение правил использования нашего сервиса и заблокировали возможность просмотра контента.
> Для возобновления просмотра необходимо сменить OTTID в личном кабинете, и обновить плейлисты на ваших устройствах.
> Если вы считаете, что произошла какая-то ошибка - пожалуйста, обратитесь в техподдержку.
??? quote "[Скриншот] Вы превысили разрешённое количество одновременных поджключений"
- 
+ 
> Вы превысили разрешённое количество одновременных подключений
> Для возобновления просмотра ограничьте количество подключённых устройств
@@ -300,11 +300,11 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
### Wink
??? quote "[Скриншот] Просмотр ТВ-каналов, фильмов и сериалов доступен только в официальных приложениях Wink и на территории России"
- 
+ 
> Просмотр ТВ-каналов, фильмов и сериалов доступен только в официальных приложениях Wink и на территории России
??? quote "[Скриншот] Wink ещё не показывает видео на этой территории"
- 
+ 
> Wink ещё не показывает видео на этой территории
**Решение 1:** купить подписку Wink и использовать официальные приложения.
diff --git a/src/common/how-it-works.md b/content/aggregator/how-it-works.md
similarity index 100%
rename from src/common/how-it-works.md
rename to content/aggregator/how-it-works.md
diff --git a/src/index.md b/content/aggregator/index.md
similarity index 95%
rename from src/index.md
rename to content/aggregator/index.md
index 6b2f5f1..c3ae514 100644
--- a/src/index.md
+++ b/content/aggregator/index.md
@@ -1,5 +1,6 @@
---
icon: material/home
+hide: [navigation, toc]
---
# :material-home: Введение
@@ -9,11 +10,9 @@ icon: material/home
!!! info "Все необходимые адреса"
**Веб-сайт:** [m3u.su](https://m3u.su)
- **Документация:** [m3u.su/docs](https://m3u.su/docs)
+ Документация: [m3u.su/docs](https://m3u.su/docs)
Исходный код: [git.axenov.dev/IPTV](https://git.axenov.dev/IPTV)
- Telegram-канал: [@iptv_aggregator](https://t.me/iptv_aggregator)
- Обсуждение: [@iptv_aggregator_chat](https://t.me/iptv_aggregator_chat)
- Бот: [@iptv_aggregator_bot](https://t.me/iptv_aggregator_bot)
+ Telegram-канал: [@iptv_aggregator](https://t.me/iptv_aggregator)
Далеко не все пользователи, желающие использовать цифровое ТВ, могут позволить себе подключение IPTV у своего провайдера или поставщиков контента.
diff --git a/src/legal.md b/content/aggregator/legal.md
similarity index 100%
rename from src/legal.md
rename to content/aggregator/legal.md
diff --git a/src/common/selection.md b/content/aggregator/selection.md
similarity index 100%
rename from src/common/selection.md
rename to content/aggregator/selection.md
diff --git a/src/statuspage.md b/content/aggregator/statuspage.md
similarity index 92%
rename from src/statuspage.md
rename to content/aggregator/statuspage.md
index f78b72f..eae22df 100644
--- a/src/statuspage.md
+++ b/content/aggregator/statuspage.md
@@ -8,7 +8,7 @@ tags: ["сайт"]
Так выглядит статусная страница сервиса.
Попасть на неё можно по ссылке "[Аптайм](https://status.m3u.su)" в шапке сайта.
-
+
Здесь отображается состояние компонентов сервиса:
@@ -22,7 +22,7 @@ tags: ["сайт"]
Можно нажать на незвание сервиса и посмотреть детальную информацию:
-
+
Если на шкале появляется красное деление, значит был кратковременный сбой.
diff --git a/src/docs.md b/content/common/docs.md
similarity index 97%
rename from src/docs.md
rename to content/common/docs.md
index 1b45a52..558ed1e 100644
--- a/src/docs.md
+++ b/content/common/docs.md
@@ -27,7 +27,7 @@ icon: material/book-open-page-variant-outline
4. справа — содержание конкретной страницы.
??? info end "На мобильниках содержание страницы спрятано за этой кнопкой в боковом меню:"
- 
+ 
## Связанные статьи
diff --git a/src/common/index.md b/content/common/index.md
similarity index 100%
rename from src/common/index.md
rename to content/common/index.md
diff --git a/src/common/players.md b/content/common/players.md
similarity index 90%
rename from src/common/players.md
rename to content/common/players.md
index d83df92..3c50bbe 100644
--- a/src/common/players.md
+++ b/content/common/players.md
@@ -33,17 +33,17 @@ tags: ["плееры"]
Универсальный плеер практически для любого мультимедиа-контента.
??? quote "[Скриншот] Главное окно"
- 
+ 
??? quote "[Скриншот] Добавление плейлиста на десктопе"
!!! warning "Указание протокола `https://` обязательно!"
- 
- 
+ 
+ 
??? quote "[Скриншот] Добавление плейлиста на андроиде"
!!! warning "Указание протокола `https://` обязательно!"
- 
- 
+ 
+ 
### :thumbsup: IPTVnator
@@ -58,12 +58,12 @@ tags: ["плееры"]
Если использовать веб-версию, то настройки сохраняются в браузере.
??? quote "[Скриншот] Главное окно"
- 
+ 
??? quote "[Скриншот] Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!"
- 
- 
+ 
+ 
### IPTV Web Player
@@ -75,11 +75,11 @@ tags: ["плееры"]
Подгрузка и отображение телепрограммы (используется https://cdn.epg.one/epg2.xml).
??? quote "[Скриншот] Главное окно"
- 
+ 
??? quote "[Скриншот] Добавление плейлиста"
!!! success "Указание протокола `https://` необязательно!"
- 
+ 
### Kodi
@@ -136,11 +136,11 @@ tags: ["плееры"]
Поддерживает плейлисты по ссылкам, сторонние телепрограммы, группировку каналов, изменение плейлистов и многое другое.
??? quote "[Скриншот] Главное окно"
- 
+ 
??? quote "[Скриншот] Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!"
- 
+ 
---
@@ -174,18 +174,18 @@ tags: ["плееры"]
* Скачать: [play.google.com](https://play.google.com/store/apps/details?id=com.ottplay.ottplay)
??? quote "[Скриншот] Главный экран"
- 
- 
+ 
+ 
??? quote "[Скриншот] Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!"
- 
- 
+ 
+ 
Из настроек:
- 
- 
+ 
+ 
И дальше те же шаги 3-5 на скриншотах выше.
@@ -202,16 +202,16 @@ tags: ["плееры"]
Программу передач нужно [подключать отдельной ссылкой](../faq.md#epg), из плейлиста не тянет.
??? quote "[Скриншот] Главный экран"
- 
+ 
??? quote "[Скриншот] Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!"
- 
- 
+ 
+ 
??? quote "[Скриншот] Установка User-Agent"
- 
- 
+ 
+ 
#### IPTV (Александр Софронов)
diff --git a/src/support.md b/content/common/support.md
similarity index 100%
rename from src/support.md
rename to content/common/support.md
diff --git a/content/iptvc/commands/check.md b/content/iptvc/commands/check.md
new file mode 100644
index 0000000..1a14be0
--- /dev/null
+++ b/content/iptvc/commands/check.md
@@ -0,0 +1,384 @@
+---
+title: check
+tags: [./iptvc]
+---
+
+# Команда `check`
+
+Команда поддерживает множество аргументов для разных целей.
+
+Они могут дополнять друг друга.
+
+Порядок аргументов не имеет значения.
+
+## `-i`, `--ini` { id=ini }
+
+Указывает путь к локальному [ini-файлу](../../formats/playlists.md) с описанием плейлистов.
+
+Можно указать только однажды.
+
+Значение по умолчанию: `./playlists.ini`
+
+Если файл не найден, проверка плейлистов будет доступна только по ссылкам ([`--url`](#url)) или из локальных файлов ([`--file`](#file)).
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini
+```
+
+## `-t`, `--tags` { id=tags }
+
+Указывает путь к локальному [json-файлу](../../formats/channels.md) с описанием тегов каналов.
+
+Можно указать только однажды.
+
+Значение по умолчанию: `./channels.json`
+
+Если файл не найден, то будет выведено предупреждение о том, что каналы не будут помечены тегами.
+
+```shell title="Пример"
+./iptvc check -t ~/tags.json
+```
+
+## `-f`, `--file` { id=file }
+
+Указывает путь к локальному файлу плейлиста `*.m3u`/`*.m3u8`.
+
+Можно указать несколько разных.
+
+```shell title="Пример"
+./iptvc check -f playlist.m3u
+./iptvc check -f playlist1.m3u --file playlist2.m3u8
+./iptvc check --file /path/to/playlist.m3u
+```
+
+## `-u`, `--url` { id=url }
+
+Указывает URL удалённого плейлиста (поддерживаются протоколы http/https).
+
+Можно указать несколько разных.
+
+```shell title="Пример"
+./iptvc check -u http://example.com/playlist.m3u
+./iptvc check -u https://site.com/playlist.m3u8 --url http://other.com/list.m3u
+```
+
+## `-c`, `--code` { id=code }
+
+Указывает код плейлиста из файла [playlists.ini](../../formats/playlists.md).
+
+Можно указать несколько разных.
+
+!!! warning "Работает только вместе с [`--ini`](#ini)."
+
+Если не указан ни разу, то будут проверены все плейлисты, которые указаны в ini-файле.
+
+Если используется кеширование, то проверенные плейлисты (результаты проверки которых ещё находятся в кеше) проверяться не будут.
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini -c RU_BASIC --code MOVIE_PREMIUM
+```
+
+## `--repeat` { id=repeat }
+
+Указывает количество повторений (итераций) команды.
+
+Значение по умолчанию: `1`
+
+Если указано `0`, тогда:
+
+* повторение будет бесконечным;
+
+* если переданы [`--url`](#url), [`--file`](#file) или [`--code`](#code), то на каждой итерации будут проверяться только указанные плейлисты;
+
+* если не переданы [`--url`](#url), [`--file`](#file) или [`--code`](#code), то на каждой итерации список плейлистов будет подготавливаться заново.
+ Если при этом используется кеширование, то проверенные плейлисты (результаты проверки которых ещё находятся в кеше) проверяться не будут.
+
+```shell title="Пример"
+# проверить 5 раз плейлисты с кодами xx и yy из my.ini
+./iptvc check -i ~/my.ini -c xx --code yy --repeat 5
+# бесконечно проверять все плейлисты из my.ini, без учёта проверенных
+./iptvc check -i ~/my.ini --repeat 0
+# бесконечно проверять плейлист из файла
+./iptvc check -f test.m3u --repeat 0
+```
+
+## `--every` { id=every }
+
+Указывает количество секунд между повторениями (итерациями) команды.
+
+Значение по умолчанию: `5`
+
+Если указано `0`, то задержки не будет.
+
+```shell title="Пример"
+# проверить 5 раз плейлисты с кодами xx и yy из my.ini каждые 5 секунд
+./iptvc check -i ~/my.ini -c xx --code yy --repeat 5 --every 5
+# бесконечно проверять все плейлисты из my.ini, без учёта проверенных, каждый час
+./iptvc check -i ~/my.ini --repeat 0 --every 3600
+# бесконечно проверять плейлист из файла каждые 10 секунд
+./iptvc check -f test.m3u --repeat 0 --every 10
+```
+
+## `-r`, `--random` { id=random }
+
+Указывает максимальное количество случайных плейлистов из ini-файла для проверки.
+
+!!! warning "Работает только вместе с [`--ini`](#ini)."
+
+Если не указан ни разу, то будут проверены все плейлисты, которые указаны в ini-файле.
+
+Если используется кеширование, то проверенные плейлисты (результаты проверки которых ещё находятся в кеше) проверяться не будут.
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini -r 10
+```
+
+## `-j`, `--json` { id=json }
+
+Если указано, то подробные результаты проверки будут выводиться в формате JSON.
+
+```shell title="Пример"
+./iptvc check -f playlist.m3u --json
+```
+
+## `-q`, `--quiet` { id=quiet }
+
+Подавляет вывод всех логов.
+
+!!! info "Не влияет на [`--json`](#json) (JSON-данные будут выведены в stdout), но перекрывает [`--verbose`](#verbose) (логов не будет вовсе, независимо от повышенной подробности)."
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --random 10 --quiet --json
+```
+
+## `-v`, `--verbose` { id=verbose }
+
+Включает подробное логирование.
+
+```shell title="Пример"
+./iptvc check --random 10 --verbose
+```
+
+## Глобальные флаги { id=global }
+
+Эти флаги доступны для всех команд и переопределяют значения из `config.yml`.
+
+### `--debug` { id=debug }
+
+Включает режим отладки. Переопределяет `app.debug` из `config.yml` и переменную `APP_DEBUG`.
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --debug
+```
+
+### `--log-level` { id=log-level }
+
+Устанавливает уровень логирования. Переопределяет `app.log_level` из `config.yml`.
+
+Доступные значения: `debug`, `info`, `warn`, `error`.
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --log-level debug
+```
+
+## Флаги проверки плейлистов { id=check-playlists }
+
+Эти флаги переопределяют параметры секции `check.playlists` из `config.yml`. Доступны для команд `check` и `serve`.
+
+### `--playlists-timeout` { id=playlists-timeout }
+
+Таймаут HTTP-запроса плейлиста в миллисекундах.
+
+Переопределяет `check.playlists.timeout` (по умолчанию `10000`).
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --playlists-timeout 5000
+```
+
+### `--playlists-all-cooldown` { id=playlists-all-cooldown }
+
+Задержка в миллисекундах после проверки всех плейлистов.
+
+Переопределяет `check.playlists.all-cooldown` (по умолчанию `0`).
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --playlists-all-cooldown 10000
+```
+
+### `--playlists-one-cooldown` { id=playlists-one-cooldown }
+
+Задержка в миллисекундах после проверки каждого плейлиста.
+
+Переопределяет `check.playlists.one-cooldown` (по умолчанию `0`).
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --playlists-one-cooldown 2000
+```
+
+### `--playlists-max-routines` { id=playlists-max-routines }
+
+Максимум одновременно проверяемых плейлистов.
+
+Переопределяет `check.playlists.max-routines` (по умолчанию `5`).
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --playlists-max-routines 10
+```
+
+### `--playlists-per-routine` { id=playlists-per-routine }
+
+Количество плейлистов на одну процедуру проверки.
+
+Переопределяет `check.playlists.per-routine` (по умолчанию `1`).
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --playlists-per-routine 3
+```
+
+### `--playlists-user-agent` { id=playlists-user-agent }
+
+User-Agent для HTTP-запросов плейлистов. Можно указать несколько — будет выбран случайный при каждом запросе.
+
+Переопределяет `check.playlists.user-agent`.
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --playlists-user-agent "Mozilla/5.0" "curl/8.0"
+```
+
+## Флаги проверки каналов { id=check-channels }
+
+Эти флаги переопределяют параметры секции `check.channels` из `config.yml`. Доступны для команд `check` и `serve`.
+
+### `--channels-timeout` { id=channels-timeout }
+
+Таймаут HTTP-запроса канала в миллисекундах.
+
+Переопределяет `check.channels.timeout` (по умолчанию `10000`).
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --channels-timeout 8000
+```
+
+### `--channels-byte-range` { id=channels-byte-range }
+
+Объём данных в байтах для загрузки от сервера при проверке канала.
+
+Переопределяет `check.channels.byte-range` (по умолчанию `512`).
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --channels-byte-range 1024
+```
+
+### `--channels-cooldown` { id=channels-cooldown }
+
+Задержка в миллисекундах после проверки каждого канала.
+
+Переопределяет `check.channels.cooldown` (по умолчанию `0`).
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --channels-cooldown 100
+```
+
+### `--channels-max-routines` { id=channels-max-routines }
+
+Максимум одновременно проверяемых каналов.
+
+Переопределяет `check.channels.max-routines` (по умолчанию `50`).
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --channels-max-routines 100
+```
+
+### `--channels-per-routine` { id=channels-per-routine }
+
+Количество каналов на одну процедуру проверки.
+
+Переопределяет `check.channels.per-routine` (по умолчанию `10`).
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --channels-per-routine 20
+```
+
+### `--channels-user-agent` { id=channels-user-agent }
+
+User-Agent для HTTP-запросов каналов. Можно указать несколько — будет выбран случайный при каждом запросе.
+
+Переопределяет `check.channels.user-agent`.
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --channels-user-agent "Mozilla/5.0" "VLC/3.0"
+```
+
+## Флаги кеша { id=cache-flags }
+
+Эти флаги переопределяют параметры секции `cache` из `config.yml`. Доступны для команд `check` и `serve`.
+
+### `--cache-enabled` { id=cache-enabled }
+
+Включает кеширование результатов в KeyDB/Redis.
+
+Переопределяет `cache.enabled` (по умолчанию `false`).
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --cache-enabled
+```
+
+### `--cache-host` { id=cache-host }
+
+Хост KeyDB/Redis.
+
+Переопределяет `cache.host` (по умолчанию `localhost`).
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --cache-enabled --cache-host 192.168.1.10
+```
+
+### `--cache-port` { id=cache-port }
+
+Порт KeyDB/Redis.
+
+Переопределяет `cache.port` (по умолчанию `6379`).
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --cache-enabled --cache-port 6380
+```
+
+### `--cache-username` { id=cache-username }
+
+Логин для подключения к KeyDB/Redis.
+
+Переопределяет `cache.username`.
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --cache-enabled --cache-username myuser
+```
+
+### `--cache-password` { id=cache-password }
+
+Пароль для подключения к KeyDB/Redis.
+
+Переопределяет `cache.password`.
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --cache-enabled --cache-password secret
+```
+
+### `--cache-db` { id=cache-db }
+
+Номер базы данных KeyDB/Redis.
+
+Переопределяет `cache.db` (по умолчанию `0`).
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --cache-enabled --cache-db 2
+```
+
+### `--cache-ttl` { id=cache-ttl }
+
+TTL записей кеша в секундах.
+
+Переопределяет `cache.ttl` (по умолчанию `1800`).
+
+```shell title="Пример"
+./iptvc check -i ~/my.ini --cache-enabled --cache-ttl 3600
+```
diff --git a/src/iptvc/commands/help.md b/content/iptvc/commands/help.md
similarity index 97%
rename from src/iptvc/commands/help.md
rename to content/iptvc/commands/help.md
index e0483ef..8085453 100644
--- a/src/iptvc/commands/help.md
+++ b/content/iptvc/commands/help.md
@@ -1,5 +1,6 @@
---
-tags: ["iptvc"]
+title: help
+tags: [iptvc]
---
# Команда `help`
diff --git a/content/iptvc/commands/index.md b/content/iptvc/commands/index.md
new file mode 100644
index 0000000..bf71864
--- /dev/null
+++ b/content/iptvc/commands/index.md
@@ -0,0 +1,23 @@
+---
+icon: octicons/terminal-24
+hide: [toc]
+---
+
+# :octicons-terminal-24: Справочник команд
+
+* [`check`](check.md) — проверка плейлистов
+* [`serve`](serve.md) — запуск веб-интерфейса
+* [`version`](version.md) — получение версии и выход
+* [`help`](help.md) — получение справки о программе и выход
+
+Каждая команда отвечает за конкретную операцию и имеет свои настройки (аргументы), которыми можно влиять на логику выполнения операции.
+
+Также есть глобальные аргументы, которые доступны для всех команд:
+
+| Флаг | Тип | Соответствует в `config.yml` | Описание |
+| ----------------- | ------ | ---------------------------- | ----------------------------------------------------- |
+| `--config` | string | — | Путь к файлу конфигурации (по умолчанию `config.yml`) |
+| `--debug` | bool | `app.debug` | Включить режим отладки |
+| `--log-level` | string | `app.log_level` | Уровень логирования: `debug`, `info`, `warn`, `error` |
+| `-v`, `--verbose` | bool | — | Подробное логирование |
+
diff --git a/content/iptvc/commands/serve.md b/content/iptvc/commands/serve.md
new file mode 100644
index 0000000..c54c74c
--- /dev/null
+++ b/content/iptvc/commands/serve.md
@@ -0,0 +1,408 @@
+---
+title: serve
+tags: [iptvc]
+---
+
+# Команда `serve`
+
+Запускает встроенный веб-сервер для просмотра плейлистов и результатов их проверки в браузере.
+
+```bash
+iptvc serve [flags]
+```
+
+## Веб-сервер
+
+
+### `-p`, `--port`
+
+Порт для веб-сервера.
+
+Переопределяет `server.port` из `config.yml` и переменную `WEB_PORT`.
+
+Если не указан, используется значение из `config.yml` (по умолчанию `8080`).
+
+```bash
+iptvc serve -p 3000
+```
+
+
+### `--host`
+
+Хост для привязки веб-сервера.
+
+Переопределяет `server.host` из `config.yml` и переменную `WEB_HOST`.
+
+Если не указан, используется значение из `config.yml` (по умолчанию — все интерфейсы).
+
+```bash
+iptvc serve --host 127.0.0.1
+```
+
+## Фоновая проверка
+
+
+### `--check`
+
+Включает фоновую проверку плейлистов. По умолчанию выключена.
+
+Без этого флага веб-сервер работает standalone — отображает данные из кеша (если включён) или статус `unknown` для всех плейлистов.
+
+```bash
+iptvc serve --check
+```
+
+При `--check` доступны следующие флаги:
+
+
+### `-i`, `--ini`
+
+Путь к локальному [ini-файлу](../../formats/playlists.md) с описанием плейлистов.
+
+Значение по умолчанию: `./playlists.ini`
+
+```bash
+iptvc serve --check -i ~/my.ini
+```
+
+
+### `-t`, `--tags`
+
+Путь к [json-файлу](../../formats/channels.md) с описанием тегов каналов.
+
+Значение по умолчанию: `./channels.json`
+
+```bash
+iptvc serve --check -t ~/tags.json
+```
+
+
+### `--every`
+
+Интервал между циклами фоновой проверки в секундах.
+
+Значение по умолчанию: `60`
+
+```bash
+iptvc serve --check --every 120
+```
+
+
+### `--repeat`
+
+Количество циклов фоновой проверки.
+
+Значение по умолчанию: `0` (бесконечно)
+
+```bash
+# проверить один раз и остановить фоновую проверку
+iptvc serve --check --repeat 1
+```
+
+
+### `-r`, `--random`
+
+Максимальное количество случайных плейлистов из ini-файла для проверки.
+
+```bash
+iptvc serve --check -r 10
+```
+
+## Глобальные флаги
+
+
+### `--config`
+
+Путь к файлу конфигурации `config.yml`.
+
+Значение по умолчанию: `config.yml`
+
+```bash
+iptvc serve --config /etc/iptvc/config.yml
+```
+
+
+### `--debug`
+
+Включает режим отладки. Переопределяет `app.debug` из `config.yml` и переменную `APP_DEBUG`.
+
+```bash
+iptvc serve --debug
+```
+
+
+### `--log-level`
+
+Устанавливает уровень логирования. Переопределяет `app.log_level` из `config.yml`.
+
+Доступные значения: `debug`, `info`, `warn`, `error`.
+
+```bash
+iptvc serve --log-level debug
+```
+
+
+### `-v`, `--verbose`
+
+Включает подробное логирование.
+
+## Флаги проверки плейлистов
+
+Эти флаги переопределяют параметры секции `check.playlists` из `config.yml`. Доступны для команд `check` и `serve`. Имеют смысл только при включённой фоновой проверке (`--check` или `check.start-on-serve: true`).
+
+
+### `--playlists-timeout`
+
+Таймаут HTTP-запроса плейлиста в миллисекундах.
+
+Переопределяет `check.playlists.timeout` (по умолчанию `10000`).
+
+```bash
+iptvc serve --check --playlists-timeout 5000
+```
+
+
+### `--playlists-all-cooldown`
+
+Задержка в миллисекундах после проверки всех плейлистов.
+
+Переопределяет `check.playlists.all-cooldown` (по умолчанию `0`).
+
+```bash
+iptvc serve --check --playlists-all-cooldown 10000
+```
+
+
+### `--playlists-one-cooldown`
+
+Задержка в миллисекундах после проверки каждого плейлиста.
+
+Переопределяет `check.playlists.one-cooldown` (по умолчанию `0`).
+
+```bash
+iptvc serve --check --playlists-one-cooldown 2000
+```
+
+
+### `--playlists-max-routines`
+
+Максимум одновременно проверяемых плейлистов.
+
+Переопределяет `check.playlists.max-routines` (по умолчанию `5`).
+
+```bash
+iptvc serve --check --playlists-max-routines 10
+```
+
+
+### `--playlists-per-routine`
+
+Количество плейлистов на одну процедуру проверки.
+
+Переопределяет `check.playlists.per-routine` (по умолчанию `1`).
+
+```bash
+iptvc serve --check --playlists-per-routine 3
+```
+
+
+### `--playlists-user-agent`
+
+User-Agent для HTTP-запросов плейлистов. Можно указать несколько — будет выбран случайный при каждом запросе.
+
+Переопределяет `check.playlists.user-agent`.
+
+```bash
+iptvc serve --check --playlists-user-agent "Mozilla/5.0" "curl/8.0"
+```
+
+## Флаги проверки каналов
+
+Эти флаги переопределяют параметры секции `check.channels` из `config.yml`. Доступны для команд `check` и `serve`. Имеют смысл только при включённой фоновой проверке.
+
+
+### `--channels-timeout`
+
+Таймаут HTTP-запроса канала в миллисекундах.
+
+Переопределяет `check.channels.timeout` (по умолчанию `10000`).
+
+```bash
+iptvc serve --check --channels-timeout 8000
+```
+
+
+### `--channels-byte-range`
+
+Объём данных в байтах для загрузки от сервера при проверке канала.
+
+Переопределяет `check.channels.byte-range` (по умолчанию `512`).
+
+```bash
+iptvc serve --check --channels-byte-range 1024
+```
+
+
+### `--channels-cooldown`
+
+Задержка в миллисекундах после проверки каждого канала.
+
+Переопределяет `check.channels.cooldown` (по умолчанию `0`).
+
+```bash
+iptvc serve --check --channels-cooldown 100
+```
+
+
+### `--channels-max-routines`
+
+Максимум одновременно проверяемых каналов.
+
+Переопределяет `check.channels.max-routines` (по умолчанию `50`).
+
+```bash
+iptvc serve --check --channels-max-routines 100
+```
+
+
+### `--channels-per-routine`
+
+Количество каналов на одну процедуру проверки.
+
+Переопределяет `check.channels.per-routine` (по умолчанию `10`).
+
+```bash
+iptvc serve --check --channels-per-routine 20
+```
+
+
+### `--channels-user-agent`
+
+User-Agent для HTTP-запросов каналов. Можно указать несколько — будет выбран случайный при каждом запросе.
+
+Переопределяет `check.channels.user-agent`.
+
+```bash
+iptvc serve --check --channels-user-agent "Mozilla/5.0" "VLC/3.0"
+```
+
+## Флаги кеша
+
+Эти флаги переопределяют параметры секции `cache` из `config.yml`. Доступны для команд `check` и `serve`.
+
+
+### `--cache-enabled`
+
+Включает кеширование результатов в KeyDB/Redis.
+
+Переопределяет `cache.enabled` (по умолчанию `false`).
+
+```bash
+iptvc serve --cache-enabled
+```
+
+
+### `--cache-host`
+
+Хост KeyDB/Redis.
+
+Переопределяет `cache.host` (по умолчанию `localhost`).
+
+```bash
+iptvc serve --cache-enabled --cache-host 192.168.1.10
+```
+
+
+### `--cache-port`
+
+Порт KeyDB/Redis.
+
+Переопределяет `cache.port` (по умолчанию `6379`).
+
+```bash
+iptvc serve --cache-enabled --cache-port 6380
+```
+
+
+### `--cache-username`
+
+Логин для подключения к KeyDB/Redis.
+
+Переопределяет `cache.username`.
+
+```bash
+iptvc serve --cache-enabled --cache-username myuser
+```
+
+
+### `--cache-password`
+
+Пароль для подключения к KeyDB/Redis.
+
+Переопределяет `cache.password`.
+
+```bash
+iptvc serve --cache-enabled --cache-password secret
+```
+
+
+### `--cache-db`
+
+Номер базы данных KeyDB/Redis.
+
+Переопределяет `cache.db` (по умолчанию `0`).
+
+```bash
+iptvc serve --cache-enabled --cache-db 2
+```
+
+
+### `--cache-ttl`
+
+TTL записей кеша в секундах.
+
+Переопределяет `cache.ttl` (по умолчанию `1800`).
+
+```bash
+iptvc serve --cache-enabled --cache-ttl 3600
+```
+
+## Примеры
+
+```bash
+# просто веб-сервер без проверки
+iptvc serve
+
+# веб-сервер с фоновой проверкой каждые 2 минуты
+iptvc serve --check --every 120
+
+# веб-сервер на порту 3000 с проверкой 10 случайных плейлистов
+iptvc serve -p 3000 --check -r 10
+
+# один цикл проверки, затем только веб-сервер
+iptvc serve --check --repeat 1 --every 0
+
+# веб-сервер с кешем и фоновой проверкой, увеличенные лимиты параллелизма
+iptvc serve --check --cache-enabled \
+ --playlists-max-routines 10 \
+ --channels-max-routines 100
+
+# веб-сервер с отладкой и кастомным user-agent
+iptvc serve --check --debug \
+ --playlists-user-agent "Mozilla/5.0" \
+ --channels-user-agent "VLC/3.0"
+```
+
+## Веб-маршруты
+
+| Метод | Путь | Описание |
+| --- | --- | --- |
+| GET | `/` | Главная страница со списком плейлистов |
+| GET | `/page/{N}` | Страница N списка плейлистов |
+| GET | `/{code}` | Редирект на прямую ссылку плейлиста |
+| GET | `/{code}.m3u[8]` | Редирект на прямую ссылку плейлиста |
+| GET | `/{code}/details` | Страница с описанием плейлиста |
+| GET | `/api/playlists/{code}` | JSON: информация о плейлисте |
+| GET | `/api/version` | JSON: версии компонентов |
+| GET | `/api/health` | JSON: состояние сервиса |
+| GET | `/api/stats` | JSON: статистика по плейлистам и каналам |
diff --git a/src/iptvc/commands/version.md b/content/iptvc/commands/version.md
similarity index 77%
rename from src/iptvc/commands/version.md
rename to content/iptvc/commands/version.md
index 48f466e..af5dead 100644
--- a/src/iptvc/commands/version.md
+++ b/content/iptvc/commands/version.md
@@ -1,5 +1,6 @@
---
-tags: ["iptvc"]
+title: version
+tags: [iptvc]
---
# Команда `version`
@@ -7,7 +8,7 @@ tags: ["iptvc"]
Выводит версию программы:
```bash
-iptvc version
+./iptvc version
```
Пример результата:
diff --git a/content/iptvc/config/config.md b/content/iptvc/config/config.md
new file mode 100644
index 0000000..3035572
--- /dev/null
+++ b/content/iptvc/config/config.md
@@ -0,0 +1,436 @@
+---
+title: config.yml
+icon: material/file-cog
+tags: ["iptvc", "конфигурация"]
+---
+
+# :material-file-cog: Конфигурация config.yml
+
+Программа читает настройки из YAML-файла `config.yml` в корне проекта.
+Путь к файлу можно задать через глобальный флаг `--config`.
+
+## Приоритет настроек
+
+От низшего к высшему:
+
+1. **Значения по умолчанию** — встроены в код;
+2. **`config.yml`** — YAML-файл;
+3. **Переменные окружения** — переопределяют `config.yml` (если заданы);
+4. **CLI-флаги** — переопределяют переменные окружения и `config.yml` (если заданы явно).
+
+Файл `.env` загружается автоматически, переменные из него применяются как переменные окружения.
+
+## Структура файла
+
+```yaml
+app:
+ timezone: GMT
+ debug: false
+ log_level: info
+ playlists: ./playlists.ini
+ tags: ./channels.json
+
+server:
+ host: localhost
+ port: 8080
+
+site:
+ base-url: http://localhost:8080
+ repo-url: https://git.axenov.dev/IPTV
+ page-size: 0
+ favicon:
+ header:
+ title: IPTV Checker
+ navigation:
+ - title: Документация
+ url: /docs
+ icon: document-text-outline
+ - title: Telegram
+ icon: paper-plane-outline
+ children:
+ - title: Канал
+ url: https://t.me/iptv_aggregator
+ icon: megaphone-outline
+ footer-links:
+ - title: Исходники
+ url: https://git.axenov.dev/IPTV
+ icon: code-slash-outline
+
+check:
+ start-on-serve: false
+ playlists:
+ user-agent:
+ - Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
+ timeout: 10000
+ all-cooldown: 0
+ one-cooldown: 0
+ max-routines: 5
+ per-routine: 1
+ channels:
+ user-agent: Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
+ timeout: 10000
+ byte-range: 512
+ cooldown: 0
+ max-routines: 50
+ per-routine: 10
+
+cache:
+ enabled: false
+ host: localhost
+ port: 6379
+ username:
+ password:
+ db: 0
+ ttl: 1800
+```
+
+## Секция `app`
+
+| Параметр | Тип | По умолчанию | Описание |
+| ----------- | ------ | ----------------- | ---------------------- |
+| `timezone` | string | `GMT` | Часовой пояс |
+| `debug` | bool | `false` | Режим отладки |
+| `log_level` | string | `info` | Уровень логирования |
+| `playlists` | string | `./playlists.ini` | Путь к `playlists.ini` |
+| `tags` | string | `./channels.json` | Путь к `channels.json` |
+
+## Секция `server`
+
+| Параметр | Тип | По умолчанию | Описание |
+| -------- | ------ | ------------ | ----------------- |
+| `host` | string | (пусто) | Хост для привязки |
+| `port` | uint | `8080` | Порт веб-сервера |
+
+## Секция `site`
+
+Настройки сайта: ссылки, заголовок, навигация, пагинация.
+
+| Параметр | Тип | По умолчанию | Описание |
+| ----------- | ------ | ----------------------------- | ----------------------------------- |
+| `base-url` | string | `http://localhost:8080` | Базовый URL для формирования ссылок |
+| `repo-url` | string | `https://git.axenov.dev/IPTV` | Ссылка на репозиторий |
+| `page-size` | uint | `0` | Размер страницы (0 — без пагинации) |
+| `favicon` | string | (пусто) | Путь к иконке сайта |
+
+### `site.header`
+
+Настройки шапки сайта.
+
+| Параметр | Тип | По умолчанию | Описание |
+| ------------ | ------ | -------------- | -------------------------------------- |
+| `title` | string | `IPTV Checker` | Заголовок сайта (в navbar и ``) |
+| `navigation` | [Link] | (см. ниже) | Ссылки в шапке сайта |
+
+### `site.footer-links`
+
+Ссылки в подвале сайта. Массив элементов `Link`.
+
+### Тип `Link`
+
+Элемент навигации или подвала. Если задано `children`, рендерится как выпадающее меню.
+
+| Параметр | Тип | Описание |
+| ---------- | ------ | ----------------------------------------------------------- |
+| `title` | string | Текст ссылки |
+| `url` | string | URL ссылки (можно опустить, если есть `children`) |
+| `icon` | string | Имя иконки |
+| `children` | [Link] | Дочерние ссылки (выпадающее меню, один уровень вложенности) |
+
+--8<-- "ionicons-name.md"
+
+Пример:
+
+```yaml
+site:
+ header:
+ navigation:
+ - title: Документация
+ url: /docs
+ icon: document-text-outline
+ - title: Telegram
+ icon: paper-plane-outline
+ children:
+ - title: Канал
+ url: https://t.me/iptv_aggregator
+ icon: megaphone-outline
+ - title: Чат
+ url: https://t.me/iptv_aggregator_chat
+ icon: chatbubbles-outline
+ footer-links:
+ - title: Исходники
+ url: https://git.axenov.dev/IPTV
+ icon: code-slash-outline
+ - title: axenov.dev
+ url: https://axenov.dev
+ icon: person-outline
+```
+
+## Секция `check`
+
+Параметры проверки плейлистов и каналов. Поддерживаются скаляры и массивы.
+
+### `check.start-on-serve`
+
+| Параметр | Тип | По умолчанию | Описание |
+| ---------------- | ---- | ------------ | ---------------------------------------------------------- |
+| `start-on-serve` | bool | `false` | Запустить фоновую проверку при `serve` без флага `--check` |
+
+### Типы значений
+
+!!! info "timeout, max-routines, per-routine, byte-range"
+ Эти параметры — всегда целые числа, не массивы.
+
+!!! info "cooldown (all-cooldown, one-cooldown, channels.cooldown)"
+ Эти параметры могут быть заданы:
+
+ - **скаляром** — фиксированное значение, например `all-cooldown: 10`;
+ - **массивом `[min, max]`** — случайное значение в диапазоне при каждой проверке, например `all-cooldown: [5, 15]`.
+
+!!! info "user-agent"
+ Параметр `user-agent` может быть задан:
+
+ - **строкой** — используется всегда одно значение;
+ - **массивом строк** — случайный выбор при каждом запросе.
+
+!!! info "byte-range"
+ Параметр `byte-range` — всегда целое число (не массив).
+
+### `check.playlists`
+
+Параметры проверки плейлистов (загрузка m3u-файлов по URL или из ФС).
+
+| Параметр | Тип | По умолчанию | Единица | Описание |
+| -------------- | ------------------ | ----------------- | ------- | ------------------------------------------------ |
+| `user-agent` | string \| string[] | `Mozilla/5.0 ...` | — | User-Agent для HTTP-запросов |
+| `timeout` | int | `10000` | мс | Таймаут запроса плейлиста |
+| `all-cooldown` | int \| int[] | `0` | мс | Задержка после проверки всех плейлистов |
+| `one-cooldown` | int \| int[] | `0` | мс | Задержка после проверки каждого плейлиста |
+| `max-routines` | int | `5` | шт | Максимум одновременно проверяемых плейлистов |
+| `per-routine` | int | `1` | шт | Количество плейлистов на одну процедуру проверки |
+
+### `check.channels`
+
+Параметры проверки каналов внутри плейлиста.
+
+| Параметр | Тип | По умолчанию | Единица | Описание |
+| -------------- | ------------------ | ----------------- | ------- | --------------------------------------------- |
+| `user-agent` | string \| string[] | `Mozilla/5.0 ...` | — | User-Agent для HTTP-запросов |
+| `timeout` | int | `10000` | мс | Таймаут запроса канала |
+| `byte-range` | int | `512` | байт | Объём данных для загрузки от сервера |
+| `cooldown` | int \| int[] | `0` | мс | Задержка после проверки каждого канала |
+| `max-routines` | int | `50` | шт | Максимум одновременно проверяемых каналов |
+| `per-routine` | int | `10` | шт | Количество каналов на одну процедуру проверки |
+
+## Секция `cache`
+
+| Параметр | Тип | По умолчанию | Описание |
+| ---------- | ------ | ------------ | ---------------------------------- |
+| `enabled` | bool | `false` | Включить кеширование (KeyDB/Redis) |
+| `host` | string | `localhost` | Хост KeyDB/Redis |
+| `port` | uint | `6379` | Порт KeyDB/Redis |
+| `username` | string | (пусто) | Логин |
+| `password` | string | (пусто) | Пароль |
+| `db` | uint | `0` | Номер БД |
+| `ttl` | uint | `1800` | TTL записей (сек) |
+
+## Валидация
+
+При запуске конфигурация валидируется.
+Некорректные значения исправляются автоматически, каждое исправление логируется:
+
+| Проверка | Действие |
+| ---------------------------------------------------- | --------------------------------------- |
+| `server.port` = 0 или > 65535 | сброс в `8080` |
+| `site.base-url` пусто | автогенерация `http://localhost:{port}` |
+| `cache.host` пусто (если cache включён) | `localhost` |
+| `cache.port` = 0 (если cache включён) | `6379` |
+| `cache.ttl` = 0 (если cache включён) | `1800` |
+| `check.playlists.timeout` <= 0 | `10000` |
+| `check.channels.timeout` <= 0 | `10000` |
+| `check.*.cooldown` — `min > max` | swap |
+| `check.*.cooldown` — выход за границы `[0, 3600000]` | clamp |
+| `check.playlists.max-routines` < 1 | `5` |
+| `check.channels.max-routines` < 1 | `50` |
+| `check.playlists.per-routine` < 1 | `1` |
+| `check.channels.per-routine` < 1 | `10` |
+| `check.channels.byte-range` <= 0 | `512` |
+| `check.*.user-agent` пусто | дефолтный User-Agent |
+
+## Переменные окружения
+
+Переменные окружения переопределяют значения из `config.yml`.
+
+### Приложение
+
+| Переменная | Соответствует в `config.yml` |
+| --------------- | ---------------------------- |
+| `APP_DEBUG` | `app.debug` |
+| `APP_LOG_LEVEL` | `app.log_level` |
+| `APP_TIMEZONE` | `app.timezone` |
+| `APP_PLAYLISTS` | `app.playlists` |
+| `APP_TAGS` | `app.tags` |
+
+### Веб-сервер и сайт
+
+| Переменная | Соответствует в `config.yml` |
+| -------------- | ---------------------------- |
+| `WEB_PORT` | `server.port` |
+| `WEB_HOST` | `server.host` |
+| `APP_URL` | `site.base-url` |
+| `PAGE_SIZE` | `site.page-size` |
+| `REPO_URL` | `site.repo-url` |
+| `SITE_FAVICON` | `site.favicon` |
+| `APP_TITLE` | `site.header.title` |
+
+### Проверка
+
+| Переменная | Соответствует в `config.yml` |
+| ---------------------- | ---------------------------- |
+| `CHECK_START_ON_SERVE` | `check.start-on-serve` |
+
+#### `check.playlists`
+
+| Переменная | Соответствует в `config.yml` |
+| ---------------------------------- | --------------------------------------------------- |
+| `CHECK_PLAYLISTS_TIMEOUT` | `check.playlists.timeout` |
+| `CHECK_PLAYLISTS_ALL_COOLDOWN` | `check.playlists.all-cooldown` (скаляр) |
+| `CHECK_PLAYLISTS_ALL_COOLDOWN_MIN` | `check.playlists.all-cooldown` (минимум диапазона) |
+| `CHECK_PLAYLISTS_ALL_COOLDOWN_MAX` | `check.playlists.all-cooldown` (максимум диапазона) |
+| `CHECK_PLAYLISTS_ONE_COOLDOWN` | `check.playlists.one-cooldown` (скаляр) |
+| `CHECK_PLAYLISTS_ONE_COOLDOWN_MIN` | `check.playlists.one-cooldown` (минимум диапазона) |
+| `CHECK_PLAYLISTS_ONE_COOLDOWN_MAX` | `check.playlists.one-cooldown` (максимум диапазона) |
+| `CHECK_PLAYLISTS_MAX_ROUTINES` | `check.playlists.max-routines` |
+| `CHECK_PLAYLISTS_PER_ROUTINE` | `check.playlists.per-routine` |
+| `CHECK_PLAYLISTS_USER_AGENT_1` | `check.playlists.user-agent` (первый элемент) |
+| `CHECK_PLAYLISTS_USER_AGENT_2` | `check.playlists.user-agent` (второй элемент) |
+| `CHECK_PLAYLISTS_USER_AGENT_N` | `check.playlists.user-agent` (N-й элемент) |
+
+#### `check.channels`
+
+| Переменная | Соответствует в `config.yml` |
+| ----------------------------- | ---------------------------------------------- |
+| `CHECK_CHANNELS_TIMEOUT` | `check.channels.timeout` |
+| `CHECK_CHANNELS_BYTE_RANGE` | `check.channels.byte-range` |
+| `CHECK_CHANNELS_COOLDOWN` | `check.channels.cooldown` (скаляр) |
+| `CHECK_CHANNELS_COOLDOWN_MIN` | `check.channels.cooldown` (минимум диапазона) |
+| `CHECK_CHANNELS_COOLDOWN_MAX` | `check.channels.cooldown` (максимум диапазона) |
+| `CHECK_CHANNELS_MAX_ROUTINES` | `check.channels.max-routines` |
+| `CHECK_CHANNELS_PER_ROUTINE` | `check.channels.per-routine` |
+| `CHECK_CHANNELS_USER_AGENT_1` | `check.channels.user-agent` (первый элемент) |
+| `CHECK_CHANNELS_USER_AGENT_2` | `check.channels.user-agent` (второй элемент) |
+| `CHECK_CHANNELS_USER_AGENT_N` | `check.channels.user-agent` (N-й элемент) |
+
+!!! info "Диапазоны cooldown через env"
+ Если заданы обе переменные `_MIN` и `_MAX` — используется диапазон.
+ Если задана только скалярная переменная (без `_MIN`/`_MAX`) — используется фиксированное значение.
+ Если задана только одна из `_MIN`/`_MAX` — переменная игнорируется.
+
+!!! info "Массивы user-agent через env"
+ Переменные читаются последовательно: `_1`, `_2`, `_3`, …
+ Первая отсутствующая переменная останавливает чтение.
+ Пустые значения пропускаются.
+
+### Кеш
+
+| Переменная | Соответствует в `config.yml` |
+| ---------------- | ---------------------------- |
+| `CACHE_ENABLED` | `cache.enabled` |
+| `CACHE_HOST` | `cache.host` |
+| `CACHE_PORT` | `cache.port` |
+| `CACHE_USERNAME` | `cache.username` |
+| `CACHE_PASSWORD` | `cache.password` |
+| `CACHE_DB` | `cache.db` |
+| `CACHE_TTL` | `cache.ttl` |
+
+## CLI-флаги
+
+CLI-флаги имеют наивысший приоритет и переопределяют значения из `config.yml` и переменных окружения. Все флаги используют zero-value по умолчанию: переопределение срабатывает, только если флаг задан явно (через `cmd.Flags().Changed()`).
+
+Порядок применения в обработчиках команд:
+
+```
+app.Init() → defaults → config.yml → env → logger
+applyAppOverrides(cmd) → app.* через Changed()
+applyCacheOverrides(cmd) → cache.* через Changed()
+applyCheckOverrides(cmd) → check.* через Changed()
+app.InitCache() → подключение к KeyDB/Redis
+```
+
+### Глобальные флаги
+
+### Флаги путей
+
+Доступны для `check` и `serve`.
+
+| Флаг | Тип | Соответствует в `config.yml` | Описание |
+| -------------- | ------ | ---------------------------- | ---------------------- |
+| `-i`, `--ini` | string | `app.playlists` | Путь к `playlists.ini` |
+| `-t`, `--tags` | string | `app.tags` | Путь к `channels.json` |
+
+### Флаги итерации
+
+Доступны для `check` и `serve`.
+
+| Флаг | Тип | По умолчанию | Описание |
+| ---------------- | ---- | ------------------------------ | --------------------------------------------- |
+| `-r`, `--random` | uint | `0` | Проверить N случайных плейлистов из ini-файла |
+| `--repeat` | uint | `1` (`check`) / `0` (`serve`) | Количество циклов (0 = бесконечно) |
+| `--every` | uint | `5` (`check`) / `60` (`serve`) | Секунд между циклами |
+
+### Флаги проверки плейлистов
+
+Доступны для `check` и `serve`. Переопределяют секцию `check.playlists`.
+
+| Флаг | Тип | Соответствует в `config.yml` | Единица | Описание |
+| -------------------------- | -------- | ------------------------------ | ------- | -------------------------------- |
+| `--playlists-timeout` | int | `check.playlists.timeout` | мс | Таймаут запроса плейлиста |
+| `--playlists-all-cooldown` | int | `check.playlists.all-cooldown` | мс | Задержка после всех плейлистов |
+| `--playlists-one-cooldown` | int | `check.playlists.one-cooldown` | мс | Задержка после каждого плейлиста |
+| `--playlists-max-routines` | int | `check.playlists.max-routines` | шт | Максимум параллельных проверок |
+| `--playlists-per-routine` | int | `check.playlists.per-routine` | шт | Плейлистов на процедуру |
+| `--playlists-user-agent` | string[] | `check.playlists.user-agent` | — | User-Agent (можно несколько) |
+
+### Флаги проверки каналов
+
+Доступны для `check` и `serve`. Переопределяют секцию `check.channels`.
+
+| Флаг | Тип | Соответствует в `config.yml` | Единица | Описание |
+| ------------------------- | -------- | ----------------------------- | ------- | ------------------------------ |
+| `--channels-timeout` | int | `check.channels.timeout` | мс | Таймаут запроса канала |
+| `--channels-byte-range` | int | `check.channels.byte-range` | байт | Объём данных от сервера |
+| `--channels-cooldown` | int | `check.channels.cooldown` | мс | Задержка после каждого канала |
+| `--channels-max-routines` | int | `check.channels.max-routines` | шт | Максимум параллельных проверок |
+| `--channels-per-routine` | int | `check.channels.per-routine` | шт | Каналов на процедуру |
+| `--channels-user-agent` | string[] | `check.channels.user-agent` | — | User-Agent (можно несколько) |
+
+### Флаги кеша
+
+Доступны для `check` и `serve`. Переопределяют секцию `cache`.
+
+| Флаг | Тип | Соответствует в `config.yml` | Описание |
+| ------------------ | ------ | ---------------------------- | ----------------- |
+| `--cache-enabled` | bool | `cache.enabled` | Включить кеш |
+| `--cache-host` | string | `cache.host` | Хост KeyDB/Redis |
+| `--cache-port` | uint | `cache.port` | Порт KeyDB/Redis |
+| `--cache-username` | string | `cache.username` | Логин |
+| `--cache-password` | string | `cache.password` | Пароль |
+| `--cache-db` | uint | `cache.db` | Номер БД |
+| `--cache-ttl` | uint | `cache.ttl` | TTL записей (сек) |
+
+### Флаги только для `serve`
+
+| Флаг | Тип | Соответствует в `config.yml` | Описание |
+| -------------- | ------ | ---------------------------- | ------------------------- |
+| `-p`, `--port` | uint | `server.port` | Порт веб-сервера |
+| `--host` | string | `server.host` | Хост привязки |
+| `--check` | bool | — | Включить фоновую проверку |
+
+### Флаги только для `check`
+
+| Флаг | Тип | Описание |
+| --------------- | -------- | -------------------------- |
+| `-j`, `--json` | bool | Вывод результатов в JSON |
+| `-q`, `--quiet` | bool | Подавить логи |
+| `-f`, `--file` | string[] | Локальный m3u-файл |
+| `-u`, `--url` | string[] | URL удалённого плейлиста |
+| `-c`, `--code` | string[] | Код плейлиста из ini-файла |
diff --git a/content/iptvc/config/env.md b/content/iptvc/config/env.md
new file mode 100644
index 0000000..645d5d1
--- /dev/null
+++ b/content/iptvc/config/env.md
@@ -0,0 +1,116 @@
+---
+icon: simple/dotenv
+tags: ["iptvc", "переменные окружения"]
+---
+
+# :simple-dotenv: Переменные окружения
+
+Переменные окружения переопределяют значения из [`config.yml`](config.md).
+Файл `.env` загружается автоматически при запуске.
+
+Приоритет: **defaults → config.yml → env → CLI-флаги**.
+
+## Приложение
+
+| Имя | Тип | Умолчание | Назначение |
+| ---------------- | ------ | ----------------------- | ----------------------------------------- |
+| `APP_DEBUG` | bool | `false` | Режим отладки |
+| `APP_LOG_LEVEL` | string | `info` | Уровень логирования (`debug`, `info`, `warn`, `error`) |
+| `APP_TIMEZONE` | string | `GMT` | Часовой пояс |
+| `APP_PLAYLISTS` | string | `./playlists.ini` | Путь к `playlists.ini` |
+| `APP_TAGS` | string | `./channels.json` | Путь к `channels.json` |
+
+## Веб-сервер и сайт
+
+| Имя | Тип | Умолчание | Назначение |
+| ---------------- | ------ | ----------------------------- | ----------------------------------- |
+| `WEB_PORT` | uint | `8080` | Порт веб-сервера |
+| `WEB_HOST` | string | (пусто) | Хост для привязки |
+| `APP_URL` | string | `http://localhost:8080` | Базовый URL для ссылок |
+| `PAGE_SIZE` | uint | `0` | Размер страницы (0 — без пагинации) |
+| `REPO_URL` | string | `https://git.axenov.dev/IPTV` | Ссылка на репозиторий |
+| `SITE_FAVICON` | string | (пусто) | Путь к иконке сайта |
+| `APP_TITLE` | string | `IPTV Checker` | Заголовок сайта |
+
+## Проверка
+
+| Имя | Тип | Умолчание | Назначение |
+| ----------------------- | --- | --------- | ------------------------------------------------------- |
+| `CHECK_START_ON_SERVE` | bool | `false` | Запустить фоновую проверку при `serve` без флага `--check` |
+
+### `check.playlists`
+
+| Имя | Тип | Умолчание | Назначение |
+| --- | --- | --- | --- |
+| `CHECK_PLAYLISTS_TIMEOUT` | int | `10000` | Таймаут запроса плейлиста (мс) |
+| `CHECK_PLAYLISTS_ALL_COOLDOWN` | int | `0` | Задержка после всех плейлистов (мс, скаляр) |
+| `CHECK_PLAYLISTS_ALL_COOLDOWN_MIN` | int | `0` | Минимум задержки после всех плейлистов (мс) |
+| `CHECK_PLAYLISTS_ALL_COOLDOWN_MAX` | int | `0` | Максимум задержки после всех плейлистов (мс) |
+| `CHECK_PLAYLISTS_ONE_COOLDOWN` | int | `0` | Задержка после каждого плейлиста (мс, скаляр) |
+| `CHECK_PLAYLISTS_ONE_COOLDOWN_MIN` | int | `0` | Минимум задержки после каждого плейлиста (мс) |
+| `CHECK_PLAYLISTS_ONE_COOLDOWN_MAX` | int | `0` | Максимум задержки после каждого плейлиста (мс) |
+| `CHECK_PLAYLISTS_MAX_ROUTINES` | int | `5` | Максимум параллельных проверок плейлистов |
+| `CHECK_PLAYLISTS_PER_ROUTINE` | int | `1` | Плейлистов на процедуру |
+| `CHECK_PLAYLISTS_USER_AGENT_1` | string | `Mozilla/5.0 …` | Первый User-Agent для запросов плейлистов |
+| `CHECK_PLAYLISTS_USER_AGENT_2` | string | — | Второй User-Agent (и т.д.) |
+
+### `check.channels`
+
+| Имя | Тип | Умолчание | Назначение |
+| --- | --- | --- | --- |
+| `CHECK_CHANNELS_TIMEOUT` | int | `10000` | Таймаут запроса канала (мс) |
+| `CHECK_CHANNELS_BYTE_RANGE` | int | `512` | Объём данных от сервера (байт) |
+| `CHECK_CHANNELS_COOLDOWN` | int | `0` | Задержка после каждого канала (мс, скаляр) |
+| `CHECK_CHANNELS_COOLDOWN_MIN` | int | `0` | Минимум задержки после каждого канала (мс) |
+| `CHECK_CHANNELS_COOLDOWN_MAX` | int | `0` | Максимум задержки после каждого канала (мс) |
+| `CHECK_CHANNELS_MAX_ROUTINES` | int | `50` | Максимум параллельных проверок каналов |
+| `CHECK_CHANNELS_PER_ROUTINE` | int | `10` | Каналов на процедуру |
+| `CHECK_CHANNELS_USER_AGENT_1` | string | `Mozilla/5.0 …` | Первый User-Agent для запросов каналов |
+| `CHECK_CHANNELS_USER_AGENT_2` | string | — | Второй User-Agent (и т.д.) |
+
+## Кеширование
+
+Кеш хранится в СУБД redis или keydb.
+
+| Имя | Тип | Умолчание | Назначение |
+| ---------------- | ------ | ----------- | ---------------------------------- |
+| `CACHE_ENABLED` | bool | `false` | Включает кеширование |
+| `CACHE_HOST` | string | `localhost` | Имя хоста СУБД |
+| `CACHE_PORT` | uint | `6379` | Порт СУБД |
+| `CACHE_USERNAME` | string | (пусто) | Логин пользователя в СУБД |
+| `CACHE_PASSWORD` | string | (пусто) | Пароль пользователя в СУБД |
+| `CACHE_DB` | uint | `0` | Номер БД в СУБД для кеша |
+| `CACHE_TTL` | uint | `1800` | Время жизни ключей кеша в секундах |
+
+## Правила
+
+### Диапазоны cooldown
+
+Поля `all-cooldown`, `one-cooldown` и `channels.cooldown` поддерживают скаляр и диапазон `[min, max]`.
+
+Через env-переменные:
+
+- Заданы **обе** `_MIN` и `_MAX` → диапазон (случайное значение при каждой проверке).
+- Задана только **скалярная** переменная (без суффикса) → фиксированное значение.
+- Задана только **одна** из `_MIN` / `_MAX` → переменная игнорируется.
+
+```shell title="Скаляр"
+CHECK_PLAYLISTS_ALL_COOLDOWN=500
+```
+
+```shell title="Диапазон"
+CHECK_PLAYLISTS_ALL_COOLDOWN_MIN=100
+CHECK_PLAYLISTS_ALL_COOLDOWN_MAX=2000
+```
+
+### Массивы user-agent
+
+Поля `user-agent` поддерживают массив строк. Через env задаются индексированными переменными `_1`, `_2`, `_3`, …
+
+- Чтение останавливается на первой отсутствующей переменной.
+- Пустые значения пропускаются.
+
+```shell title="Два User-Agent"
+CHECK_PLAYLISTS_USER_AGENT_1=Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
+CHECK_PLAYLISTS_USER_AGENT_2=curl/8.0
+```
diff --git a/src/dev/deploy.md b/content/iptvc/deploy/index.md
similarity index 100%
rename from src/dev/deploy.md
rename to content/iptvc/deploy/index.md
diff --git a/content/iptvc/dev/compile.md b/content/iptvc/dev/compile.md
new file mode 100644
index 0000000..47c8d4b
--- /dev/null
+++ b/content/iptvc/dev/compile.md
@@ -0,0 +1,24 @@
+---
+title: Компиляция
+icon: material/cog
+---
+
+# Компиляция из исходного кода
+
+Для компиляции потребуется golang v1.23.6 и выше.
+На версиях ниже не проверялось.
+
+```bash
+git clone https://git.axenov.dev/IPTV/iptvc.git
+cd iptvc
+make linux
+# или make help для получения помощи по компиляции
+```
+
+Поддерживается передача переменной `GOARCH`:
+
+```shell
+make darwin GOARCH=arm64
+```
+
+Скомпилированные файлы находятся в директории `bin/`.
diff --git a/content/iptvc/dev/docker.md b/content/iptvc/dev/docker.md
new file mode 100644
index 0000000..fef58df
--- /dev/null
+++ b/content/iptvc/dev/docker.md
@@ -0,0 +1,27 @@
+---
+title: Docker-образ
+icon: simple/docker
+---
+
+# Построение Docker-образа
+
+Предполагается выполнение в директории с исходниками.
+
+```
+./build-docker-image.sh [<версия>]
+```
+
+где `<версия>` — необязательный тег версии в формате `vX.Y.Z`.
+Если не указан, то будет взят последний.
+
+Целевая платформа и архитектура меняется с помощью переменных `GOOS` и `GOARCH`:
+
+```
+GOOS=darwin GOARCH=arm64 ./build-docker-image.sh [<версия>]
+```
+
+Запуск:
+
+```
+docker run --pull always --name iptvc git.axenov.dev/iptv/iptvc КОМАНДА [АРГУМЕНТЫ]
+```
diff --git a/content/iptvc/dev/docs/components.md b/content/iptvc/dev/docs/components.md
new file mode 100644
index 0000000..dcedf69
--- /dev/null
+++ b/content/iptvc/dev/docs/components.md
@@ -0,0 +1,284 @@
+# Песочница
+
+
+
+## Мелочёвка
+
+=== "Frontmatter"
+
+ ```yaml
+ ---
+ title: My Page
+ description: Some page description
+ icon: material/star
+ tags: [tag1, tag2]
+ hide: [navigation, toc, path]
+ status: new
+ #status: deprecated
+ #status: beta
+ ---
+
+ # My Super-Duper Page
+
+ # Markdown content goes here
+ ```
+
+=== "Бейджи"
+
+
+
+=== "Тултипы"
+
+ :material-information-outline:{ title="текст подсказки" }
+
+ [Hover me 1](https://example.com "I'm first tooltip!")
+
+ [Hover me 2][example]
+
+ [example]: https://example.com "I'm second tooltip!"
+
+=== "Кнопки"
+
+ [Серая кнопка](https://example.com/){ .md-button }
+
+ [Синяя кнопка](https://example.com/){ .md-button .md-button--primary }
+
+ [:fontawesome-solid-paper-plane: Кнопка серая с иконкой и подсказкой](https://example.com/){ .md-button title="текст подсказки 2" }
+
+ [:fontawesome-solid-paper-plane: Кнопка синяя с иконкой](https://example.com/){ .md-button .md-button--primary }
+
+---
+
+=== "Простой блок"
+
+ ```python
+ def _render_icon(shortcode: str, md) -> str:
+ emoji_pattern = md.inlinePatterns.get("emoji")
+ if emoji_pattern is None:
+ return escape(shortcode)
+ ```
+
+=== "С аннотациями"
+
+ ```python
+ def _render_icon(shortcode: str, md) -> str: #(1)!
+ emoji_pattern = md.inlinePatterns.get("emoji") #(2)!
+ if emoji_pattern is None:
+ return escape(shortcode) #(3)!
+ ```
+
+ 1. сигнатура функции
+ 2. инициализация переменной
+ 3. возврат результата
+
+=== "С заголовком"
+
+ ```python title="example.py"
+ def _render_icon(shortcode: str, md) -> str:
+ emoji_pattern = md.inlinePatterns.get("emoji")
+ if emoji_pattern is None:
+ return escape(shortcode)
+ ```
+
+=== "С нумерацией с 5"
+
+ ```python linenums="5"
+ def _render_icon(shortcode: str, md) -> str:
+ emoji_pattern = md.inlinePatterns.get("emoji")
+ if emoji_pattern is None:
+ return escape(shortcode)
+ ```
+
+=== "С выделением"
+
+ ```python linenums="1" hl_lines="2-5 8 9 22"
+ def _render_icon(shortcode: str, md) -> str:
+ try:
+ emoji_pattern = md.inlinePatterns["emoji"]
+ except KeyError:
+ return escape(shortcode)
+
+ icon = emoji_pattern.emoji_index["emoji"].get(shortcode)
+ if icon is None:
+ return escape(shortcode)
+
+ element = emoji_pattern.generator(
+ emoji_pattern.emoji_index["name"],
+ shortcode,
+ None,
+ None,
+ shortcode,
+ "",
+ icon.get("category", ""),
+ emoji_pattern.options,
+ md,
+ )
+ return tostring(element, encoding="unicode", method="html")
+ ```
+
+---
+
+## Врезки
+
+=== "Полные"
+
+ !!! note "Заголовок статичной врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ !!! abstract "Заголовок статичной врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ !!! info "Заголовок статичной врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ !!! tip "Заголовок статичной врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ !!! success "Заголовок статичной врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ !!! question "Заголовок статичной врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ !!! warning "Заголовок статичной врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ !!! failure "Заголовок статичной врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ !!! danger "Заголовок статичной врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ !!! bug "Заголовок статичной врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ !!! example "Заголовок статичной врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ !!! quote "Заголовок статичной врезки"
+ Содержимое, которое может
+ быть многострочным
+
+=== "Свёрнутые"
+
+ ??? note "Заголовок свёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ??? abstract "Заголовок свёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ??? info "Заголовок свёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ??? tip "Заголовок свёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ??? success "Заголовок свёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ??? question "Заголовок свёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ??? warning "Заголовок свёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ??? failure "Заголовок свёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ??? danger "Заголовок свёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ??? bug "Заголовок свёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ??? example "Заголовок свёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ??? quote "Заголовок свёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+=== "Сворачиваемые"
+
+ ???+ note "Заголовок развёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ???+ abstract "Заголовок развёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ???+ info "Заголовок развёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ???+ tip "Заголовок развёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ???+ success "Заголовок развёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ???+ question "Заголовок развёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ???+ warning "Заголовок развёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ???+ failure "Заголовок развёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ???+ danger "Заголовок развёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ???+ bug "Заголовок развёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ???+ example "Заголовок развёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+ ???+ quote "Заголовок развёрнутой врезки"
+ Содержимое, которое может
+ быть многострочным
+
+=== "Короткие"
+
+ !!! note
+ Дефолтный заголовок
+
+ !!! abstract ""
+ Пустой заголовок
+
+ !!! info "Пустое содержимое"
+
+
+---
diff --git a/src/dev/docs.md b/content/iptvc/dev/docs/index.md
similarity index 93%
rename from src/dev/docs.md
rename to content/iptvc/dev/docs/index.md
index 616739a..4952164 100644
--- a/src/dev/docs.md
+++ b/content/iptvc/dev/docs/index.md
@@ -6,7 +6,7 @@ icon: material/book-cog-outline
## Стилистика и правила оформления
-Все исходники хранятся в директории `src/` в формате **Markdown** (формат файлов `.md`).
+Все исходники хранятся в директории `content/` в формате **Markdown** (формат файлов `.md`).
Структура проекта и его конфигурация описываются в файле `mkdocs.yml` в корне репозитория.
@@ -24,7 +24,7 @@ icon: material/book-cog-outline
## Добавление изображений
-**Все изображения хранятся только в директории `src/assets/img/` и вложенных в неё.**
+**Все изображения хранятся только в директории `content/_assets/img/` и вложенных в неё.**
Общая суть такова:
@@ -49,8 +49,8 @@ icon: material/book-cog-outline
Совершенно любой текст, lorem ipsum dolor sit amet.
??? quote "В этом спойлере несколько больших картинок"
- 
- 
+ 
+ 
Продолжение текста, lorem ipsum dolor sit amet.
Продолжение текста, lorem ipsum dolor sit amet.
diff --git a/content/iptvc/dev/docs/vscode-icons.md b/content/iptvc/dev/docs/vscode-icons.md
new file mode 100644
index 0000000..b37a02e
--- /dev/null
+++ b/content/iptvc/dev/docs/vscode-icons.md
@@ -0,0 +1,550 @@
+
+
+| Иконка | Код для вставки в текст | Код для вставки в frontmatter |
+| ------------------------------------------------ | -------------------------------------------------- | ------------------------------------------------ |
+| :vscode-account: | `:vscode-account:` | `vscode/account` |
+| :vscode-activate-breakpoints: | `:vscode-activate-breakpoints:` | `vscode/activate-breakpoints` |
+| :vscode-add: | `:vscode-add:` | `vscode/add` |
+| :vscode-add-small: | `:vscode-add-small:` | `vscode/add-small` |
+| :vscode-agent: | `:vscode-agent:` | `vscode/agent` |
+| :vscode-archive: | `:vscode-archive:` | `vscode/archive` |
+| :vscode-arrow-both: | `:vscode-arrow-both:` | `vscode/arrow-both` |
+| :vscode-arrow-circle-down: | `:vscode-arrow-circle-down:` | `vscode/arrow-circle-down` |
+| :vscode-arrow-circle-left: | `:vscode-arrow-circle-left:` | `vscode/arrow-circle-left` |
+| :vscode-arrow-circle-right: | `:vscode-arrow-circle-right:` | `vscode/arrow-circle-right` |
+| :vscode-arrow-circle-up: | `:vscode-arrow-circle-up:` | `vscode/arrow-circle-up` |
+| :vscode-arrow-down: | `:vscode-arrow-down:` | `vscode/arrow-down` |
+| :vscode-arrow-left: | `:vscode-arrow-left:` | `vscode/arrow-left` |
+| :vscode-arrow-right: | `:vscode-arrow-right:` | `vscode/arrow-right` |
+| :vscode-arrow-small-down: | `:vscode-arrow-small-down:` | `vscode/arrow-small-down` |
+| :vscode-arrow-small-left: | `:vscode-arrow-small-left:` | `vscode/arrow-small-left` |
+| :vscode-arrow-small-right: | `:vscode-arrow-small-right:` | `vscode/arrow-small-right` |
+| :vscode-arrow-small-up: | `:vscode-arrow-small-up:` | `vscode/arrow-small-up` |
+| :vscode-arrow-swap: | `:vscode-arrow-swap:` | `vscode/arrow-swap` |
+| :vscode-arrow-up: | `:vscode-arrow-up:` | `vscode/arrow-up` |
+| :vscode-ask: | `:vscode-ask:` | `vscode/ask` |
+| :vscode-attach: | `:vscode-attach:` | `vscode/attach` |
+| :vscode-azure: | `:vscode-azure:` | `vscode/azure` |
+| :vscode-azure-devops: | `:vscode-azure-devops:` | `vscode/azure-devops` |
+| :vscode-beaker: | `:vscode-beaker:` | `vscode/beaker` |
+| :vscode-beaker-stop: | `:vscode-beaker-stop:` | `vscode/beaker-stop` |
+| :vscode-bell: | `:vscode-bell:` | `vscode/bell` |
+| :vscode-bell-dot: | `:vscode-bell-dot:` | `vscode/bell-dot` |
+| :vscode-bell-slash: | `:vscode-bell-slash:` | `vscode/bell-slash` |
+| :vscode-bell-slash-dot: | `:vscode-bell-slash-dot:` | `vscode/bell-slash-dot` |
+| :vscode-blank: | `:vscode-blank:` | `vscode/blank` |
+| :vscode-bold: | `:vscode-bold:` | `vscode/bold` |
+| :vscode-book: | `:vscode-book:` | `vscode/book` |
+| :vscode-bookmark: | `:vscode-bookmark:` | `vscode/bookmark` |
+| :vscode-bracket-dot: | `:vscode-bracket-dot:` | `vscode/bracket-dot` |
+| :vscode-bracket-error: | `:vscode-bracket-error:` | `vscode/bracket-error` |
+| :vscode-briefcase: | `:vscode-briefcase:` | `vscode/briefcase` |
+| :vscode-broadcast: | `:vscode-broadcast:` | `vscode/broadcast` |
+| :vscode-browser: | `:vscode-browser:` | `vscode/browser` |
+| :vscode-bug: | `:vscode-bug:` | `vscode/bug` |
+| :vscode-build: | `:vscode-build:` | `vscode/build` |
+| :vscode-calendar: | `:vscode-calendar:` | `vscode/calendar` |
+| :vscode-call-incoming: | `:vscode-call-incoming:` | `vscode/call-incoming` |
+| :vscode-call-outgoing: | `:vscode-call-outgoing:` | `vscode/call-outgoing` |
+| :vscode-case-sensitive: | `:vscode-case-sensitive:` | `vscode/case-sensitive` |
+| :vscode-chat-export: | `:vscode-chat-export:` | `vscode/chat-export` |
+| :vscode-chat-import: | `:vscode-chat-import:` | `vscode/chat-import` |
+| :vscode-chat-sparkle: | `:vscode-chat-sparkle:` | `vscode/chat-sparkle` |
+| :vscode-chat-sparkle-error: | `:vscode-chat-sparkle-error:` | `vscode/chat-sparkle-error` |
+| :vscode-chat-sparkle-warning: | `:vscode-chat-sparkle-warning:` | `vscode/chat-sparkle-warning` |
+| :vscode-check: | `:vscode-check:` | `vscode/check` |
+| :vscode-check-all: | `:vscode-check-all:` | `vscode/check-all` |
+| :vscode-checklist: | `:vscode-checklist:` | `vscode/checklist` |
+| :vscode-chevron-down: | `:vscode-chevron-down:` | `vscode/chevron-down` |
+| :vscode-chevron-left: | `:vscode-chevron-left:` | `vscode/chevron-left` |
+| :vscode-chevron-right: | `:vscode-chevron-right:` | `vscode/chevron-right` |
+| :vscode-chevron-up: | `:vscode-chevron-up:` | `vscode/chevron-up` |
+| :vscode-chip: | `:vscode-chip:` | `vscode/chip` |
+| :vscode-chrome-close: | `:vscode-chrome-close:` | `vscode/chrome-close` |
+| :vscode-chrome-maximize: | `:vscode-chrome-maximize:` | `vscode/chrome-maximize` |
+| :vscode-chrome-minimize: | `:vscode-chrome-minimize:` | `vscode/chrome-minimize` |
+| :vscode-chrome-restore: | `:vscode-chrome-restore:` | `vscode/chrome-restore` |
+| :vscode-circle: | `:vscode-circle:` | `vscode/circle` |
+| :vscode-circle-filled: | `:vscode-circle-filled:` | `vscode/circle-filled` |
+| :vscode-circle-large: | `:vscode-circle-large:` | `vscode/circle-large` |
+| :vscode-circle-large-filled: | `:vscode-circle-large-filled:` | `vscode/circle-large-filled` |
+| :vscode-circle-slash: | `:vscode-circle-slash:` | `vscode/circle-slash` |
+| :vscode-circle-small: | `:vscode-circle-small:` | `vscode/circle-small` |
+| :vscode-circle-small-filled: | `:vscode-circle-small-filled:` | `vscode/circle-small-filled` |
+| :vscode-circuit-board: | `:vscode-circuit-board:` | `vscode/circuit-board` |
+| :vscode-claude: | `:vscode-claude:` | `vscode/claude` |
+| :vscode-clear-all: | `:vscode-clear-all:` | `vscode/clear-all` |
+| :vscode-clippy: | `:vscode-clippy:` | `vscode/clippy` |
+| :vscode-clockface: | `:vscode-clockface:` | `vscode/clockface` |
+| :vscode-close: | `:vscode-close:` | `vscode/close` |
+| :vscode-close-all: | `:vscode-close-all:` | `vscode/close-all` |
+| :vscode-cloud: | `:vscode-cloud:` | `vscode/cloud` |
+| :vscode-cloud-download: | `:vscode-cloud-download:` | `vscode/cloud-download` |
+| :vscode-cloud-small: | `:vscode-cloud-small:` | `vscode/cloud-small` |
+| :vscode-cloud-upload: | `:vscode-cloud-upload:` | `vscode/cloud-upload` |
+| :vscode-code: | `:vscode-code:` | `vscode/code` |
+| :vscode-code-oss: | `:vscode-code-oss:` | `vscode/code-oss` |
+| :vscode-code-review: | `:vscode-code-review:` | `vscode/code-review` |
+| :vscode-coffee: | `:vscode-coffee:` | `vscode/coffee` |
+| :vscode-collapse-all: | `:vscode-collapse-all:` | `vscode/collapse-all` |
+| :vscode-collection: | `:vscode-collection:` | `vscode/collection` |
+| :vscode-collection-small: | `:vscode-collection-small:` | `vscode/collection-small` |
+| :vscode-color-mode: | `:vscode-color-mode:` | `vscode/color-mode` |
+| :vscode-combine: | `:vscode-combine:` | `vscode/combine` |
+| :vscode-comment: | `:vscode-comment:` | `vscode/comment` |
+| :vscode-comment-discussion: | `:vscode-comment-discussion:` | `vscode/comment-discussion` |
+| :vscode-comment-discussion-quote: | `:vscode-comment-discussion-quote:` | `vscode/comment-discussion-quote` |
+| :vscode-comment-discussion-sparkle: | `:vscode-comment-discussion-sparkle:` | `vscode/comment-discussion-sparkle` |
+| :vscode-comment-draft: | `:vscode-comment-draft:` | `vscode/comment-draft` |
+| :vscode-comment-unresolved: | `:vscode-comment-unresolved:` | `vscode/comment-unresolved` |
+| :vscode-compass: | `:vscode-compass:` | `vscode/compass` |
+| :vscode-compass-active: | `:vscode-compass-active:` | `vscode/compass-active` |
+| :vscode-compass-dot: | `:vscode-compass-dot:` | `vscode/compass-dot` |
+| :vscode-copilot: | `:vscode-copilot:` | `vscode/copilot` |
+| :vscode-copilot-blocked: | `:vscode-copilot-blocked:` | `vscode/copilot-blocked` |
+| :vscode-copilot-error: | `:vscode-copilot-error:` | `vscode/copilot-error` |
+| :vscode-copilot-in-progress: | `:vscode-copilot-in-progress:` | `vscode/copilot-in-progress` |
+| :vscode-copilot-large: | `:vscode-copilot-large:` | `vscode/copilot-large` |
+| :vscode-copilot-not-connected: | `:vscode-copilot-not-connected:` | `vscode/copilot-not-connected` |
+| :vscode-copilot-snooze: | `:vscode-copilot-snooze:` | `vscode/copilot-snooze` |
+| :vscode-copilot-success: | `:vscode-copilot-success:` | `vscode/copilot-success` |
+| :vscode-copilot-unavailable: | `:vscode-copilot-unavailable:` | `vscode/copilot-unavailable` |
+| :vscode-copilot-warning: | `:vscode-copilot-warning:` | `vscode/copilot-warning` |
+| :vscode-copilot-warning-large: | `:vscode-copilot-warning-large:` | `vscode/copilot-warning-large` |
+| :vscode-copy: | `:vscode-copy:` | `vscode/copy` |
+| :vscode-coverage: | `:vscode-coverage:` | `vscode/coverage` |
+| :vscode-credit-card: | `:vscode-credit-card:` | `vscode/credit-card` |
+| :vscode-cursor: | `:vscode-cursor:` | `vscode/cursor` |
+| :vscode-dash: | `:vscode-dash:` | `vscode/dash` |
+| :vscode-dashboard: | `:vscode-dashboard:` | `vscode/dashboard` |
+| :vscode-database: | `:vscode-database:` | `vscode/database` |
+| :vscode-debug: | `:vscode-debug:` | `vscode/debug` |
+| :vscode-debug-all: | `:vscode-debug-all:` | `vscode/debug-all` |
+| :vscode-debug-alt: | `:vscode-debug-alt:` | `vscode/debug-alt` |
+| :vscode-debug-alt-small: | `:vscode-debug-alt-small:` | `vscode/debug-alt-small` |
+| :vscode-debug-breakpoint-conditional: | `:vscode-debug-breakpoint-conditional:` | `vscode/debug-breakpoint-conditional` |
+| :vscode-debug-breakpoint-conditional-unverified: | `:vscode-debug-breakpoint-conditional-unverified:` | `vscode/debug-breakpoint-conditional-unverified` |
+| :vscode-debug-breakpoint-data: | `:vscode-debug-breakpoint-data:` | `vscode/debug-breakpoint-data` |
+| :vscode-debug-breakpoint-data-unverified: | `:vscode-debug-breakpoint-data-unverified:` | `vscode/debug-breakpoint-data-unverified` |
+| :vscode-debug-breakpoint-function: | `:vscode-debug-breakpoint-function:` | `vscode/debug-breakpoint-function` |
+| :vscode-debug-breakpoint-function-unverified: | `:vscode-debug-breakpoint-function-unverified:` | `vscode/debug-breakpoint-function-unverified` |
+| :vscode-debug-breakpoint-log: | `:vscode-debug-breakpoint-log:` | `vscode/debug-breakpoint-log` |
+| :vscode-debug-breakpoint-log-unverified: | `:vscode-debug-breakpoint-log-unverified:` | `vscode/debug-breakpoint-log-unverified` |
+| :vscode-debug-breakpoint-unsupported: | `:vscode-debug-breakpoint-unsupported:` | `vscode/debug-breakpoint-unsupported` |
+| :vscode-debug-connected: | `:vscode-debug-connected:` | `vscode/debug-connected` |
+| :vscode-debug-console: | `:vscode-debug-console:` | `vscode/debug-console` |
+| :vscode-debug-continue: | `:vscode-debug-continue:` | `vscode/debug-continue` |
+| :vscode-debug-continue-small: | `:vscode-debug-continue-small:` | `vscode/debug-continue-small` |
+| :vscode-debug-coverage: | `:vscode-debug-coverage:` | `vscode/debug-coverage` |
+| :vscode-debug-disconnect: | `:vscode-debug-disconnect:` | `vscode/debug-disconnect` |
+| :vscode-debug-line-by-line: | `:vscode-debug-line-by-line:` | `vscode/debug-line-by-line` |
+| :vscode-debug-pause: | `:vscode-debug-pause:` | `vscode/debug-pause` |
+| :vscode-debug-rerun: | `:vscode-debug-rerun:` | `vscode/debug-rerun` |
+| :vscode-debug-restart: | `:vscode-debug-restart:` | `vscode/debug-restart` |
+| :vscode-debug-restart-frame: | `:vscode-debug-restart-frame:` | `vscode/debug-restart-frame` |
+| :vscode-debug-reverse-continue: | `:vscode-debug-reverse-continue:` | `vscode/debug-reverse-continue` |
+| :vscode-debug-stackframe: | `:vscode-debug-stackframe:` | `vscode/debug-stackframe` |
+| :vscode-debug-stackframe-active: | `:vscode-debug-stackframe-active:` | `vscode/debug-stackframe-active` |
+| :vscode-debug-start: | `:vscode-debug-start:` | `vscode/debug-start` |
+| :vscode-debug-step-back: | `:vscode-debug-step-back:` | `vscode/debug-step-back` |
+| :vscode-debug-step-into: | `:vscode-debug-step-into:` | `vscode/debug-step-into` |
+| :vscode-debug-step-out: | `:vscode-debug-step-out:` | `vscode/debug-step-out` |
+| :vscode-debug-step-over: | `:vscode-debug-step-over:` | `vscode/debug-step-over` |
+| :vscode-debug-stop: | `:vscode-debug-stop:` | `vscode/debug-stop` |
+| :vscode-desktop-download: | `:vscode-desktop-download:` | `vscode/desktop-download` |
+| :vscode-device-camera: | `:vscode-device-camera:` | `vscode/device-camera` |
+| :vscode-device-camera-video: | `:vscode-device-camera-video:` | `vscode/device-camera-video` |
+| :vscode-device-mobile: | `:vscode-device-mobile:` | `vscode/device-mobile` |
+| :vscode-diff: | `:vscode-diff:` | `vscode/diff` |
+| :vscode-diff-added: | `:vscode-diff-added:` | `vscode/diff-added` |
+| :vscode-diff-ignored: | `:vscode-diff-ignored:` | `vscode/diff-ignored` |
+| :vscode-diff-modified: | `:vscode-diff-modified:` | `vscode/diff-modified` |
+| :vscode-diff-multiple: | `:vscode-diff-multiple:` | `vscode/diff-multiple` |
+| :vscode-diff-removed: | `:vscode-diff-removed:` | `vscode/diff-removed` |
+| :vscode-diff-renamed: | `:vscode-diff-renamed:` | `vscode/diff-renamed` |
+| :vscode-diff-single: | `:vscode-diff-single:` | `vscode/diff-single` |
+| :vscode-discard: | `:vscode-discard:` | `vscode/discard` |
+| :vscode-download: | `:vscode-download:` | `vscode/download` |
+| :vscode-edit: | `:vscode-edit:` | `vscode/edit` |
+| :vscode-edit-code: | `:vscode-edit-code:` | `vscode/edit-code` |
+| :vscode-edit-session: | `:vscode-edit-session:` | `vscode/edit-session` |
+| :vscode-edit-sparkle: | `:vscode-edit-sparkle:` | `vscode/edit-sparkle` |
+| :vscode-editor-layout: | `:vscode-editor-layout:` | `vscode/editor-layout` |
+| :vscode-ellipsis: | `:vscode-ellipsis:` | `vscode/ellipsis` |
+| :vscode-empty-window: | `:vscode-empty-window:` | `vscode/empty-window` |
+| :vscode-eraser: | `:vscode-eraser:` | `vscode/eraser` |
+| :vscode-error: | `:vscode-error:` | `vscode/error` |
+| :vscode-error-small: | `:vscode-error-small:` | `vscode/error-small` |
+| :vscode-exclude: | `:vscode-exclude:` | `vscode/exclude` |
+| :vscode-expand-all: | `:vscode-expand-all:` | `vscode/expand-all` |
+| :vscode-export: | `:vscode-export:` | `vscode/export` |
+| :vscode-extensions: | `:vscode-extensions:` | `vscode/extensions` |
+| :vscode-extensions-large: | `:vscode-extensions-large:` | `vscode/extensions-large` |
+| :vscode-eye: | `:vscode-eye:` | `vscode/eye` |
+| :vscode-eye-closed: | `:vscode-eye-closed:` | `vscode/eye-closed` |
+| :vscode-feedback: | `:vscode-feedback:` | `vscode/feedback` |
+| :vscode-file: | `:vscode-file:` | `vscode/file` |
+| :vscode-file-binary: | `:vscode-file-binary:` | `vscode/file-binary` |
+| :vscode-file-code: | `:vscode-file-code:` | `vscode/file-code` |
+| :vscode-file-media: | `:vscode-file-media:` | `vscode/file-media` |
+| :vscode-file-pdf: | `:vscode-file-pdf:` | `vscode/file-pdf` |
+| :vscode-file-submodule: | `:vscode-file-submodule:` | `vscode/file-submodule` |
+| :vscode-file-symlink-directory: | `:vscode-file-symlink-directory:` | `vscode/file-symlink-directory` |
+| :vscode-file-symlink-file: | `:vscode-file-symlink-file:` | `vscode/file-symlink-file` |
+| :vscode-file-text: | `:vscode-file-text:` | `vscode/file-text` |
+| :vscode-file-zip: | `:vscode-file-zip:` | `vscode/file-zip` |
+| :vscode-files: | `:vscode-files:` | `vscode/files` |
+| :vscode-filter: | `:vscode-filter:` | `vscode/filter` |
+| :vscode-filter-filled: | `:vscode-filter-filled:` | `vscode/filter-filled` |
+| :vscode-flag: | `:vscode-flag:` | `vscode/flag` |
+| :vscode-flame: | `:vscode-flame:` | `vscode/flame` |
+| :vscode-fold: | `:vscode-fold:` | `vscode/fold` |
+| :vscode-fold-down: | `:vscode-fold-down:` | `vscode/fold-down` |
+| :vscode-fold-up: | `:vscode-fold-up:` | `vscode/fold-up` |
+| :vscode-folder: | `:vscode-folder:` | `vscode/folder` |
+| :vscode-folder-active: | `:vscode-folder-active:` | `vscode/folder-active` |
+| :vscode-folder-library: | `:vscode-folder-library:` | `vscode/folder-library` |
+| :vscode-folder-opened: | `:vscode-folder-opened:` | `vscode/folder-opened` |
+| :vscode-forward: | `:vscode-forward:` | `vscode/forward` |
+| :vscode-game: | `:vscode-game:` | `vscode/game` |
+| :vscode-gear: | `:vscode-gear:` | `vscode/gear` |
+| :vscode-gift: | `:vscode-gift:` | `vscode/gift` |
+| :vscode-gist: | `:vscode-gist:` | `vscode/gist` |
+| :vscode-gist-secret: | `:vscode-gist-secret:` | `vscode/gist-secret` |
+| :vscode-git-branch: | `:vscode-git-branch:` | `vscode/git-branch` |
+| :vscode-git-branch-changes: | `:vscode-git-branch-changes:` | `vscode/git-branch-changes` |
+| :vscode-git-branch-conflicts: | `:vscode-git-branch-conflicts:` | `vscode/git-branch-conflicts` |
+| :vscode-git-branch-staged-changes: | `:vscode-git-branch-staged-changes:` | `vscode/git-branch-staged-changes` |
+| :vscode-git-commit: | `:vscode-git-commit:` | `vscode/git-commit` |
+| :vscode-git-compare: | `:vscode-git-compare:` | `vscode/git-compare` |
+| :vscode-git-fetch: | `:vscode-git-fetch:` | `vscode/git-fetch` |
+| :vscode-git-merge: | `:vscode-git-merge:` | `vscode/git-merge` |
+| :vscode-git-pull-request: | `:vscode-git-pull-request:` | `vscode/git-pull-request` |
+| :vscode-git-pull-request-closed: | `:vscode-git-pull-request-closed:` | `vscode/git-pull-request-closed` |
+| :vscode-git-pull-request-create: | `:vscode-git-pull-request-create:` | `vscode/git-pull-request-create` |
+| :vscode-git-pull-request-done: | `:vscode-git-pull-request-done:` | `vscode/git-pull-request-done` |
+| :vscode-git-pull-request-draft: | `:vscode-git-pull-request-draft:` | `vscode/git-pull-request-draft` |
+| :vscode-git-pull-request-go-to-changes: | `:vscode-git-pull-request-go-to-changes:` | `vscode/git-pull-request-go-to-changes` |
+| :vscode-git-pull-request-new-changes: | `:vscode-git-pull-request-new-changes:` | `vscode/git-pull-request-new-changes` |
+| :vscode-git-stash: | `:vscode-git-stash:` | `vscode/git-stash` |
+| :vscode-git-stash-apply: | `:vscode-git-stash-apply:` | `vscode/git-stash-apply` |
+| :vscode-git-stash-pop: | `:vscode-git-stash-pop:` | `vscode/git-stash-pop` |
+| :vscode-github: | `:vscode-github:` | `vscode/github` |
+| :vscode-github-action: | `:vscode-github-action:` | `vscode/github-action` |
+| :vscode-github-alt: | `:vscode-github-alt:` | `vscode/github-alt` |
+| :vscode-github-inverted: | `:vscode-github-inverted:` | `vscode/github-inverted` |
+| :vscode-github-project: | `:vscode-github-project:` | `vscode/github-project` |
+| :vscode-globe: | `:vscode-globe:` | `vscode/globe` |
+| :vscode-go-to-editing-session: | `:vscode-go-to-editing-session:` | `vscode/go-to-editing-session` |
+| :vscode-go-to-file: | `:vscode-go-to-file:` | `vscode/go-to-file` |
+| :vscode-go-to-search: | `:vscode-go-to-search:` | `vscode/go-to-search` |
+| :vscode-grabber: | `:vscode-grabber:` | `vscode/grabber` |
+| :vscode-graph: | `:vscode-graph:` | `vscode/graph` |
+| :vscode-graph-left: | `:vscode-graph-left:` | `vscode/graph-left` |
+| :vscode-graph-line: | `:vscode-graph-line:` | `vscode/graph-line` |
+| :vscode-graph-scatter: | `:vscode-graph-scatter:` | `vscode/graph-scatter` |
+| :vscode-gripper: | `:vscode-gripper:` | `vscode/gripper` |
+| :vscode-group-by-ref-type: | `:vscode-group-by-ref-type:` | `vscode/group-by-ref-type` |
+| :vscode-heart: | `:vscode-heart:` | `vscode/heart` |
+| :vscode-heart-filled: | `:vscode-heart-filled:` | `vscode/heart-filled` |
+| :vscode-history: | `:vscode-history:` | `vscode/history` |
+| :vscode-home: | `:vscode-home:` | `vscode/home` |
+| :vscode-horizontal-rule: | `:vscode-horizontal-rule:` | `vscode/horizontal-rule` |
+| :vscode-hubot: | `:vscode-hubot:` | `vscode/hubot` |
+| :vscode-inbox: | `:vscode-inbox:` | `vscode/inbox` |
+| :vscode-indent: | `:vscode-indent:` | `vscode/indent` |
+| :vscode-index-zero: | `:vscode-index-zero:` | `vscode/index-zero` |
+| :vscode-info: | `:vscode-info:` | `vscode/info` |
+| :vscode-insert: | `:vscode-insert:` | `vscode/insert` |
+| :vscode-inspect: | `:vscode-inspect:` | `vscode/inspect` |
+| :vscode-issue-draft: | `:vscode-issue-draft:` | `vscode/issue-draft` |
+| :vscode-issue-reopened: | `:vscode-issue-reopened:` | `vscode/issue-reopened` |
+| :vscode-issues: | `:vscode-issues:` | `vscode/issues` |
+| :vscode-italic: | `:vscode-italic:` | `vscode/italic` |
+| :vscode-jersey: | `:vscode-jersey:` | `vscode/jersey` |
+| :vscode-json: | `:vscode-json:` | `vscode/json` |
+| :vscode-kebab-vertical: | `:vscode-kebab-vertical:` | `vscode/kebab-vertical` |
+| :vscode-key: | `:vscode-key:` | `vscode/key` |
+| :vscode-keyboard-tab: | `:vscode-keyboard-tab:` | `vscode/keyboard-tab` |
+| :vscode-keyboard-tab-above: | `:vscode-keyboard-tab-above:` | `vscode/keyboard-tab-above` |
+| :vscode-keyboard-tab-below: | `:vscode-keyboard-tab-below:` | `vscode/keyboard-tab-below` |
+| :vscode-law: | `:vscode-law:` | `vscode/law` |
+| :vscode-layers: | `:vscode-layers:` | `vscode/layers` |
+| :vscode-layers-active: | `:vscode-layers-active:` | `vscode/layers-active` |
+| :vscode-layers-dot: | `:vscode-layers-dot:` | `vscode/layers-dot` |
+| :vscode-layout: | `:vscode-layout:` | `vscode/layout` |
+| :vscode-layout-activitybar-left: | `:vscode-layout-activitybar-left:` | `vscode/layout-activitybar-left` |
+| :vscode-layout-activitybar-right: | `:vscode-layout-activitybar-right:` | `vscode/layout-activitybar-right` |
+| :vscode-layout-centered: | `:vscode-layout-centered:` | `vscode/layout-centered` |
+| :vscode-layout-menubar: | `:vscode-layout-menubar:` | `vscode/layout-menubar` |
+| :vscode-layout-panel: | `:vscode-layout-panel:` | `vscode/layout-panel` |
+| :vscode-layout-panel-center: | `:vscode-layout-panel-center:` | `vscode/layout-panel-center` |
+| :vscode-layout-panel-dock: | `:vscode-layout-panel-dock:` | `vscode/layout-panel-dock` |
+| :vscode-layout-panel-justify: | `:vscode-layout-panel-justify:` | `vscode/layout-panel-justify` |
+| :vscode-layout-panel-left: | `:vscode-layout-panel-left:` | `vscode/layout-panel-left` |
+| :vscode-layout-panel-off: | `:vscode-layout-panel-off:` | `vscode/layout-panel-off` |
+| :vscode-layout-panel-right: | `:vscode-layout-panel-right:` | `vscode/layout-panel-right` |
+| :vscode-layout-sidebar-left: | `:vscode-layout-sidebar-left:` | `vscode/layout-sidebar-left` |
+| :vscode-layout-sidebar-left-dock: | `:vscode-layout-sidebar-left-dock:` | `vscode/layout-sidebar-left-dock` |
+| :vscode-layout-sidebar-left-off: | `:vscode-layout-sidebar-left-off:` | `vscode/layout-sidebar-left-off` |
+| :vscode-layout-sidebar-right: | `:vscode-layout-sidebar-right:` | `vscode/layout-sidebar-right` |
+| :vscode-layout-sidebar-right-dock: | `:vscode-layout-sidebar-right-dock:` | `vscode/layout-sidebar-right-dock` |
+| :vscode-layout-sidebar-right-off: | `:vscode-layout-sidebar-right-off:` | `vscode/layout-sidebar-right-off` |
+| :vscode-layout-statusbar: | `:vscode-layout-statusbar:` | `vscode/layout-statusbar` |
+| :vscode-library: | `:vscode-library:` | `vscode/library` |
+| :vscode-lightbulb: | `:vscode-lightbulb:` | `vscode/lightbulb` |
+| :vscode-lightbulb-autofix: | `:vscode-lightbulb-autofix:` | `vscode/lightbulb-autofix` |
+| :vscode-lightbulb-empty: | `:vscode-lightbulb-empty:` | `vscode/lightbulb-empty` |
+| :vscode-lightbulb-sparkle: | `:vscode-lightbulb-sparkle:` | `vscode/lightbulb-sparkle` |
+| :vscode-link: | `:vscode-link:` | `vscode/link` |
+| :vscode-link-external: | `:vscode-link-external:` | `vscode/link-external` |
+| :vscode-list-filter: | `:vscode-list-filter:` | `vscode/list-filter` |
+| :vscode-list-flat: | `:vscode-list-flat:` | `vscode/list-flat` |
+| :vscode-list-ordered: | `:vscode-list-ordered:` | `vscode/list-ordered` |
+| :vscode-list-selection: | `:vscode-list-selection:` | `vscode/list-selection` |
+| :vscode-list-tree: | `:vscode-list-tree:` | `vscode/list-tree` |
+| :vscode-list-unordered: | `:vscode-list-unordered:` | `vscode/list-unordered` |
+| :vscode-live-share: | `:vscode-live-share:` | `vscode/live-share` |
+| :vscode-loading: | `:vscode-loading:` | `vscode/loading` |
+| :vscode-location: | `:vscode-location:` | `vscode/location` |
+| :vscode-lock: | `:vscode-lock:` | `vscode/lock` |
+| :vscode-lock-small: | `:vscode-lock-small:` | `vscode/lock-small` |
+| :vscode-magnet: | `:vscode-magnet:` | `vscode/magnet` |
+| :vscode-mail: | `:vscode-mail:` | `vscode/mail` |
+| :vscode-mail-read: | `:vscode-mail-read:` | `vscode/mail-read` |
+| :vscode-map: | `:vscode-map:` | `vscode/map` |
+| :vscode-map-filled: | `:vscode-map-filled:` | `vscode/map-filled` |
+| :vscode-map-vertical: | `:vscode-map-vertical:` | `vscode/map-vertical` |
+| :vscode-map-vertical-filled: | `:vscode-map-vertical-filled:` | `vscode/map-vertical-filled` |
+| :vscode-markdown: | `:vscode-markdown:` | `vscode/markdown` |
+| :vscode-mcp: | `:vscode-mcp:` | `vscode/mcp` |
+| :vscode-megaphone: | `:vscode-megaphone:` | `vscode/megaphone` |
+| :vscode-mention: | `:vscode-mention:` | `vscode/mention` |
+| :vscode-menu: | `:vscode-menu:` | `vscode/menu` |
+| :vscode-merge: | `:vscode-merge:` | `vscode/merge` |
+| :vscode-merge-into: | `:vscode-merge-into:` | `vscode/merge-into` |
+| :vscode-mic: | `:vscode-mic:` | `vscode/mic` |
+| :vscode-mic-filled: | `:vscode-mic-filled:` | `vscode/mic-filled` |
+| :vscode-milestone: | `:vscode-milestone:` | `vscode/milestone` |
+| :vscode-mirror: | `:vscode-mirror:` | `vscode/mirror` |
+| :vscode-mortar-board: | `:vscode-mortar-board:` | `vscode/mortar-board` |
+| :vscode-move: | `:vscode-move:` | `vscode/move` |
+| :vscode-multiple-windows: | `:vscode-multiple-windows:` | `vscode/multiple-windows` |
+| :vscode-music: | `:vscode-music:` | `vscode/music` |
+| :vscode-mute: | `:vscode-mute:` | `vscode/mute` |
+| :vscode-new-collection: | `:vscode-new-collection:` | `vscode/new-collection` |
+| :vscode-new-file: | `:vscode-new-file:` | `vscode/new-file` |
+| :vscode-new-folder: | `:vscode-new-folder:` | `vscode/new-folder` |
+| :vscode-new-session: | `:vscode-new-session:` | `vscode/new-session` |
+| :vscode-newline: | `:vscode-newline:` | `vscode/newline` |
+| :vscode-no-newline: | `:vscode-no-newline:` | `vscode/no-newline` |
+| :vscode-note: | `:vscode-note:` | `vscode/note` |
+| :vscode-notebook: | `:vscode-notebook:` | `vscode/notebook` |
+| :vscode-notebook-template: | `:vscode-notebook-template:` | `vscode/notebook-template` |
+| :vscode-octoface: | `:vscode-octoface:` | `vscode/octoface` |
+| :vscode-open-in-product: | `:vscode-open-in-product:` | `vscode/open-in-product` |
+| :vscode-open-in-window: | `:vscode-open-in-window:` | `vscode/open-in-window` |
+| :vscode-open-preview: | `:vscode-open-preview:` | `vscode/open-preview` |
+| :vscode-openai: | `:vscode-openai:` | `vscode/openai` |
+| :vscode-organization: | `:vscode-organization:` | `vscode/organization` |
+| :vscode-output: | `:vscode-output:` | `vscode/output` |
+| :vscode-package: | `:vscode-package:` | `vscode/package` |
+| :vscode-paintcan: | `:vscode-paintcan:` | `vscode/paintcan` |
+| :vscode-pass: | `:vscode-pass:` | `vscode/pass` |
+| :vscode-pass-filled: | `:vscode-pass-filled:` | `vscode/pass-filled` |
+| :vscode-percentage: | `:vscode-percentage:` | `vscode/percentage` |
+| :vscode-person: | `:vscode-person:` | `vscode/person` |
+| :vscode-person-add: | `:vscode-person-add:` | `vscode/person-add` |
+| :vscode-piano: | `:vscode-piano:` | `vscode/piano` |
+| :vscode-pie-chart: | `:vscode-pie-chart:` | `vscode/pie-chart` |
+| :vscode-pin: | `:vscode-pin:` | `vscode/pin` |
+| :vscode-pinned: | `:vscode-pinned:` | `vscode/pinned` |
+| :vscode-pinned-dirty: | `:vscode-pinned-dirty:` | `vscode/pinned-dirty` |
+| :vscode-play: | `:vscode-play:` | `vscode/play` |
+| :vscode-play-circle: | `:vscode-play-circle:` | `vscode/play-circle` |
+| :vscode-plug: | `:vscode-plug:` | `vscode/plug` |
+| :vscode-preserve-case: | `:vscode-preserve-case:` | `vscode/preserve-case` |
+| :vscode-preview: | `:vscode-preview:` | `vscode/preview` |
+| :vscode-primitive-square: | `:vscode-primitive-square:` | `vscode/primitive-square` |
+| :vscode-project: | `:vscode-project:` | `vscode/project` |
+| :vscode-pulse: | `:vscode-pulse:` | `vscode/pulse` |
+| :vscode-python: | `:vscode-python:` | `vscode/python` |
+| :vscode-question: | `:vscode-question:` | `vscode/question` |
+| :vscode-quote: | `:vscode-quote:` | `vscode/quote` |
+| :vscode-quotes: | `:vscode-quotes:` | `vscode/quotes` |
+| :vscode-radio-tower: | `:vscode-radio-tower:` | `vscode/radio-tower` |
+| :vscode-reactions: | `:vscode-reactions:` | `vscode/reactions` |
+| :vscode-record: | `:vscode-record:` | `vscode/record` |
+| :vscode-record-keys: | `:vscode-record-keys:` | `vscode/record-keys` |
+| :vscode-record-small: | `:vscode-record-small:` | `vscode/record-small` |
+| :vscode-redo: | `:vscode-redo:` | `vscode/redo` |
+| :vscode-references: | `:vscode-references:` | `vscode/references` |
+| :vscode-refresh: | `:vscode-refresh:` | `vscode/refresh` |
+| :vscode-regex: | `:vscode-regex:` | `vscode/regex` |
+| :vscode-remote: | `:vscode-remote:` | `vscode/remote` |
+| :vscode-remote-explorer: | `:vscode-remote-explorer:` | `vscode/remote-explorer` |
+| :vscode-remove: | `:vscode-remove:` | `vscode/remove` |
+| :vscode-remove-small: | `:vscode-remove-small:` | `vscode/remove-small` |
+| :vscode-rename: | `:vscode-rename:` | `vscode/rename` |
+| :vscode-replace: | `:vscode-replace:` | `vscode/replace` |
+| :vscode-replace-all: | `:vscode-replace-all:` | `vscode/replace-all` |
+| :vscode-reply: | `:vscode-reply:` | `vscode/reply` |
+| :vscode-repo: | `:vscode-repo:` | `vscode/repo` |
+| :vscode-repo-clone: | `:vscode-repo-clone:` | `vscode/repo-clone` |
+| :vscode-repo-fetch: | `:vscode-repo-fetch:` | `vscode/repo-fetch` |
+| :vscode-repo-force-push: | `:vscode-repo-force-push:` | `vscode/repo-force-push` |
+| :vscode-repo-forked: | `:vscode-repo-forked:` | `vscode/repo-forked` |
+| :vscode-repo-pinned: | `:vscode-repo-pinned:` | `vscode/repo-pinned` |
+| :vscode-repo-pull: | `:vscode-repo-pull:` | `vscode/repo-pull` |
+| :vscode-repo-push: | `:vscode-repo-push:` | `vscode/repo-push` |
+| :vscode-repo-selected: | `:vscode-repo-selected:` | `vscode/repo-selected` |
+| :vscode-report: | `:vscode-report:` | `vscode/report` |
+| :vscode-request-changes: | `:vscode-request-changes:` | `vscode/request-changes` |
+| :vscode-robot: | `:vscode-robot:` | `vscode/robot` |
+| :vscode-rocket: | `:vscode-rocket:` | `vscode/rocket` |
+| :vscode-root-folder: | `:vscode-root-folder:` | `vscode/root-folder` |
+| :vscode-root-folder-opened: | `:vscode-root-folder-opened:` | `vscode/root-folder-opened` |
+| :vscode-rss: | `:vscode-rss:` | `vscode/rss` |
+| :vscode-ruby: | `:vscode-ruby:` | `vscode/ruby` |
+| :vscode-run-above: | `:vscode-run-above:` | `vscode/run-above` |
+| :vscode-run-all: | `:vscode-run-all:` | `vscode/run-all` |
+| :vscode-run-all-coverage: | `:vscode-run-all-coverage:` | `vscode/run-all-coverage` |
+| :vscode-run-below: | `:vscode-run-below:` | `vscode/run-below` |
+| :vscode-run-coverage: | `:vscode-run-coverage:` | `vscode/run-coverage` |
+| :vscode-run-errors: | `:vscode-run-errors:` | `vscode/run-errors` |
+| :vscode-run-with-deps: | `:vscode-run-with-deps:` | `vscode/run-with-deps` |
+| :vscode-save: | `:vscode-save:` | `vscode/save` |
+| :vscode-save-all: | `:vscode-save-all:` | `vscode/save-all` |
+| :vscode-save-as: | `:vscode-save-as:` | `vscode/save-as` |
+| :vscode-screen-cut: | `:vscode-screen-cut:` | `vscode/screen-cut` |
+| :vscode-screen-full: | `:vscode-screen-full:` | `vscode/screen-full` |
+| :vscode-screen-normal: | `:vscode-screen-normal:` | `vscode/screen-normal` |
+| :vscode-search: | `:vscode-search:` | `vscode/search` |
+| :vscode-search-fuzzy: | `:vscode-search-fuzzy:` | `vscode/search-fuzzy` |
+| :vscode-search-large: | `:vscode-search-large:` | `vscode/search-large` |
+| :vscode-search-sparkle: | `:vscode-search-sparkle:` | `vscode/search-sparkle` |
+| :vscode-search-stop: | `:vscode-search-stop:` | `vscode/search-stop` |
+| :vscode-send: | `:vscode-send:` | `vscode/send` |
+| :vscode-send-to-remote-agent: | `:vscode-send-to-remote-agent:` | `vscode/send-to-remote-agent` |
+| :vscode-server: | `:vscode-server:` | `vscode/server` |
+| :vscode-server-environment: | `:vscode-server-environment:` | `vscode/server-environment` |
+| :vscode-server-process: | `:vscode-server-process:` | `vscode/server-process` |
+| :vscode-session-in-progress: | `:vscode-session-in-progress:` | `vscode/session-in-progress` |
+| :vscode-settings: | `:vscode-settings:` | `vscode/settings` |
+| :vscode-settings-gear: | `:vscode-settings-gear:` | `vscode/settings-gear` |
+| :vscode-share: | `:vscode-share:` | `vscode/share` |
+| :vscode-share-window: | `:vscode-share-window:` | `vscode/share-window` |
+| :vscode-shield: | `:vscode-shield:` | `vscode/shield` |
+| :vscode-sign-in: | `:vscode-sign-in:` | `vscode/sign-in` |
+| :vscode-sign-out: | `:vscode-sign-out:` | `vscode/sign-out` |
+| :vscode-skip: | `:vscode-skip:` | `vscode/skip` |
+| :vscode-smiley: | `:vscode-smiley:` | `vscode/smiley` |
+| :vscode-snake: | `:vscode-snake:` | `vscode/snake` |
+| :vscode-sort-precedence: | `:vscode-sort-precedence:` | `vscode/sort-precedence` |
+| :vscode-source-control: | `:vscode-source-control:` | `vscode/source-control` |
+| :vscode-sparkle: | `:vscode-sparkle:` | `vscode/sparkle` |
+| :vscode-sparkle-filled: | `:vscode-sparkle-filled:` | `vscode/sparkle-filled` |
+| :vscode-split-horizontal: | `:vscode-split-horizontal:` | `vscode/split-horizontal` |
+| :vscode-split-vertical: | `:vscode-split-vertical:` | `vscode/split-vertical` |
+| :vscode-squirrel: | `:vscode-squirrel:` | `vscode/squirrel` |
+| :vscode-star-empty: | `:vscode-star-empty:` | `vscode/star-empty` |
+| :vscode-star-full: | `:vscode-star-full:` | `vscode/star-full` |
+| :vscode-star-half: | `:vscode-star-half:` | `vscode/star-half` |
+| :vscode-stop-circle: | `:vscode-stop-circle:` | `vscode/stop-circle` |
+| :vscode-strikethrough: | `:vscode-strikethrough:` | `vscode/strikethrough` |
+| :vscode-surround-with: | `:vscode-surround-with:` | `vscode/surround-with` |
+| :vscode-symbol-array: | `:vscode-symbol-array:` | `vscode/symbol-array` |
+| :vscode-symbol-boolean: | `:vscode-symbol-boolean:` | `vscode/symbol-boolean` |
+| :vscode-symbol-class: | `:vscode-symbol-class:` | `vscode/symbol-class` |
+| :vscode-symbol-color: | `:vscode-symbol-color:` | `vscode/symbol-color` |
+| :vscode-symbol-constant: | `:vscode-symbol-constant:` | `vscode/symbol-constant` |
+| :vscode-symbol-enum: | `:vscode-symbol-enum:` | `vscode/symbol-enum` |
+| :vscode-symbol-enum-member: | `:vscode-symbol-enum-member:` | `vscode/symbol-enum-member` |
+| :vscode-symbol-event: | `:vscode-symbol-event:` | `vscode/symbol-event` |
+| :vscode-symbol-field: | `:vscode-symbol-field:` | `vscode/symbol-field` |
+| :vscode-symbol-file: | `:vscode-symbol-file:` | `vscode/symbol-file` |
+| :vscode-symbol-interface: | `:vscode-symbol-interface:` | `vscode/symbol-interface` |
+| :vscode-symbol-key: | `:vscode-symbol-key:` | `vscode/symbol-key` |
+| :vscode-symbol-keyword: | `:vscode-symbol-keyword:` | `vscode/symbol-keyword` |
+| :vscode-symbol-method: | `:vscode-symbol-method:` | `vscode/symbol-method` |
+| :vscode-symbol-method-arrow: | `:vscode-symbol-method-arrow:` | `vscode/symbol-method-arrow` |
+| :vscode-symbol-misc: | `:vscode-symbol-misc:` | `vscode/symbol-misc` |
+| :vscode-symbol-namespace: | `:vscode-symbol-namespace:` | `vscode/symbol-namespace` |
+| :vscode-symbol-numeric: | `:vscode-symbol-numeric:` | `vscode/symbol-numeric` |
+| :vscode-symbol-operator: | `:vscode-symbol-operator:` | `vscode/symbol-operator` |
+| :vscode-symbol-parameter: | `:vscode-symbol-parameter:` | `vscode/symbol-parameter` |
+| :vscode-symbol-property: | `:vscode-symbol-property:` | `vscode/symbol-property` |
+| :vscode-symbol-ruler: | `:vscode-symbol-ruler:` | `vscode/symbol-ruler` |
+| :vscode-symbol-snippet: | `:vscode-symbol-snippet:` | `vscode/symbol-snippet` |
+| :vscode-symbol-string: | `:vscode-symbol-string:` | `vscode/symbol-string` |
+| :vscode-symbol-structure: | `:vscode-symbol-structure:` | `vscode/symbol-structure` |
+| :vscode-symbol-variable: | `:vscode-symbol-variable:` | `vscode/symbol-variable` |
+| :vscode-sync: | `:vscode-sync:` | `vscode/sync` |
+| :vscode-sync-ignored: | `:vscode-sync-ignored:` | `vscode/sync-ignored` |
+| :vscode-table: | `:vscode-table:` | `vscode/table` |
+| :vscode-tag: | `:vscode-tag:` | `vscode/tag` |
+| :vscode-target: | `:vscode-target:` | `vscode/target` |
+| :vscode-tasklist: | `:vscode-tasklist:` | `vscode/tasklist` |
+| :vscode-telescope: | `:vscode-telescope:` | `vscode/telescope` |
+| :vscode-terminal: | `:vscode-terminal:` | `vscode/terminal` |
+| :vscode-terminal-bash: | `:vscode-terminal-bash:` | `vscode/terminal-bash` |
+| :vscode-terminal-cmd: | `:vscode-terminal-cmd:` | `vscode/terminal-cmd` |
+| :vscode-terminal-debian: | `:vscode-terminal-debian:` | `vscode/terminal-debian` |
+| :vscode-terminal-git-bash: | `:vscode-terminal-git-bash:` | `vscode/terminal-git-bash` |
+| :vscode-terminal-linux: | `:vscode-terminal-linux:` | `vscode/terminal-linux` |
+| :vscode-terminal-powershell: | `:vscode-terminal-powershell:` | `vscode/terminal-powershell` |
+| :vscode-terminal-secure: | `:vscode-terminal-secure:` | `vscode/terminal-secure` |
+| :vscode-terminal-tmux: | `:vscode-terminal-tmux:` | `vscode/terminal-tmux` |
+| :vscode-terminal-ubuntu: | `:vscode-terminal-ubuntu:` | `vscode/terminal-ubuntu` |
+| :vscode-text-size: | `:vscode-text-size:` | `vscode/text-size` |
+| :vscode-thinking: | `:vscode-thinking:` | `vscode/thinking` |
+| :vscode-three-bars: | `:vscode-three-bars:` | `vscode/three-bars` |
+| :vscode-thumbsdown: | `:vscode-thumbsdown:` | `vscode/thumbsdown` |
+| :vscode-thumbsdown-filled: | `:vscode-thumbsdown-filled:` | `vscode/thumbsdown-filled` |
+| :vscode-thumbsup: | `:vscode-thumbsup:` | `vscode/thumbsup` |
+| :vscode-thumbsup-filled: | `:vscode-thumbsup-filled:` | `vscode/thumbsup-filled` |
+| :vscode-tools: | `:vscode-tools:` | `vscode/tools` |
+| :vscode-trash: | `:vscode-trash:` | `vscode/trash` |
+| :vscode-triangle-down: | `:vscode-triangle-down:` | `vscode/triangle-down` |
+| :vscode-triangle-left: | `:vscode-triangle-left:` | `vscode/triangle-left` |
+| :vscode-triangle-right: | `:vscode-triangle-right:` | `vscode/triangle-right` |
+| :vscode-triangle-up: | `:vscode-triangle-up:` | `vscode/triangle-up` |
+| :vscode-twitter: | `:vscode-twitter:` | `vscode/twitter` |
+| :vscode-type-hierarchy: | `:vscode-type-hierarchy:` | `vscode/type-hierarchy` |
+| :vscode-type-hierarchy-sub: | `:vscode-type-hierarchy-sub:` | `vscode/type-hierarchy-sub` |
+| :vscode-type-hierarchy-super: | `:vscode-type-hierarchy-super:` | `vscode/type-hierarchy-super` |
+| :vscode-unarchive: | `:vscode-unarchive:` | `vscode/unarchive` |
+| :vscode-unfold: | `:vscode-unfold:` | `vscode/unfold` |
+| :vscode-ungroup-by-ref-type: | `:vscode-ungroup-by-ref-type:` | `vscode/ungroup-by-ref-type` |
+| :vscode-unlock: | `:vscode-unlock:` | `vscode/unlock` |
+| :vscode-unmute: | `:vscode-unmute:` | `vscode/unmute` |
+| :vscode-unverified: | `:vscode-unverified:` | `vscode/unverified` |
+| :vscode-variable-group: | `:vscode-variable-group:` | `vscode/variable-group` |
+| :vscode-verified: | `:vscode-verified:` | `vscode/verified` |
+| :vscode-verified-filled: | `:vscode-verified-filled:` | `vscode/verified-filled` |
+| :vscode-versions: | `:vscode-versions:` | `vscode/versions` |
+| :vscode-vm: | `:vscode-vm:` | `vscode/vm` |
+| :vscode-vm-active: | `:vscode-vm-active:` | `vscode/vm-active` |
+| :vscode-vm-connect: | `:vscode-vm-connect:` | `vscode/vm-connect` |
+| :vscode-vm-outline: | `:vscode-vm-outline:` | `vscode/vm-outline` |
+| :vscode-vm-pending: | `:vscode-vm-pending:` | `vscode/vm-pending` |
+| :vscode-vm-running: | `:vscode-vm-running:` | `vscode/vm-running` |
+| :vscode-vm-small: | `:vscode-vm-small:` | `vscode/vm-small` |
+| :vscode-vr: | `:vscode-vr:` | `vscode/vr` |
+| :vscode-vscode: | `:vscode-vscode:` | `vscode/vscode` |
+| :vscode-vscode-insiders: | `:vscode-vscode-insiders:` | `vscode/vscode-insiders` |
+| :vscode-wand: | `:vscode-wand:` | `vscode/wand` |
+| :vscode-warning: | `:vscode-warning:` | `vscode/warning` |
+| :vscode-watch: | `:vscode-watch:` | `vscode/watch` |
+| :vscode-whitespace: | `:vscode-whitespace:` | `vscode/whitespace` |
+| :vscode-whole-word: | `:vscode-whole-word:` | `vscode/whole-word` |
+| :vscode-window: | `:vscode-window:` | `vscode/window` |
+| :vscode-window-active: | `:vscode-window-active:` | `vscode/window-active` |
+| :vscode-word-wrap: | `:vscode-word-wrap:` | `vscode/word-wrap` |
+| :vscode-workspace-trusted: | `:vscode-workspace-trusted:` | `vscode/workspace-trusted` |
+| :vscode-workspace-unknown: | `:vscode-workspace-unknown:` | `vscode/workspace-unknown` |
+| :vscode-workspace-untrusted: | `:vscode-workspace-untrusted:` | `vscode/workspace-untrusted` |
+| :vscode-worktree: | `:vscode-worktree:` | `vscode/worktree` |
+| :vscode-worktree-small: | `:vscode-worktree-small:` | `vscode/worktree-small` |
+| :vscode-zoom-in: | `:vscode-zoom-in:` | `vscode/zoom-in` |
+| :vscode-zoom-out: | `:vscode-zoom-out:` | `vscode/zoom-out` |
diff --git a/src/dev/index.md b/content/iptvc/dev/index.md
similarity index 100%
rename from src/dev/index.md
rename to content/iptvc/dev/index.md
diff --git a/content/iptvc/dev/iptvc-arch.md b/content/iptvc/dev/iptvc-arch.md
new file mode 100644
index 0000000..a234c03
--- /dev/null
+++ b/content/iptvc/dev/iptvc-arch.md
@@ -0,0 +1,221 @@
+---
+# icon: material/architecture
+tags: ["iptvc", "разработка", "архитектура"]
+---
+
+# Архитектура iptvc
+
+Внутреннее устройство программы для разработчиков.
+
+## Стек технологий
+
+- **Go 1.22+** — язык программирования;
+- `net/http` — HTTP-сервер (Go 1.22 routing patterns);
+- `html/template` — шаблоны HTML;
+- `//go:embed` — встраивание шаблонов в бинарник;
+- `github.com/spf13/cobra` — CLI-фреймворк;
+- `gopkg.in/yaml.v3` — парсинг `config.yml`;
+- `github.com/joho/godotenv` — загрузка `.env`;
+- `github.com/redis/go-redis/v9` — клиент KeyDB/Redis.
+
+## Структура проекта
+
+```
+iptvc/
+├── main.go # точка входа
+├── config.yml # конфигурация
+├── .env # переменные окружения (опционально)
+├── cmd/ # CLI-команды (Cobra)
+│ ├── root.go # корневая команда, глобальные флаги
+│ ├── check.go # команда check
+│ ├── serve.go # команда serve
+│ ├── flags.go # общие флаги check/serve
+│ └── version.go # команда version
+├── app/
+│ ├── app.go # глобальные переменные: Args, Config, Cache
+│ ├── config/
+│ │ └── config.go # Config, Init(), validate(), IntRange, UserAgents
+│ ├── checker/
+│ │ └── checker.go # CheckPlaylists(), CheckChannels(), OnPlaylistChecked
+│ ├── playlist/
+│ │ └── playlist.go # Playlist, Channel, Parse(), Download()
+│ ├── inifile/
+│ │ └── inifile.go # чтение playlists.ini
+│ ├── tagfile/
+│ │ └── tagfile.go # чтение channels.json, назначение тегов
+│ ├── cache/
+│ │ └── cache.go # подключение к KeyDB/Redis
+│ ├── logger/
+│ │ └── logger.go # настройка логирования
+│ ├── utils/
+│ │ └── utils.go # Fetch(), ExpandPath(), ArrayUnique(), Md5str()
+│ └── web/
+│ ├── server.go # Server, Start(), StartBackgroundChecker()
+│ ├── handlers.go # HTTP-обработчики
+│ ├── templates.go # TemplateManager, //go:embed
+│ └── views/ # HTML-шаблоны
+│ ├── layout.html
+│ ├── list.html
+│ └── details.html
+└── go.mod
+```
+
+## Пакеты
+
+### `app`
+
+Глобальный контейнер: `Args` (CLI-флаги), `Config` (конфигурация), `Cache` (Redis-клиент).
+`Init()` загружает конфигурацию, инициализирует логгер и подключение к кешу.
+
+### `app.config`
+
+Структуры: `Config` → `AppConfig`, `ServerConfig`, `CheckConfig`, `CacheConfig`.
+
+Кастомные YAML-типы:
+
+- **`IntRange`** — скаляр или `[min, max]`. Метод `Value()` возвращает константу или случайное значение.
+- **`UserAgents`** — строка или массив строк. Метод `Pick()` возвращает случайный элемент.
+
+`Init(configPath)` — загружает `config.yml`, применяет env, валидирует.
+
+`validate()` — проверяет все значения, исправляет некорректные с логированием.
+
+### `app.checker`
+
+Содержит логику проверки:
+
+- **`PrepareListsToCheck(files, urls, codes)`** — формирует список плейлистов из файлов, URL и кодов ini-файла.
+- **`CheckPlaylists(lists)`** — параллельная проверка плейлистов (семфор `per-routine`), загрузка, парсинг, вызов `CheckChannels` для каждого.
+- **`CheckChannels(pls)`** — параллельная проверка каналов (семфор `per-routine`), HTTP-запрос с `Range` header.
+- **`OnPlaylistChecked`** — глобальный callback, вызывается после проверки каждого плейлиста. Используется веб-сервером для обновления in-memory кеша.
+- **`cachePlaylist(pls)`** — сохранение результата в Redis (если включён).
+
+Параметры проверки берутся из `app.Config.Check.Playlists` и `app.Config.Check.Channels`.
+
+### `app.playlist`
+
+- **`Playlist`** — плейлист: код, URL, контент, каналы, статус.
+- **`Channel`** — канал: ID, название, URL, статус, теги.
+- **`Download(userAgent, timeout)`** — загрузка по URL.
+- **`ReadFromFs()`** — чтение из файла.
+- **`Parse()`** — парсинг m3u/m3u8 контента.
+
+### `app.web`
+
+Веб-сервер на `net/http` (Go 1.22 routing).
+
+- **`Server`** — структура: конфиг, кеш, шаблоны, in-memory кеш (`memCache` с `sync.RWMutex`).
+- **`Start()`** — запуск HTTP-сервера.
+- **`StartBackgroundChecker(opts)`** — фоновая проверка в отдельной горутине.
+- **`CheckOptions`** — параметры: Every, Repeat, Random, Files, Urls, Codes.
+
+Маршруты (Go 1.22 patterns):
+
+```
+GET /api/playlists/{code} — JSON плейлиста
+GET /api/version — версия
+GET /api/health — здоровье сервиса
+GET /api/stats — статистика
+GET /{$} — главная (catch-all root)
+GET /{path...} — все остальные маршруты (catch-all)
+```
+
+Catch-all `/{path...}` используется для избежания конфликтов паттернов в Go 1.22 mux.
+
+In-memory кеш (`memCache`) обновляется через `OnPlaylistChecked` callback.
+Это позволяет отображать результаты проверки в реальном времени без ожидания завершения цикла и без Redis.
+
+ini-файл кешируется на 30 секунд, кеш сбрасывается при каждом обновлении `memCache`.
+
+## Жизненный цикл `serve --check`
+
+```
+main → app.Init() → web.NewServer() → go StartBackgroundChecker() → server.Start()
+
+StartBackgroundChecker:
+ loop:
+ runCheckerOnce()
+ → checker.PrepareListsToCheck()
+ → checker.CheckPlaylists()
+ → for each playlist (parallel, per-routine):
+ → Download() / ReadFromFs()
+ → Parse()
+ → CheckChannels()
+ → for each channel (parallel, per-routine):
+ → HTTP GET with Range header
+ → check status + content type
+ → OnPlaylistChecked(pls) → memCache update
+ → one-cooldown sleep
+ → all-cooldown sleep
+ sleep(every)
+ if repeat > 0 && iteration >= repeat: stop
+```
+
+## CLI-флаги
+
+### Общие (`cmd/flags.go`)
+
+Используются командами `check` и `serve --check`:
+
+| Флаг | Поле | Описание |
+| --- | --- | --- |
+| `-i, --ini` | `Args.IniPath` | Путь к playlists.ini |
+| `-t, --tags` | `Args.TagsPath` | Путь к channels.json |
+| `-r, --random` | `Args.RandomCount` | Случайные N плейлистов |
+| `--repeat` | `Args.RepeatCount` | Количество циклов (0 = бесконечно) |
+| `--every` | `Args.RepeatEverySec` | Секунд между циклами |
+
+### Только `check` (`addCheckOnlyFlags`)
+
+| Флаг | Поле | Описание |
+| --- | --- | --- |
+| `-j, --json` | `Args.NeedJson` | Вывод в JSON |
+| `-q, --quiet` | `Args.NeedQuiet` | Подавить логи |
+| `-f, --file` | `Args.Files` | Локальные m3u файлы |
+| `-u, --url` | `Args.Urls` | URL плейлистов |
+| `-c, --code` | `Args.Codes` | Коды из ini-файла |
+
+### Только `serve`
+
+| Флаг | Поле | Описание |
+| --- | --- | --- |
+| `-p, --port` | `Args.ServerPort` | Порт веб-сервера |
+| `--host` | `Args.ServerHost` | Хост привязки |
+| `--check` | `Args.NeedCheck` | Включить фоновую проверку |
+
+### Глобальные (`cmd/root.go`)
+
+| Флаг | Поле | Описание |
+| --- | --- | --- |
+| `--config` | `Args.ConfigPath` | Путь к config.yml |
+| `-v, --verbose` | `Args.Verbose` | Подробный лог |
+
+## Конфигурация
+
+Подробное описание параметров — в разделе [config.yml](../config.md).
+
+Приоритет: Defaults < `config.yml` < Env < CLI-флаги.
+
+CLI-флаги переопределяют конфигурацию только если переданы явно (`cmd.Flags().Changed()`).
+Для этого в Cobra используются zero-value defaults (0, "", false), чтобы отличить «не передан» от «передан со значением по умолчанию».
+
+## Шаблоны
+
+HTML-шаблоны встроены через `//go:embed`:
+
+- `layout.html` — общий каркас (header, footer);
+- `list.html` — список плейлистов с пагинацией;
+- `details.html` — детали плейлиста и список каналов.
+
+SVG-логотипы каналов передаются через `encodeURIComponent` в data-URI для корректной работы с кавычками в HTML.
+
+При отсутствии `playlists.ini` рендерится пустое состояние с alert-блоком.
+
+## Кеширование
+
+Два уровня кеша:
+
+1. **Redis/KeyDB** (опционально) — постоянный кеш результатов проверки. TTL из `cache.ttl`.
+2. **In-memory** (`memCache`) — только при `serve --check`. Обновляется в реальном времени через callback. Не требует Redis.
+
+In-memory кеш приоритетнее Redis при отображении в веб-интерфейсе.
diff --git a/src/dev/local-dev.md b/content/iptvc/dev/local-dev.md
similarity index 100%
rename from src/dev/local-dev.md
rename to content/iptvc/dev/local-dev.md
diff --git a/src/dev/tgbot.md b/content/iptvc/dev/tgbot.md
similarity index 100%
rename from src/dev/tgbot.md
rename to content/iptvc/dev/tgbot.md
diff --git a/src/formats/channels.md b/content/iptvc/formats/channels.md
similarity index 99%
rename from src/formats/channels.md
rename to content/iptvc/formats/channels.md
index 8a0fa0d..e61838c 100644
--- a/src/formats/channels.md
+++ b/content/iptvc/formats/channels.md
@@ -1,4 +1,5 @@
---
+title: channels.json
icon: material/code-json
tags: ["iptvc", "теги", "каналы"]
---
diff --git a/src/formats/index.md b/content/iptvc/formats/index.md
similarity index 100%
rename from src/formats/index.md
rename to content/iptvc/formats/index.md
diff --git a/src/formats/m3u.md b/content/iptvc/formats/m3u.md
similarity index 99%
rename from src/formats/m3u.md
rename to content/iptvc/formats/m3u.md
index 0ced7d7..2116153 100644
--- a/src/formats/m3u.md
+++ b/content/iptvc/formats/m3u.md
@@ -1,4 +1,5 @@
---
+title: "*.m3u (*.m3u8)"
icon: material/playlist-play
tags: ["плейлисты", "каналы"]
---
@@ -15,6 +16,7 @@ tags: ["плейлисты", "каналы"]
После директив с новой строки указывается ссылка на канал (или путь к файлу).
В свою чередь, по этой ссылке может быть:
+
* либо текстовое представление контента в формате m3u/m3u8/XMLTV/MPD с описанием непосредственно участки трансляции;
* либо непосредственно сама потоковая трансляция mp4 или т. п.
diff --git a/src/formats/playlists.md b/content/iptvc/formats/playlists.md
similarity index 98%
rename from src/formats/playlists.md
rename to content/iptvc/formats/playlists.md
index 9d4e44b..b00a5da 100644
--- a/src/formats/playlists.md
+++ b/content/iptvc/formats/playlists.md
@@ -1,4 +1,5 @@
---
+title: playlists.ini
icon: material/code-brackets
tags: ["плейлисты"]
---
diff --git a/content/iptvc/install.md b/content/iptvc/install.md
new file mode 100644
index 0000000..bea6869
--- /dev/null
+++ b/content/iptvc/install.md
@@ -0,0 +1,70 @@
+---
+icon: material/download
+tags: ["iptvc"]
+---
+
+# Установка и запуск
+
+## Запуск готовой программы
+
+Достаточно скачать и распаковать архив с подходящим исполняемым файлом [со страницы последнего релиза][rel_page] в любую удобную директорию:
+
+| ОС | Скачать для `amd64` | Скачать для `arm64` |
+| ------- | ---------------------------------- | ---------------------------------- |
+| Linux | [linux_amd64.zip][linux_amd64] | [linux_arm64.zip][linux_arm64] |
+| MacOS | [darwin_amd64.zip][darwin_amd64] | [darwin_arm64.zip][darwin_arm64] |
+| Windows | [windows_amd64.zip][windows_amd64] | [windows_arm64.zip][windows_arm64] |
+
+[rel_page]: https://git.axenov.dev/IPTV/iptvc/releases/latest
+[linux_amd64]: https://git.axenov.dev/IPTV/iptvc/releases/download/latest/linux_amd64.zip
+[linux_arm64]: https://git.axenov.dev/IPTV/iptvc/releases/download/latest/linux_arm64.zip
+[darwin_amd64]: https://git.axenov.dev/IPTV/iptvc/releases/download/latest/darwin_amd64.zip
+[darwin_arm64]: https://git.axenov.dev/IPTV/iptvc/releases/download/latest/darwin_arm64.zip
+[windows_amd64]: https://git.axenov.dev/IPTV/iptvc/releases/download/latest/windows_amd64.zip
+[windows_arm64]: https://git.axenov.dev/IPTV/iptvc/releases/download/latest/windows_arm64.zip
+
+## Запуск релизного образа
+
+Релизные docker-образы строятся для платформы `linux` и архитектуры `amd64`.
+
+Найти их можно здесь:
+
+Тег `latest` всегда соответствует последней версии, он подразумевается по умолчанию:
+
+=== "Запуск последней версии"
+
+ ```shell
+ docker run \
+ --pull always \
+ --name iptvc \
+ git.axenov.dev/iptv/iptvc \ #(1)!
+ КОМАНДА [АРГУМЕНТЫ]
+ ```
+
+ 1. Подразумевается `:latest`, можно указать явно
+
+=== "Запуск другой версии"
+
+ ```shell
+ docker run \
+ --pull always \
+ --name iptvc \
+ git.axenov.dev/iptv/iptvc:v1.0.6 \ #(1)!
+ КОМАНДА [АРГУМЕНТЫ]
+ ```
+
+ 1. Список версий доступен на [релизной странице][rel_page]
+
+## Использование образа в Docker compose
+
+```yaml title="compose.yml"
+services:
+ #...
+ iptvc:
+ container_name: iptvc
+ image: git.axenov.dev/iptv/iptvc:latest
+ command: [serve] #(1)!
+ #...
+```
+
+1. Доступные команды и аргументы см. в [**Справочнике команд**](commands/index.md)
diff --git a/src/iptvc/index.md b/content/iptvc/overview.md
similarity index 67%
rename from src/iptvc/index.md
rename to content/iptvc/overview.md
index 132c7c4..95c9960 100644
--- a/src/iptvc/index.md
+++ b/content/iptvc/overview.md
@@ -1,9 +1,10 @@
---
-icon: material/check-network
+title: Введение
+icon: octicons/sparkles-fill-16
hide: [toc]
---
-# :material-check-network: IPTV Checker (iptvc)
+# IPTV Checker (iptvc)
Это простая программа для проверки IPTV плейлистов, входящая в состав проекта m3u.su.
@@ -11,26 +12,47 @@ hide: [toc]
> Программа не предназначена для хранения, воспроизведения или распространения пиратского контента.
-Программа не имеет графического интерфейса и работает в терминале.
-
-- [:material-flag-checkered: Быстрый старт](quickstart.md)
+- :material-flag-checkered: **Быстрый старт**
---
+
Коротко о главном, если не терпится
-- [:octicons-terminal-24: Доступные команды](commands/index.md)
+ [Подробности :material-arrow-right:][start]{ .md-button .md-button--primary }
+
+- :material-application-brackets-outline: **Запуск сайта**
---
- Как правильно с ней работать
-- [:simple-dotenv: Переменные окружения](env.md)
+ Создайте свой агрегатор плейлистов
+
+ [Подробности :material-arrow-right:][site]{ .md-button .md-button--primary }
+
+- :octicons-terminal-24: **Работа в терминале**
---
- Параметры конфигурации программы
+
+ Как обрабатывать плейлисты без GUI
+
+ [Подробности :material-arrow-right:][cli]{ .md-button .md-button--primary }
+
+- :material-file-cog: **Конфигурация**
+
+ ---
+
+ Настройте `iptvc` для своих целей
+
+ [Подробности :material-arrow-right:][cfg]{ .md-button .md-button--primary }
-## :material-cog-sync-outline: Как работает iptvc
+[start]: quickstart.md "Перейти к разделу"
+[site]: site/index.md "Перейти к разделу"
+[cli]: commands/index.md "Перейти к разделу"
+[cfg]: config/config.md "Перейти к разделу"
+
+
diff --git a/content/iptvc/quickstart.md b/content/iptvc/quickstart.md
new file mode 100644
index 0000000..bdbe48c
--- /dev/null
+++ b/content/iptvc/quickstart.md
@@ -0,0 +1,85 @@
+---
+icon: material/flag-checkered
+tags: ["iptvc"]
+---
+
+# :material-flag-checkered: Быстрый старт
+
+Для простоты представим, что программа скачана и распакована в любую директорию и вы находитесь в ней.
+
+Используйте тот способ запуска, который выбрали на шаге [установки](install.md).
+
+Ниже представлены лишь частые примеры запуска программы с разными аргументами под разные случаи.
+
+## Проверить плейлист по прямой ссылке
+
+```
+./iptvc check -u https://example.com/pls.m3u
+./iptvc check --url https://example.com/pls.m3u
+```
+
+## Проверить файл плейлиста с диска
+
+```
+./iptvc check -f /home/user/pls.m3u
+./iptvc check --file /home/user/pls.m3u
+```
+
+## Проверить плейлист по короткому коду из [`playlists.ini`](formats/playlists.md)
+
+```
+./iptvc check -c X
+./iptvc check --code X
+```
+
+Файл `playlists.ini` должен лежать рядом с `iptvc`.
+
+Если файл лежит в другой директории, то можно явно указать путь к нему:
+
+```
+./iptvc check --ini /home/user/playlists.ini --code X
+```
+
+Если ini-файл не будет найден, программа предупредит об этом.
+
+## Присвоить каналам тематические теги
+
+Для этого рядом с `iptvc` должен лежать файл [channels.json](formats/channels.md).
+
+Если файл лежит в другой директории, то можно указать её явно:
+
+```
+./iptvc check --tags /home/user/channels.json
+```
+
+Если json-файл не будет найден, то программа предупредит о том, что теги не будут присвоены, и продолжит работу.
+
+## Проверить несколько плейлистов одновременно
+
+Для этого можно комбинировать все аргументы, перечисленные выше, с учётом особенностей их работы:
+
+```shell
+./iptvc check \
+ --ini /home/user/p.ini \ #(1)!
+ --tags /home/user/c.json \ #(2)!
+ --code Y \ #(3)!
+ --file /home/user/tv.m3u \ #(4)!
+ --url https://example.com/pls1.m3u \ #(5)!
+ -u https://example.com/pls2.m3u #(6)!
+```
+
+1. Из этого файла будет взят список плейлистов
+2. Из этого файла будут взяты правила для присвоения тегов каналам
+3. Из ini-списка будет проверен только плейлист с кодом `Y`
+4. Это отдельный файл плейлиста на диске, который будет проверен в дополнение к основному списку
+5. Плейлист на каком-то удалённом сервере, который будет загружен и проверен вместе с прошлыми двумя
+6. Ещё один по ссылке, просто через короткий вариант аргумента `--url`
+
+Символ `\` нужен только для наглядного разделения аргументов на несколько строк.
+Всё это можно писать в одну строку.
+
+Переданные плейлисты будут обработаны в следующем порядке:
+
+1. локальные файлы (`-f|--file`);
+2. по ссылкам (`-u|--url`);
+3. по кодам из ini-файла (`-i|--ini`, `-c|--code`).
diff --git a/src/common/connect.md b/content/iptvc/site/connect.md
similarity index 100%
rename from src/common/connect.md
rename to content/iptvc/site/connect.md
diff --git a/src/common/details.md b/content/iptvc/site/details.md
similarity index 95%
rename from src/common/details.md
rename to content/iptvc/site/details.md
index 8c2f250..3805089 100644
--- a/src/common/details.md
+++ b/content/iptvc/site/details.md
@@ -15,7 +15,7 @@ tags: ["сайт", "статусы", "каналы"]
## Вкладка "Основная информация"
-
+
На этой вкладке выводится таблица со следующими строками:
@@ -36,7 +36,7 @@ tags: ["сайт", "статусы", "каналы"]
Если при проверке плейлиста возникла ошибка, то она будет отображена красным цветом сразу под заголовком:
??? quote "Скриншот страницы с ошибкой"
- 
+ 
!!! info
Если в тексте ошибки фигурирует слово `Timeout` и плейлист offline — это ерунда.
@@ -49,7 +49,7 @@ tags: ["сайт", "статусы", "каналы"]
## Вкладка "Исходный текст"
-
+
Здесь выводится плейлист как он есть.
Над этим текстом — две кнопки:
@@ -61,7 +61,7 @@ tags: ["сайт", "статусы", "каналы"]
В заголовке пишется их общее количество.
-
+
В списке всегда отображается не более 100 каналов.
@@ -92,7 +92,7 @@ tags: ["сайт", "статусы", "каналы"]
**Сбросить** выбор можно повторным нажатием на каждый, либо кнопкой сброса у строки поиска.
??? quote "Пример фильтрации"
- 
+ 
## Ссылка для ТВ
diff --git a/src/common/list.md b/content/iptvc/site/list.md
similarity index 94%
rename from src/common/list.md
rename to content/iptvc/site/list.md
index 2f3e4c9..d11be7e 100644
--- a/src/common/list.md
+++ b/content/iptvc/site/list.md
@@ -7,7 +7,7 @@ tags: ["сайт", "плейлисты"]
Это главная страница сайта.
-
+
Наверху отображаются:
@@ -33,4 +33,4 @@ tags: ["сайт", "плейлисты"]
В зависимости от ширины экрана, для экономии места может быть скрыто описание с иконками возможностей и короткая ссылка.
-
+
diff --git a/content/iptvc/site/start.md b/content/iptvc/site/start.md
new file mode 100644
index 0000000..f758022
--- /dev/null
+++ b/content/iptvc/site/start.md
@@ -0,0 +1,392 @@
+---
+title: Запуск своего сайта
+icon: material/rocket-launch
+tags: ["iptvc", "serve", "сайт"]
+---
+
+# :material-rocket-launch: Запуск своего сайта
+
+В этой статье мы шаг за шагом запустим собственный сайт-агрегатор IPTV-плейлистов — от простейшего варианта до полной конфигурации с кешем и тонкой настройкой проверки.
+
+Программа `iptvc` уже должна быть [установлена](../install.md). Все команды ниже выполняются в терминале из директории, где лежит бинарник.
+
+---
+
+## Шаг 1. Запускаем пустой сайт
+
+Минимальный запуск — одна команда:
+
+```bash
+./iptvc serve
+```
+
+Сайт откроется на `http://localhost:8080`. Это пустая страница: нет ни одного плейлиста, потому что программе пока неоткуда их взять.
+
+Чтобы изменить порт или хост, не трогая файл конфигурации:
+
+```bash
+./iptvc serve -p 3000 --host 0.0.0.0
+```
+
+Подробнее об этих флагах — в [документации команды `serve`](../commands/serve.md).
+
+---
+
+## Шаг 2. Добавляем плейлисты
+
+Список плейлистов описывается в файле [`playlists.ini`](../formats/playlists.md). Создадим его рядом с `iptvc`:
+
+```ini title="playlists.ini"
+[ru]
+name = Российские каналы
+desc = Основные федеральные каналы
+pls = 'https://example.com/ru.m3u'
+src = 'https://example.com/ru-playlist'
+
+[movies]
+name = Фильмы
+pls = 'https://example.com/movies.m3u'
+```
+
+Каждая секция `[code]` — это плейлист. Код используется в коротких ссылках вида `http://localhost:8080/ru`. Параметр `pls` обязателен, остальные — по желанию.
+
+Теперь запустим:
+
+```bash
+./iptvc serve
+```
+
+Сайт покажет оба плейлиста, но их статус — `unknown` (неизвестно). Это нормально: программа знает о них, но ещё не проверяла. Чтобы статусы появились, нужно включить фоновую проверку.
+
+!!! tip "Путь к ini-файлу"
+ Если файл лежит не рядом с программой, укажите путь через флаг [`-i`](../commands/serve.md#ini) или в [`config.yml`](../config/config.md) → `app.playlists`.
+
+---
+
+## Шаг 3. Включаем фоновую проверку
+
+Без проверки сайт просто показывает список. Чтобы плейлисты и каналы проверялись автоматически, добавим флаг `--check`:
+
+```bash
+./iptvc serve --check
+```
+
+Теперь программа в фоне загружает каждый плейлист, парсит каналы и проверяет их доступность. Результаты сразу попадают в оперативную память и отображаются на сайте.
+
+Можно настроить интервал между циклами проверки:
+
+```bash
+# проверять каждые 120 секунд, бесконечно
+./iptvc serve --check --every 120
+
+# проверить один раз и остановить
+./iptvc serve --check --repeat 1
+```
+
+Если не хочется каждый раз писать `--check`, можно включить проверку через [`config.yml`](../config/config.md):
+
+```yaml title="config.yml"
+check:
+ start-on-serve: true
+```
+
+Тогда обычный `./iptvc serve` автоматически запустит фоновую проверку.
+
+---
+
+## Шаг 4. Настраиваем внешний вид сайта
+
+Сайт можно настроить под себя: заголовок, иконку, навигацию в шапке и ссылки в подвале. Всё это — в секции [`site`](../config/config.md#секция-site) файла `config.yml`.
+
+```yaml title="config.yml"
+site:
+ base-url: http://localhost:8080
+ repo-url: https://git.axenov.dev/IPTV
+ page-size: 20 # пагинация по 20 плейлистов на страницу (0 — без пагинации)
+ favicon: /favicon.ico # путь к иконке
+ header:
+ title: Мой IPTV # заголовок в шапке и вкладке браузера
+ navigation:
+ - title: Документация
+ url: /docs
+ icon: document-text-outline
+ - title: Telegram
+ icon: paper-plane-outline
+ children:
+ - title: Канал
+ url: https://t.me/my_channel
+ icon: megaphone-outline
+ - title: Чат
+ url: https://t.me/my_chat
+ icon: chatbubbles-outline
+ footer-links:
+ - title: Исходники
+ url: https://git.axenov.dev/IPTV
+ icon: code-slash-outline
+ - title: Мой сайт
+ url: https://example.com
+ icon: person-outline
+```
+
+--8<-- "ionicons-name.md"
+
+!!! note "base-url"
+ Параметр `base-url` используется для формирования внутренних ссылок. Если публикуете сайт на домене, укажите его здесь, например `https://my-iptv.ru`.
+
+---
+
+## Шаг 5. Добавляем теги каналам
+
+Теги помогают посетителям находить каналы по темам: спорт, фильмы, музыка и так далее. Правила описываются в файле [`channels.json`](../formats/channels.md).
+
+```json title="channels.json"
+[
+ {
+ "tvg-id": "^ru-",
+ "tags": ["russian"]
+ },
+ {
+ "title": "спорт",
+ "tags": ["sport"]
+ },
+ {
+ "title": "кино|фильм",
+ "tags": ["film"]
+ }
+]
+```
+
+Путь к файлу указывается в [`config.yml`](../config/config.md) → `app.tags` или через флаг [`-t`](../commands/serve.md#tags):
+
+```bash
+./iptvc serve --check -t /path/to/channels.json
+```
+
+Полный список доступных тегов — в [справочнике по channels.json](../formats/channels.md#доступные-теги).
+
+---
+
+## Шаг 6. Подключаем кеш (KeyDB/Redis)
+
+По умолчанию результаты проверки хранятся только в оперативной памяти. Если программу перезапустить — все результаты пропадут, и плейлисты снова станут `unknown` до следующей проверки.
+
+Кеш решает эту проблему: результаты сохраняются в KeyDB (или Redis) и переживают перезапуск. Включается одной строкой в [`config.yml`](../config/config.md#секция-cache):
+
+```yaml title="config.yml"
+cache:
+ enabled: true
+ host: localhost
+ port: 6379
+ ttl: 1800 # секунды (30 минут)
+```
+
+Или через переменные окружения:
+
+```bash
+CACHE_ENABLED=true CACHE_TTL=3600 ./iptvc serve --check
+```
+
+Или через флаги:
+
+```bash
+./iptvc serve --check --cache-enabled --cache-host 192.168.1.10 --cache-ttl 3600
+```
+
+!!! tip "KeyDB или Redis"
+ KeyDB — это форк Redis, полностью совместимый по протоколу. Подойдёт любой из них. Если кеш включён, но сервер недоступен — сайт продолжит работать, просто без кеширования.
+
+---
+
+## Шаг 7. Тонкая настройка проверки
+
+Когда плейлистов много, полезно управлять параллелизмом, таймаутами и задержками. Все параметры — в секции [`check`](../config/config.md#секция-check) файла `config.yml`.
+
+### Параллелизм
+
+```yaml title="config.yml"
+check:
+ playlists:
+ max-routines: 10 # сколько плейлистов проверять одновременно
+ per-routine: 5 # сколько плейлистов в одной процедуре
+ channels:
+ max-routines: 100 # сколько каналов проверять одновременно
+ per-routine: 20 # сколько каналов в одной процедуре
+```
+
+Чем больше значения — тем быстрее проверка, но выше нагрузка на процессор и сеть. Начните со значений по умолчанию и увеличивайте при необходимости.
+
+### Таймауты
+
+```yaml title="config.yml"
+check:
+ playlists:
+ timeout: 10000 # мс на загрузку плейлиста
+ channels:
+ timeout: 10000 # мс на проверку одного канала
+ byte-range: 512 # сколько байт скачать от сервера канала
+```
+
+Если плейлисты или каналы медленные, увеличьте `timeout`. Если сервер блокирует большие запросы — уменьшите `byte-range`.
+
+### Задержки (cooldown)
+
+Чтобы не перегружать серверы-источники, между проверками можно делать паузы. Параметры поддерживают как фиксированное значение, так и диапазон `[min, max]` — тогда пауза будет случайной при каждом проходе:
+
+```yaml title="config.yml"
+check:
+ playlists:
+ all-cooldown: 5000 # 5 секунд после всех плейлистов
+ one-cooldown: [1000, 3000] # 1–3 секунды после каждого плейлиста
+ channels:
+ cooldown: [100, 500] # 100–500 мс после каждого канала
+```
+
+### User-Agent
+
+Некоторые серверы блокируют запросы без правильного User-Agent. Можно указать один или несколько — тогда при каждом запросе будет выбран случайный:
+
+```yaml title="config.yml"
+check:
+ playlists:
+ user-agent:
+ - Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
+ - Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
+ channels:
+ user-agent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
+```
+
+Все эти параметры можно также задавать через [переменные окружения](../config/env.md) или [CLI-флаги](../commands/serve.md) — они имеют наивысший приоритет.
+
+---
+
+## Полный пример
+
+Соберём всё вместе в одном `config.yml`:
+
+```yaml title="config.yml"
+app:
+ timezone: GMT+3
+ debug: false
+ log_level: info
+ playlists: ./playlists.ini
+ tags: ./channels.json
+
+server:
+ host: 0.0.0.0
+ port: 8080
+
+site:
+ base-url: https://my-iptv.ru
+ repo-url: https://git.axenov.dev/IPTV
+ page-size: 20
+ favicon: /favicon.ico
+ header:
+ title: Мой IPTV
+ navigation:
+ - title: Статус
+ url: https://status.my-iptv.ru
+ icon: pulse-outline
+ - title: Документация
+ url: /docs
+ icon: document-text-outline
+ - title: Telegram
+ icon: paper-plane-outline
+ children:
+ - title: Канал
+ url: https://t.me/my_channel
+ icon: megaphone-outline
+ - title: Чат
+ url: https://t.me/my_chat
+ icon: chatbubbles-outline
+ footer-links:
+ - title: Исходники
+ url: https://git.axenov.dev/IPTV
+ icon: code-slash-outline
+ - title: Контакты
+ url: https://example.com
+ icon: person-outline
+
+check:
+ start-on-serve: true
+ playlists:
+ user-agent:
+ - Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
+ - Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
+ timeout: 10000
+ all-cooldown: 5000
+ one-cooldown: [1000, 3000]
+ max-routines: 10
+ per-routine: 5
+ channels:
+ user-agent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
+ timeout: 10000
+ byte-range: 512
+ cooldown: [100, 500]
+ max-routines: 100
+ per-routine: 20
+
+cache:
+ enabled: true
+ host: localhost
+ port: 6379
+ ttl: 3600
+```
+
+Запуск:
+
+```bash
+./iptvc serve
+```
+
+Поскольку `start-on-serve: true`, фоновая проверка запустится автоматически. Кеш включён, так что результаты переживут перезапуск. Сайт доступен на `http://0.0.0.0:8080`.
+
+---
+
+## Docker
+
+Удобно запускать сайт в контейнере. Образ `iptvc` уже включает бинарник:
+
+```yaml title="compose.yml"
+services:
+ iptvc:
+ image: git.axenov.dev/iptv/iptvc:latest
+ command: [serve]
+ ports:
+ - "8080:8080"
+ volumes:
+ - ./config.yml:/app/config.yml:ro
+ - ./playlists.ini:/app/playlists.ini:ro
+ - ./channels.json:/app/channels.json:ro
+ environment:
+ - CHECK_START_ON_SERVE=true
+ - CACHE_ENABLED=true
+ - CACHE_HOST=keydb
+ - CACHE_PORT=6379
+
+ keydb:
+ image: eqalpha/keydb:latest
+ restart: unless-stopped
+```
+
+```bash
+docker compose up -d
+```
+
+Подробнее об установке образа — в [документации по установке](../install.md).
+
+---
+
+## Краткая шпаргалка
+
+| Задача | Как |
+| --- | --- |
+| Запустить сайт | `./iptvc serve` |
+| С проверкой плейлистов | `./iptvc serve --check` |
+| На другом порту | `./iptvc serve -p 3000` |
+| С ini-файлом из другого места | `./iptvc serve -i /path/to/playlists.ini` |
+| С кешем | `./iptvc serve --check --cache-enabled` |
+| Один цикл проверки | `./iptvc serve --check --repeat 1` |
+| Проверять каждые 2 минуты | `./iptvc serve --check --every 120` |
+| Подробные логи | `./iptvc serve --check --verbose` |
+
+Полный список параметров — в [справочнике по `config.yml`](../config/config.md), [переменным окружения](../config/env.md) и [команде `serve`](../commands/serve.md).
diff --git a/src/tg/bot.md b/content/tg/bot.md
similarity index 100%
rename from src/tg/bot.md
rename to content/tg/bot.md
diff --git a/src/tg/chat.md b/content/tg/chat.md
similarity index 100%
rename from src/tg/chat.md
rename to content/tg/chat.md
diff --git a/src/tg/index.md b/content/tg/index.md
similarity index 100%
rename from src/tg/index.md
rename to content/tg/index.md
diff --git a/inline_badges.py b/inline_badges.py
new file mode 100644
index 0000000..99ca33e
--- /dev/null
+++ b/inline_badges.py
@@ -0,0 +1,49 @@
+from __future__ import annotations
+
+import re
+from html import escape
+
+from markdown.extensions import Extension
+from markdown.preprocessors import Preprocessor
+
+SHORTCODE_RE = re.compile(r"", re.I)
+
+class BadgePreprocessor(Preprocessor):
+ def run(self, lines: list[str]) -> list[str]:
+ return [SHORTCODE_RE.sub(self._replace, line) for line in lines]
+
+ def _replace(self, match: re.Match[str]) -> str:
+ kind, args = match.groups()
+ args = args.strip()
+
+ if kind == "version":
+ return _badge(":material-tag-outline:", escape(args))
+
+ if kind == "default":
+ value = escape(args or "none")
+ return _badge(":material-water:", f"{value}")
+
+ if kind == "flag" and args == "experimental":
+ return _badge(":material-test-tube:")
+
+ return match.group(0)
+
+
+# Формирует HTML-разметку бейджа. Иконки остаются Zensical-шорткодами
+# и рендерятся штатным `pymdownx.emoji` на следующем этапе обработки Markdown.
+def _badge(icon: str, text: str = "") -> str:
+ return "".join([
+ '',
+ f'{icon} ',
+ *([f'{text} '] if text else []),
+ ' ',
+ ])
+
+
+class InlineBadgeExtension(Extension):
+ def extendMarkdown(self, md):
+ md.preprocessors.register(BadgePreprocessor(md), "inline_badges", 175)
+
+
+def makeExtension(**kwargs):
+ return InlineBadgeExtension(**kwargs)
diff --git a/mkdocs.yml b/mkdocs.yml
deleted file mode 100644
index 4ec0408..0000000
--- a/mkdocs.yml
+++ /dev/null
@@ -1,144 +0,0 @@
-site_name: Документация m3u.su
-site_description: Описание сервиса m3u.su и его компонентов
-site_author: Антон Аксенов
-copyright: Антон Аксенов © 2025 MIT License
-
-repo_name: Репозиторий
-repo_url: https://git.axenov.dev/IPTV/docs
-edit_uri: src/branch/master/src/
-remote_branch: master
-
-docs_dir: ./src
-use_directory_urls: false
-watch:
- - src
-extra_css:
- - assets/css/custom.css
-extra_javascript:
- - https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.js
-
-extra:
- homepage: /docs
- logo: assets/img/favicon/logo.png
- favicon: assets/img/favicon/logo.png
- social:
- - name: Канал @iptv_aggregator
- icon: simple/telegram
- link: https://t.me/iptv_aggregator
- - name: Чат @iptv_aggregator_chat
- icon: simple/telegram
- link: https://t.me/iptv_aggregator_chat
- - name: Бот @iptv_aggregator_bot
- icon: simple/telegram
- link: https://t.me/iptv_aggregator_bot
-
-theme:
- name: 'material'
- language: ru
- features:
- - toc.follow
- - search.suggest
- - navigation.top
- - navigation.footer
- - navigation.indexes
- - content.action.edit
- icon:
- repo: simple/gitea
- edit: material/pencil
- view: material/eye
- palette:
- # Автотема
- - media: "(prefers-color-scheme)"
- toggle:
- icon: material/brightness-auto
- name: Switch to light mode
- # Тёмная тема
- - scheme: slate
- media: "(prefers-color-scheme: light)"
- accent: teal
- primary: black
- toggle:
- name: Светлая тема
- icon: material/weather-sunny
- # Светлая тема
- - scheme: default
- media: "(prefers-color-scheme: dark)"
- accent: teal
- primary: teal
- toggle:
- name: Тёмная тема
- icon: material/weather-night
-
-plugins:
- - minify:
- minify_html: true
- - tags:
- tags: true
- listings: true
- - social:
- cards_layout_options:
- background_color: teal
- background_image: null
- - search:
- separator: '[\s\-\.]+'
- # indexing: 'full'
-
-validation:
- omitted_files: warn
- absolute_links: warn
- unrecognized_links: warn
- anchors: warn
-
-markdown_extensions:
- - admonition
- - pymdownx.details
- - pymdownx.superfences
- - attr_list
- - md_in_html
- - pymdownx.emoji:
- emoji_index: !!python/name:material.extensions.emoji.twemoji
- emoji_generator: !!python/name:material.extensions.emoji.to_svg
- - toc:
- permalink: true
-
-nav:
- - index.md
- - docs.md
- - support.md
- - legal.md
- - 'Общая информация':
- - common/index.md
- - common/how-it-works.md
- - common/selection.md
- - common/checks.md
- - common/list.md
- - common/details.md
- - common/connect.md
- - common/players.md
- - 'IPTV Checker (iptvc)':
- - iptvc/index.md
- - iptvc/install.md
- - iptvc/quickstart.md
- - iptvc/env.md
- - 'Доступные команды':
- - iptvc/commands/index.md
- - iptvc/commands/help.md
- - iptvc/commands/check.md
- - iptvc/commands/version.md
- - statuspage.md
- - 'Для разработчиков':
- - dev/index.md
- - dev/local-dev.md
- - dev/tgbot.md
- - dev/docs.md
- - dev/deploy.md
- - 'Форматы файлов':
- - formats/index.md
- - 'playlists.ini': 'formats/playlists.md'
- - 'channels.json': 'formats/channels.md'
- - '*.m3u (*.m3u8)': 'formats/m3u.md'
- - 'Telegram':
- - tg/index.md
- - 'Бот': tg/bot.md
- - 'Чат': tg/chat.md
- - 'FAQ (ЧаВо)': 'faq.md'
diff --git a/overrides/.icons/vscode/LICENSE b/overrides/.icons/vscode/LICENSE
new file mode 100644
index 0000000..b5ab7ef
--- /dev/null
+++ b/overrides/.icons/vscode/LICENSE
@@ -0,0 +1,399 @@
+Attribution 4.0 International
+
+=======================================================================
+
+Creative Commons Corporation ("Creative Commons") is not a law firm and
+does not provide legal services or legal advice. Distribution of
+Creative Commons public licenses does not create a lawyer-client or
+other relationship. Creative Commons makes its licenses and related
+information available on an "as-is" basis. Creative Commons gives no
+warranties regarding its licenses, any material licensed under their
+terms and conditions, or any related information. Creative Commons
+disclaims all liability for damages resulting from their use to the
+fullest extent possible.
+
+Using Creative Commons Public Licenses
+
+Creative Commons public licenses provide a standard set of terms and
+conditions that creators and other rights holders may use to share
+original works of authorship and other material subject to copyright
+and certain other rights specified in the public license below. The
+following considerations are for informational purposes only, are not
+exhaustive, and do not form part of our licenses.
+
+ Considerations for licensors: Our public licenses are
+ intended for use by those authorized to give the public
+ permission to use material in ways otherwise restricted by
+ copyright and certain other rights. Our licenses are
+ irrevocable. Licensors should read and understand the terms
+ and conditions of the license they choose before applying it.
+ Licensors should also secure all rights necessary before
+ applying our licenses so that the public can reuse the
+ material as expected. Licensors should clearly mark any
+ material not subject to the license. This includes other CC-
+ licensed material, or material used under an exception or
+ limitation to copyright. More considerations for licensors:
+ wiki.creativecommons.org/Considerations_for_licensors
+
+ Considerations for the public: By using one of our public
+ licenses, a licensor grants the public permission to use the
+ licensed material under specified terms and conditions. If
+ the licensor's permission is not necessary for any reason--for
+ example, because of any applicable exception or limitation to
+ copyright--then that use is not regulated by the license. Our
+ licenses grant only permissions under copyright and certain
+ other rights that a licensor has authority to grant. Use of
+ the licensed material may still be restricted for other
+ reasons, including because others have copyright or other
+ rights in the material. A licensor may make special requests,
+ such as asking that all changes be marked or described.
+ Although not required by our licenses, you are encouraged to
+ respect those requests where reasonable. More_considerations
+ for the public:
+ wiki.creativecommons.org/Considerations_for_licensees
+
+=======================================================================
+
+Creative Commons Attribution 4.0 International Public License
+
+By exercising the Licensed Rights (defined below), You accept and agree
+to be bound by the terms and conditions of this Creative Commons
+Attribution 4.0 International Public License ("Public License"). To the
+extent this Public License may be interpreted as a contract, You are
+granted the Licensed Rights in consideration of Your acceptance of
+these terms and conditions, and the Licensor grants You such rights in
+consideration of benefits the Licensor receives from making the
+Licensed Material available under these terms and conditions.
+
+
+Section 1 -- Definitions.
+
+ a. Adapted Material means material subject to Copyright and Similar
+ Rights that is derived from or based upon the Licensed Material
+ and in which the Licensed Material is translated, altered,
+ arranged, transformed, or otherwise modified in a manner requiring
+ permission under the Copyright and Similar Rights held by the
+ Licensor. For purposes of this Public License, where the Licensed
+ Material is a musical work, performance, or sound recording,
+ Adapted Material is always produced where the Licensed Material is
+ synched in timed relation with a moving image.
+
+ b. Adapter's License means the license You apply to Your Copyright
+ and Similar Rights in Your contributions to Adapted Material in
+ accordance with the terms and conditions of this Public License.
+
+ c. Copyright and Similar Rights means copyright and/or similar rights
+ closely related to copyright including, without limitation,
+ performance, broadcast, sound recording, and Sui Generis Database
+ Rights, without regard to how the rights are labeled or
+ categorized. For purposes of this Public License, the rights
+ specified in Section 2(b)(1)-(2) are not Copyright and Similar
+ Rights.
+
+ d. Effective Technological Measures means those measures that, in the
+ absence of proper authority, may not be circumvented under laws
+ fulfilling obligations under Article 11 of the WIPO Copyright
+ Treaty adopted on December 20, 1996, and/or similar international
+ agreements.
+
+ e. Exceptions and Limitations means fair use, fair dealing, and/or
+ any other exception or limitation to Copyright and Similar Rights
+ that applies to Your use of the Licensed Material.
+
+ f. Licensed Material means the artistic or literary work, database,
+ or other material to which the Licensor applied this Public
+ License.
+
+ g. Licensed Rights means the rights granted to You subject to the
+ terms and conditions of this Public License, which are limited to
+ all Copyright and Similar Rights that apply to Your use of the
+ Licensed Material and that the Licensor has authority to license.
+
+ h. Licensor means the individual(s) or entity(ies) granting rights
+ under this Public License.
+
+ i. Share means to provide material to the public by any means or
+ process that requires permission under the Licensed Rights, such
+ as reproduction, public display, public performance, distribution,
+ dissemination, communication, or importation, and to make material
+ available to the public including in ways that members of the
+ public may access the material from a place and at a time
+ individually chosen by them.
+
+ j. Sui Generis Database Rights means rights other than copyright
+ resulting from Directive 96/9/EC of the European Parliament and of
+ the Council of 11 March 1996 on the legal protection of databases,
+ as amended and/or succeeded, as well as other essentially
+ equivalent rights anywhere in the world.
+
+ k. You means the individual or entity exercising the Licensed Rights
+ under this Public License. Your has a corresponding meaning.
+
+
+Section 2 -- Scope.
+
+ a. License grant.
+
+ 1. Subject to the terms and conditions of this Public License,
+ the Licensor hereby grants You a worldwide, royalty-free,
+ non-sublicensable, non-exclusive, irrevocable license to
+ exercise the Licensed Rights in the Licensed Material to:
+
+ a. reproduce and Share the Licensed Material, in whole or
+ in part; and
+
+ b. produce, reproduce, and Share Adapted Material.
+
+ 2. Exceptions and Limitations. For the avoidance of doubt, where
+ Exceptions and Limitations apply to Your use, this Public
+ License does not apply, and You do not need to comply with
+ its terms and conditions.
+
+ 3. Term. The term of this Public License is specified in Section
+ 6(a).
+
+ 4. Media and formats; technical modifications allowed. The
+ Licensor authorizes You to exercise the Licensed Rights in
+ all media and formats whether now known or hereafter created,
+ and to make technical modifications necessary to do so. The
+ Licensor waives and/or agrees not to assert any right or
+ authority to forbid You from making technical modifications
+ necessary to exercise the Licensed Rights, including
+ technical modifications necessary to circumvent Effective
+ Technological Measures. For purposes of this Public License,
+ simply making modifications authorized by this Section 2(a)
+ (4) never produces Adapted Material.
+
+ 5. Downstream recipients.
+
+ a. Offer from the Licensor -- Licensed Material. Every
+ recipient of the Licensed Material automatically
+ receives an offer from the Licensor to exercise the
+ Licensed Rights under the terms and conditions of this
+ Public License.
+
+ b. No downstream restrictions. You may not offer or impose
+ any additional or different terms or conditions on, or
+ apply any Effective Technological Measures to, the
+ Licensed Material if doing so restricts exercise of the
+ Licensed Rights by any recipient of the Licensed
+ Material.
+
+ 6. No endorsement. Nothing in this Public License constitutes or
+ may be construed as permission to assert or imply that You
+ are, or that Your use of the Licensed Material is, connected
+ with, or sponsored, endorsed, or granted official status by,
+ the Licensor or others designated to receive attribution as
+ provided in Section 3(a)(1)(A)(i).
+
+ b. Other rights.
+
+ 1. Moral rights, such as the right of integrity, are not
+ licensed under this Public License, nor are publicity,
+ privacy, and/or other similar personality rights; however, to
+ the extent possible, the Licensor waives and/or agrees not to
+ assert any such rights held by the Licensor to the limited
+ extent necessary to allow You to exercise the Licensed
+ Rights, but not otherwise.
+
+ 2. Patent and trademark rights are not licensed under this
+ Public License.
+
+ 3. To the extent possible, the Licensor waives any right to
+ collect royalties from You for the exercise of the Licensed
+ Rights, whether directly or through a collecting society
+ under any voluntary or waivable statutory or compulsory
+ licensing scheme. In all other cases the Licensor expressly
+ reserves any right to collect such royalties.
+
+
+Section 3 -- License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the
+following conditions.
+
+ a. Attribution.
+
+ 1. If You Share the Licensed Material (including in modified
+ form), You must:
+
+ a. retain the following if it is supplied by the Licensor
+ with the Licensed Material:
+
+ i. identification of the creator(s) of the Licensed
+ Material and any others designated to receive
+ attribution, in any reasonable manner requested by
+ the Licensor (including by pseudonym if
+ designated);
+
+ ii. a copyright notice;
+
+ iii. a notice that refers to this Public License;
+
+ iv. a notice that refers to the disclaimer of
+ warranties;
+
+ v. a URI or hyperlink to the Licensed Material to the
+ extent reasonably practicable;
+
+ b. indicate if You modified the Licensed Material and
+ retain an indication of any previous modifications; and
+
+ c. indicate the Licensed Material is licensed under this
+ Public License, and include the text of, or the URI or
+ hyperlink to, this Public License.
+
+ 2. You may satisfy the conditions in Section 3(a)(1) in any
+ reasonable manner based on the medium, means, and context in
+ which You Share the Licensed Material. For example, it may be
+ reasonable to satisfy the conditions by providing a URI or
+ hyperlink to a resource that includes the required
+ information.
+
+ 3. If requested by the Licensor, You must remove any of the
+ information required by Section 3(a)(1)(A) to the extent
+ reasonably practicable.
+
+ 4. If You Share Adapted Material You produce, the Adapter's
+ License You apply must not prevent recipients of the Adapted
+ Material from complying with this Public License.
+
+
+Section 4 -- Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that
+apply to Your use of the Licensed Material:
+
+ a. for the avoidance of doubt, Section 2(a)(1) grants You the right
+ to extract, reuse, reproduce, and Share all or a substantial
+ portion of the contents of the database;
+
+ b. if You include all or a substantial portion of the database
+ contents in a database in which You have Sui Generis Database
+ Rights, then the database in which You have Sui Generis Database
+ Rights (but not its individual contents) is Adapted Material; and
+
+ c. You must comply with the conditions in Section 3(a) if You Share
+ all or a substantial portion of the contents of the database.
+
+For the avoidance of doubt, this Section 4 supplements and does not
+replace Your obligations under this Public License where the Licensed
+Rights include other Copyright and Similar Rights.
+
+
+Section 5 -- Disclaimer of Warranties and Limitation of Liability.
+
+ a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
+ EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
+ AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
+ ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
+ IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
+ WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
+ ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
+ KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
+ ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
+
+ b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
+ TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
+ NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
+ INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
+ COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
+ USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
+ DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
+ IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
+
+ c. The disclaimer of warranties and limitation of liability provided
+ above shall be interpreted in a manner that, to the extent
+ possible, most closely approximates an absolute disclaimer and
+ waiver of all liability.
+
+
+Section 6 -- Term and Termination.
+
+ a. This Public License applies for the term of the Copyright and
+ Similar Rights licensed here. However, if You fail to comply with
+ this Public License, then Your rights under this Public License
+ terminate automatically.
+
+ b. Where Your right to use the Licensed Material has terminated under
+ Section 6(a), it reinstates:
+
+ 1. automatically as of the date the violation is cured, provided
+ it is cured within 30 days of Your discovery of the
+ violation; or
+
+ 2. upon express reinstatement by the Licensor.
+
+ For the avoidance of doubt, this Section 6(b) does not affect any
+ right the Licensor may have to seek remedies for Your violations
+ of this Public License.
+
+ c. For the avoidance of doubt, the Licensor may also offer the
+ Licensed Material under separate terms or conditions or stop
+ distributing the Licensed Material at any time; however, doing so
+ will not terminate this Public License.
+
+ d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
+ License.
+
+
+Section 7 -- Other Terms and Conditions.
+
+ a. The Licensor shall not be bound by any additional or different
+ terms or conditions communicated by You unless expressly agreed.
+
+ b. Any arrangements, understandings, or agreements regarding the
+ Licensed Material not stated herein are separate from and
+ independent of the terms and conditions of this Public License.
+
+
+Section 8 -- Interpretation.
+
+ a. For the avoidance of doubt, this Public License does not, and
+ shall not be interpreted to, reduce, limit, restrict, or impose
+ conditions on any use of the Licensed Material that could lawfully
+ be made without permission under this Public License.
+
+ b. To the extent possible, if any provision of this Public License is
+ deemed unenforceable, it shall be automatically reformed to the
+ minimum extent necessary to make it enforceable. If the provision
+ cannot be reformed, it shall be severed from this Public License
+ without affecting the enforceability of the remaining terms and
+ conditions.
+
+ c. No term or condition of this Public License will be waived and no
+ failure to comply consented to unless expressly agreed to by the
+ Licensor.
+
+ d. Nothing in this Public License constitutes or may be interpreted
+ as a limitation upon, or waiver of, any privileges and immunities
+ that apply to the Licensor or You, including from the legal
+ processes of any jurisdiction or authority.
+
+
+=======================================================================
+
+Creative Commons is not a party to its public
+licenses. Notwithstanding, Creative Commons may elect to apply one of
+its public licenses to material it publishes and in those instances
+will be considered the "Licensor." The text of the Creative Commons
+public licenses is dedicated to the public domain under the CC0 Public
+Domain Dedication. Except for the limited purpose of indicating that
+material is shared under a Creative Commons public license or as
+otherwise permitted by the Creative Commons policies published at
+creativecommons.org/policies, Creative Commons does not authorize the
+use of the trademark "Creative Commons" or any other trademark or logo
+of Creative Commons without its prior written consent including,
+without limitation, in connection with any unauthorized modifications
+to any of its public licenses or any other arrangements,
+understandings, or agreements concerning use of licensed material. For
+the avoidance of doubt, this paragraph does not form part of the
+public licenses.
+
+Creative Commons may be contacted at creativecommons.org.
+
+---
+
+Git Logo by [Jason Long](https://bsky.app/profile/jasonlong.me) is licensed under the [Creative Commons Attribution 3.0 Unported License](https://creativecommons.org/licenses/by/3.0/).
diff --git a/overrides/.icons/vscode/account.svg b/overrides/.icons/vscode/account.svg
new file mode 100644
index 0000000..ca37ef5
--- /dev/null
+++ b/overrides/.icons/vscode/account.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/activate-breakpoints.svg b/overrides/.icons/vscode/activate-breakpoints.svg
new file mode 100644
index 0000000..54486a0
--- /dev/null
+++ b/overrides/.icons/vscode/activate-breakpoints.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/add-small.svg b/overrides/.icons/vscode/add-small.svg
new file mode 100644
index 0000000..f22da9b
--- /dev/null
+++ b/overrides/.icons/vscode/add-small.svg
@@ -0,0 +1 @@
+
diff --git a/overrides/.icons/vscode/add.svg b/overrides/.icons/vscode/add.svg
new file mode 100644
index 0000000..7b2fe93
--- /dev/null
+++ b/overrides/.icons/vscode/add.svg
@@ -0,0 +1 @@
+
diff --git a/overrides/.icons/vscode/agent.svg b/overrides/.icons/vscode/agent.svg
new file mode 100644
index 0000000..422001e
--- /dev/null
+++ b/overrides/.icons/vscode/agent.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/archive.svg b/overrides/.icons/vscode/archive.svg
new file mode 100644
index 0000000..c0e94a7
--- /dev/null
+++ b/overrides/.icons/vscode/archive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/arrow-both.svg b/overrides/.icons/vscode/arrow-both.svg
new file mode 100644
index 0000000..6c5dcc6
--- /dev/null
+++ b/overrides/.icons/vscode/arrow-both.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/arrow-circle-down.svg b/overrides/.icons/vscode/arrow-circle-down.svg
new file mode 100644
index 0000000..77a5f75
--- /dev/null
+++ b/overrides/.icons/vscode/arrow-circle-down.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/arrow-circle-left.svg b/overrides/.icons/vscode/arrow-circle-left.svg
new file mode 100644
index 0000000..f6f6243
--- /dev/null
+++ b/overrides/.icons/vscode/arrow-circle-left.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/arrow-circle-right.svg b/overrides/.icons/vscode/arrow-circle-right.svg
new file mode 100644
index 0000000..aa0b268
--- /dev/null
+++ b/overrides/.icons/vscode/arrow-circle-right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/arrow-circle-up.svg b/overrides/.icons/vscode/arrow-circle-up.svg
new file mode 100644
index 0000000..0352938
--- /dev/null
+++ b/overrides/.icons/vscode/arrow-circle-up.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/arrow-down.svg b/overrides/.icons/vscode/arrow-down.svg
new file mode 100644
index 0000000..fde1bfc
--- /dev/null
+++ b/overrides/.icons/vscode/arrow-down.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/arrow-left.svg b/overrides/.icons/vscode/arrow-left.svg
new file mode 100644
index 0000000..3344094
--- /dev/null
+++ b/overrides/.icons/vscode/arrow-left.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/arrow-right.svg b/overrides/.icons/vscode/arrow-right.svg
new file mode 100644
index 0000000..50cfc21
--- /dev/null
+++ b/overrides/.icons/vscode/arrow-right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/arrow-small-down.svg b/overrides/.icons/vscode/arrow-small-down.svg
new file mode 100644
index 0000000..9dc62ec
--- /dev/null
+++ b/overrides/.icons/vscode/arrow-small-down.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/arrow-small-left.svg b/overrides/.icons/vscode/arrow-small-left.svg
new file mode 100644
index 0000000..cc82cdd
--- /dev/null
+++ b/overrides/.icons/vscode/arrow-small-left.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/arrow-small-right.svg b/overrides/.icons/vscode/arrow-small-right.svg
new file mode 100644
index 0000000..4d05578
--- /dev/null
+++ b/overrides/.icons/vscode/arrow-small-right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/arrow-small-up.svg b/overrides/.icons/vscode/arrow-small-up.svg
new file mode 100644
index 0000000..4135bbf
--- /dev/null
+++ b/overrides/.icons/vscode/arrow-small-up.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/arrow-swap.svg b/overrides/.icons/vscode/arrow-swap.svg
new file mode 100644
index 0000000..af2febe
--- /dev/null
+++ b/overrides/.icons/vscode/arrow-swap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/arrow-up.svg b/overrides/.icons/vscode/arrow-up.svg
new file mode 100644
index 0000000..bcd870c
--- /dev/null
+++ b/overrides/.icons/vscode/arrow-up.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/ask.svg b/overrides/.icons/vscode/ask.svg
new file mode 100644
index 0000000..f4bcddf
--- /dev/null
+++ b/overrides/.icons/vscode/ask.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/attach.svg b/overrides/.icons/vscode/attach.svg
new file mode 100644
index 0000000..496e0c2
--- /dev/null
+++ b/overrides/.icons/vscode/attach.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/azure-devops.svg b/overrides/.icons/vscode/azure-devops.svg
new file mode 100644
index 0000000..4e4773e
--- /dev/null
+++ b/overrides/.icons/vscode/azure-devops.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/azure.svg b/overrides/.icons/vscode/azure.svg
new file mode 100644
index 0000000..d0a3f0d
--- /dev/null
+++ b/overrides/.icons/vscode/azure.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/beaker-stop.svg b/overrides/.icons/vscode/beaker-stop.svg
new file mode 100644
index 0000000..57999f0
--- /dev/null
+++ b/overrides/.icons/vscode/beaker-stop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/beaker.svg b/overrides/.icons/vscode/beaker.svg
new file mode 100644
index 0000000..f3f59da
--- /dev/null
+++ b/overrides/.icons/vscode/beaker.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/bell-dot.svg b/overrides/.icons/vscode/bell-dot.svg
new file mode 100644
index 0000000..43c716e
--- /dev/null
+++ b/overrides/.icons/vscode/bell-dot.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/bell-slash-dot.svg b/overrides/.icons/vscode/bell-slash-dot.svg
new file mode 100644
index 0000000..13a8f7f
--- /dev/null
+++ b/overrides/.icons/vscode/bell-slash-dot.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/bell-slash.svg b/overrides/.icons/vscode/bell-slash.svg
new file mode 100644
index 0000000..2ac2e8f
--- /dev/null
+++ b/overrides/.icons/vscode/bell-slash.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/bell.svg b/overrides/.icons/vscode/bell.svg
new file mode 100644
index 0000000..ef4183e
--- /dev/null
+++ b/overrides/.icons/vscode/bell.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/blank.svg b/overrides/.icons/vscode/blank.svg
new file mode 100644
index 0000000..7aacd32
--- /dev/null
+++ b/overrides/.icons/vscode/blank.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/bold.svg b/overrides/.icons/vscode/bold.svg
new file mode 100644
index 0000000..5d707aa
--- /dev/null
+++ b/overrides/.icons/vscode/bold.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/book.svg b/overrides/.icons/vscode/book.svg
new file mode 100644
index 0000000..7e31853
--- /dev/null
+++ b/overrides/.icons/vscode/book.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/bookmark.svg b/overrides/.icons/vscode/bookmark.svg
new file mode 100644
index 0000000..1162f09
--- /dev/null
+++ b/overrides/.icons/vscode/bookmark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/bracket-dot.svg b/overrides/.icons/vscode/bracket-dot.svg
new file mode 100644
index 0000000..ba0cac8
--- /dev/null
+++ b/overrides/.icons/vscode/bracket-dot.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/bracket-error.svg b/overrides/.icons/vscode/bracket-error.svg
new file mode 100644
index 0000000..8ebf781
--- /dev/null
+++ b/overrides/.icons/vscode/bracket-error.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/briefcase.svg b/overrides/.icons/vscode/briefcase.svg
new file mode 100644
index 0000000..215a738
--- /dev/null
+++ b/overrides/.icons/vscode/briefcase.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/broadcast.svg b/overrides/.icons/vscode/broadcast.svg
new file mode 100644
index 0000000..d4abb6b
--- /dev/null
+++ b/overrides/.icons/vscode/broadcast.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/browser.svg b/overrides/.icons/vscode/browser.svg
new file mode 100644
index 0000000..0e5201d
--- /dev/null
+++ b/overrides/.icons/vscode/browser.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/bug.svg b/overrides/.icons/vscode/bug.svg
new file mode 100644
index 0000000..49b1457
--- /dev/null
+++ b/overrides/.icons/vscode/bug.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/build.svg b/overrides/.icons/vscode/build.svg
new file mode 100644
index 0000000..0c2cdfa
--- /dev/null
+++ b/overrides/.icons/vscode/build.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/calendar.svg b/overrides/.icons/vscode/calendar.svg
new file mode 100644
index 0000000..431d931
--- /dev/null
+++ b/overrides/.icons/vscode/calendar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/call-incoming.svg b/overrides/.icons/vscode/call-incoming.svg
new file mode 100644
index 0000000..0e6258a
--- /dev/null
+++ b/overrides/.icons/vscode/call-incoming.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/call-outgoing.svg b/overrides/.icons/vscode/call-outgoing.svg
new file mode 100644
index 0000000..505a321
--- /dev/null
+++ b/overrides/.icons/vscode/call-outgoing.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/case-sensitive.svg b/overrides/.icons/vscode/case-sensitive.svg
new file mode 100644
index 0000000..98954a0
--- /dev/null
+++ b/overrides/.icons/vscode/case-sensitive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/chat-export.svg b/overrides/.icons/vscode/chat-export.svg
new file mode 100644
index 0000000..0b75f80
--- /dev/null
+++ b/overrides/.icons/vscode/chat-export.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/chat-import.svg b/overrides/.icons/vscode/chat-import.svg
new file mode 100644
index 0000000..691c9c3
--- /dev/null
+++ b/overrides/.icons/vscode/chat-import.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/chat-sparkle-error.svg b/overrides/.icons/vscode/chat-sparkle-error.svg
new file mode 100644
index 0000000..c02a3e6
--- /dev/null
+++ b/overrides/.icons/vscode/chat-sparkle-error.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/chat-sparkle-warning.svg b/overrides/.icons/vscode/chat-sparkle-warning.svg
new file mode 100644
index 0000000..716410f
--- /dev/null
+++ b/overrides/.icons/vscode/chat-sparkle-warning.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/chat-sparkle.svg b/overrides/.icons/vscode/chat-sparkle.svg
new file mode 100644
index 0000000..d6b9df0
--- /dev/null
+++ b/overrides/.icons/vscode/chat-sparkle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/check-all.svg b/overrides/.icons/vscode/check-all.svg
new file mode 100644
index 0000000..3028a6c
--- /dev/null
+++ b/overrides/.icons/vscode/check-all.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/check.svg b/overrides/.icons/vscode/check.svg
new file mode 100644
index 0000000..6217cb9
--- /dev/null
+++ b/overrides/.icons/vscode/check.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/checklist.svg b/overrides/.icons/vscode/checklist.svg
new file mode 100644
index 0000000..b7dfee2
--- /dev/null
+++ b/overrides/.icons/vscode/checklist.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/chevron-down.svg b/overrides/.icons/vscode/chevron-down.svg
new file mode 100644
index 0000000..445aba2
--- /dev/null
+++ b/overrides/.icons/vscode/chevron-down.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/chevron-left.svg b/overrides/.icons/vscode/chevron-left.svg
new file mode 100644
index 0000000..d61d175
--- /dev/null
+++ b/overrides/.icons/vscode/chevron-left.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/chevron-right.svg b/overrides/.icons/vscode/chevron-right.svg
new file mode 100644
index 0000000..831a0c9
--- /dev/null
+++ b/overrides/.icons/vscode/chevron-right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/chevron-up.svg b/overrides/.icons/vscode/chevron-up.svg
new file mode 100644
index 0000000..e2b1769
--- /dev/null
+++ b/overrides/.icons/vscode/chevron-up.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/chip.svg b/overrides/.icons/vscode/chip.svg
new file mode 100644
index 0000000..b2490b2
--- /dev/null
+++ b/overrides/.icons/vscode/chip.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/chrome-close.svg b/overrides/.icons/vscode/chrome-close.svg
new file mode 100644
index 0000000..a1c97ef
--- /dev/null
+++ b/overrides/.icons/vscode/chrome-close.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/chrome-maximize.svg b/overrides/.icons/vscode/chrome-maximize.svg
new file mode 100644
index 0000000..bc0f29a
--- /dev/null
+++ b/overrides/.icons/vscode/chrome-maximize.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/chrome-minimize.svg b/overrides/.icons/vscode/chrome-minimize.svg
new file mode 100644
index 0000000..ff59c67
--- /dev/null
+++ b/overrides/.icons/vscode/chrome-minimize.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/chrome-restore.svg b/overrides/.icons/vscode/chrome-restore.svg
new file mode 100644
index 0000000..efd9ceb
--- /dev/null
+++ b/overrides/.icons/vscode/chrome-restore.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/circle-filled.svg b/overrides/.icons/vscode/circle-filled.svg
new file mode 100644
index 0000000..3e224da
--- /dev/null
+++ b/overrides/.icons/vscode/circle-filled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/circle-large-filled.svg b/overrides/.icons/vscode/circle-large-filled.svg
new file mode 100644
index 0000000..b91aeb5
--- /dev/null
+++ b/overrides/.icons/vscode/circle-large-filled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/circle-large.svg b/overrides/.icons/vscode/circle-large.svg
new file mode 100644
index 0000000..7727785
--- /dev/null
+++ b/overrides/.icons/vscode/circle-large.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/circle-slash.svg b/overrides/.icons/vscode/circle-slash.svg
new file mode 100644
index 0000000..1e6009c
--- /dev/null
+++ b/overrides/.icons/vscode/circle-slash.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/circle-small-filled.svg b/overrides/.icons/vscode/circle-small-filled.svg
new file mode 100644
index 0000000..81e49aa
--- /dev/null
+++ b/overrides/.icons/vscode/circle-small-filled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/circle-small.svg b/overrides/.icons/vscode/circle-small.svg
new file mode 100644
index 0000000..183a2c0
--- /dev/null
+++ b/overrides/.icons/vscode/circle-small.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/circle.svg b/overrides/.icons/vscode/circle.svg
new file mode 100644
index 0000000..05f8a2b
--- /dev/null
+++ b/overrides/.icons/vscode/circle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/circuit-board.svg b/overrides/.icons/vscode/circuit-board.svg
new file mode 100644
index 0000000..2dc3d63
--- /dev/null
+++ b/overrides/.icons/vscode/circuit-board.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/claude.svg b/overrides/.icons/vscode/claude.svg
new file mode 100644
index 0000000..5a3ecca
--- /dev/null
+++ b/overrides/.icons/vscode/claude.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/clear-all.svg b/overrides/.icons/vscode/clear-all.svg
new file mode 100644
index 0000000..8d96f4a
--- /dev/null
+++ b/overrides/.icons/vscode/clear-all.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/clippy.svg b/overrides/.icons/vscode/clippy.svg
new file mode 100644
index 0000000..cea22d7
--- /dev/null
+++ b/overrides/.icons/vscode/clippy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/clockface.svg b/overrides/.icons/vscode/clockface.svg
new file mode 100644
index 0000000..edf24dc
--- /dev/null
+++ b/overrides/.icons/vscode/clockface.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/close-all.svg b/overrides/.icons/vscode/close-all.svg
new file mode 100644
index 0000000..320f3cc
--- /dev/null
+++ b/overrides/.icons/vscode/close-all.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/close.svg b/overrides/.icons/vscode/close.svg
new file mode 100644
index 0000000..0333349
--- /dev/null
+++ b/overrides/.icons/vscode/close.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/cloud-download.svg b/overrides/.icons/vscode/cloud-download.svg
new file mode 100644
index 0000000..1fed644
--- /dev/null
+++ b/overrides/.icons/vscode/cloud-download.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/cloud-small.svg b/overrides/.icons/vscode/cloud-small.svg
new file mode 100644
index 0000000..8f338aa
--- /dev/null
+++ b/overrides/.icons/vscode/cloud-small.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/cloud-upload.svg b/overrides/.icons/vscode/cloud-upload.svg
new file mode 100644
index 0000000..12791a5
--- /dev/null
+++ b/overrides/.icons/vscode/cloud-upload.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/cloud.svg b/overrides/.icons/vscode/cloud.svg
new file mode 100644
index 0000000..c22c3c1
--- /dev/null
+++ b/overrides/.icons/vscode/cloud.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/code-oss.svg b/overrides/.icons/vscode/code-oss.svg
new file mode 100644
index 0000000..bf4371e
--- /dev/null
+++ b/overrides/.icons/vscode/code-oss.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/code-review.svg b/overrides/.icons/vscode/code-review.svg
new file mode 100644
index 0000000..858e36b
--- /dev/null
+++ b/overrides/.icons/vscode/code-review.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/code.svg b/overrides/.icons/vscode/code.svg
new file mode 100644
index 0000000..dedaf8c
--- /dev/null
+++ b/overrides/.icons/vscode/code.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/coffee.svg b/overrides/.icons/vscode/coffee.svg
new file mode 100644
index 0000000..47722a2
--- /dev/null
+++ b/overrides/.icons/vscode/coffee.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/collapse-all.svg b/overrides/.icons/vscode/collapse-all.svg
new file mode 100644
index 0000000..035053f
--- /dev/null
+++ b/overrides/.icons/vscode/collapse-all.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/collection-small.svg b/overrides/.icons/vscode/collection-small.svg
new file mode 100644
index 0000000..32a10f5
--- /dev/null
+++ b/overrides/.icons/vscode/collection-small.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/collection.svg b/overrides/.icons/vscode/collection.svg
new file mode 100644
index 0000000..6847702
--- /dev/null
+++ b/overrides/.icons/vscode/collection.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/color-mode.svg b/overrides/.icons/vscode/color-mode.svg
new file mode 100644
index 0000000..b5345d7
--- /dev/null
+++ b/overrides/.icons/vscode/color-mode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/combine.svg b/overrides/.icons/vscode/combine.svg
new file mode 100644
index 0000000..07570c3
--- /dev/null
+++ b/overrides/.icons/vscode/combine.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/comment-discussion-quote.svg b/overrides/.icons/vscode/comment-discussion-quote.svg
new file mode 100644
index 0000000..809c1fb
--- /dev/null
+++ b/overrides/.icons/vscode/comment-discussion-quote.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/comment-discussion-sparkle.svg b/overrides/.icons/vscode/comment-discussion-sparkle.svg
new file mode 100644
index 0000000..27b9c45
--- /dev/null
+++ b/overrides/.icons/vscode/comment-discussion-sparkle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/comment-discussion.svg b/overrides/.icons/vscode/comment-discussion.svg
new file mode 100644
index 0000000..c53bfd3
--- /dev/null
+++ b/overrides/.icons/vscode/comment-discussion.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/comment-draft.svg b/overrides/.icons/vscode/comment-draft.svg
new file mode 100644
index 0000000..e67dbde
--- /dev/null
+++ b/overrides/.icons/vscode/comment-draft.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/comment-unresolved.svg b/overrides/.icons/vscode/comment-unresolved.svg
new file mode 100644
index 0000000..e0f79b9
--- /dev/null
+++ b/overrides/.icons/vscode/comment-unresolved.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/comment.svg b/overrides/.icons/vscode/comment.svg
new file mode 100644
index 0000000..6430691
--- /dev/null
+++ b/overrides/.icons/vscode/comment.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/compass-active.svg b/overrides/.icons/vscode/compass-active.svg
new file mode 100644
index 0000000..a0333ce
--- /dev/null
+++ b/overrides/.icons/vscode/compass-active.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/compass-dot.svg b/overrides/.icons/vscode/compass-dot.svg
new file mode 100644
index 0000000..9df33cf
--- /dev/null
+++ b/overrides/.icons/vscode/compass-dot.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/compass.svg b/overrides/.icons/vscode/compass.svg
new file mode 100644
index 0000000..44c0579
--- /dev/null
+++ b/overrides/.icons/vscode/compass.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/copilot-blocked.svg b/overrides/.icons/vscode/copilot-blocked.svg
new file mode 100644
index 0000000..5d2b446
--- /dev/null
+++ b/overrides/.icons/vscode/copilot-blocked.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/copilot-error.svg b/overrides/.icons/vscode/copilot-error.svg
new file mode 100644
index 0000000..8b01436
--- /dev/null
+++ b/overrides/.icons/vscode/copilot-error.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/copilot-in-progress.svg b/overrides/.icons/vscode/copilot-in-progress.svg
new file mode 100644
index 0000000..2f512d9
--- /dev/null
+++ b/overrides/.icons/vscode/copilot-in-progress.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/copilot-large.svg b/overrides/.icons/vscode/copilot-large.svg
new file mode 100644
index 0000000..8383c21
--- /dev/null
+++ b/overrides/.icons/vscode/copilot-large.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/copilot-not-connected.svg b/overrides/.icons/vscode/copilot-not-connected.svg
new file mode 100644
index 0000000..4b70a9b
--- /dev/null
+++ b/overrides/.icons/vscode/copilot-not-connected.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/copilot-snooze.svg b/overrides/.icons/vscode/copilot-snooze.svg
new file mode 100644
index 0000000..a8b096c
--- /dev/null
+++ b/overrides/.icons/vscode/copilot-snooze.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/copilot-success.svg b/overrides/.icons/vscode/copilot-success.svg
new file mode 100644
index 0000000..afd7a2c
--- /dev/null
+++ b/overrides/.icons/vscode/copilot-success.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/copilot-unavailable.svg b/overrides/.icons/vscode/copilot-unavailable.svg
new file mode 100644
index 0000000..fc4c371
--- /dev/null
+++ b/overrides/.icons/vscode/copilot-unavailable.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/copilot-warning-large.svg b/overrides/.icons/vscode/copilot-warning-large.svg
new file mode 100644
index 0000000..71c8da7
--- /dev/null
+++ b/overrides/.icons/vscode/copilot-warning-large.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/copilot-warning.svg b/overrides/.icons/vscode/copilot-warning.svg
new file mode 100644
index 0000000..7c09942
--- /dev/null
+++ b/overrides/.icons/vscode/copilot-warning.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/copilot.svg b/overrides/.icons/vscode/copilot.svg
new file mode 100644
index 0000000..6d52a36
--- /dev/null
+++ b/overrides/.icons/vscode/copilot.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/copy.svg b/overrides/.icons/vscode/copy.svg
new file mode 100644
index 0000000..39a6298
--- /dev/null
+++ b/overrides/.icons/vscode/copy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/coverage.svg b/overrides/.icons/vscode/coverage.svg
new file mode 100644
index 0000000..d512049
--- /dev/null
+++ b/overrides/.icons/vscode/coverage.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/credit-card.svg b/overrides/.icons/vscode/credit-card.svg
new file mode 100644
index 0000000..f3f46ce
--- /dev/null
+++ b/overrides/.icons/vscode/credit-card.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/cursor.svg b/overrides/.icons/vscode/cursor.svg
new file mode 100644
index 0000000..03b0809
--- /dev/null
+++ b/overrides/.icons/vscode/cursor.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/dash.svg b/overrides/.icons/vscode/dash.svg
new file mode 100644
index 0000000..fc8830e
--- /dev/null
+++ b/overrides/.icons/vscode/dash.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/dashboard.svg b/overrides/.icons/vscode/dashboard.svg
new file mode 100644
index 0000000..d135e0a
--- /dev/null
+++ b/overrides/.icons/vscode/dashboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/database.svg b/overrides/.icons/vscode/database.svg
new file mode 100644
index 0000000..4b5a7e6
--- /dev/null
+++ b/overrides/.icons/vscode/database.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-all.svg b/overrides/.icons/vscode/debug-all.svg
new file mode 100644
index 0000000..511f90e
--- /dev/null
+++ b/overrides/.icons/vscode/debug-all.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-alt-small.svg b/overrides/.icons/vscode/debug-alt-small.svg
new file mode 100644
index 0000000..fccad15
--- /dev/null
+++ b/overrides/.icons/vscode/debug-alt-small.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-alt.svg b/overrides/.icons/vscode/debug-alt.svg
new file mode 100644
index 0000000..a19d03c
--- /dev/null
+++ b/overrides/.icons/vscode/debug-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-breakpoint-conditional-unverified.svg b/overrides/.icons/vscode/debug-breakpoint-conditional-unverified.svg
new file mode 100644
index 0000000..68562bc
--- /dev/null
+++ b/overrides/.icons/vscode/debug-breakpoint-conditional-unverified.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-breakpoint-conditional.svg b/overrides/.icons/vscode/debug-breakpoint-conditional.svg
new file mode 100644
index 0000000..bd4b07c
--- /dev/null
+++ b/overrides/.icons/vscode/debug-breakpoint-conditional.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-breakpoint-data-unverified.svg b/overrides/.icons/vscode/debug-breakpoint-data-unverified.svg
new file mode 100644
index 0000000..360e5ff
--- /dev/null
+++ b/overrides/.icons/vscode/debug-breakpoint-data-unverified.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-breakpoint-data.svg b/overrides/.icons/vscode/debug-breakpoint-data.svg
new file mode 100644
index 0000000..e3e87e3
--- /dev/null
+++ b/overrides/.icons/vscode/debug-breakpoint-data.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-breakpoint-function-unverified.svg b/overrides/.icons/vscode/debug-breakpoint-function-unverified.svg
new file mode 100644
index 0000000..c4d4dcc
--- /dev/null
+++ b/overrides/.icons/vscode/debug-breakpoint-function-unverified.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-breakpoint-function.svg b/overrides/.icons/vscode/debug-breakpoint-function.svg
new file mode 100644
index 0000000..316bafa
--- /dev/null
+++ b/overrides/.icons/vscode/debug-breakpoint-function.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-breakpoint-log-unverified.svg b/overrides/.icons/vscode/debug-breakpoint-log-unverified.svg
new file mode 100644
index 0000000..e6ec300
--- /dev/null
+++ b/overrides/.icons/vscode/debug-breakpoint-log-unverified.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-breakpoint-log.svg b/overrides/.icons/vscode/debug-breakpoint-log.svg
new file mode 100644
index 0000000..1d446c8
--- /dev/null
+++ b/overrides/.icons/vscode/debug-breakpoint-log.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-breakpoint-unsupported.svg b/overrides/.icons/vscode/debug-breakpoint-unsupported.svg
new file mode 100644
index 0000000..393fc37
--- /dev/null
+++ b/overrides/.icons/vscode/debug-breakpoint-unsupported.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-connected.svg b/overrides/.icons/vscode/debug-connected.svg
new file mode 100644
index 0000000..407907a
--- /dev/null
+++ b/overrides/.icons/vscode/debug-connected.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-console.svg b/overrides/.icons/vscode/debug-console.svg
new file mode 100644
index 0000000..7af504f
--- /dev/null
+++ b/overrides/.icons/vscode/debug-console.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-continue-small.svg b/overrides/.icons/vscode/debug-continue-small.svg
new file mode 100644
index 0000000..bcff30b
--- /dev/null
+++ b/overrides/.icons/vscode/debug-continue-small.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-continue.svg b/overrides/.icons/vscode/debug-continue.svg
new file mode 100644
index 0000000..12b7e4f
--- /dev/null
+++ b/overrides/.icons/vscode/debug-continue.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-coverage.svg b/overrides/.icons/vscode/debug-coverage.svg
new file mode 100644
index 0000000..9e17449
--- /dev/null
+++ b/overrides/.icons/vscode/debug-coverage.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-disconnect.svg b/overrides/.icons/vscode/debug-disconnect.svg
new file mode 100644
index 0000000..8b76d31
--- /dev/null
+++ b/overrides/.icons/vscode/debug-disconnect.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-line-by-line.svg b/overrides/.icons/vscode/debug-line-by-line.svg
new file mode 100644
index 0000000..7e009f0
--- /dev/null
+++ b/overrides/.icons/vscode/debug-line-by-line.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-pause.svg b/overrides/.icons/vscode/debug-pause.svg
new file mode 100644
index 0000000..fb1a05f
--- /dev/null
+++ b/overrides/.icons/vscode/debug-pause.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-rerun.svg b/overrides/.icons/vscode/debug-rerun.svg
new file mode 100644
index 0000000..570758a
--- /dev/null
+++ b/overrides/.icons/vscode/debug-rerun.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-restart-frame.svg b/overrides/.icons/vscode/debug-restart-frame.svg
new file mode 100644
index 0000000..3de1195
--- /dev/null
+++ b/overrides/.icons/vscode/debug-restart-frame.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-restart.svg b/overrides/.icons/vscode/debug-restart.svg
new file mode 100644
index 0000000..75b5776
--- /dev/null
+++ b/overrides/.icons/vscode/debug-restart.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-reverse-continue.svg b/overrides/.icons/vscode/debug-reverse-continue.svg
new file mode 100644
index 0000000..ac4d2fd
--- /dev/null
+++ b/overrides/.icons/vscode/debug-reverse-continue.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-stackframe-active.svg b/overrides/.icons/vscode/debug-stackframe-active.svg
new file mode 100644
index 0000000..319122a
--- /dev/null
+++ b/overrides/.icons/vscode/debug-stackframe-active.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-stackframe.svg b/overrides/.icons/vscode/debug-stackframe.svg
new file mode 100644
index 0000000..47500b4
--- /dev/null
+++ b/overrides/.icons/vscode/debug-stackframe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-start.svg b/overrides/.icons/vscode/debug-start.svg
new file mode 100644
index 0000000..8d3f583
--- /dev/null
+++ b/overrides/.icons/vscode/debug-start.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-step-back.svg b/overrides/.icons/vscode/debug-step-back.svg
new file mode 100644
index 0000000..e42a85d
--- /dev/null
+++ b/overrides/.icons/vscode/debug-step-back.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-step-into.svg b/overrides/.icons/vscode/debug-step-into.svg
new file mode 100644
index 0000000..5628752
--- /dev/null
+++ b/overrides/.icons/vscode/debug-step-into.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-step-out.svg b/overrides/.icons/vscode/debug-step-out.svg
new file mode 100644
index 0000000..9fa9c63
--- /dev/null
+++ b/overrides/.icons/vscode/debug-step-out.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-step-over.svg b/overrides/.icons/vscode/debug-step-over.svg
new file mode 100644
index 0000000..8894196
--- /dev/null
+++ b/overrides/.icons/vscode/debug-step-over.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug-stop.svg b/overrides/.icons/vscode/debug-stop.svg
new file mode 100644
index 0000000..ada1ae5
--- /dev/null
+++ b/overrides/.icons/vscode/debug-stop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/debug.svg b/overrides/.icons/vscode/debug.svg
new file mode 100644
index 0000000..b180078
--- /dev/null
+++ b/overrides/.icons/vscode/debug.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/desktop-download.svg b/overrides/.icons/vscode/desktop-download.svg
new file mode 100644
index 0000000..7323116
--- /dev/null
+++ b/overrides/.icons/vscode/desktop-download.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/device-camera-video.svg b/overrides/.icons/vscode/device-camera-video.svg
new file mode 100644
index 0000000..a09b839
--- /dev/null
+++ b/overrides/.icons/vscode/device-camera-video.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/device-camera.svg b/overrides/.icons/vscode/device-camera.svg
new file mode 100644
index 0000000..b400ee4
--- /dev/null
+++ b/overrides/.icons/vscode/device-camera.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/device-mobile.svg b/overrides/.icons/vscode/device-mobile.svg
new file mode 100644
index 0000000..285a72e
--- /dev/null
+++ b/overrides/.icons/vscode/device-mobile.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/diff-added.svg b/overrides/.icons/vscode/diff-added.svg
new file mode 100644
index 0000000..96e554b
--- /dev/null
+++ b/overrides/.icons/vscode/diff-added.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/diff-ignored.svg b/overrides/.icons/vscode/diff-ignored.svg
new file mode 100644
index 0000000..eae6ce6
--- /dev/null
+++ b/overrides/.icons/vscode/diff-ignored.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/diff-modified.svg b/overrides/.icons/vscode/diff-modified.svg
new file mode 100644
index 0000000..e83081e
--- /dev/null
+++ b/overrides/.icons/vscode/diff-modified.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/diff-multiple.svg b/overrides/.icons/vscode/diff-multiple.svg
new file mode 100644
index 0000000..5bb1774
--- /dev/null
+++ b/overrides/.icons/vscode/diff-multiple.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/diff-removed.svg b/overrides/.icons/vscode/diff-removed.svg
new file mode 100644
index 0000000..4f1a461
--- /dev/null
+++ b/overrides/.icons/vscode/diff-removed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/diff-renamed.svg b/overrides/.icons/vscode/diff-renamed.svg
new file mode 100644
index 0000000..8d1e7ec
--- /dev/null
+++ b/overrides/.icons/vscode/diff-renamed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/diff-single.svg b/overrides/.icons/vscode/diff-single.svg
new file mode 100644
index 0000000..749801b
--- /dev/null
+++ b/overrides/.icons/vscode/diff-single.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/diff.svg b/overrides/.icons/vscode/diff.svg
new file mode 100644
index 0000000..bb7be8a
--- /dev/null
+++ b/overrides/.icons/vscode/diff.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/discard.svg b/overrides/.icons/vscode/discard.svg
new file mode 100644
index 0000000..b7434c9
--- /dev/null
+++ b/overrides/.icons/vscode/discard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/download.svg b/overrides/.icons/vscode/download.svg
new file mode 100644
index 0000000..77c31a9
--- /dev/null
+++ b/overrides/.icons/vscode/download.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/edit-code.svg b/overrides/.icons/vscode/edit-code.svg
new file mode 100644
index 0000000..144b803
--- /dev/null
+++ b/overrides/.icons/vscode/edit-code.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/edit-session.svg b/overrides/.icons/vscode/edit-session.svg
new file mode 100644
index 0000000..5b8edd1
--- /dev/null
+++ b/overrides/.icons/vscode/edit-session.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/edit-sparkle.svg b/overrides/.icons/vscode/edit-sparkle.svg
new file mode 100644
index 0000000..5eb0ab6
--- /dev/null
+++ b/overrides/.icons/vscode/edit-sparkle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/edit.svg b/overrides/.icons/vscode/edit.svg
new file mode 100644
index 0000000..7642adb
--- /dev/null
+++ b/overrides/.icons/vscode/edit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/editor-layout.svg b/overrides/.icons/vscode/editor-layout.svg
new file mode 100644
index 0000000..c925fb3
--- /dev/null
+++ b/overrides/.icons/vscode/editor-layout.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/ellipsis.svg b/overrides/.icons/vscode/ellipsis.svg
new file mode 100644
index 0000000..7b16539
--- /dev/null
+++ b/overrides/.icons/vscode/ellipsis.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/empty-window.svg b/overrides/.icons/vscode/empty-window.svg
new file mode 100644
index 0000000..177a0f7
--- /dev/null
+++ b/overrides/.icons/vscode/empty-window.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/eraser.svg b/overrides/.icons/vscode/eraser.svg
new file mode 100644
index 0000000..848f8ed
--- /dev/null
+++ b/overrides/.icons/vscode/eraser.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/error-small.svg b/overrides/.icons/vscode/error-small.svg
new file mode 100644
index 0000000..93d6900
--- /dev/null
+++ b/overrides/.icons/vscode/error-small.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/error.svg b/overrides/.icons/vscode/error.svg
new file mode 100644
index 0000000..9ceb299
--- /dev/null
+++ b/overrides/.icons/vscode/error.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/exclude.svg b/overrides/.icons/vscode/exclude.svg
new file mode 100644
index 0000000..eb82a8b
--- /dev/null
+++ b/overrides/.icons/vscode/exclude.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/expand-all.svg b/overrides/.icons/vscode/expand-all.svg
new file mode 100644
index 0000000..81b9253
--- /dev/null
+++ b/overrides/.icons/vscode/expand-all.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/export.svg b/overrides/.icons/vscode/export.svg
new file mode 100644
index 0000000..ad03241
--- /dev/null
+++ b/overrides/.icons/vscode/export.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/extensions-large.svg b/overrides/.icons/vscode/extensions-large.svg
new file mode 100644
index 0000000..a060f8b
--- /dev/null
+++ b/overrides/.icons/vscode/extensions-large.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/extensions.svg b/overrides/.icons/vscode/extensions.svg
new file mode 100644
index 0000000..1c113b0
--- /dev/null
+++ b/overrides/.icons/vscode/extensions.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/eye-closed.svg b/overrides/.icons/vscode/eye-closed.svg
new file mode 100644
index 0000000..868d38a
--- /dev/null
+++ b/overrides/.icons/vscode/eye-closed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/eye.svg b/overrides/.icons/vscode/eye.svg
new file mode 100644
index 0000000..551729d
--- /dev/null
+++ b/overrides/.icons/vscode/eye.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/feedback.svg b/overrides/.icons/vscode/feedback.svg
new file mode 100644
index 0000000..2de89fd
--- /dev/null
+++ b/overrides/.icons/vscode/feedback.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/file-binary.svg b/overrides/.icons/vscode/file-binary.svg
new file mode 100644
index 0000000..b8effff
--- /dev/null
+++ b/overrides/.icons/vscode/file-binary.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/file-code.svg b/overrides/.icons/vscode/file-code.svg
new file mode 100644
index 0000000..331bc1f
--- /dev/null
+++ b/overrides/.icons/vscode/file-code.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/file-media.svg b/overrides/.icons/vscode/file-media.svg
new file mode 100644
index 0000000..3c4625a
--- /dev/null
+++ b/overrides/.icons/vscode/file-media.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/file-pdf.svg b/overrides/.icons/vscode/file-pdf.svg
new file mode 100644
index 0000000..2cf2edd
--- /dev/null
+++ b/overrides/.icons/vscode/file-pdf.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/file-submodule.svg b/overrides/.icons/vscode/file-submodule.svg
new file mode 100644
index 0000000..84f600a
--- /dev/null
+++ b/overrides/.icons/vscode/file-submodule.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/file-symlink-directory.svg b/overrides/.icons/vscode/file-symlink-directory.svg
new file mode 100644
index 0000000..41450eb
--- /dev/null
+++ b/overrides/.icons/vscode/file-symlink-directory.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/file-symlink-file.svg b/overrides/.icons/vscode/file-symlink-file.svg
new file mode 100644
index 0000000..ce72dd3
--- /dev/null
+++ b/overrides/.icons/vscode/file-symlink-file.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/file-text.svg b/overrides/.icons/vscode/file-text.svg
new file mode 100644
index 0000000..98db68a
--- /dev/null
+++ b/overrides/.icons/vscode/file-text.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/file-zip.svg b/overrides/.icons/vscode/file-zip.svg
new file mode 100644
index 0000000..39975e6
--- /dev/null
+++ b/overrides/.icons/vscode/file-zip.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/file.svg b/overrides/.icons/vscode/file.svg
new file mode 100644
index 0000000..31d6076
--- /dev/null
+++ b/overrides/.icons/vscode/file.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/files.svg b/overrides/.icons/vscode/files.svg
new file mode 100644
index 0000000..9582a9d
--- /dev/null
+++ b/overrides/.icons/vscode/files.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/filter-filled.svg b/overrides/.icons/vscode/filter-filled.svg
new file mode 100644
index 0000000..eb4e19f
--- /dev/null
+++ b/overrides/.icons/vscode/filter-filled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/filter.svg b/overrides/.icons/vscode/filter.svg
new file mode 100644
index 0000000..9c5b6fd
--- /dev/null
+++ b/overrides/.icons/vscode/filter.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/flag.svg b/overrides/.icons/vscode/flag.svg
new file mode 100644
index 0000000..f1682d0
--- /dev/null
+++ b/overrides/.icons/vscode/flag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/flame.svg b/overrides/.icons/vscode/flame.svg
new file mode 100644
index 0000000..a7be020
--- /dev/null
+++ b/overrides/.icons/vscode/flame.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/fold-down.svg b/overrides/.icons/vscode/fold-down.svg
new file mode 100644
index 0000000..92a243c
--- /dev/null
+++ b/overrides/.icons/vscode/fold-down.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/fold-up.svg b/overrides/.icons/vscode/fold-up.svg
new file mode 100644
index 0000000..097d513
--- /dev/null
+++ b/overrides/.icons/vscode/fold-up.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/fold.svg b/overrides/.icons/vscode/fold.svg
new file mode 100644
index 0000000..4468afd
--- /dev/null
+++ b/overrides/.icons/vscode/fold.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/folder-active.svg b/overrides/.icons/vscode/folder-active.svg
new file mode 100644
index 0000000..92e5f34
--- /dev/null
+++ b/overrides/.icons/vscode/folder-active.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/folder-library.svg b/overrides/.icons/vscode/folder-library.svg
new file mode 100644
index 0000000..89486c5
--- /dev/null
+++ b/overrides/.icons/vscode/folder-library.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/folder-opened.svg b/overrides/.icons/vscode/folder-opened.svg
new file mode 100644
index 0000000..4a8779b
--- /dev/null
+++ b/overrides/.icons/vscode/folder-opened.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/folder.svg b/overrides/.icons/vscode/folder.svg
new file mode 100644
index 0000000..a669796
--- /dev/null
+++ b/overrides/.icons/vscode/folder.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/forward.svg b/overrides/.icons/vscode/forward.svg
new file mode 100644
index 0000000..6e860dc
--- /dev/null
+++ b/overrides/.icons/vscode/forward.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/game.svg b/overrides/.icons/vscode/game.svg
new file mode 100644
index 0000000..8763a03
--- /dev/null
+++ b/overrides/.icons/vscode/game.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/gear.svg b/overrides/.icons/vscode/gear.svg
new file mode 100644
index 0000000..f527fd3
--- /dev/null
+++ b/overrides/.icons/vscode/gear.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/gift.svg b/overrides/.icons/vscode/gift.svg
new file mode 100644
index 0000000..b9ec70b
--- /dev/null
+++ b/overrides/.icons/vscode/gift.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/gist-secret.svg b/overrides/.icons/vscode/gist-secret.svg
new file mode 100644
index 0000000..9beb6ec
--- /dev/null
+++ b/overrides/.icons/vscode/gist-secret.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/gist.svg b/overrides/.icons/vscode/gist.svg
new file mode 100644
index 0000000..7721c03
--- /dev/null
+++ b/overrides/.icons/vscode/gist.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/git-branch-changes.svg b/overrides/.icons/vscode/git-branch-changes.svg
new file mode 100644
index 0000000..78d592a
--- /dev/null
+++ b/overrides/.icons/vscode/git-branch-changes.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/git-branch-conflicts.svg b/overrides/.icons/vscode/git-branch-conflicts.svg
new file mode 100644
index 0000000..1da6b80
--- /dev/null
+++ b/overrides/.icons/vscode/git-branch-conflicts.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/git-branch-staged-changes.svg b/overrides/.icons/vscode/git-branch-staged-changes.svg
new file mode 100644
index 0000000..2d76052
--- /dev/null
+++ b/overrides/.icons/vscode/git-branch-staged-changes.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/git-branch.svg b/overrides/.icons/vscode/git-branch.svg
new file mode 100644
index 0000000..6418d1f
--- /dev/null
+++ b/overrides/.icons/vscode/git-branch.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/git-commit.svg b/overrides/.icons/vscode/git-commit.svg
new file mode 100644
index 0000000..ecce26c
--- /dev/null
+++ b/overrides/.icons/vscode/git-commit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/git-compare.svg b/overrides/.icons/vscode/git-compare.svg
new file mode 100644
index 0000000..193a80c
--- /dev/null
+++ b/overrides/.icons/vscode/git-compare.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/git-fetch.svg b/overrides/.icons/vscode/git-fetch.svg
new file mode 100644
index 0000000..6ad8e40
--- /dev/null
+++ b/overrides/.icons/vscode/git-fetch.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/git-merge.svg b/overrides/.icons/vscode/git-merge.svg
new file mode 100644
index 0000000..63dbdc3
--- /dev/null
+++ b/overrides/.icons/vscode/git-merge.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/git-pull-request-closed.svg b/overrides/.icons/vscode/git-pull-request-closed.svg
new file mode 100644
index 0000000..bce2914
--- /dev/null
+++ b/overrides/.icons/vscode/git-pull-request-closed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/git-pull-request-create.svg b/overrides/.icons/vscode/git-pull-request-create.svg
new file mode 100644
index 0000000..1918193
--- /dev/null
+++ b/overrides/.icons/vscode/git-pull-request-create.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/git-pull-request-done.svg b/overrides/.icons/vscode/git-pull-request-done.svg
new file mode 100644
index 0000000..fb6744b
--- /dev/null
+++ b/overrides/.icons/vscode/git-pull-request-done.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/git-pull-request-draft.svg b/overrides/.icons/vscode/git-pull-request-draft.svg
new file mode 100644
index 0000000..0afee6e
--- /dev/null
+++ b/overrides/.icons/vscode/git-pull-request-draft.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/git-pull-request-go-to-changes.svg b/overrides/.icons/vscode/git-pull-request-go-to-changes.svg
new file mode 100644
index 0000000..e6e05f2
--- /dev/null
+++ b/overrides/.icons/vscode/git-pull-request-go-to-changes.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/git-pull-request-new-changes.svg b/overrides/.icons/vscode/git-pull-request-new-changes.svg
new file mode 100644
index 0000000..285e813
--- /dev/null
+++ b/overrides/.icons/vscode/git-pull-request-new-changes.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/git-pull-request.svg b/overrides/.icons/vscode/git-pull-request.svg
new file mode 100644
index 0000000..47a216d
--- /dev/null
+++ b/overrides/.icons/vscode/git-pull-request.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/git-stash-apply.svg b/overrides/.icons/vscode/git-stash-apply.svg
new file mode 100644
index 0000000..fac0fe9
--- /dev/null
+++ b/overrides/.icons/vscode/git-stash-apply.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/git-stash-pop.svg b/overrides/.icons/vscode/git-stash-pop.svg
new file mode 100644
index 0000000..74b494f
--- /dev/null
+++ b/overrides/.icons/vscode/git-stash-pop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/git-stash.svg b/overrides/.icons/vscode/git-stash.svg
new file mode 100644
index 0000000..425b08b
--- /dev/null
+++ b/overrides/.icons/vscode/git-stash.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/github-action.svg b/overrides/.icons/vscode/github-action.svg
new file mode 100644
index 0000000..ab28160
--- /dev/null
+++ b/overrides/.icons/vscode/github-action.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/github-alt.svg b/overrides/.icons/vscode/github-alt.svg
new file mode 100644
index 0000000..a77f3a6
--- /dev/null
+++ b/overrides/.icons/vscode/github-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/github-inverted.svg b/overrides/.icons/vscode/github-inverted.svg
new file mode 100644
index 0000000..e583b75
--- /dev/null
+++ b/overrides/.icons/vscode/github-inverted.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/github-project.svg b/overrides/.icons/vscode/github-project.svg
new file mode 100644
index 0000000..d240cf2
--- /dev/null
+++ b/overrides/.icons/vscode/github-project.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/github.svg b/overrides/.icons/vscode/github.svg
new file mode 100644
index 0000000..28c1a39
--- /dev/null
+++ b/overrides/.icons/vscode/github.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/globe.svg b/overrides/.icons/vscode/globe.svg
new file mode 100644
index 0000000..9031271
--- /dev/null
+++ b/overrides/.icons/vscode/globe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/go-to-editing-session.svg b/overrides/.icons/vscode/go-to-editing-session.svg
new file mode 100644
index 0000000..166ae19
--- /dev/null
+++ b/overrides/.icons/vscode/go-to-editing-session.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/go-to-file.svg b/overrides/.icons/vscode/go-to-file.svg
new file mode 100644
index 0000000..c11a995
--- /dev/null
+++ b/overrides/.icons/vscode/go-to-file.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/go-to-search.svg b/overrides/.icons/vscode/go-to-search.svg
new file mode 100644
index 0000000..3df34fe
--- /dev/null
+++ b/overrides/.icons/vscode/go-to-search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/grabber.svg b/overrides/.icons/vscode/grabber.svg
new file mode 100644
index 0000000..3e9ea26
--- /dev/null
+++ b/overrides/.icons/vscode/grabber.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/graph-left.svg b/overrides/.icons/vscode/graph-left.svg
new file mode 100644
index 0000000..3dbe3ac
--- /dev/null
+++ b/overrides/.icons/vscode/graph-left.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/graph-line.svg b/overrides/.icons/vscode/graph-line.svg
new file mode 100644
index 0000000..b287adf
--- /dev/null
+++ b/overrides/.icons/vscode/graph-line.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/graph-scatter.svg b/overrides/.icons/vscode/graph-scatter.svg
new file mode 100644
index 0000000..b8ecde7
--- /dev/null
+++ b/overrides/.icons/vscode/graph-scatter.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/graph.svg b/overrides/.icons/vscode/graph.svg
new file mode 100644
index 0000000..1f35554
--- /dev/null
+++ b/overrides/.icons/vscode/graph.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/gripper.svg b/overrides/.icons/vscode/gripper.svg
new file mode 100644
index 0000000..e8a207a
--- /dev/null
+++ b/overrides/.icons/vscode/gripper.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/group-by-ref-type.svg b/overrides/.icons/vscode/group-by-ref-type.svg
new file mode 100644
index 0000000..981afa8
--- /dev/null
+++ b/overrides/.icons/vscode/group-by-ref-type.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/heart-filled.svg b/overrides/.icons/vscode/heart-filled.svg
new file mode 100644
index 0000000..123e890
--- /dev/null
+++ b/overrides/.icons/vscode/heart-filled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/heart.svg b/overrides/.icons/vscode/heart.svg
new file mode 100644
index 0000000..d7e53b5
--- /dev/null
+++ b/overrides/.icons/vscode/heart.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/history.svg b/overrides/.icons/vscode/history.svg
new file mode 100644
index 0000000..a6c0a49
--- /dev/null
+++ b/overrides/.icons/vscode/history.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/home.svg b/overrides/.icons/vscode/home.svg
new file mode 100644
index 0000000..43af9d1
--- /dev/null
+++ b/overrides/.icons/vscode/home.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/horizontal-rule.svg b/overrides/.icons/vscode/horizontal-rule.svg
new file mode 100644
index 0000000..8b720c3
--- /dev/null
+++ b/overrides/.icons/vscode/horizontal-rule.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/hubot.svg b/overrides/.icons/vscode/hubot.svg
new file mode 100644
index 0000000..e796a28
--- /dev/null
+++ b/overrides/.icons/vscode/hubot.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/inbox.svg b/overrides/.icons/vscode/inbox.svg
new file mode 100644
index 0000000..45af4b6
--- /dev/null
+++ b/overrides/.icons/vscode/inbox.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/indent.svg b/overrides/.icons/vscode/indent.svg
new file mode 100644
index 0000000..9d48589
--- /dev/null
+++ b/overrides/.icons/vscode/indent.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/index-zero.svg b/overrides/.icons/vscode/index-zero.svg
new file mode 100644
index 0000000..2711b0c
--- /dev/null
+++ b/overrides/.icons/vscode/index-zero.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/info.svg b/overrides/.icons/vscode/info.svg
new file mode 100644
index 0000000..c3bd957
--- /dev/null
+++ b/overrides/.icons/vscode/info.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/insert.svg b/overrides/.icons/vscode/insert.svg
new file mode 100644
index 0000000..405434b
--- /dev/null
+++ b/overrides/.icons/vscode/insert.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/inspect.svg b/overrides/.icons/vscode/inspect.svg
new file mode 100644
index 0000000..b31cc92
--- /dev/null
+++ b/overrides/.icons/vscode/inspect.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/issue-draft.svg b/overrides/.icons/vscode/issue-draft.svg
new file mode 100644
index 0000000..e16b07c
--- /dev/null
+++ b/overrides/.icons/vscode/issue-draft.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/issue-reopened.svg b/overrides/.icons/vscode/issue-reopened.svg
new file mode 100644
index 0000000..aa98214
--- /dev/null
+++ b/overrides/.icons/vscode/issue-reopened.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/issues.svg b/overrides/.icons/vscode/issues.svg
new file mode 100644
index 0000000..7de219b
--- /dev/null
+++ b/overrides/.icons/vscode/issues.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/italic.svg b/overrides/.icons/vscode/italic.svg
new file mode 100644
index 0000000..97cfd49
--- /dev/null
+++ b/overrides/.icons/vscode/italic.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/jersey.svg b/overrides/.icons/vscode/jersey.svg
new file mode 100644
index 0000000..b6ce1f9
--- /dev/null
+++ b/overrides/.icons/vscode/jersey.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/json.svg b/overrides/.icons/vscode/json.svg
new file mode 100644
index 0000000..a3ff4fa
--- /dev/null
+++ b/overrides/.icons/vscode/json.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/kebab-vertical.svg b/overrides/.icons/vscode/kebab-vertical.svg
new file mode 100644
index 0000000..41cdbb1
--- /dev/null
+++ b/overrides/.icons/vscode/kebab-vertical.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/key.svg b/overrides/.icons/vscode/key.svg
new file mode 100644
index 0000000..0cf854b
--- /dev/null
+++ b/overrides/.icons/vscode/key.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/keyboard-tab-above.svg b/overrides/.icons/vscode/keyboard-tab-above.svg
new file mode 100644
index 0000000..5ee07a7
--- /dev/null
+++ b/overrides/.icons/vscode/keyboard-tab-above.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/keyboard-tab-below.svg b/overrides/.icons/vscode/keyboard-tab-below.svg
new file mode 100644
index 0000000..5870194
--- /dev/null
+++ b/overrides/.icons/vscode/keyboard-tab-below.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/keyboard-tab.svg b/overrides/.icons/vscode/keyboard-tab.svg
new file mode 100644
index 0000000..1fc0d91
--- /dev/null
+++ b/overrides/.icons/vscode/keyboard-tab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/law.svg b/overrides/.icons/vscode/law.svg
new file mode 100644
index 0000000..2a583d5
--- /dev/null
+++ b/overrides/.icons/vscode/law.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layers-active.svg b/overrides/.icons/vscode/layers-active.svg
new file mode 100644
index 0000000..12b8191
--- /dev/null
+++ b/overrides/.icons/vscode/layers-active.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layers-dot.svg b/overrides/.icons/vscode/layers-dot.svg
new file mode 100644
index 0000000..d136608
--- /dev/null
+++ b/overrides/.icons/vscode/layers-dot.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layers.svg b/overrides/.icons/vscode/layers.svg
new file mode 100644
index 0000000..6344884
--- /dev/null
+++ b/overrides/.icons/vscode/layers.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout-activitybar-left.svg b/overrides/.icons/vscode/layout-activitybar-left.svg
new file mode 100644
index 0000000..72e54b6
--- /dev/null
+++ b/overrides/.icons/vscode/layout-activitybar-left.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout-activitybar-right.svg b/overrides/.icons/vscode/layout-activitybar-right.svg
new file mode 100644
index 0000000..e921f15
--- /dev/null
+++ b/overrides/.icons/vscode/layout-activitybar-right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout-centered.svg b/overrides/.icons/vscode/layout-centered.svg
new file mode 100644
index 0000000..ce93d59
--- /dev/null
+++ b/overrides/.icons/vscode/layout-centered.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout-menubar.svg b/overrides/.icons/vscode/layout-menubar.svg
new file mode 100644
index 0000000..497547f
--- /dev/null
+++ b/overrides/.icons/vscode/layout-menubar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout-panel-center.svg b/overrides/.icons/vscode/layout-panel-center.svg
new file mode 100644
index 0000000..3a60434
--- /dev/null
+++ b/overrides/.icons/vscode/layout-panel-center.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout-panel-dock.svg b/overrides/.icons/vscode/layout-panel-dock.svg
new file mode 100644
index 0000000..d880b0e
--- /dev/null
+++ b/overrides/.icons/vscode/layout-panel-dock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout-panel-justify.svg b/overrides/.icons/vscode/layout-panel-justify.svg
new file mode 100644
index 0000000..2c6c317
--- /dev/null
+++ b/overrides/.icons/vscode/layout-panel-justify.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout-panel-left.svg b/overrides/.icons/vscode/layout-panel-left.svg
new file mode 100644
index 0000000..782ad3c
--- /dev/null
+++ b/overrides/.icons/vscode/layout-panel-left.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout-panel-off.svg b/overrides/.icons/vscode/layout-panel-off.svg
new file mode 100644
index 0000000..2a37eca
--- /dev/null
+++ b/overrides/.icons/vscode/layout-panel-off.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout-panel-right.svg b/overrides/.icons/vscode/layout-panel-right.svg
new file mode 100644
index 0000000..8c1642a
--- /dev/null
+++ b/overrides/.icons/vscode/layout-panel-right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout-panel.svg b/overrides/.icons/vscode/layout-panel.svg
new file mode 100644
index 0000000..548fdbc
--- /dev/null
+++ b/overrides/.icons/vscode/layout-panel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout-sidebar-left-dock.svg b/overrides/.icons/vscode/layout-sidebar-left-dock.svg
new file mode 100644
index 0000000..75e560f
--- /dev/null
+++ b/overrides/.icons/vscode/layout-sidebar-left-dock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout-sidebar-left-off.svg b/overrides/.icons/vscode/layout-sidebar-left-off.svg
new file mode 100644
index 0000000..dfccba6
--- /dev/null
+++ b/overrides/.icons/vscode/layout-sidebar-left-off.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout-sidebar-left.svg b/overrides/.icons/vscode/layout-sidebar-left.svg
new file mode 100644
index 0000000..ccc60a2
--- /dev/null
+++ b/overrides/.icons/vscode/layout-sidebar-left.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout-sidebar-right-dock.svg b/overrides/.icons/vscode/layout-sidebar-right-dock.svg
new file mode 100644
index 0000000..c4bf00f
--- /dev/null
+++ b/overrides/.icons/vscode/layout-sidebar-right-dock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout-sidebar-right-off.svg b/overrides/.icons/vscode/layout-sidebar-right-off.svg
new file mode 100644
index 0000000..5539a14
--- /dev/null
+++ b/overrides/.icons/vscode/layout-sidebar-right-off.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout-sidebar-right.svg b/overrides/.icons/vscode/layout-sidebar-right.svg
new file mode 100644
index 0000000..719fd78
--- /dev/null
+++ b/overrides/.icons/vscode/layout-sidebar-right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout-statusbar.svg b/overrides/.icons/vscode/layout-statusbar.svg
new file mode 100644
index 0000000..4782b7f
--- /dev/null
+++ b/overrides/.icons/vscode/layout-statusbar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/layout.svg b/overrides/.icons/vscode/layout.svg
new file mode 100644
index 0000000..60d2f11
--- /dev/null
+++ b/overrides/.icons/vscode/layout.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/library.svg b/overrides/.icons/vscode/library.svg
new file mode 100644
index 0000000..b1aa329
--- /dev/null
+++ b/overrides/.icons/vscode/library.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/lightbulb-autofix.svg b/overrides/.icons/vscode/lightbulb-autofix.svg
new file mode 100644
index 0000000..6f8e63b
--- /dev/null
+++ b/overrides/.icons/vscode/lightbulb-autofix.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/lightbulb-empty.svg b/overrides/.icons/vscode/lightbulb-empty.svg
new file mode 100644
index 0000000..4642a98
--- /dev/null
+++ b/overrides/.icons/vscode/lightbulb-empty.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/lightbulb-sparkle.svg b/overrides/.icons/vscode/lightbulb-sparkle.svg
new file mode 100644
index 0000000..5b3ca9c
--- /dev/null
+++ b/overrides/.icons/vscode/lightbulb-sparkle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/lightbulb.svg b/overrides/.icons/vscode/lightbulb.svg
new file mode 100644
index 0000000..4290026
--- /dev/null
+++ b/overrides/.icons/vscode/lightbulb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/link-external.svg b/overrides/.icons/vscode/link-external.svg
new file mode 100644
index 0000000..ded2e00
--- /dev/null
+++ b/overrides/.icons/vscode/link-external.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/link.svg b/overrides/.icons/vscode/link.svg
new file mode 100644
index 0000000..2469b90
--- /dev/null
+++ b/overrides/.icons/vscode/link.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/list-filter.svg b/overrides/.icons/vscode/list-filter.svg
new file mode 100644
index 0000000..0ef089d
--- /dev/null
+++ b/overrides/.icons/vscode/list-filter.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/list-flat.svg b/overrides/.icons/vscode/list-flat.svg
new file mode 100644
index 0000000..55ef82c
--- /dev/null
+++ b/overrides/.icons/vscode/list-flat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/list-ordered.svg b/overrides/.icons/vscode/list-ordered.svg
new file mode 100644
index 0000000..d2c61f1
--- /dev/null
+++ b/overrides/.icons/vscode/list-ordered.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/list-selection.svg b/overrides/.icons/vscode/list-selection.svg
new file mode 100644
index 0000000..c32c184
--- /dev/null
+++ b/overrides/.icons/vscode/list-selection.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/list-tree.svg b/overrides/.icons/vscode/list-tree.svg
new file mode 100644
index 0000000..368d9fb
--- /dev/null
+++ b/overrides/.icons/vscode/list-tree.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/list-unordered.svg b/overrides/.icons/vscode/list-unordered.svg
new file mode 100644
index 0000000..38f024f
--- /dev/null
+++ b/overrides/.icons/vscode/list-unordered.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/live-share.svg b/overrides/.icons/vscode/live-share.svg
new file mode 100644
index 0000000..39d375f
--- /dev/null
+++ b/overrides/.icons/vscode/live-share.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/loading.svg b/overrides/.icons/vscode/loading.svg
new file mode 100644
index 0000000..57a717a
--- /dev/null
+++ b/overrides/.icons/vscode/loading.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/location.svg b/overrides/.icons/vscode/location.svg
new file mode 100644
index 0000000..8210946
--- /dev/null
+++ b/overrides/.icons/vscode/location.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/lock-small.svg b/overrides/.icons/vscode/lock-small.svg
new file mode 100644
index 0000000..5816b55
--- /dev/null
+++ b/overrides/.icons/vscode/lock-small.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/lock.svg b/overrides/.icons/vscode/lock.svg
new file mode 100644
index 0000000..6a191ad
--- /dev/null
+++ b/overrides/.icons/vscode/lock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/magnet.svg b/overrides/.icons/vscode/magnet.svg
new file mode 100644
index 0000000..32fb9f3
--- /dev/null
+++ b/overrides/.icons/vscode/magnet.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/mail-read.svg b/overrides/.icons/vscode/mail-read.svg
new file mode 100644
index 0000000..baa13d9
--- /dev/null
+++ b/overrides/.icons/vscode/mail-read.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/mail.svg b/overrides/.icons/vscode/mail.svg
new file mode 100644
index 0000000..a24aa29
--- /dev/null
+++ b/overrides/.icons/vscode/mail.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/map-filled.svg b/overrides/.icons/vscode/map-filled.svg
new file mode 100644
index 0000000..90987a7
--- /dev/null
+++ b/overrides/.icons/vscode/map-filled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/map-vertical-filled.svg b/overrides/.icons/vscode/map-vertical-filled.svg
new file mode 100644
index 0000000..a896a11
--- /dev/null
+++ b/overrides/.icons/vscode/map-vertical-filled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/map-vertical.svg b/overrides/.icons/vscode/map-vertical.svg
new file mode 100644
index 0000000..640a372
--- /dev/null
+++ b/overrides/.icons/vscode/map-vertical.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/map.svg b/overrides/.icons/vscode/map.svg
new file mode 100644
index 0000000..4518899
--- /dev/null
+++ b/overrides/.icons/vscode/map.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/markdown.svg b/overrides/.icons/vscode/markdown.svg
new file mode 100644
index 0000000..5cc4c0e
--- /dev/null
+++ b/overrides/.icons/vscode/markdown.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/mcp.svg b/overrides/.icons/vscode/mcp.svg
new file mode 100644
index 0000000..7b52991
--- /dev/null
+++ b/overrides/.icons/vscode/mcp.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/megaphone.svg b/overrides/.icons/vscode/megaphone.svg
new file mode 100644
index 0000000..41b1ffe
--- /dev/null
+++ b/overrides/.icons/vscode/megaphone.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/mention.svg b/overrides/.icons/vscode/mention.svg
new file mode 100644
index 0000000..464c04f
--- /dev/null
+++ b/overrides/.icons/vscode/mention.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/menu.svg b/overrides/.icons/vscode/menu.svg
new file mode 100644
index 0000000..6fc8b91
--- /dev/null
+++ b/overrides/.icons/vscode/menu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/merge-into.svg b/overrides/.icons/vscode/merge-into.svg
new file mode 100644
index 0000000..7533070
--- /dev/null
+++ b/overrides/.icons/vscode/merge-into.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/merge.svg b/overrides/.icons/vscode/merge.svg
new file mode 100644
index 0000000..2692dee
--- /dev/null
+++ b/overrides/.icons/vscode/merge.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/mic-filled.svg b/overrides/.icons/vscode/mic-filled.svg
new file mode 100644
index 0000000..dd82bc4
--- /dev/null
+++ b/overrides/.icons/vscode/mic-filled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/mic.svg b/overrides/.icons/vscode/mic.svg
new file mode 100644
index 0000000..b9ce1ff
--- /dev/null
+++ b/overrides/.icons/vscode/mic.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/milestone.svg b/overrides/.icons/vscode/milestone.svg
new file mode 100644
index 0000000..3d2f9db
--- /dev/null
+++ b/overrides/.icons/vscode/milestone.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/mirror.svg b/overrides/.icons/vscode/mirror.svg
new file mode 100644
index 0000000..fc9e376
--- /dev/null
+++ b/overrides/.icons/vscode/mirror.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/mortar-board.svg b/overrides/.icons/vscode/mortar-board.svg
new file mode 100644
index 0000000..3b26cd6
--- /dev/null
+++ b/overrides/.icons/vscode/mortar-board.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/move.svg b/overrides/.icons/vscode/move.svg
new file mode 100644
index 0000000..37bb84a
--- /dev/null
+++ b/overrides/.icons/vscode/move.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/multiple-windows.svg b/overrides/.icons/vscode/multiple-windows.svg
new file mode 100644
index 0000000..e0701c1
--- /dev/null
+++ b/overrides/.icons/vscode/multiple-windows.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/music.svg b/overrides/.icons/vscode/music.svg
new file mode 100644
index 0000000..e6fc67b
--- /dev/null
+++ b/overrides/.icons/vscode/music.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/mute.svg b/overrides/.icons/vscode/mute.svg
new file mode 100644
index 0000000..8cf77be
--- /dev/null
+++ b/overrides/.icons/vscode/mute.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/new-collection.svg b/overrides/.icons/vscode/new-collection.svg
new file mode 100644
index 0000000..5bd6536
--- /dev/null
+++ b/overrides/.icons/vscode/new-collection.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/new-file.svg b/overrides/.icons/vscode/new-file.svg
new file mode 100644
index 0000000..fecbb5f
--- /dev/null
+++ b/overrides/.icons/vscode/new-file.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/new-folder.svg b/overrides/.icons/vscode/new-folder.svg
new file mode 100644
index 0000000..d5547e2
--- /dev/null
+++ b/overrides/.icons/vscode/new-folder.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/new-session.svg b/overrides/.icons/vscode/new-session.svg
new file mode 100644
index 0000000..b5fe731
--- /dev/null
+++ b/overrides/.icons/vscode/new-session.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/newline.svg b/overrides/.icons/vscode/newline.svg
new file mode 100644
index 0000000..537c5b0
--- /dev/null
+++ b/overrides/.icons/vscode/newline.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/no-newline.svg b/overrides/.icons/vscode/no-newline.svg
new file mode 100644
index 0000000..6700c45
--- /dev/null
+++ b/overrides/.icons/vscode/no-newline.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/note.svg b/overrides/.icons/vscode/note.svg
new file mode 100644
index 0000000..01e96c6
--- /dev/null
+++ b/overrides/.icons/vscode/note.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/notebook-template.svg b/overrides/.icons/vscode/notebook-template.svg
new file mode 100644
index 0000000..67aaf65
--- /dev/null
+++ b/overrides/.icons/vscode/notebook-template.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/notebook.svg b/overrides/.icons/vscode/notebook.svg
new file mode 100644
index 0000000..d9ad6e4
--- /dev/null
+++ b/overrides/.icons/vscode/notebook.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/octoface.svg b/overrides/.icons/vscode/octoface.svg
new file mode 100644
index 0000000..6c90408
--- /dev/null
+++ b/overrides/.icons/vscode/octoface.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/open-in-product.svg b/overrides/.icons/vscode/open-in-product.svg
new file mode 100644
index 0000000..7f03c40
--- /dev/null
+++ b/overrides/.icons/vscode/open-in-product.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/open-in-window.svg b/overrides/.icons/vscode/open-in-window.svg
new file mode 100644
index 0000000..d1a4175
--- /dev/null
+++ b/overrides/.icons/vscode/open-in-window.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/open-preview.svg b/overrides/.icons/vscode/open-preview.svg
new file mode 100644
index 0000000..a04514b
--- /dev/null
+++ b/overrides/.icons/vscode/open-preview.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/openai.svg b/overrides/.icons/vscode/openai.svg
new file mode 100644
index 0000000..b780d84
--- /dev/null
+++ b/overrides/.icons/vscode/openai.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/organization.svg b/overrides/.icons/vscode/organization.svg
new file mode 100644
index 0000000..90f90d4
--- /dev/null
+++ b/overrides/.icons/vscode/organization.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/output.svg b/overrides/.icons/vscode/output.svg
new file mode 100644
index 0000000..841958c
--- /dev/null
+++ b/overrides/.icons/vscode/output.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/package.svg b/overrides/.icons/vscode/package.svg
new file mode 100644
index 0000000..73de24e
--- /dev/null
+++ b/overrides/.icons/vscode/package.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/paintcan.svg b/overrides/.icons/vscode/paintcan.svg
new file mode 100644
index 0000000..88613e8
--- /dev/null
+++ b/overrides/.icons/vscode/paintcan.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/pass-filled.svg b/overrides/.icons/vscode/pass-filled.svg
new file mode 100644
index 0000000..e20711e
--- /dev/null
+++ b/overrides/.icons/vscode/pass-filled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/pass.svg b/overrides/.icons/vscode/pass.svg
new file mode 100644
index 0000000..9380137
--- /dev/null
+++ b/overrides/.icons/vscode/pass.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/percentage.svg b/overrides/.icons/vscode/percentage.svg
new file mode 100644
index 0000000..9349404
--- /dev/null
+++ b/overrides/.icons/vscode/percentage.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/person-add.svg b/overrides/.icons/vscode/person-add.svg
new file mode 100644
index 0000000..44a1d67
--- /dev/null
+++ b/overrides/.icons/vscode/person-add.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/person.svg b/overrides/.icons/vscode/person.svg
new file mode 100644
index 0000000..ca9906f
--- /dev/null
+++ b/overrides/.icons/vscode/person.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/piano.svg b/overrides/.icons/vscode/piano.svg
new file mode 100644
index 0000000..34e3823
--- /dev/null
+++ b/overrides/.icons/vscode/piano.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/pie-chart.svg b/overrides/.icons/vscode/pie-chart.svg
new file mode 100644
index 0000000..471cc6d
--- /dev/null
+++ b/overrides/.icons/vscode/pie-chart.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/pin.svg b/overrides/.icons/vscode/pin.svg
new file mode 100644
index 0000000..152002d
--- /dev/null
+++ b/overrides/.icons/vscode/pin.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/pinned-dirty.svg b/overrides/.icons/vscode/pinned-dirty.svg
new file mode 100644
index 0000000..06b5380
--- /dev/null
+++ b/overrides/.icons/vscode/pinned-dirty.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/pinned.svg b/overrides/.icons/vscode/pinned.svg
new file mode 100644
index 0000000..dfb1b33
--- /dev/null
+++ b/overrides/.icons/vscode/pinned.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/play-circle.svg b/overrides/.icons/vscode/play-circle.svg
new file mode 100644
index 0000000..373611b
--- /dev/null
+++ b/overrides/.icons/vscode/play-circle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/play.svg b/overrides/.icons/vscode/play.svg
new file mode 100644
index 0000000..bb6880d
--- /dev/null
+++ b/overrides/.icons/vscode/play.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/plug.svg b/overrides/.icons/vscode/plug.svg
new file mode 100644
index 0000000..c5034e1
--- /dev/null
+++ b/overrides/.icons/vscode/plug.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/preserve-case.svg b/overrides/.icons/vscode/preserve-case.svg
new file mode 100644
index 0000000..30c29d3
--- /dev/null
+++ b/overrides/.icons/vscode/preserve-case.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/preview.svg b/overrides/.icons/vscode/preview.svg
new file mode 100644
index 0000000..83b3b47
--- /dev/null
+++ b/overrides/.icons/vscode/preview.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/primitive-square.svg b/overrides/.icons/vscode/primitive-square.svg
new file mode 100644
index 0000000..56b36de
--- /dev/null
+++ b/overrides/.icons/vscode/primitive-square.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/project.svg b/overrides/.icons/vscode/project.svg
new file mode 100644
index 0000000..6b75db1
--- /dev/null
+++ b/overrides/.icons/vscode/project.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/pulse.svg b/overrides/.icons/vscode/pulse.svg
new file mode 100644
index 0000000..0b62aaf
--- /dev/null
+++ b/overrides/.icons/vscode/pulse.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/python.svg b/overrides/.icons/vscode/python.svg
new file mode 100644
index 0000000..a832a9e
--- /dev/null
+++ b/overrides/.icons/vscode/python.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/question.svg b/overrides/.icons/vscode/question.svg
new file mode 100644
index 0000000..467b195
--- /dev/null
+++ b/overrides/.icons/vscode/question.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/quote.svg b/overrides/.icons/vscode/quote.svg
new file mode 100644
index 0000000..4dc1dd3
--- /dev/null
+++ b/overrides/.icons/vscode/quote.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/quotes.svg b/overrides/.icons/vscode/quotes.svg
new file mode 100644
index 0000000..286a4cc
--- /dev/null
+++ b/overrides/.icons/vscode/quotes.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/radio-tower.svg b/overrides/.icons/vscode/radio-tower.svg
new file mode 100644
index 0000000..92a1811
--- /dev/null
+++ b/overrides/.icons/vscode/radio-tower.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/reactions.svg b/overrides/.icons/vscode/reactions.svg
new file mode 100644
index 0000000..a82883f
--- /dev/null
+++ b/overrides/.icons/vscode/reactions.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/record-keys.svg b/overrides/.icons/vscode/record-keys.svg
new file mode 100644
index 0000000..d8faaa2
--- /dev/null
+++ b/overrides/.icons/vscode/record-keys.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/record-small.svg b/overrides/.icons/vscode/record-small.svg
new file mode 100644
index 0000000..14f200e
--- /dev/null
+++ b/overrides/.icons/vscode/record-small.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/record.svg b/overrides/.icons/vscode/record.svg
new file mode 100644
index 0000000..028f085
--- /dev/null
+++ b/overrides/.icons/vscode/record.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/redo.svg b/overrides/.icons/vscode/redo.svg
new file mode 100644
index 0000000..8d6e323
--- /dev/null
+++ b/overrides/.icons/vscode/redo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/references.svg b/overrides/.icons/vscode/references.svg
new file mode 100644
index 0000000..97465c9
--- /dev/null
+++ b/overrides/.icons/vscode/references.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/refresh.svg b/overrides/.icons/vscode/refresh.svg
new file mode 100644
index 0000000..49df22b
--- /dev/null
+++ b/overrides/.icons/vscode/refresh.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/regex.svg b/overrides/.icons/vscode/regex.svg
new file mode 100644
index 0000000..1ee5186
--- /dev/null
+++ b/overrides/.icons/vscode/regex.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/remote-explorer.svg b/overrides/.icons/vscode/remote-explorer.svg
new file mode 100644
index 0000000..4162e42
--- /dev/null
+++ b/overrides/.icons/vscode/remote-explorer.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/remote.svg b/overrides/.icons/vscode/remote.svg
new file mode 100644
index 0000000..f2ab212
--- /dev/null
+++ b/overrides/.icons/vscode/remote.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/remove-small.svg b/overrides/.icons/vscode/remove-small.svg
new file mode 100644
index 0000000..befafcf
--- /dev/null
+++ b/overrides/.icons/vscode/remove-small.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/remove.svg b/overrides/.icons/vscode/remove.svg
new file mode 100644
index 0000000..fef6714
--- /dev/null
+++ b/overrides/.icons/vscode/remove.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/rename.svg b/overrides/.icons/vscode/rename.svg
new file mode 100644
index 0000000..7560d72
--- /dev/null
+++ b/overrides/.icons/vscode/rename.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/replace-all.svg b/overrides/.icons/vscode/replace-all.svg
new file mode 100644
index 0000000..70e8054
--- /dev/null
+++ b/overrides/.icons/vscode/replace-all.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/replace.svg b/overrides/.icons/vscode/replace.svg
new file mode 100644
index 0000000..6125e24
--- /dev/null
+++ b/overrides/.icons/vscode/replace.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/reply.svg b/overrides/.icons/vscode/reply.svg
new file mode 100644
index 0000000..39d8437
--- /dev/null
+++ b/overrides/.icons/vscode/reply.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/repo-clone.svg b/overrides/.icons/vscode/repo-clone.svg
new file mode 100644
index 0000000..94e570f
--- /dev/null
+++ b/overrides/.icons/vscode/repo-clone.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/repo-fetch.svg b/overrides/.icons/vscode/repo-fetch.svg
new file mode 100644
index 0000000..199a561
--- /dev/null
+++ b/overrides/.icons/vscode/repo-fetch.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/repo-force-push.svg b/overrides/.icons/vscode/repo-force-push.svg
new file mode 100644
index 0000000..ebbd596
--- /dev/null
+++ b/overrides/.icons/vscode/repo-force-push.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/repo-forked.svg b/overrides/.icons/vscode/repo-forked.svg
new file mode 100644
index 0000000..f0b532c
--- /dev/null
+++ b/overrides/.icons/vscode/repo-forked.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/repo-pinned.svg b/overrides/.icons/vscode/repo-pinned.svg
new file mode 100644
index 0000000..f40ef6a
--- /dev/null
+++ b/overrides/.icons/vscode/repo-pinned.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/repo-pull.svg b/overrides/.icons/vscode/repo-pull.svg
new file mode 100644
index 0000000..2a42ff7
--- /dev/null
+++ b/overrides/.icons/vscode/repo-pull.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/repo-push.svg b/overrides/.icons/vscode/repo-push.svg
new file mode 100644
index 0000000..51998c9
--- /dev/null
+++ b/overrides/.icons/vscode/repo-push.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/repo-selected.svg b/overrides/.icons/vscode/repo-selected.svg
new file mode 100644
index 0000000..dc599db
--- /dev/null
+++ b/overrides/.icons/vscode/repo-selected.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/repo.svg b/overrides/.icons/vscode/repo.svg
new file mode 100644
index 0000000..7fc1245
--- /dev/null
+++ b/overrides/.icons/vscode/repo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/report.svg b/overrides/.icons/vscode/report.svg
new file mode 100644
index 0000000..fe26a4f
--- /dev/null
+++ b/overrides/.icons/vscode/report.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/request-changes.svg b/overrides/.icons/vscode/request-changes.svg
new file mode 100644
index 0000000..749801b
--- /dev/null
+++ b/overrides/.icons/vscode/request-changes.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/robot.svg b/overrides/.icons/vscode/robot.svg
new file mode 100644
index 0000000..f4960af
--- /dev/null
+++ b/overrides/.icons/vscode/robot.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/rocket.svg b/overrides/.icons/vscode/rocket.svg
new file mode 100644
index 0000000..ee89073
--- /dev/null
+++ b/overrides/.icons/vscode/rocket.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/root-folder-opened.svg b/overrides/.icons/vscode/root-folder-opened.svg
new file mode 100644
index 0000000..32f5056
--- /dev/null
+++ b/overrides/.icons/vscode/root-folder-opened.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/root-folder.svg b/overrides/.icons/vscode/root-folder.svg
new file mode 100644
index 0000000..c178580
--- /dev/null
+++ b/overrides/.icons/vscode/root-folder.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/rss.svg b/overrides/.icons/vscode/rss.svg
new file mode 100644
index 0000000..6f39a40
--- /dev/null
+++ b/overrides/.icons/vscode/rss.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/ruby.svg b/overrides/.icons/vscode/ruby.svg
new file mode 100644
index 0000000..f615253
--- /dev/null
+++ b/overrides/.icons/vscode/ruby.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/run-above.svg b/overrides/.icons/vscode/run-above.svg
new file mode 100644
index 0000000..d45fd53
--- /dev/null
+++ b/overrides/.icons/vscode/run-above.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/run-all-coverage.svg b/overrides/.icons/vscode/run-all-coverage.svg
new file mode 100644
index 0000000..91bc63e
--- /dev/null
+++ b/overrides/.icons/vscode/run-all-coverage.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/run-all.svg b/overrides/.icons/vscode/run-all.svg
new file mode 100644
index 0000000..1628446
--- /dev/null
+++ b/overrides/.icons/vscode/run-all.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/run-below.svg b/overrides/.icons/vscode/run-below.svg
new file mode 100644
index 0000000..8973970
--- /dev/null
+++ b/overrides/.icons/vscode/run-below.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/run-coverage.svg b/overrides/.icons/vscode/run-coverage.svg
new file mode 100644
index 0000000..c4e2bce
--- /dev/null
+++ b/overrides/.icons/vscode/run-coverage.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/run-errors.svg b/overrides/.icons/vscode/run-errors.svg
new file mode 100644
index 0000000..e4c29f2
--- /dev/null
+++ b/overrides/.icons/vscode/run-errors.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/run-with-deps.svg b/overrides/.icons/vscode/run-with-deps.svg
new file mode 100644
index 0000000..35801e3
--- /dev/null
+++ b/overrides/.icons/vscode/run-with-deps.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/save-all.svg b/overrides/.icons/vscode/save-all.svg
new file mode 100644
index 0000000..dd31bce
--- /dev/null
+++ b/overrides/.icons/vscode/save-all.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/save-as.svg b/overrides/.icons/vscode/save-as.svg
new file mode 100644
index 0000000..d279804
--- /dev/null
+++ b/overrides/.icons/vscode/save-as.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/save.svg b/overrides/.icons/vscode/save.svg
new file mode 100644
index 0000000..532997a
--- /dev/null
+++ b/overrides/.icons/vscode/save.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/screen-cut.svg b/overrides/.icons/vscode/screen-cut.svg
new file mode 100644
index 0000000..f63edb7
--- /dev/null
+++ b/overrides/.icons/vscode/screen-cut.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/screen-full.svg b/overrides/.icons/vscode/screen-full.svg
new file mode 100644
index 0000000..32e26e5
--- /dev/null
+++ b/overrides/.icons/vscode/screen-full.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/screen-normal.svg b/overrides/.icons/vscode/screen-normal.svg
new file mode 100644
index 0000000..1360f2d
--- /dev/null
+++ b/overrides/.icons/vscode/screen-normal.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/search-fuzzy.svg b/overrides/.icons/vscode/search-fuzzy.svg
new file mode 100644
index 0000000..24d3eeb
--- /dev/null
+++ b/overrides/.icons/vscode/search-fuzzy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/search-large.svg b/overrides/.icons/vscode/search-large.svg
new file mode 100644
index 0000000..041e153
--- /dev/null
+++ b/overrides/.icons/vscode/search-large.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/search-sparkle.svg b/overrides/.icons/vscode/search-sparkle.svg
new file mode 100644
index 0000000..a14449c
--- /dev/null
+++ b/overrides/.icons/vscode/search-sparkle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/search-stop.svg b/overrides/.icons/vscode/search-stop.svg
new file mode 100644
index 0000000..851ab83
--- /dev/null
+++ b/overrides/.icons/vscode/search-stop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/search.svg b/overrides/.icons/vscode/search.svg
new file mode 100644
index 0000000..f8249b1
--- /dev/null
+++ b/overrides/.icons/vscode/search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/send-to-remote-agent.svg b/overrides/.icons/vscode/send-to-remote-agent.svg
new file mode 100644
index 0000000..d517f1e
--- /dev/null
+++ b/overrides/.icons/vscode/send-to-remote-agent.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/send.svg b/overrides/.icons/vscode/send.svg
new file mode 100644
index 0000000..d727478
--- /dev/null
+++ b/overrides/.icons/vscode/send.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/server-environment.svg b/overrides/.icons/vscode/server-environment.svg
new file mode 100644
index 0000000..7c973b9
--- /dev/null
+++ b/overrides/.icons/vscode/server-environment.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/server-process.svg b/overrides/.icons/vscode/server-process.svg
new file mode 100644
index 0000000..cafb154
--- /dev/null
+++ b/overrides/.icons/vscode/server-process.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/server.svg b/overrides/.icons/vscode/server.svg
new file mode 100644
index 0000000..ac42aed
--- /dev/null
+++ b/overrides/.icons/vscode/server.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/session-in-progress.svg b/overrides/.icons/vscode/session-in-progress.svg
new file mode 100644
index 0000000..32925f9
--- /dev/null
+++ b/overrides/.icons/vscode/session-in-progress.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/settings-gear.svg b/overrides/.icons/vscode/settings-gear.svg
new file mode 100644
index 0000000..cdc25f1
--- /dev/null
+++ b/overrides/.icons/vscode/settings-gear.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/settings.svg b/overrides/.icons/vscode/settings.svg
new file mode 100644
index 0000000..0f1b128
--- /dev/null
+++ b/overrides/.icons/vscode/settings.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/share-window.svg b/overrides/.icons/vscode/share-window.svg
new file mode 100644
index 0000000..96d0f11
--- /dev/null
+++ b/overrides/.icons/vscode/share-window.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/share.svg b/overrides/.icons/vscode/share.svg
new file mode 100644
index 0000000..7eff37a
--- /dev/null
+++ b/overrides/.icons/vscode/share.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/shield.svg b/overrides/.icons/vscode/shield.svg
new file mode 100644
index 0000000..b1b5517
--- /dev/null
+++ b/overrides/.icons/vscode/shield.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/sign-in.svg b/overrides/.icons/vscode/sign-in.svg
new file mode 100644
index 0000000..930bfd5
--- /dev/null
+++ b/overrides/.icons/vscode/sign-in.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/sign-out.svg b/overrides/.icons/vscode/sign-out.svg
new file mode 100644
index 0000000..9867d8b
--- /dev/null
+++ b/overrides/.icons/vscode/sign-out.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/skip.svg b/overrides/.icons/vscode/skip.svg
new file mode 100644
index 0000000..f9dcd2d
--- /dev/null
+++ b/overrides/.icons/vscode/skip.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/smiley.svg b/overrides/.icons/vscode/smiley.svg
new file mode 100644
index 0000000..c5094f2
--- /dev/null
+++ b/overrides/.icons/vscode/smiley.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/snake.svg b/overrides/.icons/vscode/snake.svg
new file mode 100644
index 0000000..d054ac2
--- /dev/null
+++ b/overrides/.icons/vscode/snake.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/sort-precedence.svg b/overrides/.icons/vscode/sort-precedence.svg
new file mode 100644
index 0000000..395f3e8
--- /dev/null
+++ b/overrides/.icons/vscode/sort-precedence.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/source-control.svg b/overrides/.icons/vscode/source-control.svg
new file mode 100644
index 0000000..c40e566
--- /dev/null
+++ b/overrides/.icons/vscode/source-control.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/sparkle-filled.svg b/overrides/.icons/vscode/sparkle-filled.svg
new file mode 100644
index 0000000..98108b3
--- /dev/null
+++ b/overrides/.icons/vscode/sparkle-filled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/sparkle.svg b/overrides/.icons/vscode/sparkle.svg
new file mode 100644
index 0000000..cacf8d2
--- /dev/null
+++ b/overrides/.icons/vscode/sparkle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/split-horizontal.svg b/overrides/.icons/vscode/split-horizontal.svg
new file mode 100644
index 0000000..74b7a5e
--- /dev/null
+++ b/overrides/.icons/vscode/split-horizontal.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/split-vertical.svg b/overrides/.icons/vscode/split-vertical.svg
new file mode 100644
index 0000000..fd88e74
--- /dev/null
+++ b/overrides/.icons/vscode/split-vertical.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/squirrel.svg b/overrides/.icons/vscode/squirrel.svg
new file mode 100644
index 0000000..f3d6f17
--- /dev/null
+++ b/overrides/.icons/vscode/squirrel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/star-empty.svg b/overrides/.icons/vscode/star-empty.svg
new file mode 100644
index 0000000..391094d
--- /dev/null
+++ b/overrides/.icons/vscode/star-empty.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/star-full.svg b/overrides/.icons/vscode/star-full.svg
new file mode 100644
index 0000000..e06ba69
--- /dev/null
+++ b/overrides/.icons/vscode/star-full.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/star-half.svg b/overrides/.icons/vscode/star-half.svg
new file mode 100644
index 0000000..e86fad9
--- /dev/null
+++ b/overrides/.icons/vscode/star-half.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/stop-circle.svg b/overrides/.icons/vscode/stop-circle.svg
new file mode 100644
index 0000000..9970ad8
--- /dev/null
+++ b/overrides/.icons/vscode/stop-circle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/strikethrough.svg b/overrides/.icons/vscode/strikethrough.svg
new file mode 100644
index 0000000..2744ebe
--- /dev/null
+++ b/overrides/.icons/vscode/strikethrough.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/surround-with.svg b/overrides/.icons/vscode/surround-with.svg
new file mode 100644
index 0000000..082c1b7
--- /dev/null
+++ b/overrides/.icons/vscode/surround-with.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-array.svg b/overrides/.icons/vscode/symbol-array.svg
new file mode 100644
index 0000000..8de0f6e
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-array.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-boolean.svg b/overrides/.icons/vscode/symbol-boolean.svg
new file mode 100644
index 0000000..673ac05
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-boolean.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-class.svg b/overrides/.icons/vscode/symbol-class.svg
new file mode 100644
index 0000000..26fb8b2
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-class.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-color.svg b/overrides/.icons/vscode/symbol-color.svg
new file mode 100644
index 0000000..dbb927e
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-constant.svg b/overrides/.icons/vscode/symbol-constant.svg
new file mode 100644
index 0000000..f17583b
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-constant.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-enum-member.svg b/overrides/.icons/vscode/symbol-enum-member.svg
new file mode 100644
index 0000000..b1c6171
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-enum-member.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-enum.svg b/overrides/.icons/vscode/symbol-enum.svg
new file mode 100644
index 0000000..c9bc85f
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-enum.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-event.svg b/overrides/.icons/vscode/symbol-event.svg
new file mode 100644
index 0000000..5b39a0a
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-event.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-field.svg b/overrides/.icons/vscode/symbol-field.svg
new file mode 100644
index 0000000..9ee1315
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-field.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-file.svg b/overrides/.icons/vscode/symbol-file.svg
new file mode 100644
index 0000000..31d6076
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-file.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-interface.svg b/overrides/.icons/vscode/symbol-interface.svg
new file mode 100644
index 0000000..fcb84d1
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-interface.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-key.svg b/overrides/.icons/vscode/symbol-key.svg
new file mode 100644
index 0000000..326a1cc
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-key.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-keyword.svg b/overrides/.icons/vscode/symbol-keyword.svg
new file mode 100644
index 0000000..48453d2
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-keyword.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-method-arrow.svg b/overrides/.icons/vscode/symbol-method-arrow.svg
new file mode 100644
index 0000000..34c091f
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-method-arrow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-method.svg b/overrides/.icons/vscode/symbol-method.svg
new file mode 100644
index 0000000..1ca9ea8
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-method.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-misc.svg b/overrides/.icons/vscode/symbol-misc.svg
new file mode 100644
index 0000000..01017b7
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-misc.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-namespace.svg b/overrides/.icons/vscode/symbol-namespace.svg
new file mode 100644
index 0000000..a3ff4fa
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-namespace.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-numeric.svg b/overrides/.icons/vscode/symbol-numeric.svg
new file mode 100644
index 0000000..30f6bae
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-numeric.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-operator.svg b/overrides/.icons/vscode/symbol-operator.svg
new file mode 100644
index 0000000..f1528a3
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-operator.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-parameter.svg b/overrides/.icons/vscode/symbol-parameter.svg
new file mode 100644
index 0000000..f30132d
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-parameter.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-property.svg b/overrides/.icons/vscode/symbol-property.svg
new file mode 100644
index 0000000..ca196ad
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-property.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-ruler.svg b/overrides/.icons/vscode/symbol-ruler.svg
new file mode 100644
index 0000000..a283b91
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-ruler.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-snippet.svg b/overrides/.icons/vscode/symbol-snippet.svg
new file mode 100644
index 0000000..38f266b
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-snippet.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-string.svg b/overrides/.icons/vscode/symbol-string.svg
new file mode 100644
index 0000000..326a1cc
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-string.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-structure.svg b/overrides/.icons/vscode/symbol-structure.svg
new file mode 100644
index 0000000..7cfde96
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-structure.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/symbol-variable.svg b/overrides/.icons/vscode/symbol-variable.svg
new file mode 100644
index 0000000..d37f81c
--- /dev/null
+++ b/overrides/.icons/vscode/symbol-variable.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/sync-ignored.svg b/overrides/.icons/vscode/sync-ignored.svg
new file mode 100644
index 0000000..7ce8635
--- /dev/null
+++ b/overrides/.icons/vscode/sync-ignored.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/sync.svg b/overrides/.icons/vscode/sync.svg
new file mode 100644
index 0000000..1767194
--- /dev/null
+++ b/overrides/.icons/vscode/sync.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/table.svg b/overrides/.icons/vscode/table.svg
new file mode 100644
index 0000000..c5a7443
--- /dev/null
+++ b/overrides/.icons/vscode/table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/tag.svg b/overrides/.icons/vscode/tag.svg
new file mode 100644
index 0000000..788540b
--- /dev/null
+++ b/overrides/.icons/vscode/tag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/target.svg b/overrides/.icons/vscode/target.svg
new file mode 100644
index 0000000..ec67355
--- /dev/null
+++ b/overrides/.icons/vscode/target.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/tasklist.svg b/overrides/.icons/vscode/tasklist.svg
new file mode 100644
index 0000000..c9b951f
--- /dev/null
+++ b/overrides/.icons/vscode/tasklist.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/telescope.svg b/overrides/.icons/vscode/telescope.svg
new file mode 100644
index 0000000..ca75105
--- /dev/null
+++ b/overrides/.icons/vscode/telescope.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/terminal-bash.svg b/overrides/.icons/vscode/terminal-bash.svg
new file mode 100644
index 0000000..3a97256
--- /dev/null
+++ b/overrides/.icons/vscode/terminal-bash.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/terminal-cmd.svg b/overrides/.icons/vscode/terminal-cmd.svg
new file mode 100644
index 0000000..95be0e5
--- /dev/null
+++ b/overrides/.icons/vscode/terminal-cmd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/terminal-debian.svg b/overrides/.icons/vscode/terminal-debian.svg
new file mode 100644
index 0000000..466a547
--- /dev/null
+++ b/overrides/.icons/vscode/terminal-debian.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/terminal-git-bash.svg b/overrides/.icons/vscode/terminal-git-bash.svg
new file mode 100644
index 0000000..45c6459
--- /dev/null
+++ b/overrides/.icons/vscode/terminal-git-bash.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/terminal-linux.svg b/overrides/.icons/vscode/terminal-linux.svg
new file mode 100644
index 0000000..672ac9d
--- /dev/null
+++ b/overrides/.icons/vscode/terminal-linux.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/terminal-powershell.svg b/overrides/.icons/vscode/terminal-powershell.svg
new file mode 100644
index 0000000..81be90d
--- /dev/null
+++ b/overrides/.icons/vscode/terminal-powershell.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/terminal-secure.svg b/overrides/.icons/vscode/terminal-secure.svg
new file mode 100644
index 0000000..717006d
--- /dev/null
+++ b/overrides/.icons/vscode/terminal-secure.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/terminal-tmux.svg b/overrides/.icons/vscode/terminal-tmux.svg
new file mode 100644
index 0000000..813d9fa
--- /dev/null
+++ b/overrides/.icons/vscode/terminal-tmux.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/terminal-ubuntu.svg b/overrides/.icons/vscode/terminal-ubuntu.svg
new file mode 100644
index 0000000..74d7b01
--- /dev/null
+++ b/overrides/.icons/vscode/terminal-ubuntu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/terminal.svg b/overrides/.icons/vscode/terminal.svg
new file mode 100644
index 0000000..3b1b1a3
--- /dev/null
+++ b/overrides/.icons/vscode/terminal.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/text-size.svg b/overrides/.icons/vscode/text-size.svg
new file mode 100644
index 0000000..bdba104
--- /dev/null
+++ b/overrides/.icons/vscode/text-size.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/thinking.svg b/overrides/.icons/vscode/thinking.svg
new file mode 100644
index 0000000..2a7c0df
--- /dev/null
+++ b/overrides/.icons/vscode/thinking.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/three-bars.svg b/overrides/.icons/vscode/three-bars.svg
new file mode 100644
index 0000000..b318808
--- /dev/null
+++ b/overrides/.icons/vscode/three-bars.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/thumbsdown-filled.svg b/overrides/.icons/vscode/thumbsdown-filled.svg
new file mode 100644
index 0000000..4292e6f
--- /dev/null
+++ b/overrides/.icons/vscode/thumbsdown-filled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/thumbsdown.svg b/overrides/.icons/vscode/thumbsdown.svg
new file mode 100644
index 0000000..9a28c78
--- /dev/null
+++ b/overrides/.icons/vscode/thumbsdown.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/thumbsup-filled.svg b/overrides/.icons/vscode/thumbsup-filled.svg
new file mode 100644
index 0000000..e556f72
--- /dev/null
+++ b/overrides/.icons/vscode/thumbsup-filled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/thumbsup.svg b/overrides/.icons/vscode/thumbsup.svg
new file mode 100644
index 0000000..1aee99c
--- /dev/null
+++ b/overrides/.icons/vscode/thumbsup.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/tools.svg b/overrides/.icons/vscode/tools.svg
new file mode 100644
index 0000000..d835c25
--- /dev/null
+++ b/overrides/.icons/vscode/tools.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/trash.svg b/overrides/.icons/vscode/trash.svg
new file mode 100644
index 0000000..fd1c66a
--- /dev/null
+++ b/overrides/.icons/vscode/trash.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/triangle-down.svg b/overrides/.icons/vscode/triangle-down.svg
new file mode 100644
index 0000000..5193317
--- /dev/null
+++ b/overrides/.icons/vscode/triangle-down.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/triangle-left.svg b/overrides/.icons/vscode/triangle-left.svg
new file mode 100644
index 0000000..3a96300
--- /dev/null
+++ b/overrides/.icons/vscode/triangle-left.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/triangle-right.svg b/overrides/.icons/vscode/triangle-right.svg
new file mode 100644
index 0000000..2703a5a
--- /dev/null
+++ b/overrides/.icons/vscode/triangle-right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/triangle-up.svg b/overrides/.icons/vscode/triangle-up.svg
new file mode 100644
index 0000000..c28cb7c
--- /dev/null
+++ b/overrides/.icons/vscode/triangle-up.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/twitter.svg b/overrides/.icons/vscode/twitter.svg
new file mode 100644
index 0000000..5a38696
--- /dev/null
+++ b/overrides/.icons/vscode/twitter.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/type-hierarchy-sub.svg b/overrides/.icons/vscode/type-hierarchy-sub.svg
new file mode 100644
index 0000000..6026fb8
--- /dev/null
+++ b/overrides/.icons/vscode/type-hierarchy-sub.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/type-hierarchy-super.svg b/overrides/.icons/vscode/type-hierarchy-super.svg
new file mode 100644
index 0000000..ef98714
--- /dev/null
+++ b/overrides/.icons/vscode/type-hierarchy-super.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/type-hierarchy.svg b/overrides/.icons/vscode/type-hierarchy.svg
new file mode 100644
index 0000000..56f1d6b
--- /dev/null
+++ b/overrides/.icons/vscode/type-hierarchy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/unarchive.svg b/overrides/.icons/vscode/unarchive.svg
new file mode 100644
index 0000000..43a7ded
--- /dev/null
+++ b/overrides/.icons/vscode/unarchive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/unfold.svg b/overrides/.icons/vscode/unfold.svg
new file mode 100644
index 0000000..61e380c
--- /dev/null
+++ b/overrides/.icons/vscode/unfold.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/ungroup-by-ref-type.svg b/overrides/.icons/vscode/ungroup-by-ref-type.svg
new file mode 100644
index 0000000..6720029
--- /dev/null
+++ b/overrides/.icons/vscode/ungroup-by-ref-type.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/unlock.svg b/overrides/.icons/vscode/unlock.svg
new file mode 100644
index 0000000..3354394
--- /dev/null
+++ b/overrides/.icons/vscode/unlock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/unmute.svg b/overrides/.icons/vscode/unmute.svg
new file mode 100644
index 0000000..75b4c3d
--- /dev/null
+++ b/overrides/.icons/vscode/unmute.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/unverified.svg b/overrides/.icons/vscode/unverified.svg
new file mode 100644
index 0000000..11cf7c0
--- /dev/null
+++ b/overrides/.icons/vscode/unverified.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/variable-group.svg b/overrides/.icons/vscode/variable-group.svg
new file mode 100644
index 0000000..eca1c3e
--- /dev/null
+++ b/overrides/.icons/vscode/variable-group.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/verified-filled.svg b/overrides/.icons/vscode/verified-filled.svg
new file mode 100644
index 0000000..420f4de
--- /dev/null
+++ b/overrides/.icons/vscode/verified-filled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/verified.svg b/overrides/.icons/vscode/verified.svg
new file mode 100644
index 0000000..06e3cdd
--- /dev/null
+++ b/overrides/.icons/vscode/verified.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/versions.svg b/overrides/.icons/vscode/versions.svg
new file mode 100644
index 0000000..e0701c1
--- /dev/null
+++ b/overrides/.icons/vscode/versions.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/vm-active.svg b/overrides/.icons/vscode/vm-active.svg
new file mode 100644
index 0000000..a75158d
--- /dev/null
+++ b/overrides/.icons/vscode/vm-active.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/vm-connect.svg b/overrides/.icons/vscode/vm-connect.svg
new file mode 100644
index 0000000..78ab1d8
--- /dev/null
+++ b/overrides/.icons/vscode/vm-connect.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/vm-outline.svg b/overrides/.icons/vscode/vm-outline.svg
new file mode 100644
index 0000000..eb960dd
--- /dev/null
+++ b/overrides/.icons/vscode/vm-outline.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/vm-pending.svg b/overrides/.icons/vscode/vm-pending.svg
new file mode 100644
index 0000000..f8b9f26
--- /dev/null
+++ b/overrides/.icons/vscode/vm-pending.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/vm-running.svg b/overrides/.icons/vscode/vm-running.svg
new file mode 100644
index 0000000..d4a0716
--- /dev/null
+++ b/overrides/.icons/vscode/vm-running.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/vm-small.svg b/overrides/.icons/vscode/vm-small.svg
new file mode 100644
index 0000000..334bc87
--- /dev/null
+++ b/overrides/.icons/vscode/vm-small.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/vm.svg b/overrides/.icons/vscode/vm.svg
new file mode 100644
index 0000000..1230e67
--- /dev/null
+++ b/overrides/.icons/vscode/vm.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/vr.svg b/overrides/.icons/vscode/vr.svg
new file mode 100644
index 0000000..2184807
--- /dev/null
+++ b/overrides/.icons/vscode/vr.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/vscode-insiders.svg b/overrides/.icons/vscode/vscode-insiders.svg
new file mode 100644
index 0000000..570d720
--- /dev/null
+++ b/overrides/.icons/vscode/vscode-insiders.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/vscode.svg b/overrides/.icons/vscode/vscode.svg
new file mode 100644
index 0000000..5d0463a
--- /dev/null
+++ b/overrides/.icons/vscode/vscode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/wand.svg b/overrides/.icons/vscode/wand.svg
new file mode 100644
index 0000000..26715c8
--- /dev/null
+++ b/overrides/.icons/vscode/wand.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/warning.svg b/overrides/.icons/vscode/warning.svg
new file mode 100644
index 0000000..104147b
--- /dev/null
+++ b/overrides/.icons/vscode/warning.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/watch.svg b/overrides/.icons/vscode/watch.svg
new file mode 100644
index 0000000..d573c17
--- /dev/null
+++ b/overrides/.icons/vscode/watch.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/whitespace.svg b/overrides/.icons/vscode/whitespace.svg
new file mode 100644
index 0000000..345ce3a
--- /dev/null
+++ b/overrides/.icons/vscode/whitespace.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/whole-word.svg b/overrides/.icons/vscode/whole-word.svg
new file mode 100644
index 0000000..7baf83d
--- /dev/null
+++ b/overrides/.icons/vscode/whole-word.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/window-active.svg b/overrides/.icons/vscode/window-active.svg
new file mode 100644
index 0000000..a08a469
--- /dev/null
+++ b/overrides/.icons/vscode/window-active.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/window.svg b/overrides/.icons/vscode/window.svg
new file mode 100644
index 0000000..0e5201d
--- /dev/null
+++ b/overrides/.icons/vscode/window.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/word-wrap.svg b/overrides/.icons/vscode/word-wrap.svg
new file mode 100644
index 0000000..149b7bd
--- /dev/null
+++ b/overrides/.icons/vscode/word-wrap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/workspace-trusted.svg b/overrides/.icons/vscode/workspace-trusted.svg
new file mode 100644
index 0000000..8b4e5f5
--- /dev/null
+++ b/overrides/.icons/vscode/workspace-trusted.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/workspace-unknown.svg b/overrides/.icons/vscode/workspace-unknown.svg
new file mode 100644
index 0000000..47d10f1
--- /dev/null
+++ b/overrides/.icons/vscode/workspace-unknown.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/workspace-untrusted.svg b/overrides/.icons/vscode/workspace-untrusted.svg
new file mode 100644
index 0000000..1807cc7
--- /dev/null
+++ b/overrides/.icons/vscode/workspace-untrusted.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/worktree-small.svg b/overrides/.icons/vscode/worktree-small.svg
new file mode 100644
index 0000000..586b9d3
--- /dev/null
+++ b/overrides/.icons/vscode/worktree-small.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/worktree.svg b/overrides/.icons/vscode/worktree.svg
new file mode 100644
index 0000000..db4c390
--- /dev/null
+++ b/overrides/.icons/vscode/worktree.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/zoom-in.svg b/overrides/.icons/vscode/zoom-in.svg
new file mode 100644
index 0000000..4b0c39f
--- /dev/null
+++ b/overrides/.icons/vscode/zoom-in.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/overrides/.icons/vscode/zoom-out.svg b/overrides/.icons/vscode/zoom-out.svg
new file mode 100644
index 0000000..5ba7bd0
--- /dev/null
+++ b/overrides/.icons/vscode/zoom-out.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/snippets/abbr.md b/snippets/abbr.md
new file mode 100644
index 0000000..8dbbffb
--- /dev/null
+++ b/snippets/abbr.md
@@ -0,0 +1,6 @@
+*[RAG]: Retrieval-Augmented Generation
+
+*[W3C]: World Wide Web Consortium
+
+*[HTML]: Hyper Text Markup Language
+
diff --git a/snippets/coming_soon.md b/snippets/coming_soon.md
new file mode 100644
index 0000000..1b01240
--- /dev/null
+++ b/snippets/coming_soon.md
@@ -0,0 +1,3 @@
+!!! example "Здесь пока пусто"
+ Скоро здесь появится полезная информация.
+ Мы работаем над этим.
diff --git a/snippets/config_file_path.md b/snippets/config_file_path.md
new file mode 100644
index 0000000..cec4078
--- /dev/null
+++ b/snippets/config_file_path.md
@@ -0,0 +1,4 @@
+Расположение файла конфигурации:
+
+- :fontawesome-brands-windows: Windows: `%USERPROFILE%/.example/config.yaml`
+- :simple-linux: Linux / :simple-apple: MacOS: `$HOME/.example/config.yaml`
diff --git a/snippets/ionicons-name.md b/snippets/ionicons-name.md
new file mode 100644
index 0000000..a80462d
--- /dev/null
+++ b/snippets/ionicons-name.md
@@ -0,0 +1,7 @@
+!!! question "Где взять имя иконки?"
+ Откройте галерею иконок на сайте [Ionicons](https://ionic.io/ionicons).
+ Кликнув на нужную иконку, внизу вы увидите её имя.
+ Именно это имя используется в конфигурации iptvc.
+
+ ??? quote "Скриншот"
+ 
diff --git a/src/iptvc/commands/check.md b/src/iptvc/commands/check.md
deleted file mode 100644
index 02cb76d..0000000
--- a/src/iptvc/commands/check.md
+++ /dev/null
@@ -1,192 +0,0 @@
----
-tags: ["iptvc"]
----
-
-# Команда `check`
-
-Команда поддерживает множество аргументов для разных целей.
-
-Они могут дополнять друг друга.
-
-Порядок аргументов не имеет значения.
-
-
-## `-i`, `--ini`
-
-Указывает путь к локальному [ini-файлу](../../formats/playlists.md) с описанием плейлистов.
-
-Можно указать только однажды.
-
-Значение по умолчанию: `./playlists.ini`
-
-Если файл не найден, проверка плейлистов будет доступна только по ссылкам ([`--url`](#url)) или из локальных файлов ([`--file`](#file)).
-
-Пример:
-
-```bash
-iptvc check -i ~/my.ini
-```
-
-
-## `-t`, `--tags`
-
-Указывает путь к локальному [json-файлу](../../formats/channels.md) с описанием тегов каналов.
-
-Можно указать только однажды.
-
-Значение по умолчанию: `./channels.json`
-
-Если файл не найден, то будет выведено предупреждение о том, что каналы не будут помечены тегами.
-
-Пример:
-
-```bash
-iptvc check -t ~/tags.json
-```
-
-
-## `-f`, `--file`
-
-Указывает путь к локальному файлу плейлиста `*.m3u`/`*.m3u8`.
-
-Можно указать несколько разных.
-
-Пример:
-
-```bash
-iptvc check -f playlist.m3u
-iptvc check -f playlist1.m3u --file playlist2.m3u8
-iptvc check --file /path/to/playlist.m3u
-```
-
-
-## `-u`, `--url`
-
-Указывает URL удалённого плейлиста (поддерживаются протоколы http/https).
-
-Можно указать несколько разных.
-
-Пример:
-
-```bash
-iptvc check -u http://example.com/playlist.m3u
-iptvc check -u https://site.com/playlist.m3u8 --url http://other.com/list.m3u
-```
-
-
-## `-c`, `--code`
-
-Указывает код плейлиста из файла [playlists.ini](../../formats/playlists.md).
-
-Можно указать несколько разных.
-
-!!! warning "Работает только вместе с [`--ini`](#ini)."
-
-Если не указан ни разу, то будут проверены все плейлисты, которые указаны в ini-файле.
-
-Если используется кеширование, то проверенные плейлисты (результаты проверки которых ещё находятся в кеше) проверяться не будут.
-
-Пример:
-
-```bash
-iptvc check -i ~/my.ini -c RU_BASIC --code MOVIE_PREMIUM
-```
-
-
-## `--repeat`
-
-Указывает количество повторений (итераций) команды.
-
-Значение по умолчанию: `1`
-
-Если указано `0`, тогда:
-
-* повторение будет бесконечным;
-
-* если переданы [`--url`](#url), [`--file`](#file) или [`--code`](#code), то на каждой итерации будут проверяться только указанные плейлисты;
-
-* если не переданы [`--url`](#url), [`--file`](#file) или [`--code`](#code), то на каждой итерации список плейлистов будет подготавливаться заново.
- Если при этом используется кеширование, то проверенные плейлисты (результаты проверки которых ещё находятся в кеше) проверяться не будут.
-
-Пример:
-
-```bash
-# проверить 5 раз плейлисты с кодами xx и yy из my.ini
-iptvc check -i ~/my.ini -c xx --code yy --repeat 5
-# бесконечно проверять все плейлисты из my.ini, без учёта проверенных
-iptvc check -i ~/my.ini --repeat 0
-# бесконечно проверять плейлист из файла
-iptvc check -f test.m3u --repeat 0
-```
-
-
-## `--every`
-
-Указывает количество секунд между повторениями (итерациями) команды.
-
-Значение по умолчанию: `5`
-
-Если указано `0`, то задержки не будет.
-
-Пример:
-
-```bash
-# проверить 5 раз плейлисты с кодами xx и yy из my.ini каждые 5 секунд
-iptvc check -i ~/my.ini -c xx --code yy --repeat 5 --every 5
-# бесконечно проверять все плейлисты из my.ini, без учёта проверенных, каждый час
-iptvc check -i ~/my.ini --repeat 0 --every 3600
-# бесконечно проверять плейлист из файла каждые 10 секунд
-iptvc check -f test.m3u --repeat 0 --every 10
-```
-
-
-## `-r`, `--random`
-
-Указывает максимальное количество случайных плейлистов из ini-файла для проверки.
-
-!!! warning "Работает только вместе с [`--ini`](#ini)."
-
-Если не указан ни разу, то будут проверены все плейлисты, которые указаны в ini-файле.
-
-Если используется кеширование, то проверенные плейлисты (результаты проверки которых ещё находятся в кеше) проверяться не будут.
-
-Пример:
-
-```bash
-iptvc check -i ~/my.ini -r 10
-```
-
-
-## `-j`, `--json`
-
-Если указано, то подробные результаты проверки будут выводиться в формате JSON.
-
-Пример:
-
-```bash
-iptvc check -f playlist.m3u --json
-```
-
-
-## `-q`, `--quiet`
-
-Подавляет вывод всех логов.
-
-!!! info "Не влияет на [`--json`](#json), но перекрывает [`--verbose`](#verbose)."
-
-Пример:
-
-```bash
-iptvc check -i ~/my.ini -r 10 -q --json
-```
-
-
-## `-v`, `--verbose`
-
-Включает подробное логирование.
-
-Пример:
-
-```bash
-iptvc check --random 10 --verbose
-```
diff --git a/src/iptvc/commands/index.md b/src/iptvc/commands/index.md
deleted file mode 100644
index 10e70a8..0000000
--- a/src/iptvc/commands/index.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-icon: octicons/terminal-24
-hide: [toc]
----
-
-# :octicons-terminal-24: Доступные команды
-
-* [Команда `help`](help.md) — получение справки о программе
-* [Команда `check`](check.md) — проверка плейлистов
-* [Команда `version`](version.md) — получение версии
diff --git a/src/iptvc/env.md b/src/iptvc/env.md
deleted file mode 100644
index 880f32d..0000000
--- a/src/iptvc/env.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-icon: simple/dotenv
-tags: ["iptvc", "переменные окружения"]
----
-
-# :simple-dotenv: Переменные окружения
-
-!!! info "TODO"
- Скоро здесь появится полезная информация.
- Следи за обновлениями в канале [@iptv_aggregator](https://t.me/iptv_aggregator) или в [репозитории](https://git.axenov.dev/IPTV/docs).
-
-## Настройки кэширования
-
-Кэш может храниться в СУБД redis или keydb.
-
-| Имя | Тип | Умолчание | Назначение |
-| ---------------- | ------ | ------------- | ---------------------------------- |
-| `CACHE_ENABLED` | bool | `false` | Включает кэширование |
-| `CACHE_HOST` | string | `"localhost"` | Имя хоста СУБД |
-| `CACHE_PORT` | uint | `6379` | Порт СУБД |
-| `CACHE_USERNAME` | string | `""` | Логин пользователя в СУБД |
-| `CACHE_PASSWORD` | string | `""` | Пароль пользователя в СУБД |
-| `CACHE_DB` | uint | `0` | Номер БД в СУБД для кэша |
-| `CACHE_TTL` | unit | `1800` | Время жизни ключей кэша в секундах |
diff --git a/src/iptvc/install.md b/src/iptvc/install.md
deleted file mode 100644
index 5b5b7c7..0000000
--- a/src/iptvc/install.md
+++ /dev/null
@@ -1,87 +0,0 @@
----
-icon: material/download
-tags: ["iptvc"]
----
-
-# Установка и запуск
-
-## Запуск готовой программы
-
-Достаточно скачать и распаковать архив с подходящим исполняемым файлом [со страницы последнего релиза](https://git.axenov.dev/IPTV/iptvc/releases/latest) в любую удобную директорию:
-
-| ОС | Скачать для `amd64` | Скачать для `arm64` |
-| ------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
-| Linux | [linux_amd64.zip](https://git.axenov.dev/IPTV/iptvc/releases/download/latest/linux_amd64.zip) | [linux_arm64.zip](https://git.axenov.dev/IPTV/iptvc/releases/download/latest/linux_arm64.zip) |
-| MacOS | [darwin_amd64.zip](https://git.axenov.dev/IPTV/iptvc/releases/download/latest/darwin_amd64.zip) | [darwin_arm64.zip](https://git.axenov.dev/IPTV/iptvc/releases/download/latest/darwin_arm64.zip) |
-| Windows | [windows_amd64.zip](https://git.axenov.dev/IPTV/iptvc/releases/download/latest/windows_amd64.zip) | [windows_arm64.zip](https://git.axenov.dev/IPTV/iptvc/releases/download/latest/windows_arm64.zip) |
-
-## Запуск релизного образа
-
-Релизные docker-образы строятся для платформы `linux` и архитектуры `amd64`.
-
-Найти их можно здесь:
-
-Тег `latest` всегда соответствует последней версии, он подразумевается по умолчанию:
-
-```shell
-docker run --pull always --name iptvc git.axenov.dev/iptv/iptvc КОМАНДА [АРГУМЕНТЫ]
-```
-
-Для использования другой версии следует явно указать её:
-
-```shell
-docker run --pull always --name iptvc git.axenov.dev/iptv/iptvc:v1.0.6 КОМАНДА [АРГУМЕНТЫ]
-```
-
-## Построение собственного образа
-
-```shell
-./build-docker-image.sh [<версия>]
-```
-
-где `<версия>` — необязательный тег версии в формате `vX.Y.Z`.
-Если не указан, то будет взят последний.
-
-Целевая платформа и архитектура меняется с помощью переменных `GOOS` и `GOARCH`:
-
-```shell
-GOOS=darwin GOARCH=arm64 ./build-docker-image.sh [<версия>]
-```
-
-Запуск:
-
-```
-docker run --pull always --name iptvc git.axenov.dev/iptv/iptvc КОМАНДА [АРГУМЕНТЫ]
-```
-
-## Использование образа в Docker compose
-
-```yml
-services:
- #...
- checker:
- container_name: iptv-checker
- image: git.axenov.dev/iptv/iptvc:latest
- command: [check]
- #...
-```
-
-## Компиляция из исходного кода
-
-Для компиляции потребуется golang v1.23.6 и выше.
-На версиях ниже не проверялось.
-
-```bash
-git clone https://git.axenov.dev/IPTV/iptvc.git
-cd iptvc
-make linux
-# или make help для получения помощи по компиляции
-```
-
-Поддерживается передача переменной `GOARCH`:
-
-```shell
-make darwin GOARCH=arm64
-```
-
-Скомпилированные файлы находятся в директории `bin/`.
diff --git a/src/iptvc/quickstart.md b/src/iptvc/quickstart.md
deleted file mode 100644
index 43a1002..0000000
--- a/src/iptvc/quickstart.md
+++ /dev/null
@@ -1,84 +0,0 @@
----
-icon: material/flag-checkered
-tags: ["iptvc"]
----
-
-# :material-flag-checkered: Быстрый старт
-
-Допустим, что программа скачана и распакована в любую директорию.
-
-## Проверить плейлист по прямой ссылке
-
-```
-./iptvc check -u https://example.com/pls.m3u
-./iptvc check --url https://example.com/pls.m3u
-```
-
-## Проверить файл плейлист с диска
-
-```
-./iptvc check -f /home/user/pls.m3u
-./iptvc check --file /home/user/pls.m3u
-```
-
-## Проверить плейлист по короткому коду из [`playlists.ini`](../formats/playlists.md)
-
-```
-./iptvc check -c X
-./iptvc check --code X
-```
-
-Файл `playlists.ini` должен лежать рядом с `iptvc`.
-
-Если файл лежит в другой директории, то можно явно указать путь к нему:
-
-```
-./iptvc check --ini /home/user/playlists.ini --code X
-```
-
-Если ini-файл не будет найден, программа предупредит об этом.
-
-## Присвоить каналам тематические теги
-
-Чтобы это произошло, рядом с `iptvc` должен лежать файл [channels.json](../formats/channels.md).
-
-Если файл лежит в другой директории, то можно указать её явно:
-
-```
-./iptvc check --tags /home/user/channels.json <...другие аргументы...>
-```
-
-Если json-файл не будет найден, то программа предупредит о том, что теги не будут присвоены, и продолжит работу.
-
-## Проверить несколько плейлистов одновременно
-
-Для этого можно комбинировать все аргументы, пречисленные выше, с учётом особенностей их работы:
-
-```
-./iptvc check \
- --ini /home/user/p.ini \
- --tags /home/user/c.json \
- --code Y \
- --file /home/user/tv.m3u \
- --url https://example.com/pls1.m3u \
- --url https://example.com/pls2.m3u
-```
-
-В этом примере (построчно):
-
-* вызвать команду проверки;
-* взять список плейлистов из файла `/home/user/p.ini`;
-* применить правила присвоения тегов из файла `/home/user/c.json`;
-* проверить плейлист с кодом `Y` из ini-файла;
-* проверить плейлист из файла `/home/user/tv.m3u`;
-* проверить плейлист по ссылке `https://example.com/pls1.m3u`;
-* проверить плейлист по ссылке `https://example.com/pls2.m3u`.
-
-Символ `\` нужен только для наглядного разделения аргументов на несколько строк.
-
-Переданные плейлисты будут обработаны в следующем порядке:
-
-1. локальные файлы;
-2. по ссылкам;
-3. по кодам из ini-файла.
-
diff --git a/zensical.toml b/zensical.toml
new file mode 100644
index 0000000..cda7395
--- /dev/null
+++ b/zensical.toml
@@ -0,0 +1,261 @@
+# https://zensical.org/docs/setup/basics
+
+[project]
+site_name = "Документация m3u.su"
+site_url = "https://m3u.su/"
+site_description = "Описание сервиса m3u.su и его компонентов"
+site_author = "Антон Аксенов"
+copyright = "Антон Аксенов © 2025-2026 MIT License"
+repo_url = "https://git.axenov.dev/IPTV/docs"
+repo_name = ".axenov.dev/IPTV/docs"
+edit_uri = "src/branch/master/content/"
+
+docs_dir = "./content"
+site_dir = "./site"
+use_directory_urls = false
+dev_addr = "localhost:8000"
+watch = ["content", "snippets"]
+extra_css = ["_css/extra.css"]
+extra_javascript = [
+ # "_js/extra.js",
+ "https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.js",
+]
+
+nav = [
+ {"Общая информация" = [
+ ]},
+ {"Приложение iptvc" = [
+ "iptvc/overview.md",
+ {"Использование" = [
+ "iptvc/install.md",
+ "iptvc/quickstart.md",
+ ]},
+ {"Запуск сайта" = [
+ "iptvc/site/start.md",
+ "iptvc/site/list.md",
+ "iptvc/site/details.md",
+ "iptvc/site/connect.md",
+ ]},
+ {"Команды CLI" = [
+ "iptvc/commands/index.md",
+ "iptvc/commands/check.md",
+ "iptvc/commands/serve.md",
+ "iptvc/commands/version.md",
+ "iptvc/commands/help.md",
+ ]},
+ {"Конфигурация" = [
+ "iptvc/config/config.md",
+ "iptvc/config/env.md",
+ {"Форматы файлов" = [
+ "iptvc/formats/index.md",
+ "iptvc/formats/playlists.md",
+ "iptvc/formats/channels.md",
+ "iptvc/formats/m3u.md",
+ ]},
+ ]},
+ {"Разработка" = [
+ "iptvc/dev/overview.md",
+ "iptvc/dev/compile.md",
+ # "iptvc/dev/docker.md",
+ {"Документация" = [
+ "iptvc/dev/docs/index.md",
+ "iptvc/dev/docs/vscode-icons.md",
+ "iptvc/dev/docs/components.md",
+ ]},
+ ]},
+ {"Развёртывание" = [
+ "iptvc/deploy/index.md",
+ ]},
+ ]},
+ # {"Сайт m3u.su" = [
+ # "index.md",
+ # {"О проекте" = [
+ # "docs.md",
+ # "support.md",
+ # "legal.md",
+ # "statuspage.md",
+ # ]},
+ # {"Общая информация" = [
+ # "common/index.md",
+ # "common/how-it-works.md",
+ # "common/selection.md",
+ # "common/checks.md",
+ # "common/list.md",
+ # "common/details.md",
+ # "common/connect.md",
+ # "common/players.md",
+ # ]},
+ # "faq.md",
+ # ]},
+]
+
+[project.validation] # валидация контента при сборке
+invalid_links = true # битые ссылки
+invalid_link_anchors = true # битые якоря
+
+[project.extra]
+homepage = "/index.html" # ссылка на логотипе
+generator = false # убрать из футера ссылку на Zensical
+
+# [project.extra.consent] # предупреждение о куках
+# title = "Уведомление о сookies"
+# description = """
+# Мы используем cookie-файлы для улучшения пользовательского опыта и сбора статистики.
+# Для получения дополнительной информации вы можете ознакомиться с нашей Политикой использования cookie-файлов .
+# """
+# actions = [
+# "accept",
+# # "reject,
+# ]
+
+[project.extra.analytics.feedback]
+title = "Полезна ли эта страница?"
+
+[[project.extra.analytics.feedback.ratings]]
+icon = "material/emoticon-happy-outline"
+name = "Да, всё понятно"
+data = 1
+note = "Спасибо за отзыв!"
+
+[[project.extra.analytics.feedback.ratings]]
+icon = "material/emoticon-sad-outline"
+name = "Нет, нужны уточнения"
+data = 0
+note = "Спасибо за отзыв!"
+
+[[project.extra.social]] # соц. кнопка в футере
+name = "Новостной канал в Telegram"
+icon = "simple/telegram"
+link = "https://t.me/iptv_aggregator"
+
+# [[project.extra.social]] # соц. кнопка в футере
+# name = "Сообщество в Telegram"
+# icon = "simple/telegram"
+# link = "https://t.me/"
+
+[[project.extra.social]] # соц. кнопка в футере
+name = "GitHub"
+icon = "fontawesome/brands/git"
+link = "https://git.axenov.dev/IPTV"
+
+[project.extra.status]
+beta = "Нестабильный функционал"
+
+[project.theme] # общие настройки темы
+custom_dir = "./overrides"
+language = "ru"
+# logo = "/_assets/logo-mid.png" # относительно docs_dir
+# favicon = "/_assets/favicon-32x32.png" # относительно docs_dir
+features = [
+ # "header.autohide", # скрывать заголовок при скролле
+ "content.code.annotate",
+ "content.code.copy",
+ "content.code.select",
+ "content.footnote.tooltips",
+ "content.tabs.link",
+ "content.tooltips",
+
+ # "navigation.instant",
+ # "navigation.instant.prefetch",
+ # "navigation.instant.progress",
+ "navigation.tabs", # 1 уровень навигации превращаются в табы в шапке
+ # "navigation.tabs.sticky", # не скрывать табы под заголовком при скролле
+ "navigation.sections", # заголовки секций меню сворачиваются или статичны
+ "navigation.tracking", # подстановка якорей страницы в урлу при скролле
+ # "navigation.expand", # развёрнутые подменю по умолчанию
+ "navigation.path", # хлебные крошки над H1 страницы
+ "navigation.indexes", # если есть index.md, то пункт меню разворачиваблен и открывает свой index.md
+ "navigation.footer", # прошлый/следующий документ в футере
+ "navigation.top", # кнопка возврата наверх
+
+ "toc.follow", # подсветка загловков содержания при скролле
+ "search.highlight", # подсвечивать поисковый запрос на странице при переходе из поиска
+
+ # "content.action.edit", # редактирование страницы в repo_url
+ # "content.action.view", # исходник страницы в repo_url
+]
+
+[project.theme.font]
+text = "Inter"
+code = "Jetbrains Mono"
+
+[[project.theme.palette]] # Светлая тема
+media = "(prefers-color-scheme: light)"
+scheme = "default"
+# primary = "white"
+accent = "teal"
+toggle.icon = "lucide/moon"
+toggle.name = "Включить тёмную тему"
+
+[[project.theme.palette]] # Тёмная тема
+media = "(prefers-color-scheme: dark)"
+scheme = "slate"
+# primary = "black"
+accent = "teal"
+toggle.icon = "lucide/sun"
+toggle.name = "Включить светлую тему"
+
+[project.theme.icon]
+repo = "fontawesome/brands/git"
+edit = "material/pencil"
+view = "material/eye"
+
+[project.theme.icon.tag]
+default = "lucide/hash"
+html = "fontawesome/brands/html5"
+js = "fontawesome/brands/js"
+css = "fontawesome/brands/css3"
+vscode = "material/microsoft-visual-studio-code"
+intellij = "simple/jetbrains"
+jetbrains = "simple/jetbrains"
+cli = "material/console"
+brain = "material/brain"
+
+[project.extra.tags]
+HTML5 = "html"
+JavaScript = "js"
+CSS = "css"
+VSCode = "vscode"
+"VS Code" = "vscode"
+IntelliJ = "intellij"
+JetBrains = "jetbrains"
+CLI = "cli"
+"модель" = "brain"
+"модели" = "brain"
+"ии" = "brain"
+AI = "brain"
+LLM = "brain"
+
+[project.markdown_extensions.pymdownx.highlight]
+anchor_linenums = true
+pygments_lang_class = true
+
+[project.markdown_extensions.pymdownx.emoji]
+emoji_index = "zensical.extensions.emoji.twemoji"
+emoji_generator = "zensical.extensions.emoji.to_svg"
+options.custom_icons = ["./overrides/.icons"]
+
+[project.markdown_extensions.pymdownx.snippets]
+base_path = "./snippets"
+
+[project.markdown_extensions.pymdownx.tabbed]
+alternate_style = true
+
+[project.markdown_extensions.toc]
+permalink = true
+# title = "На этой странице:"
+
+[project.markdown_extensions.abbr]
+[project.markdown_extensions.admonition]
+[project.markdown_extensions.attr_list]
+[project.markdown_extensions.def_list]
+[project.markdown_extensions.footnotes]
+[project.markdown_extensions.md_in_html]
+[project.markdown_extensions.inline_badges]
+[project.markdown_extensions.pymdownx.inlinehilite]
+[project.markdown_extensions.pymdownx.superfences]
+# [project.markdown_extensions.pymdownx.keys]
+[project.markdown_extensions.pymdownx.details]
+[project.markdown_extensions.pymdownx.caret]
+[project.markdown_extensions.pymdownx.mark]
+[project.markdown_extensions.pymdownx.tilde]