From 87760307a4cb695fc924942e95716910b3f296f5 Mon Sep 17 00:00:00 2001 From: AnthonyAxenov Date: Mon, 3 Mar 2025 16:03:39 +0800 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B5=D0=B7=D0=B4=20?= =?UTF-8?q?=D0=B2=20=D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8E=20=D0=BD=D0=B0=20git.axenov.dev?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - https://git.axenov.dev/IPTV/docker - https://git.axenov.dev/IPTV/playlists - https://git.axenov.dev/IPTV/svc-main - https://git.axenov.dev/IPTV/tools --- .gitignore | 9 +- LICENSE | 2 +- README.md | 277 +-- playlists.ini | 1549 -------------- src/.env.example | 18 - src/app/Controllers/ApiController.php | 36 - src/app/Controllers/BasicController.php | 58 - src/app/Controllers/WebController.php | 128 -- src/app/Core/ChannelLogo.php | 195 -- src/app/Core/Core.php | 230 -- src/app/Core/IniFile.php | 135 -- src/app/Core/Playlist.php | 368 ---- src/app/Core/TwigExtention.php | 41 - src/app/Errors/ErrorHandler.php | 92 - src/app/Errors/PlaylistNotFoundException.php | 15 - src/app/Middleware/RequestId.php | 29 - src/app/helpers.php | 159 -- src/cache/.gitkeep | 0 src/composer.json | 46 - src/composer.lock | 1860 ----------------- src/config/app.php | 18 - src/config/redis.php | 11 - src/config/routes.php | 52 - src/config/twig.php | 8 - src/public/boosty.svg | 13 - src/public/css/bootstrap.min.css | 7 - src/public/favicon/android-chrome-192x192.png | Bin 10799 -> 0 bytes src/public/favicon/android-chrome-512x512.png | Bin 22807 -> 0 bytes src/public/favicon/apple-touch-icon.png | Bin 7404 -> 0 bytes src/public/favicon/browserconfig.xml | 9 - src/public/favicon/favicon-16x16.png | Bin 1174 -> 0 bytes src/public/favicon/favicon-32x32.png | Bin 1775 -> 0 bytes src/public/favicon/favicon.ico | Bin 15086 -> 0 bytes src/public/favicon/mstile-150x150.png | Bin 7428 -> 0 bytes src/public/favicon/safari-pinned-tab.svg | 27 - src/public/favicon/site.webmanifest | 19 - src/public/index.php | 7 - src/public/js/bootstrap.bundle.min.js | 7 - src/public/js/list.min.js | 2 - src/public/no-tvg-logo.png | Bin 2102 -> 0 bytes src/views/custom.twig.example | 2 - src/views/details.twig | 133 -- src/views/faq.twig | 297 --- src/views/list.twig | 66 - src/views/notfound.twig | 18 - src/views/template.twig | 81 - tools/check-pls.sh | 77 - tools/download-all.sh | 31 - tools/find-in-all.sh | 25 - tools/find-in-pls.sh | 84 - tools/make-pls.sh | 55 - 51 files changed, 14 insertions(+), 6282 deletions(-) delete mode 100644 playlists.ini delete mode 100644 src/.env.example delete mode 100644 src/app/Controllers/ApiController.php delete mode 100644 src/app/Controllers/BasicController.php delete mode 100644 src/app/Controllers/WebController.php delete mode 100644 src/app/Core/ChannelLogo.php delete mode 100644 src/app/Core/Core.php delete mode 100644 src/app/Core/IniFile.php delete mode 100644 src/app/Core/Playlist.php delete mode 100644 src/app/Core/TwigExtention.php delete mode 100644 src/app/Errors/ErrorHandler.php delete mode 100644 src/app/Errors/PlaylistNotFoundException.php delete mode 100644 src/app/Middleware/RequestId.php delete mode 100644 src/app/helpers.php delete mode 100755 src/cache/.gitkeep delete mode 100644 src/composer.json delete mode 100644 src/composer.lock delete mode 100644 src/config/app.php delete mode 100644 src/config/redis.php delete mode 100644 src/config/routes.php delete mode 100644 src/config/twig.php delete mode 100644 src/public/boosty.svg delete mode 100644 src/public/css/bootstrap.min.css delete mode 100644 src/public/favicon/android-chrome-192x192.png delete mode 100644 src/public/favicon/android-chrome-512x512.png delete mode 100644 src/public/favicon/apple-touch-icon.png delete mode 100644 src/public/favicon/browserconfig.xml delete mode 100644 src/public/favicon/favicon-16x16.png delete mode 100644 src/public/favicon/favicon-32x32.png delete mode 100644 src/public/favicon/favicon.ico delete mode 100644 src/public/favicon/mstile-150x150.png delete mode 100644 src/public/favicon/safari-pinned-tab.svg delete mode 100644 src/public/favicon/site.webmanifest delete mode 100644 src/public/index.php delete mode 100644 src/public/js/bootstrap.bundle.min.js delete mode 100644 src/public/js/list.min.js delete mode 100644 src/public/no-tvg-logo.png delete mode 100644 src/views/custom.twig.example delete mode 100644 src/views/details.twig delete mode 100644 src/views/faq.twig delete mode 100644 src/views/list.twig delete mode 100644 src/views/notfound.twig delete mode 100644 src/views/template.twig delete mode 100755 tools/check-pls.sh delete mode 100755 tools/download-all.sh delete mode 100755 tools/find-in-all.sh delete mode 100755 tools/find-in-pls.sh delete mode 100755 tools/make-pls.sh diff --git a/.gitignore b/.gitignore index c2fc36c..ff043bc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,11 @@ /.idea /.vscode downloaded/ -/src/commit -/src/cache/* -/src/vendor -/src/config/playlists.ini -/src/views/custom.twig +/svc-* +/src +/tools /tmp + *.log .env *.m3u diff --git a/LICENSE b/LICENSE index 82b8da5..ca8a984 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 Антон Аксенов (aka Anthony Axenov) +Copyright (c) 2022 Антон Аксенов (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/README.md b/README.md index e1f0949..8be877a 100644 --- a/README.md +++ b/README.md @@ -1,171 +1,15 @@ -# Автообновляемые IPTV-плейлисты +# Инфраструктурный слой проекта iptv.axenov.dev -> **Web-версия**: [https://iptv.axenov.dev/](https://iptv.axenov.dev/) -> **FAQ**: [https://iptv.axenov.dev/faq](https://iptv.axenov.dev/faq) -> **Зеркало репозитория**: https://git.axenov.dev/anthony/iptv +**Web-версия**: https://iptv.axenov.dev +**FAQ**: https://iptv.axenov.dev/faq +**Исходный код**: https://git.axenov.dev/IPTV -Проект, содержащий в себе инструменты для работы с IPTV-плейлистами: +## Использованный стек -* список автообновляемых плейлистов, которые найдены в открытых источниках; -* скрипты для поиска каналов в этом списке, создания своего плейлиста; -* веб-сервис, предоставляющий короткие ссылки на эти плейлисты и отображающий список каналов. - -Плейлисты подбираются преимущественно для РФ и любых стран бывшего СНГ, но этими странами список не ограничивается. - -Поддержкой этих плейлистов занимаются сервисы и ресурсы, указанные как источник. -Вопросы работоспособности плейлистов адресуйте тем, кто несёт за них ответственность. - -Они бесплатны для использования. -Список проверяется и обновляется мной вручную. -Гарантию работоспособности никто не даёт. - -* [Как использовать этот список?](#как-использовать-этот-список) -* [Формат `playlists.ini`](#формат-playlistsini) -* [API](#api) -* [Развёртывание проекта](#развёртывание-проекта) - * [Apache](#apache) - * [Nginx](#nginx) -* [Расширенные возможности](#расширенные-возможности) - * [Собственный код html/css/js](#собственный-код-htmlcssjs-) - * [Очистка кеша twig](#очистка-кеша-twig) - * [Скачать все плейлисты](#скачать-все-плейлисты) - * [Проверить каналы плейлиста](#проверить-каналы-плейлиста) - * [Поиск каналов в одном плейлисте](#поиск-каналов-в-одном-плейлисте) - * [Поиск каналов во всех плейлистах](#поиск-каналов-во-всех-плейлистах) - * [Создать плейлист из нужных каналов](#создать-плейлист-из-нужных-каналов) -* [Как создать свой собственный плейлист?](#как-создать-свой-собственный-плейлист) -* [Использованный стек](#использованный-стек) -* [Лицензия](#лицензия) - ---- - -## Как использовать этот список? - -Чтобы подключить плейлист, нужно в настройках медиаплеера указать ссылку в следующем формате: - -``` -iptv.axenov.dev/ -``` - -где `` - один из идентификаторов, указанных в [`playlists.ini`](playlists.ini) в квадратных скобках. - -Либо провернуть всё то же самое через браузер. - -## Формат `playlists.ini` - -```ini -# ID плейлиста в рамках этого конфига (обязательно) -[1] - -# Название плейлиста (необязательно) -name = 'Рабочий и актуальный IPTV плейлист M3U' - -# Краткое описание из источника или от себя (необязательно) -desc = 'В этом IPTV плейлисте вы найдете очень много каналов в HD качестве' - -# Прямая ссылка на m3u/m3u8 плейлист (обязательно) -pls = 'https://example.com/pls.m3u' - -# Ссылка на источник, откуда взят плейлист (необязательно) -src = 'https://example.com/super-duper-playlist' - -[2] - -# ID другого плейлиста в этом списке, на который -# произойдёт редирект. Нужен для мягкой смены ID. -redirect = 1 -``` - -В описании любого плейлиста обязательны: -* ID в квадратных скобках - > Для удобства ввода с пульта, рекомендуется задавать числом или короткой строкой без пробелов и др. спецсимволов. -* параметр `pls` или `redirect` - > Если указаны оба, то `redirect` приоритетен. - -Плейлистов с редиректами может быть сколько угодно, но они не должны быть цикличными. - -## API - -Можно получать состояние плейлистов из этого сборника при помощи метода: - -``` -GET https://iptv.axenov.dev//json -``` - -где `ID` -- один из идентификаторов, указанных в [`playlists.ini`](playlists.ini) в квадратных скобках. - -В случае успеха вернётся JSON следующего содержания: - -```json -{ - "id": "p1", - "url": "localhost:8080/p1", - "name": "Каналы в SD и HD качестве (smarttvnews.ru)", - "desc": "Рабочий и актуальный IPTV плейлист M3U — на июнь 2022 года", - "pls": "https://smarttvnews.ru/apps/iptvchannels.m3u", - "src": "https://smarttvnews.ru/rabochiy-i-aktualnyiy-iptv-pleylist-m3u-kanalyi-v-sd-i-hd-kachestve/", - "status": "online", - "encoding": { - "name": "UTF-8", - "alert": false - }, - "channels": [ - "Channel1", - "Channel2", - "ChannelX" - ], - "count": 3 -} -``` - -где: - -* `id` -- идентификатор плейлиста -* `name` -- название плейлиста -* `url` -- короткая ссылка, которую можно использовать для добавления плейлиста в плеер -* `desc` -- краткое описание -* `pls` -- прямая ссылка на m3u/m3u8 плейлист -* `src` -- ссылка на источник, откуда взят плейлист -* `status` -- статус плейлиста (`"online"|"timeout"|"offline"|"error"`) -* `encoding` -- данные о кодировке файла плейлиста - * `name` -- название кодировки (`"UTF-8"|"Windows-1251"`) - * `alert` -- признак отличия кодировки от `UTF-8`, названия каналов сконвертированы в `UTF-8`, могут быть ошибки - в отображении -* `channels` -- массив названий каналов -* `count` -- количество каналов >= 0 - -> Название кодировки `encoding.name` может определяться неточно! - -В случае ошибки вернётся JSON в следующем формате: - -```json -{ - "id": "p1", - "url": "localhost:8080/p1", - "name": "Каналы в SD и HD качестве (smarttvnews.ru)", - "desc": "Рабочий и актуальный IPTV плейлист M3U — на июнь 2022 года", - "pls": "https://smarttvnews.ru/apps/iptvchannels.m3u", - "src": "https://smarttvnews.ru/rabochiy-i-aktualnyiy-iptv-pleylist-m3u-kanalyi-v-sd-i-hd-kachestve/", - "status": "offline", - "error": { - "code": 22, - "message": "The requested URL returned error: 404 Not Found" - } -} -``` - -где: - -* `id` -- идентификатор плейлиста -* `name` -- название плейлиста -* `url` -- короткая ссылка, которую можно использовать для добавления плейлиста в плеер -* `desc` -- краткое описание -* `pls` -- прямая ссылка на m3u/m3u8 плейлист -* `src` -- ссылка на источник, откуда взят плейлист -* `status` -- статус плейлиста (`"online"|"timeout"|"offline"|"error"`) -* `error` -- данные об ошибке при проверке плейлиста - * `code` -- [код ошибки curl](https://curl.se/libcurl/c/libcurl-errors.html) - * `message` -- текст ошибки curl +* [docker compose](https://docs.docker.com/compose/) +* [php8.3-fpm](https://www.php.net/releases/8.3/ru.php) +* [nginx](https://nginx.org/ru/) +* bash ## Развёртывание проекта @@ -253,109 +97,6 @@ $ sudo ln -s /etc/nginx/sites-available/iptv.conf /etc/nginx/sites-enabled/iptv. $ sudo systemctl reload apache2 ``` -## Расширенные возможности - -### Собственный код html/css/js - -В проекте есть директория `src/views/custom`. -Там можно размещать собственный код, который будет вставляться на каждой странице. - -Для этого, в первую очередь, нужно выполнить: - -``` -cp src/views/custom/custom.twig.example src/views/custom/custom.twig -``` - -Между тегами `{% block ... %} сюда {% endblock %}` следует вставить желаемый код или текст. -Можно создавать новые twig-файлы рядом и подключать их внутри `custom.twig`. -Git будет их игнорировать, хотя можно убрать директорию из `.gitignore` и добавлять эти файлы репозиторий. - -В общем случае, это можно выполнять на том сервере, на коем установлен и работает веб-сервис. - -После всех правок следует очистить кеш twig (см. далее). - -### Очистка кеша twig - -Если в файле `./src/.env` параметр `TWIG_CACHE=1`, то макеты страниц компилируются однажды и потом переиспользуются. -Изменённые макеты не будут перекомпилироваться пока не будет очищен кеш прежних. - -Для этого следует выполнить: - -``` -cd src && composer clear-views -``` - -### Скачать все плейлисты - -Команда: `./tools/download-all.sh` - -Скачивает все плейлисты из [`playlists.ini`](playlists.ini) в локальную директорию `./tools/downloaded/`. - -### Проверить каналы плейлиста - -Команда: `./tools/check-pls.sh` - -Проверяет каждый канал в плейлисте на доступность и выводит результат проверки. - -Поддерживаются `*.m3u` и `*.m3u8`; как локальные файлы, так по прямым ссылкам. - -Коды ошибок доступны [здесь](https://everything.curl.dev/usingcurl/returns). - -### Поиск каналов в одном плейлисте - -Команда: `./tools/find-in-pls.sh` - -Находит каналы по заданному регулярному выражению в одном указанном плейлисте. - -Поддерживаются `*.m3u` и `*.m3u8`; как локальные файлы, так по прямым ссылкам. - -### Поиск каналов во всех плейлистах - -Команда: `./tools/find-in-all.sh` - -Находит каналы по заданному регулярному выражению во всех плейлистах, скачанных через `download-all.sh`. - -### Создать плейлист из нужных каналов - -Команда: `./tools/make-pls.sh` - -Находит каналы по заданному регулярному выражению во всех плейлистах, скачанных через `download-all.sh`. - -Отличается от `find-in-all.sh` тем, что тот выводит результат в человекочитаемом формате, а этот -- в готовом m3u -формате для сохранения в файл. - -Для сохранения в файл следует добавить `> myfile.m3u` или `>> myfile.m3u` в конец команды. - -## Как создать свой собственный плейлист? - -1. Скачать все плейлисты, указанные в [`playlists.ini`](playlists.ini): - ``` - $ ./tools/download-all.sh - ``` -2. Вытащить из них нужные каналы и сохранить в отдельный файл: - ``` - $ ./tools/make-pls.sh "(fox|disney)" > my.m3u8 - ``` - Так в плейлисте `./my.m3u8` окажутся все каналы из скачанных плейлистов, в названиях которых встретились `fox` - или `disney`. -3. Проверить доступность каналов в полученном плейлисте: - ``` - $ ./tools/check-pls.sh my.m3u8 - ``` - > Результат `ОК` не означает, что канал действительно работает и отдаёт видео/аудио потоки. - > Результат `ERROR` с любыми кодами ошибок гарантированно означает, что канал не работает. -4. Вручную: удалить нерабочие, мусорные и продублировавшиеся (по ссылкам) каналы. -5. Вручную: добавить плейлист в IPTV-плеер и перепроверить результат. - -## Использованный стек - -* [docker compose](https://docs.docker.com/compose/) -* [php8.3-fpm](https://www.php.net/releases/8.3/ru.php) -* [SlimPHP v4](https://www.slimframework.com/docs/v4/) -* [Bootstrap 5](https://getbootstrap.com/docs/5.0/getting-started/introduction/) -* [nginx](https://nginx.org/ru/) -* bash - ## Лицензия [The MIT License](LICENSE) diff --git a/playlists.ini b/playlists.ini deleted file mode 100644 index fa23e56..0000000 --- a/playlists.ini +++ /dev/null @@ -1,1549 +0,0 @@ -;################################################### -; без группировки -;################################################### - -[ru] -name='Русские' -desc = -pls='https://raw.githubusercontent.com/iptv-org/iptv/master/streams/ru.m3u' -src='https://github.com/iptv-org/iptv' - -[ru2] -name='Российские федеральные' -desc='Несколько главных телеканалов' -pls='https://pastebin.com/raw/F7RiTyK2' -src='' - -[ru3] -name='Российские' -desc='Эфирные + WINK' -pls='https://dl.dropbox.com/scl/fi/jocyqlbk1wyi83v/efirtv.m3u' -src='' - -[sng] -name='Каналы СНГ' -desc = -pls='https://dl.dropboxusercontent.com/s/iw9v57cln6dfkpu/Vinnitsa.m3u' -src='https://iptvsensei.ru/samoobnovlyayemyye-pleylisty-iptv' - -[edem] -name='Эдем' -desc='Разные категории и страны' -pls='https://dl.dropbox.com/scl/fi/37c2sbo6kq8997u52ricj/.m3u?rlkey=gnt8h6iaqzf5vrsmfa0wh7xio&dl=0' -src='' - -[sh] -name='Российские и 18+' -desc='' -pls='https://gitlab.com/iptv135435/iptvshared/raw/main/IPTV_SHARED.m3u' -src='https://gitlab.com/iptv135435/iptvshared' - -[tp] -name='TaurerPlus' -desc = -pls='https://raw.githubusercontent.com/TaurerMedia/TaurerPlus/main/index.m3u8' -src='https://github.com/anthonyaxenov/iptv/issues/2' - -[b1] -name='IPTV плейлисты для GX3235T2C и AV2568T2C' -desc = -pls='https://www.digitaltv.ru/upload/iblock/034/tvlist.m3u' -src='https://www.digitaltv.ru/news/iptv_pleylisty.html' - -;################################################### -; музыкальные -;################################################### - -[mr] -name='Музыкальные радиоканалы' -desc='1800+ радиоканалов со всего мира и разных сервисов' -pls='https://dl.dropbox.com/scl/fi/tebxhojnowjccht/RADIO.m3u' -src='' - -[mr2] -name='Музыкальные радиоканалы' -desc='Расширенный mr' -pls='https://dl.dropbox.com/scl/fi/utrbaozx2t8tecsz9l3m5/R.A.D.I.O.m3u?rlkey=ap1e2ezi45fi8n4n38hiuvgb8' -src='' - -[mr3] -name='Музыкальные радиоканалы' -desc='250+ музыкальных радиоканалов по жанрам' -pls='https://dl.dropbox.com/scl/fi/f8hqauggbpvbxyp/Radio_Genres.m3u' -src='' - -;################################################### -; фильмы и сериалы -;################################################### - -[k1] -name='Кинофильмы' -desc='4000+ разных фильмов, без каналов' -pls='https://dl.dropbox.com/scl/fi/c3if4cnohx524ar/Film.m3u' -src='' - -[k2] -name='Кинофильмы' -desc='4000+ разных фильмов, без каналов; немного отличается от kino' -pls='https://dl.dropbox.com/scl/fi/n8qb6uyi51scqn3/film_4000.m3u' -src='' - -[k3] -name='Фильмы 5 (iptvsensei.ru)' -desc = -pls='https://pastebin.com/raw/jLaRge54' -src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty' - -[k4] -name='Фильмы' -pls='http://divantv.zz.mu/Playlist003.m3u' -desc= -src='https://t.me/iptv_aggregator_chat' - -;################################################### -; детские -;################################################### - -[kid] -name='Детские познавательные' -desc='' -src='' -pls='https://pastebin.com/raw/bvLkNCqV' - -[mult] -name='Советские мультики' -desc='' -pls='https://raw.githubusercontent.com/user797/Playlists/refs/heads/main/Cartoons.m3u8' -src='' - -;################################################### -; веб-камеры -;################################################### - -[cam] -name='Веб-камеры' -desc = -pls='http://gorod.tv/iptv.m3u' -src='https://iptvsensei.ru/samoobnovlyayemyye-pleylisty-iptv' - -[cam2] -name='Веб-камеры' -desc='Со всего мира' -pls='https://dl.dropbox.com/scl/fi/my7c21h9zk2ayxzd28rp1/.m3u?rlkey=ca7lh90r0qqm6ushz9rqyy91r' -src='' - -[cam3] -name='Веб-камеры' -desc='Расширенный cam2' -pls='https://dl.dropbox.com/scl/fi/1jous9zdcxtulcw/Camera.m3u' -src='' - -;################################################### -; миксы -;################################################### - -[mix1] -name='Микс 1' -desc='Россия, Беларусь, Польша, Украина, Литва, Молдова, Египет, Греция' -pls='https://dl.dropbox.com/scl/fi/5kkgez01gq41xdfobu9t1/887.m3u?rlkey=4cewg8idky1vgmax3v1w8kupr&st=pteb5t7l&dl=0' -src='' - -[mix2] -name='Микс 2' -desc='В основном Россия, есть Беларусь и др. зарубежные' -pls='https://dl.dropbox.com/scl/fi/2qqj4pl6fknbl2b/TV.m3u' -src='' - -[mix3] -name='Микс 3' -desc='Россия, Украина, Узбекистан, Казахстан и др. зарубежные' -pls='https://dl.dropbox.com/scl/fi/k8ssgyysmqw3h74fcv3gg/.m3u?rlkey=mr8u5kgl9uhnee0bi52yddurp' -src='' - -[mix4] -name='Микс 4 зарубежный' -desc='Без российских: Китай, Казахстан, Беларусь, Бразилия, Канада, США; Европа, Азия, Ближний восток и др.' -pls='https://dl.dropbox.com/scl/fi/8n22yhvwasfzrk1/Zarub.m3u' -src='' - -[mix5] -name='Микс 5 зарубежный' -desc='Расширенный mix4 с телепрограммой' -pls='https://dl.dropbox.com/scl/fi/l468bhnljav5vwp9mq9a7/.m3u?rlkey=hizmeptzfnjrzsiscu23454bb' -src='' - -[mix6] -name='Микс 6' -desc='Похож на mix1' -pls='https://dl.dropbox.com/scl/fi/tbri62bjrs372wy440ebg/ILook-4756-16.m3u?rlkey=0h1gh4g897el8fjvxvaf443tq&st=acj49kp5&dl=0' -src='' - -[mix6d] -name='Микс 6 дубль' -desc='Каналы те же, что в mix6, но ссылки на потоки другие' -pls='https://dl.dropbox.com/scl/fi/bdrqx8il33d0lfiwuzq4d/ILook-4756-15.m3u?rlkey=ra02fmla2jj6092a3u5yzb3zp&st=pxd0foe7&dl=0' -src='' - -[mix7] -name='Микс 7 зарубежный огромный' -desc='Каналы и фильмы -- Европа, Азия, Ближний восток' -pls='https://dl.dropbox.com/scl/fi/2jute41yvxjocw3/tv_channels_Matrix2022.m3u' -src='' - -[mix8] -name='Микс 8' -desc='Россия, зарубеж' -pls='https://dl.dropbox.com/scl/fi/xbyv4gnz5f3t4tpan0aqc/stream-5.m3u?rlkey=omga60ixe53dnghohnqufq8ch' -src='' - -[mix9] -name='Микс 9' -desc='Россия, зарубеж' -pls='https://dl.dropbox.com/scl/fi/r9o5lpmc23kpn8kqr2xq5/TV44444.m3u?rlkey=h1svmxccs466cd60l55kprmqt&dl=0' -src='' - -[mix10] -name='Микс 10' -desc='Российские каналы -- музыка, кино и сериалы' -pls='https://dl.dropbox.com/scl/fi/0btovnab1pjvqdo/kinokha.m3u' -src='' - -[mix11] -name='Микс 11' -desc='Российские каналы -- музыка, кино и сериалы' -pls='https://dl.dropbox.com/scl/fi/0btovnab1pjvqdo/kinokha.m3u' -src='' - -[mix12] -name='Микс 12 огромный' -desc='Очень много тематик и государств 22000+ теле/радио каналов со всего мира.' -pls='https://dl.dropbox.com/scl/fi/bknr5ndm9qnz8wklbpvin/13sh_tv.m3u?rlkey=9f5jf7teoxc0f77ri6213x7vu' -src='' - -[mix13] -name='Микс 13' -desc='Россия, Казахстан, Польша, Молдова, Турция, Корея, Украина, Великобритания, Азербайджан, Эстония, Беларусь, Италия, Индонезия, Таджикистан, Туркменистан' -pls='https://dl.dropbox.com/scl/fi/z2viao5wrva4bzhdegz42/ColtishkaIPTV.m3u?rlkey=c8tq73gpgyftrnohlc2gm4kmq&st=y57735ba&dl=0' -src='' - -[mix14] -name='Микс 14' -desc='Россия, Молдова, Канада, Казахстан, Турция и мн. др. 4K + HD' -pls='https://dl.dropbox.com/scl/fi/6b20hiys8j27k0icra79w/konkiv_Edi.m3u?rlkey=8ynw7l2b2utzaikfg5x2eyepu&dl=0' -src='' - -[mix15] -name='Микс 15' -desc='Спорт, музыка, кино, радио, детские; Россия, Беларусь, Украина' -pls='https://dl.dropbox.com/scl/fi/mbyei8mfurol7zi/LokoTV.m3u' -src='' - -[mix16] -name='Микс 16' -desc='Россия: очень много кино, спорта и музыки, но не только' -pls='https://dl.dropbox.com/scl/fi/74m171q8t8opwhve485pf/Moi_ip.m3u?rlkey=8cj23dvra85s2u7eh1kfzq4bp' -src='' - -[mix17] -name='Микс 17' -desc='Радио, кино, фильмы 18+; Торрент ТВ, Wink, Catcast, Rutube' -pls='https://dl.dropbox.com/scl/fi/ur595ef4cqmfst951kboh/.NET_2.m3u?rlkey=0cw1ficfrq0m6yg2udh16qn78&dl=0' -src='' - -[mix18] -name='Микс 18' -desc='Россия + каналы всего мира' -pls='https://dl.dropbox.com/scl/fi/ir89ujj1wnabkk88d57bb/2_5192754592034613084.m3u?rlkey=ov8kis4eztaccljnwnlmla1j7&st=4yzsr3m7&dl=0' -src='' - -[mix19] -name='Микс 19' -desc='Россия + каналы всего мира' -pls='https://dl.dropbox.com/scl/fi/idq3ih7akoety1shvhnqg/2_5390947455636366975.m3u?rlkey=hh4rm3ivg4nkdjzs6tmdvv8na&st=vqq4vpzt&dl=0' -src='' - -[mix20] -name='Микс 20' -desc='Расширенный mix19' -pls='https://dl.dropbox.com/scl/fi/9sn2z2yypakdb6xibka0h/2_5390947455636366984.m3u?rlkey=5af4qc5odgyp14wzy5obv5uwi&st=ouwbcr2x&dl=0' -src='' - -[mix20d] -name='Микс 20 дубль' -desc='Каналы те же, что в mix20, но ссылки на потоки другие' -pls='https://dl.dropbox.com/scl/fi/9sn2z2yypakdb6xibka0h/2_5390947455636366984.m3u?rlkey=5af4qc5odgyp14wzy5obv5uwi&st=ouwbcr2x&dl=0' -src='' - -[mix21] -name='Микс 21 большой' -desc='Очень много очень разных' -pls='https://raw.githubusercontent.com/suzukantv/IPTV/refs/heads/main/KolobokHatNet2.m3u' -src='' - -[mix22] -name='Микс 22 большой' -desc='Очень много очень разных' -pls='https://raw.githubusercontent.com/suzukantv/IPTV/refs/heads/main/SuzuSCloudFreeGedemTvNET.m3u' -src='' - -;################################################### -; конкретные страны -;################################################### - -[kz] -name='Казахстан' -desc = -pls='https://raw.githubusercontent.com/iptv-org/iptv/master/streams/kz.m3u' -src='https://github.com/iptv-org/iptv' - -[az] -name='Азербайджан' -desc = -pls='https://raw.githubusercontent.com/iptv-org/iptv/master/streams/az.m3u' -src='https://github.com/iptv-org/iptv' - -;################################################### -; smolnp -;################################################### - -[so] -name='smolnp/IPTVru - Основной плейлист' -desc='250 телеканалов и 13 радиоканалов.' -pls='https://smolnp.github.io/IPTVru/IPTVru.m3u' -src='https://smolnp.github.io/IPTVru' - -[sx] -name='smolnp/IPTVru - Плейлист с телеканалами для взрослых' -desc='250 телеканалов, 13 радиоканалов и 10 телеканалов для взрослых.' -pls='https://smolnp.github.io/IPTVru/IPTVххх.m3u' -src='https://smolnp.github.io/IPTVru' - -;################################################### -; iptv-playlisty.ru -;################################################### - -[2] -name='[iptv-playlisty.ru] Плейлист 2020' -desc='Трансляции для детей и подростков. Сериалы и Премьеры кино. Каналы для женщин и мужских развлечений. Документалистика и исторические лента о событиях прошлого.' -pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/2020.m3u' -src='https://iptv-playlisty.ru/collection/samyj-svezheobnovlennyj-plejlist-iptv-na-2020-god/' - -[3] -name='[iptv-playlisty.ru] Плейлист newplay' -desc='Общефедеральные. Каналы фильмов. Все на русском. Имеются с зарубежными лентами. Спортивные. Как трансляции, так и кино данной тематики. Детские. Мультфильмы и передачи.' -pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/newplay.m3u' -src='https://iptv-playlisty.ru/collection/besplatnyj-iptv-plejlist-formata-m3u/' - -[mus] -name='[iptv-playlisty.ru] Музыкальные IPTV каналы' -desc='Музыкальный плейлист наиболее популярных каналов на нашем телевидении.' -pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/music.m3u' -src='https://iptv-playlisty.ru/janriptv/muzykalnye-iptv-kanaly-v-formate-m3u/' - -[det] -name='[iptv-playlisty.ru] Плейлист детских IPTV каналов' -desc = -pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/deti.m3u' -src='https://iptv-playlisty.ru/janriptv/plejlist-detskix-iptv-kanalov-v-formate-m3u/' - -[det2] -name='[iptv-playlisty.ru] Плейлист IPTV Мультфильмов для детей и подростков' -desc = -pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/multy.m3u' -src='https://iptv-playlisty.ru/janriptv/plejlist-iptv-multfilmov-dlya-detej-i-podrostkov/' - -[poz] -name='[iptv-playlisty.ru] Плейлист IPTV образовательных каналов' -desc='В список вошло более десятка трансляций. Зритель сможет найти здесь передачи для разностороннего обучения и в целом просвещения.' -pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/obrazovanie.m3u' -src='https://iptv-playlisty.ru/janriptv/plejlist-iptv-obrazovatelnyx-kanalov-m3u/' - -[poz2] -name='[iptv-playlisty.ru] Познавательные каналы IPTV плейлист' -desc='Наиболее подходящие трансляции, с выпусками интересных познавательных передач на любой вкус' -pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/poznav.m3u' -src='https://iptv-playlisty.ru/janriptv/poznavatelnye-kanaly-iptv-plejlist-v-formate-m3u/' - -[moda] -name='[iptv-playlisty.ru] Плейлист IPTV модных телеканалов' -desc='Сюда вошли только топовые компании, на которых ежедневно рассказывают о последних тенденциях в одежде и дизайне.' -pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/moda.m3u' -src='https://iptv-playlisty.ru/janriptv/plejlist-iptv-modnyx-telekanalov-m3u/' - -[fun] -name='[iptv-playlisty.ru] Плейлист IPTV каналов развлечений' -desc='Огромное количество развлекательных каналов' -pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/razvlechenie.m3u' -src='https://iptv-playlisty.ru/janriptv/plejlist-iptv-kanalov-razvlechenij/' - -[hd] -name='[iptv-playlisty.ru] Плейлист IPTV каналов в HD формате' -desc='Плейлист доступных по настоящий момент HD каналов' -pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/hd.m3u' -src='https://iptv-playlisty.ru/janriptv/plejlist-iptv-kanalov-v-hd-formate/' - -[nauka] -name='[iptv-playlisty.ru] Научные IPTV каналы в формате' -desc='Современные научные каналы: история, документальное кино, психология, культура...' -pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/nauka.m3u' -src='https://iptv-playlisty.ru/janriptv/nauchnye-iptv-kanaly-v-formate-m3u/' - -[eda] -name='[iptv-playlisty.ru] IPTV плейлист кулинарных каналов' -desc='В список вошли наиболее интересные кулинарные каналы в формате M3U. Большинство каналов на русском языке' -pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/eda.m3u' -src='https://iptv-playlisty.ru/janriptv/iptv-plejlist-kulinarnyx-kanalov/' - -[heal] -name='[iptv-playlisty.ru] IPTV плейлист каналов здоровья' -desc = -pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/zdorov.m3u' -src='https://iptv-playlisty.ru/janriptv/iptv-plejlist-kanalov-zdorovya/' - -[sport] -name='[iptv-playlisty.ru] Плейлист IPTV спортивных каналов' -desc='В коллекции можно встретить: футбольные матчи, баскетбольные встречи, теннис, хоккей, автоспорт и даже гольф.' -pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/sport.m3u' -src='https://iptv-playlisty.ru/janriptv/plejlist-iptv-sportivnyx-kanalov/' - -[strah] -name='[iptv-playlisty.ru] Бесплатный IPTV плейлист каналов ужасов' -desc = -pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/Strah.m3u' -src='https://iptv-playlisty.ru/janriptv/besplatnyj-iptv-plejlist-kanalov-uzhasov/' - -[his] -name='[iptv-playlisty.ru] IPTV плейлист телеканала History' -desc = -pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/history.m3u' -src='https://iptv-playlisty.ru/iptv-kanaly/iptv-plejlist-telekanala-history/' - -[dis] -name='[iptv-playlisty.ru] IPTV плейлист телеканала Discovery' -desc = -pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/discovery.m3u' -src='https://iptv-playlisty.ru/iptv-kanaly/iptv-plejlist-telekanala-discovery/' - -[ngeo] -name='[iptv-playlisty.ru] IPTV плейлист канала National Geographic' -desc = -pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/ngeografik.m3u' -src='https://iptv-playlisty.ru/iptv-kanaly/iptv-plejlist-kanala-national-geographic/' - -;################################################### -; telekarta -;################################################### - -[tru] -name='[telekarta] IPTV плейлист с ТВ каналами России 2024' -desc='Бесплатный и рабочий iptv плейлист c ТВ каналами России.' -pls='https://telekarta-tv.ru/wp-content/uploads/ru-all-1.m3u' -src='https://telekarta-tv.ru/iptv/playlist-russia/' - -[tsa] -name='[telekarta] IPTV плейлист самообновляемый 2024' -desc='Бесплатный и рабочий iptv плейлист с самообновлением с различными каналами.' -pls='https://telekarta-tv.ru/wp-content/uploads/sam.m3u' -src='https://telekarta-tv.ru/iptv/playlist-samoobnovlyaemy/' - -[tby] -name='[telekarta] Бесплатный и рабочий iptv плейлист с ТВ каналами Беларуси.' -desc='Бесплатный и рабочий iptv плейлист с ТВ каналами Беларуси. В нём вы найдёте основные каналы страны – БелРос, Витебск, Беларусь 4 и другие.' -pls='https://telekarta-tv.ru/wp-content/uploads/by.m3u' -src='https://telekarta-tv.ru/iptv/playlist-s-tv-kanalami-belarusi/' - -[tkz] -name='[telekarta] IPTV плейлист с ТВ каналами Казахстана' -desc='Бесплатный и рабочий iptv плейлист с популярными ТВ каналами Казахстана.' -pls='https://telekarta-tv.ru/wp-content/uploads/kaz.m3u' -src='https://telekarta-tv.ru/iptv/playlist-s-tv-kanalami-kazahstana/' - -[tuz] -name='[telekarta] IPTV плейлист с ТВ каналами Узбекистана' -desc='Бесплатный и рабочий iptv плейлист с ТВ каналами Узбекистана. В данном плейлисте вы найдёте более 20 каналов.' -pls='https://telekarta-tv.ru/wp-content/uploads/uz.m3u' -src='https://telekarta-tv.ru/iptv/playlist-s-tv-kanalami-uzbekistana/' - -[ttr] -name='[telekarta] IPTV плейлист с ТВ каналами Турции' -desc='В плейлисте вы найдёте десятки каналов Турции. Также в плейлисты есть каналы других стран, которые ведут трансляцию в Турции.' -pls='https://telekarta-tv.ru/wp-content/uploads/tr.m3u' -src='https://telekarta-tv.ru/iptv/playlist-s-kanalami-turkey/' - -[tm] -name='[telekarta] IPTV плейлист с музыкальными каналами 2024' -desc='Бесплатный и рабочий iptv плейлист музыкальных каналов с клипами и треками.' -pls='https://telekarta-tv.ru/wp-content/uploads/music_new.m3u' -src='https://telekarta-tv.ru/iptv/playlist-music/' - -[tw] -name='[telekarta] IPTV плейлист с веб-камерами мира 2024' -desc='IPTV плейлист с веб-камерами перенесет вас в любую точку земного шара за считанные секунды. В данном плейлисте вы найдёте камеры со всего мира.' -pls='https://telekarta-tv.ru/wp-content/uploads/webcam.m3u' -src='https://telekarta-tv.ru/iptv/playlist-s-veb-kamerami-mira/' - -[tl] -name='[telekarta] IPTV плейлист с познавательными ТВ каналами 2024' -desc='Бесплатный и рабочий iptv плейлист с познавательными ТВ каналами.' -pls='https://telekarta-tv.ru/wp-content/uploads/sci-all.m3u' -src='https://telekarta-tv.ru/iptv/playlist-s-poznavatelnymi-tv-kanalami/' - -[te] -name='[telekarta] IPTV плейлист с русскими каналами и фильмами от Edem TV 2024' -desc='Бесплатный и рабочий iptv плейлист с русскими каналами и фильмами от Edem TV.' -pls='https://telekarta-tv.ru/wp-content/uploads/playlist_edemtv.m3u' -src='https://telekarta-tv.ru/iptv/playlist-russian/' - -[tf] -name='[telekarta] IPTV плейлист с фильмами 2024' -desc='Бесплатный и рабочий iptv плейлист фильмов и мультфильмов. 1700+ фильмов' -pls='https://telekarta-tv.ru/wp-content/uploads/cinematic-2.m3u' -src='https://telekarta-tv.ru/iptv/playlist-films/' - -[tf2] -name='[telekarta] IPTV плейлист с фильмами и сериалами 2024' -desc='Для киноманов мы подготовили IPTV плейлист с фильмами и сериалами.' -pls='https://telekarta-tv.ru/wp-content/uploads/movies1700.m3u' -src='https://telekarta-tv.ru/iptv/playlisty-s-filmami-i-serialami/' - -[th] -name='[telekarta] IPTV плейлист каналов ужасов на 2024' -desc='Бесплатный и рабочий iptv плейлист с ТВ каналами ужасов. В данном плейлисте вы найдёте 3 канала.' -pls='https://telekarta-tv.ru/wp-content/uploads/strah.m3u' -src='https://telekarta-tv.ru/iptv/playlist-kanalov-uzhasov/' - -[tng] -name='[telekarta] IPTV плейлист National Geographic' -desc='В трансляции канала входит множество телепрограмм, которые понравятся большему числу пользователей.' -pls='https://telekarta-tv.ru/wp-content/uploads/ngeografik.m3u' -src='https://telekarta-tv.ru/iptv/playlist-national-geographic/' - -[tr] -name='[telekarta] IPTV плейлист с радио 2024' -desc='Бесплатный и рабочий iptv плейлист с радио. 600+ каналов' -pls='https://telekarta-tv.ru/wp-content/uploads/radio.m3u' -src='https://telekarta-tv.ru/iptv/playlist-s-radio/' - -[tk] -name='[telekarta] IPTV плейлист с детскими каналами 2024' -desc='Бесплатный и рабочий iptv плейлист детских каналов. 30 каналов, 600+ фильмов' -pls='https://telekarta-tv.ru/wp-content/uploads/kids-all.m3u' -src='https://telekarta-tv.ru/iptv/playlist-kids/' - -[t3d] -name='[telekarta] IPTV плейлист с фильмами 3D 2024' -desc='Бесплатный и рабочий iptv плейлист с фильмами 3D.' -pls='https://telekarta-tv.ru/wp-content/uploads/3d-film.m3u' -src='https://telekarta-tv.ru/iptv/playlist-3d/' - -[t60] -name='[telekarta] IPTV плейлист с фильмами 60fps 2024' -desc='Бесплатный и рабочий iptv плейлист с фильмами 60fps. 27 фильмов' -pls='https://telekarta-tv.ru/wp-content/uploads/filmy_60_fps-1.m3u' -src='https://telekarta-tv.ru/iptv/playlist-60fps/' - -[ts] -name='[telekarta] IPTV плейлист со спортивными каналами 2024' -desc='По требованию правообладателей в списке нет и не будет: Матч ТВ!, Наш Футбол, Матч! Кхл, Матч! Боец, Матч! Спорт плюс, Конный, Футбол 1, 2, 3 (Украина), Футбол 1, Футбол 2, Футбол 3.' -pls='https://telekarta-tv.ru/wp-content/uploads/sport-all.m3u' -src='https://telekarta-tv.ru/iptv/playlist-sport/' - -[tx] -name='[telekarta] IPTV плейлист с каналами и фильмами для взрослых 2024' -desc='Бесплатный и рабочий iptv плейлист с каналами и фильмами для взрослых. 50 каналов, 400 фильмов' -pls='https://telekarta-tv.ru/wp-content/uploads/18_xxx.m3u' -src='https://telekarta-tv.ru/iptv/playlist-xxx/' - -;################################################### -; tviptv -;################################################### - -[25ru] -name='[tviptv] Российские федеральные' -desc='' -pls='https://tviptv.ru/upl/25rus238zl.m3u' -src='' - -[25kino] -name='[tviptv] Российские киноканалы' -desc='' -pls='https://tviptv.ru/upl/25kino8ds66.m3u' -src='' - -[25kids] -name='[tviptv] Российские детские' -desc='' -pls='https://tviptv.ru/upl/25kids18h4v.m3u' -src='' - -[25pozn] -name='[tviptv] Российские познавательные' -desc='' -pls='https://tviptv.ru/upl/25pozn0877.m3u' -src='' - -[25sp] -name='[tviptv] Спортивные' -desc='' -pls='https://tviptv.ru/upl/25sport56kr.m3u' -src='' - -[25mus] -name='[tviptv] Музыкальные' -desc='' -pls='https://tviptv.ru/upl/25music124x6.m3u' -src='' - -;################################################### -; Karnei4 -;################################################### - -[kk1] -name='[Karnei4] Films-FREE' -desc='' -pls='https://raw.githubusercontent.com/Karnei4/Karnei4.github.io/refs/heads/master/Films-FREE-Karnei4.m3u' -src='https://github.com/Karnei4/Karnei4.github.io' - -[kk2] -name='[Karnei4] Zabava-FREE' -desc='' -pls='https://raw.githubusercontent.com/Karnei4/Karnei4.github.io/refs/heads/master/s/Mediacentr/Zabava-FREE-Karnei4.m3u' -src='https://github.com/Karnei4/Karnei4.github.io' - -[kr] -name='[Karnei4] Россия' -desc='Каналов относительно немного, но очень много часовых поясов' -pls='https://dl.dropbox.com/scl/fi/3jaul2v9tbynfnp/PlayList-Karnei4-M3U-1763.m3u' -src='' - -;################################################### -; blackbird -;################################################### - -[bb1] -name='[blackbird] IPTVPlay' -desc='' -pls='https://raw.githubusercontent.com/blackbirdstudiorus/IPTVPlay/refs/heads/main/IPTVPlay.m3u' -src='https://github.com/blackbirdstudiorus/IPTVPlay' - -[bb2] -name='[blackbird] LoganetXAll' -desc='' -pls='https://raw.githubusercontent.com/blackbirdstudiorus/LoganetXIPTV/refs/heads/main/LoganetXAll.m3u' -src='https://github.com/blackbirdstudiorus/LoganetXIPTV' - -[bb3] -name='[blackbird] LoganetXStrawberry' -desc='' -pls='https://raw.githubusercontent.com/blackbirdstudiorus/LoganetXIPTV/refs/heads/main/LoganetXStrawberry.m3u' -src='https://github.com/blackbirdstudiorus/LoganetXIPTV' - -;################################################### -; suzukantv -;################################################### - -[sr] -name='[suzukantv] Радио' -desc='' -pls='https://raw.githubusercontent.com/suzukantv/IPTV/refs/heads/main/SuzuSCloudTvNET.m3u' -src='https://github.com/suzukantv/IPTV' - -[st] -name='[suzukantv] TorrentTV' -desc='' -pls='https://raw.githubusercontent.com/suzukantv/IPTV/refs/heads/main/TorrentTV.m3u' -src='https://github.com/suzukantv/IPTV' - -[swz] -name='[suzukantv] WinkZabava' -desc='' -pls='https://raw.githubusercontent.com/suzukantv/IPTV/refs/heads/main/WinkZabava.m3u' -src='https://github.com/suzukantv/IPTV' - -;################################################### -; dmi3y-tv -;################################################### - -[d] -name='[dmi3y-tv] D-TV6' -pls='http://dmi3y-tv.ru/iptv/D-TV6.m3u' -desc='Телеканал «D-TV6» - Интерактивный российский федеральный телеканал. Cпециализирующийся на сериалах, художественных и документальных фильмах познавательного характера.' -src='http://dmi3y-tv.ru/d-tv/ch_d-tv6/' - -[dh] -name='[dmi3y-tv] Dmitry-tv HD' -pls='http://dmi3y-tv.ru/iptv/Dmitry-tvHD.m3u' -desc='Телеканал «Dmitry-tv HD» - Интерактивный российский федеральный телеканал. Только русские музыкальные видеоклипы в Full HD качестве.' -src='http://dmi3y-tv.ru/d-tv/ch_dmitry-tv/' - -[d1] -name='[dmi3y-tv] Playlist-01' -pls='http://dmi3y-tv.ru/iptv/Playlist-01.m3u' -desc='300+ каналов (гибрид, Беларусь, СМОТРИМ)' -src='http://dmi3y-tv.ru/d-tv/playlist/m3u/' - -[dg] -name='[dmi3y-tv] Playlist-01 (GTMedia)' -pls='http://dmitry-tv.ddns.net/iptv/freesat/gtmedia/Playlist-01/custom_url.m3u' -desc='300+ каналов (гибрид, Беларусь, СМОТРИМ)' -src='http://dmi3y-tv.ru/d-tv/playlist/freesat/' - -[d1m1] -name='[dmi3y-tv] Playlist-01 Mobile 360p' -pls='http://dmi3y-tv.ru/iptv/Playlist-01_360p.m3u' -desc='14 каналов (гибрид)' -src='http://dmi3y-tv.ru/d-tv/playlist/mobile/' - -[d1m2] -name='[dmi3y-tv] Playlist-01 Mobile 480p' -pls='http://dmi3y-tv.ru/iptv/Playlist-01_480p.m3u' -desc='14 каналов (гибрид)' -src='http://dmi3y-tv.ru/d-tv/playlist/mobile/' - -[d4] -name='[dmi3y-tv] Playlist-04' -pls='http://dmi3y-tv.ru/iptv/Playlist-04.m3u' -desc='4 канала (Беларусь)' -src='http://dmi3y-tv.ru/d-tv/playlist/m3u/' - -[d5] -name='[dmi3y-tv] Playlist-05' -pls='http://dmi3y-tv.ru/iptv/Playlist-05.m3u' -desc='650+ каналов (гибрид, Беларусь, СМОТРИМ, ZABAVA)' -src='http://dmi3y-tv.ru/d-tv/playlist/freesat/' - -[d5m1] -name='[dmi3y-tv] Playlist-05 Mobile 360p' -pls='http://dmi3y-tv.ru/iptv/Playlist-05_360p.m3u' -desc='157 каналов (ZABAVA)' -src='http://dmi3y-tv.ru/d-tv/playlist/mobile/' - -[d5m2] -name='[dmi3y-tv] Playlist-05 Mobile 480p' -pls='http://dmi3y-tv.ru/iptv/Playlist-05_480p.m3u' -desc='157 каналов (ZABAVA)' -src='http://dmi3y-tv.ru/d-tv/playlist/mobile/' - -[d5g] -name='[dmi3y-tv] Playlist-05 (GTMedia)' -pls='http://dmitry-tv.ddns.net/iptv/freesat/gtmedia/Playlist-05/custom_url.m3u' -desc='650+ каналов (гибрид, Беларусь, СМОТРИМ, ZABAVA)' -src='http://dmi3y-tv.ru/d-tv/playlist/freesat/' - -[ds] -name='[dmi3y-tv] СМОТРИМ' -pls='http://dmi3y-tv.ru/iptv/smotrim.m3u' -desc='150+ каналов (СМОТРИМ)' -src='http://dmi3y-tv.ru/d-tv/playlist/m3u/' - -[dt] -name='[dmi3y-tv] Dmitry-tv' -pls='http://dmi3y-tv.ru/iptv/Dmitry-tv.m3u' -desc='390+ каналов (гибрид, Беларусь, СМОТРИМ, Яндекс ТВ)' -src='http://dmi3y-tv.ru/d-tv/playlist/m3u/' - -[dd] -name='[dmi3y-tv] ВСЕ КАНАЛЫ' -pls='http://dmi3y-tv.ru/iptv/d-tv.m3u' -desc='гибрид, Беларусь, СМОТРИМ, ZABAVA, Яндекс ТВ' -src='http://dmi3y-tv.ru/d-tv/playlist/freesat/' - -[dm] -name='[dmi3y-tv] ВСЕ МУЛЬТ/ФИЛЬМЫ' -pls='http://dmi3y-tv.ru/iptv/film_d-tv.m3u' -desc='420+ мульт/фильмов' -src='http://dmi3y-tv.ru/d-tv/playlist/freesat/' - -[dr] -name='[dmi3y-tv] AM Radio' -pls='http://dmi3y-tv.ru/iptv/AMRADIO.m3u' -desc='69 радиоканалов' -src='http://dmi3y-tv.ru/d-tv/playlist/fm/' - -[de1] -name='[dmi3y-tv] "ЦИФРОВОЕ ЭФИРНОЕ IPTV" => "Android"' -pls='http://dmi3y-tv.ru/iptv/DVB-T2/CH-1.m3u' -desc='Калининград МСК-1' -src='http://dmi3y-tv.ru/d-tv/playlist/c_iptv/' - -[de2] -name='[dmi3y-tv] "ЦИФРОВОЕ ЭФИРНОЕ IPTV" => "Android"' -pls='http://dmi3y-tv.ru/iptv/DVB-T2/CH_0.m3u' -desc='МСК' -src='http://dmi3y-tv.ru/d-tv/playlist/c_iptv/' - -[de3] -name='[dmi3y-tv] "ЦИФРОВОЕ ЭФИРНОЕ IPTV" => "Android"' -pls='http://dmi3y-tv.ru/iptv/DVB-T2/CH_3.m3u' -desc='Омск МСК+3' -src='http://dmi3y-tv.ru/d-tv/playlist/c_iptv/' - -[de4] -name='[dmi3y-tv] "ЦИФРОВОЕ ЭФИРНОЕ IPTV" => "Android"' -pls='http://dmi3y-tv.ru/iptv/DVB-T2/CH_4.m3u' -desc='Красноярск МСК+4' -src='http://dmi3y-tv.ru/d-tv/playlist/c_iptv/' - -[de5] -name='[dmi3y-tv] "ЦИФРОВОЕ ЭФИРНОЕ IPTV" => "Android"' -pls='http://dmi3y-tv.ru/iptv/DVB-T2/CH_5.m3u' -desc='Иркутск МСК+5' -src='http://dmi3y-tv.ru/d-tv/playlist/c_iptv/' - -[de7] -name='[dmi3y-tv] "ЦИФРОВОЕ ЭФИРНОЕ IPTV" => "Android"' -pls='http://dmi3y-tv.ru/iptv/DVB-T2/CH_7.m3u' -desc='Владивосток МСК+7' -src='http://dmi3y-tv.ru/d-tv/playlist/c_iptv/' - -[de8] -name='[dmi3y-tv] "ЦИФРОВОЕ ЭФИРНОЕ IPTV" => "Android"' -pls='http://dmi3y-tv.ru/iptv/DVB-T2/CH_8.m3u' -desc='Сахалин МСК+8' -src='http://dmi3y-tv.ru/d-tv/playlist/c_iptv/' - -[de9] -name='[dmi3y-tv] "ЦИФРОВОЕ ЭФИРНОЕ IPTV" => "Android"' -pls='http://dmi3y-tv.ru/iptv/DVB-T2/CH_9.m3u' -desc='Камчатка МСК+9' -src='http://dmi3y-tv.ru/d-tv/playlist/c_iptv/' - -[dz] -name='[dmi3y-tv] ZABAVA' -pls='http://dmi3y-tv.ru/iptv/ZABAVA.m3u' -desc='350+ каналов (ZABAVA)' -src='http://dmi3y-tv.ru/d-tv/playlist/m3u/' - -[dzg] -name='[dmi3y-tv] ZABAVA (GTMedia)' -pls='http://dmitry-tv.ddns.net/iptv/freesat/gtmedia/ZABAVA/custom_url.m3u' -desc='350+ каналов (ZABAVA)' -src='http://dmi3y-tv.ru/d-tv/playlist/freesat/' - -[dza] -name='[dmi3y-tv] Региональные: Абакан (Республика Хакасия)/ABAKAN_KHAK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_ABAKAN_KHAK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dza2] -name='[dmi3y-tv] Региональные: Абакан/ABAKAN.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_ABAKAN.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzal] -name='[dmi3y-tv] Региональные: Алтайский край/ZABAVA_ALTAY.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_ALTAY.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzar] -name='[dmi3y-tv] Региональные: Архангельск/ARKH.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_ARKH.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzar2] -name='[dmi3y-tv] Региональные: Архангельская область/ARKH_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_ARKH_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzas] -name='[dmi3y-tv] Региональные: Астраханская область/ASTRH_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_ASTRH_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzas2] -name='[dmi3y-tv] Региональные: Астрахань/ASTRH.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_ASTRH.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzac] -name='[dmi3y-tv] Региональные: Ачинск/ACHINSK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_ACHINSK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzb] -name='[dmi3y-tv] Региональные: Барнаул/BUL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_BUL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzbe] -name='[dmi3y-tv] Региональные: Белгород/BELG.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_BELG.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzbo] -name='[dmi3y-tv] Региональные: Белгородская область/BELG_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_BELG_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzbi] -name='[dmi3y-tv] Региональные: Бийск/BIYSK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_BIYSK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzd] -name='[dmi3y-tv] Региональные: Биробиджан/DV_BIR.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_DV_BIR.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzbl] -name='[dmi3y-tv] Региональные: Благовещенск/DV_BLAG.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_DV_BLAG.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzbr] -name='[dmi3y-tv] Региональные: Братск/BRATSK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_BRATSK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzby] -name='[dmi3y-tv] Региональные: Брянск/BRYANSK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_BRYANSK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzby2] -name='[dmi3y-tv] Региональные: Брянская область/BRYANSK_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_BRYANSK_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzbu] -name='[dmi3y-tv] Региональные: Бурятия/BURAT.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_BURAT.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzvn] -name='[dmi3y-tv] Региональные: Великий Новгород/NOVG.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_NOVG.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzv] -name='[dmi3y-tv] Региональные: Владивосток/DV_VLD.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_DV_VLD.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzvk] -name='[dmi3y-tv] Региональные: Владикавказ/VKAZ.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_VKAZ.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzvl] -name='[dmi3y-tv] Региональные: Владимир/VLAD.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_VLAD.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzvo] -name='[dmi3y-tv] Региональные: Владимирская область/VLAD_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_VLAD_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzvg] -name='[dmi3y-tv] Региональные: Волгоград/VGRAD.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_VGRAD.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzvgo] -name='[dmi3y-tv] Региональные: Волгоградская область/VGRAD_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_VGRAD_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzvd] -name='[dmi3y-tv] Региональные: Вологда/VOL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_VOL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzvdo] -name='[dmi3y-tv] Региональные: Вологодская область/VOL_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_VOL_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzvr] -name='[dmi3y-tv] Региональные: Воронеж/VRZH.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_VRZH.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzvro] -name='[dmi3y-tv] Региональные: Воронежская область/VRZH_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_VRZH_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzga] -name='[dmi3y-tv] Региональные: Горно-Алтайск/GALT.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_GALT.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dze] -name='[dmi3y-tv] Региональные: Екатеринбург/EKT.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_EKT.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzi] -name='[dmi3y-tv] Региональные: Иваново/IVAN.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_IVAN.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dziz] -name='[dmi3y-tv] Региональные: Ижевск/IZHSK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_IZHSK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzig] -name='[dmi3y-tv] Региональные: Ингушетия/ING.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_ING.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzir] -name='[dmi3y-tv] Региональные: Иркутск/IRK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_IRK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzio] -name='[dmi3y-tv] Региональные: Иркутская область/IRK_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_IRK_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzy] -name='[dmi3y-tv] Региональные: Йошкар-Ола/YOLA.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_YOLA.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzk] -name='[dmi3y-tv] Региональные: Казань/KZN.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_KZN.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzkl] -name='[dmi3y-tv] Региональные: Калининград/KLGR.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_KLGR.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzkg] -name='[dmi3y-tv] Региональные: Калуга/KALUGA.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_KALUGA.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzka] -name='[dmi3y-tv] Региональные: Камчатка/DV_KAM.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_DV_KAM.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzke] -name='[dmi3y-tv] Региональные: Кемерово/KEM.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_KEM.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzkeo] -name='[dmi3y-tv] Региональные: Кемеровская область/KEM_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_KEM_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzki] -name='[dmi3y-tv] Региональные: Киров/KIROV.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_KIROV.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzko] -name='[dmi3y-tv] Региональные: Коми/KOMI.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_KOMI.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzks] -name='[dmi3y-tv] Региональные: Кострома/KOSTROMA.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_KOSTROMA.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzkd] -name='[dmi3y-tv] Региональные: Краснодар/KRDAR.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_KRDAR.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzkdk] -name='[dmi3y-tv] Региональные: Краснодарский край/KRDAR_KRAI.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_KRDAR_KRAI.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzkk] -name='[dmi3y-tv] Региональные: Красноярск/KRSK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_KRSK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzkkk] -name='[dmi3y-tv] Региональные: Красноярский край/KRSK_KRAI.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_KRSK_KRAI.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzku] -name='[dmi3y-tv] Региональные: Курган/KRG.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_KRG.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzkur] -name='[dmi3y-tv] Региональные: Курск/KURSK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_KURSK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzkoro] -name='[dmi3y-tv] Региональные: Курская область/KURSK_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_KURSK_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzt] -name='[dmi3y-tv] Региональные: Кызыл/TUVA.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_TUVA.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzl] -name='[dmi3y-tv] Региональные: Липецк/LIPETSK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_LIPETSK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzm] -name='[dmi3y-tv] Региональные: Магадан/DV_MGDN.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_DV_MGDN.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzma] -name='[dmi3y-tv] Региональные: Майкоп/MAYK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_MAYK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzmh] -name='[dmi3y-tv] Региональные: Махачкала/MAHACHK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_MAHACHK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzmo] -name='[dmi3y-tv] Региональные: Москва/MOS.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_MOS.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzmu] -name='[dmi3y-tv] Региональные: Мурманск/MURM.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_MURM.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzn] -name='[dmi3y-tv] Региональные: Нальчик/NALCH.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_NALCH.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dznm] -name='[dmi3y-tv] Региональные: Нарьян-Мар/NAO.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_NAO.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dznn] -name='[dmi3y-tv] Региональные: Нижний Новгород/NN.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_NN.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dznt] -name='[dmi3y-tv] Региональные: Нижний Тагил/NTAG.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_NTAG.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzno] -name='[dmi3y-tv] Региональные: Новгородская область/NOVG_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_NOVG_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dznz] -name='[dmi3y-tv] Региональные: Новозыбков/NZB.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_NZB.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dznk] -name='[dmi3y-tv] Региональные: Новокузнецк/NVKZ.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_NVKZ.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dznr] -name='[dmi3y-tv] Региональные: Новороссийск/NVR.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_NVR.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzns] -name='[dmi3y-tv] Региональные: Новосибирск/NSK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_NSK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dznso] -name='[dmi3y-tv] Региональные: Новосибирская область/NSK_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_NSK_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dznb] -name='[dmi3y-tv] Региональные: Ноябрьск/NBK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_NBK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzo] -name='[dmi3y-tv] Региональные: Обнинск/OBN.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_OBN.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzom] -name='[dmi3y-tv] Региональные: Омск/OMSK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_OMSK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzomo] -name='[dmi3y-tv] Региональные: Омская область/OMSK_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_OMSK_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzor] -name='[dmi3y-tv] Региональные: Орел/ORL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_ORL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzob] -name='[dmi3y-tv] Региональные: Оренбург/ORB.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_ORB.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzoro] -name='[dmi3y-tv] Региональные: Орловская область/ORL_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_ORL_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzos] -name='[dmi3y-tv] Региональные: Орск/ORSK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_ORSK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzpe] -name='[dmi3y-tv] Региональные: Пенза/PENZA.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_PENZA.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzpr] -name='[dmi3y-tv] Региональные: Пермь/PERM.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_PERM.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzp] -name='[dmi3y-tv] Региональные: Петрозаводск (Республика Карелия)/PZAV_RK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_PZAV_RK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzpz] -name='[dmi3y-tv] Региональные: Петрозаводск/PZAV.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_PZAV.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzps] -name='[dmi3y-tv] Региональные: Псков/PSKV.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_PSKV.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzpo] -name='[dmi3y-tv] Региональные: Псковская область/PSKV_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_PSKV_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzr] -name='[dmi3y-tv] Региональные: Ростов на Дону/RD.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_RD.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzro] -name='[dmi3y-tv] Региональные: Ростовская область/RD_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_RD_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzry] -name='[dmi3y-tv] Региональные: Рыбинск/RYB.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_RYB.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzrz] -name='[dmi3y-tv] Региональные: Рязань/RYAZ.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_RYAZ.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzs] -name='[dmi3y-tv] Региональные: Самара/SAMARA.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_SAMARA.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzsp] -name='[dmi3y-tv] Региональные: Санкт-Петербург/SPB.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_SPB.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzsa] -name='[dmi3y-tv] Региональные: Саранск/SRNK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_SRNK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzsr] -name='[dmi3y-tv] Региональные: Саратов/SARATOV.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_SARATOV.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzsh] -name='[dmi3y-tv] Региональные: Сахалин/DV_SLIN.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_DV_SLIN.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzsho] -name='[dmi3y-tv] Региональные: Сахалинская область/DV_SLIN_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_DV_SLIN_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzsm] -name='[dmi3y-tv] Региональные: Смоленск/SMOL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_SMOL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzso] -name='[dmi3y-tv] Региональные: Сочи/SOCHI.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_SOCHI.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzst] -name='[dmi3y-tv] Региональные: Ставрополь/STAVR.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_STAVR.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzstk] -name='[dmi3y-tv] Региональные: Ставропольский край/STAVR_KRAI.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_STAVR_KRAI.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzsk] -name='[dmi3y-tv] Региональные: Старый Оскол/OSK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_OSK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzsu] -name='[dmi3y-tv] Региональные: Сургут/SUR.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_SUR.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzsy] -name='[dmi3y-tv] Региональные: Сыктывкар/SKTV.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_SKTV.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzta] -name='[dmi3y-tv] Региональные: Тамбов/TAMB.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_TAMB.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dztvo] -name='[dmi3y-tv] Региональные: Тверская область/TVER_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_TVER_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dztv] -name='[dmi3y-tv] Региональные: Тверь/TVER.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_TVER.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzto] -name='[dmi3y-tv] Региональные: Томск/TOMSK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_TOMSK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dztoo] -name='[dmi3y-tv] Региональные: Томская область/TOMSK_OBL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_TOMSK_OBL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dztu] -name='[dmi3y-tv] Региональные: Тула/TULA.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_TULA.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzty] -name='[dmi3y-tv] Региональные: Тюмень/TUM.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_TUM.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzu] -name='[dmi3y-tv] Региональные: Улан-Удэ/UUDE.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_UUDE.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzul] -name='[dmi3y-tv] Региональные: Ульяновск/UL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_UL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzuf] -name='[dmi3y-tv] Региональные: Уфа/UFA.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_UFA.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzh] -name='[dmi3y-tv] Региональные: Хабаровск/DV_HVSK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_DV_HVSK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzc] -name='[dmi3y-tv] Региональные: Чебоксары/CHR.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_CHR.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzcb] -name='[dmi3y-tv] Региональные: Челябинск/CHEL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_CHEL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzce] -name='[dmi3y-tv] Региональные: Черкесия/CHERKS.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_CHERKS.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzct] -name='[dmi3y-tv] Региональные: Чита (Забайкальский край)/CHITA_ZK.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_CHITA_ZK.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzct2] -name='[dmi3y-tv] Региональные: Чита/CHITA.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_CHITA.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzel] -name='[dmi3y-tv] Региональные: Элиста/ELISTA.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_ELISTA.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzyk] -name='[dmi3y-tv] Региональные: Якутск/DV_YKT.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_DV_YKT.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -[dzyr] -name='[dmi3y-tv] Региональные: Ярославль/YARL.m3u' -pls='http://dmi3y-tv.ru/iptv/region/ZABAVA_YARL.m3u' -desc='' -src='http://dmi3y-tv.ru/d-tv/playlist/zabava/region/1' - -;################################################### -; редиректы -;################################################### - -; [from_code] -; redirect=to_code - diff --git a/src/.env.example b/src/.env.example deleted file mode 100644 index da185b7..0000000 --- a/src/.env.example +++ /dev/null @@ -1,18 +0,0 @@ -# config/app.php -APP_DEBUG=false -APP_ENV=prod -APP_URL=http://localhost:8080 -APP_TITLE='IPTV Плейлисты' -USER_AGENT='Mozilla/5.0 (Windows NT 10.0; Win64; x99) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36' -PAGE_SIZE=10 - -# config/redis.php -REDIS_HOST='keydb' -REDIS_PORT=6379 -REDIS_PASSWORD= -REDIS_DB=0 -REDIS_TTL_DAYS=14 - -# config/redis.php -TWIG_USE_CACHE=true -TWIG_DEBUG=false diff --git a/src/app/Controllers/ApiController.php b/src/app/Controllers/ApiController.php deleted file mode 100644 index 11ac970..0000000 --- a/src/app/Controllers/ApiController.php +++ /dev/null @@ -1,36 +0,0 @@ -getAttributes()['code']; - $playlist = $this->getPlaylist($code, true); - $playlist->fetchContent(); - $playlist->parse(); - - $json = json_encode($playlist->toArray(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); - $response->getBody()->write($json); - - return $response - ->withHeader('Content-Type', 'application/json') - ->withHeader('Content-Length', strlen($json)); - } -} diff --git a/src/app/Controllers/BasicController.php b/src/app/Controllers/BasicController.php deleted file mode 100644 index c4dc24c..0000000 --- a/src/app/Controllers/BasicController.php +++ /dev/null @@ -1,58 +0,0 @@ -withStatus(404); - $this->view($request, $response, 'notfound.twig'); - - return $response; - } - - /** - * @param ServerRequestInterface $request - * @param ResponseInterface $response - * @param string $template - * @param array $data - * @return ResponseInterface - * @throws LoaderError - * @throws RuntimeError - * @throws SyntaxError - */ - protected function view( - ServerRequestInterface $request, - ResponseInterface $response, - string $template, - array $data = [], - ): ResponseInterface { - $view = Twig::fromRequest($request); - return $view->render($response, $template, $data); - } -} diff --git a/src/app/Controllers/WebController.php b/src/app/Controllers/WebController.php deleted file mode 100644 index b346865..0000000 --- a/src/app/Controllers/WebController.php +++ /dev/null @@ -1,128 +0,0 @@ -load(); - - $playlists = ini()->playlists(false); - $count = count($playlists); - $page = (int)($request->getAttributes()['page'] ?? $request->getQueryParams()['page'] ?? 1); - $pageSize = config('app.page_size'); - $pageCount = ceil($count / $pageSize); - $offset = max(0, ($page - 1) * $pageSize); - $list = array_slice($playlists, $offset, $pageSize, true); - - return $this->view($request, $response, 'list.twig', [ - 'updated_at' => ini()->updatedAt(), - 'playlists' => $list, - 'count' => $count, - 'pageCount' => $pageCount, - 'pageCurrent' => $page, - ]); - } - - /** - * @param ServerRequestInterface $request - * @param ResponseInterface $response - * @return ResponseInterface - * @throws LoaderError - * @throws RuntimeError - * @throws SyntaxError - */ - public function faq(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface - { - return $this->view($request, $response, 'faq.twig'); - } - - /** - * @param ServerRequestInterface $request - * @param ResponseInterface $response - * @return ResponseInterface - */ - public function redirect(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface - { - ini()->load(); - $code = $request->getAttributes()['code']; - try { - $playlist = ini()->getPlaylist($code); - return $response->withHeader('Location', $playlist->pls); - } catch (PlaylistNotFoundException) { - return $this->notFound($request, $response); - } - } - - /** - * @param ServerRequestInterface $request - * @param ResponseInterface $response - * @return ResponseInterface - * @throws \Random\RandomException - * @throws LoaderError - * @throws RuntimeError - * @throws SyntaxError - */ - public function details(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface - { - ini()->load(); - $code = $request->getAttributes()['code']; - try { - $playlist = ini()->getPlaylist($code); - $response->withHeader('Location', $playlist->pls); - } catch (PlaylistNotFoundException) { - return $this->notFound($request, $response); - } - - $playlist->fetchContent(); - $playlist->parse(); - - return $this->view($request, $response, 'details.twig', $playlist->toArray()); - } - - /** - * @param ServerRequestInterface $request - * @param ResponseInterface $response - * @return ResponseInterface - */ - public function logo(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface - { - $input = $request->getQueryParams()['url'] ?? null; - - $logo = new ChannelLogo($input); - $logo->readFile() || $logo->fetch(); - $logo->size() === 0 && $logo->setDefault(); - $logo->store(); - $body = $logo->raw(); - $size = $logo->size(); - $mime = $logo->mimeType(); - - $response->getBody()->write($body); - return $response->withHeader('Content-Type', $mime) - ->withHeader('Content-Length', $size); - } -} diff --git a/src/app/Core/ChannelLogo.php b/src/app/Core/ChannelLogo.php deleted file mode 100644 index 5dc9af6..0000000 --- a/src/app/Core/ChannelLogo.php +++ /dev/null @@ -1,195 +0,0 @@ -prepareUrl($url); - if (is_string($url)) { - $this->url = $url; - $this->hash = md5($url); - $this->path = cache_path("tv-logos/$this->hash"); - } - } - - /** - * Валидирует и очищает ссылку на изображение - * - * @param string $url - * @return false|string - */ - protected function prepareUrl(string $url): false|string - { - $parts = parse_url(trim($url)); - if (!is_array($parts) || count($parts) < 2) { - return false; - } - - $result = $parts['scheme'] . '://' . $parts['host']; - $result .= (empty($parts['port']) ? '' : ':' . $parts['port']); - - return $result . $parts['path']; - } - - /** - * Загружает сырое изображение по ссылке и определяет его MIME-тип - * - * @return bool - */ - public function fetch(): bool - { - $this->rawData = @file_get_contents($this->url); - $isFetched = is_string($this->rawData); - if (!$isFetched) { - return false; - } - - $this->mimeType = $this->mimeType(); - return true; - } - - /** - * Сохраняет сырое изображение в кэш - * - * @return bool - */ - public function store(): bool - { - return is_string($this->rawData) - && $this->prepareCacheDir() - && @file_put_contents($this->path, $this->rawData); - } - - /** - * Считывает изображение из кэша - * - * @return bool - */ - public function readFile(): bool - { - if (!file_exists($this->path)) { - return false; - } - - $this->rawData = @file_get_contents($this->path); - return is_string($this->rawData); - } - - /** - * Считывает дефолтный эскиз вместо логотипа - * - * @return bool - */ - public function setDefault(): bool - { - $this->path = root_path('public/no-tvg-logo.png'); - return $this->readFile(); - } - - /** - * Возвращает base64-кодированное изображение - * - * @return string|null - */ - public function asBase64(): ?string - { - if (!is_string($this->rawData)) { - return null; - } - - return "data:$this->mimeType;base64," . base64_encode($this->rawData); - } - - /** - * Возвращает сырое изображение - * - * @return false|string|null - */ - public function raw(): false|string|null - { - return $this->rawData; - } - - /** - * Проверяет готовность директории кэша изображений, создавая её при необходимости - * - * @return bool - */ - public function prepareCacheDir(): bool - { - $cacheFileDir = cache_path('tv-logos'); - - return is_dir($cacheFileDir) - || @mkdir($cacheFileDir, 0775, true); - } - - /** - * Возвращает MIME-тип сырого изображения - * - * @return string|null - */ - public function mimeType(): ?string - { - if (!is_string($this->rawData)) { - return null; - } - - $finfo = new \finfo(FILEINFO_MIME_TYPE); - return $finfo->buffer($this->rawData) ?: null; - } - - /** - * Возвращает размер сырого изображения в байтах - * - * @return int - */ - public function size(): int - { - return strlen((string)$this->rawData); - } - - /** - * @inheritDoc - */ - public function __toString(): string - { - return $this->asBase64(); - } -} diff --git a/src/app/Core/Core.php b/src/app/Core/Core.php deleted file mode 100644 index 9d2d876..0000000 --- a/src/app/Core/Core.php +++ /dev/null @@ -1,230 +0,0 @@ -app = AppFactory::create(); - - $this->bootSettings(); - $this->bootRoutes(); - $this->bootTwig(); - $this->bootRedis(); - $this->bootIni(); - - return $this->app; - } - - /** - * Возвращает значение из конфига - * - * @param string $key Ключ в формате "config.key" - * @param mixed|null $default Значение по умолчанию - * @return mixed - */ - public function config(string $key, mixed $default = null): mixed - { - $parts = explode('.', $key); - return $this->config[$parts[0]][$parts[1]] ?? $default; - } - - /** - * @return Redis - */ - public function redis(): Redis - { - return $this->redis; - } - - /** - * @return IniFile - */ - public function ini(): IniFile - { - return $this->iniFile; - } - - /** - * @return App - */ - public function app(): App - { - return $this->app; - } - - /** - * Загружает файл .env или .env.$env - * - * @param string $env - * @return array - */ - protected function loadDotEnvFile(string $env = ''): array - { - $filename = empty($env) ? '.env' : ".env.$env"; - if (!file_exists(root_path($filename))) { - return []; - } - - $dotenv = Dotenv::createMutable(root_path(), $filename); - return $dotenv->safeLoad(); - } - - /** - * Загружает конфигурационные файлы - * - * @return void - */ - protected function bootSettings(): void - { - $env = $this->loadDotEnvFile(); - - if (!empty($env['APP_ENV'])) { - $this->loadDotEnvFile($env['APP_ENV']); - } - - foreach (glob(config_path() . '/*.php') as $file) { - $key = basename($file, '.php'); - $this->config += [$key => require_once $file]; - } - } - - /** - * Загружает маршруты - * - * @return void - * @see https://www.slimframework.com/docs/v4/objects/routing.html - */ - protected function bootRoutes(): void - { - foreach ($this->config['routes'] as $route) { - if (is_array($route['method'])) { - $definition = $this->app->map($route['method'], $route['path'], $route['handler']); - } else { - $isPossible = in_array($route['method'], ['GET', 'POST', 'OPTIONS', 'PUT', 'PATCH', 'DELETE']); - - $func = match (true) { - $route['method'] === '*' => 'any', - $isPossible => strtolower($route['method']), - default => throw new InvalidArgumentException(sprintf('Неверный HTTP метод %s', $route['method'])) - }; - - $definition = $this->app->$func($route['path'], $route['handler']); - } - - if (!empty($route['name'])) { - $definition->setName($route['name']); - } - } - } - - /** - * Загружает шаблонизатор и его расширения - * - * @return void - * @throws LoaderError - * @see https://www.slimframework.com/docs/v4/features/twig-view.html - */ - protected function bootTwig(): void - { - $twig = Twig::create(root_path('views'), $this->config['twig']); - $twig->addExtension(new IptvTwigExtension()); - $this->app->add(TwigMiddleware::create($this->app, $twig)); - } - - /** - * Инициализирует подключение к Redis - * - * @return void - * @see https://github.com/phpredis/phpredis/?tab=readme-ov-file - */ - protected function bootRedis(): void - { - $options = [ - 'host' => $this->config['redis']['host'], - 'port' => (int)$this->config['redis']['port'], - ]; - - if (!empty($this->config['redis']['password'])) { - $options['auth'] = $this->config['redis']['password']; - } - - $this->redis = new Redis($options); - $this->redis->select((int)$this->config['redis']['db']); - $this->redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_JSON); - } - - /** - * Инициализирует объект ini-файла - * - * @return void - */ - protected function bootIni(): void - { - $this->iniFile = new IniFile(); - } -} diff --git a/src/app/Core/IniFile.php b/src/app/Core/IniFile.php deleted file mode 100644 index 8c99a3f..0000000 --- a/src/app/Core/IniFile.php +++ /dev/null @@ -1,135 +0,0 @@ -hGetAll('_playlists_'); - if (empty($ini)) { - $filepath = config_path('playlists.ini'); - $ini = parse_ini_file($filepath, true); - $this->updated_at = date('d.m.Y h:i', filemtime($filepath)); - $order = array_keys($ini); - } - - $order ??= redis()->get('_order_'); - $this->ini ??= $ini; - $this->updated_at ??= redis()->get('_updated_at_'); - $transaction = redis()->multi(); - foreach ($order as $id) { - $data = $this->ini[$id]; - $this->playlists[(string)$id] = $pls = $this->makePlaylist($id, $data); - $transaction->hSet('_playlists_', $id, $pls); - } - - $expireAfter = config('redis.ttl_days'); - $transaction - ->expire('_playlists_', $expireAfter) - ->set('_order_', $order, ['EX' => $expireAfter]) - ->set('_updated_at_', $this->updated_at, ['EX' => $expireAfter]) - ->exec(); - } - - /** - * Возвращает объекты плейлистов - * - * @param bool $all true - получить все, false - получить только НЕпереадресованные - * @return Playlist[] - */ - public function playlists(bool $all = true): array - { - return $all - ? $this->playlists - : array_filter($this->playlists, static fn ($playlist) => is_null($playlist->redirectId)); - } - - /** - * Возвращает дату обновления ini-файла - * - * @return string - */ - public function updatedAt(): string - { - return $this->updated_at; - } - - /** - * Возвращает ID плейлиста, на который нужно переадресовать указанный - * - * @param string $id ID плейлиста - * @return string|null - */ - public function getRedirection(string $id): ?string - { - return $this->redirections[$id] ?? null; - } - - /** - * Возвращает объект плейлиста - * - * @param string $id ID плейлиста - * @return Playlist|null - * @throws PlaylistNotFoundException - */ - public function getPlaylist(string $id): ?Playlist - { - return $this->playlists[$id] ?? throw new PlaylistNotFoundException($id); - } - - /** - * Создаёт объекты плейлистов, рекурсивно определяя переадресации - * - * @param int|string $id ID плейлиста - * @param array $params Описание плейлиста - * @param string|null $redirectId ID для переадресации - * @return Playlist - * @throws Exception - */ - protected function makePlaylist(int|string $id, array $params, ?string $redirectId = null): Playlist - { - $id = (string)$id; - if (isset($params['redirect'])) { - $this->redirections[$id] = $redirectId = (string)$params['redirect']; - $params = $this->ini[$redirectId]; - return $this->makePlaylist($id, $params, $redirectId); - } - - return new Playlist($id, $params, $redirectId); - } -} diff --git a/src/app/Core/Playlist.php b/src/app/Core/Playlist.php deleted file mode 100644 index e4349df..0000000 --- a/src/app/Core/Playlist.php +++ /dev/null @@ -1,368 +0,0 @@ - 'unknown', - 'errCode' => 'unknown', - 'errText' => 'unknown', - 'possibleStatus' => 'unknown', - ]; - - /** - * Конструктор - * - * @param string $id ID плейлиста - * @param array $params Описание плейлиста - * @param string|null $redirectId ID для переадресации - * @throws Exception - */ - public function __construct( - public readonly string $id, - array $params, - public readonly ?string $redirectId = null - ) { - empty($params['pls']) && throw new Exception( - "Плейлист с ID=$id обязан иметь параметр pls или redirect" - ); - - $this->url = base_url($id); - $this->name = empty($params['name']) ? "Плейлист #$id" : $params['name']; - $this->desc = empty($params['desc']) ? null : $params['desc']; - $this->pls = $params['pls']; - $this->src = empty($params['src']) ? null : $params['src']; - } - - /** - * Получает содержимое плейлиста с третьей стороны - * - * @return void - */ - public function fetchContent(): void - { - $cached = redis()->get($this->id); - if (is_array($cached)) { - $this->downloadStatus['httpCode'] = $cached['httpCode']; - $this->downloadStatus['errCode'] = $cached['errCode']; - $this->downloadStatus['errText'] = $cached['errText']; - $this->downloadStatus['possibleStatus'] = $cached['possibleStatus']; - $this->rawContent = $cached['content']; - return; - } - - $curl = $this->makeCurl(); - $content = curl_exec($curl); - $this->rawContent = $content === false ? null : $content; - $this->downloadStatus['httpCode'] = curl_getinfo($curl, CURLINFO_RESPONSE_CODE); - $this->downloadStatus['errCode'] = curl_errno($curl); - $this->downloadStatus['errText'] = curl_error($curl); - $this->downloadStatus['possibleStatus'] = $this->guessStatus($this->downloadStatus['errCode']); - curl_close($curl); - - if ($cached === false) { - redis()->set($this->id, [ - 'httpCode' => $this->downloadStatus['httpCode'], - 'errCode' => $this->downloadStatus['errCode'], - 'errText' => $this->downloadStatus['errText'], - 'possibleStatus' => $this->downloadStatus['possibleStatus'], - 'content' => $this->rawContent, - ], ['EX' => config('redis.ttl_days')]); - } - } - - /** - * Возвращает статус проверки плейлиста по коду ошибки curl - * - * @param int $curlErrCode - * @return string - */ - protected function guessStatus(int $curlErrCode): string - { - return match ($curlErrCode) { - 0 => 'online', - 28 => 'timeout', - 5, 6, 7, 22, 35 => 'offline', - default => 'error', - }; - } - - /** - * Парсит полученный от третьей стороны плейлист - * - * @return array Информация о составе плейлиста - * @throws RandomException - */ - public function parse(): array - { - if (!empty($this->parsed())) { - return $this->parsed(); - } - - $result = [ - 'attributes' => [], - 'channels' => [], - 'groups' => [], - 'encoding' => [ - 'name' => 'unknown', - 'alert' => false, - ], - ]; - - if (is_null($this->rawContent)) { - return $this->parsedContent = $result; - } - - $enc = mb_detect_encoding($this->rawContent, config('app.pls_encodings')); - $result['encoding']['name'] = $enc; - if ($enc !== 'UTF-8') { - $result['encoding']['alert'] = true; - $this->rawContent = mb_convert_encoding($this->rawContent, 'UTF-8', $enc); - } - - $lines = explode("\n", $this->rawContent); - $isHeader = $isGroup = $isChannel = false; - foreach ($lines as $line) { - if (empty($line = trim($line))) { - continue; - } - - if (str_starts_with($line, '#EXTM3U ')) { - $isHeader = true; - $isGroup = $isChannel = false; - - $result['attributes'] = $this->parseAttributes($line); - continue; - } - - if (str_starts_with($line, '#EXTINF:')) { - $isChannel = true; - $isHeader = $isGroup = false; - - $combined = trim(substr($line, strpos($line, ',') + 1)); - $exploded = explode(',', $line); - $attrs = $this->parseAttributes($exploded[0]); - $tvgid = empty($attrs['tvg-id']) ? ' неизвестен' : "='{$attrs['tvg-id']}'"; - $name = trim($exploded[1] ?? "(канал без названия, tvg-id$tvgid)"); - $channel = [ - '_id' => md5($name . random_int(1, 99999)), - 'name' => trim($name), - 'url' => null, - 'group' => $attrs['group-title'] ?? null, - 'attributes' => $attrs, - ]; - - unset($name, $attrs, $combined, $exploded); - continue; - } - - if (str_starts_with($line, '#EXTGRP:')) { - $isGroup = true; - $isHeader = false; - - if ($isChannel) { - $exploded = explode(':', $line); - $channel['group'] = $exploded[1]; - } - continue; - } - - if ($isChannel) { - $channel['url'] = str_starts_with($line, 'http') ? $line : null; - $logoUrl = $channel['attributes']['tvg-logo'] ?? null; - if (is_string($logoUrl)) { - $logo = new ChannelLogo($logoUrl); - $logo->readFile(); - $channel['logo'] = [ - 'base64' => $logo->asBase64(), - 'size' => $logo->size(), - 'mime-type' => $logo->mimeType(), - ]; - } - $result['channels'][] = $channel; - $isChannel = false; - unset($channel); - } - } - - $groups = []; - foreach ($result['channels'] as $channel) { - $name = $channel['group'] ?? '(без группы)'; - $id = md5($name); - if (empty($groups[$id])) { - $groups[$id] = [ - '_id' => $id, - 'name' => $name, - 'channels' => [], - ]; - } - $groups[$id]['channels'][] = $channel['_id']; - } - $result['groups'] = array_values($groups); - - return $this->parsedContent = $result; - } - - public function check(): bool - { - $curl = $this->makeCurl([ - CURLOPT_RETURNTRANSFER => true, - CURLOPT_NOBODY => true, - CURLOPT_HEADER => true, - CURLOPT_CUSTOMREQUEST => 'HEAD', - ]); - - $content = curl_exec($curl); - $this->rawContent = $content === false ? null : $content; - $this->downloadStatus['httpCode'] = curl_getinfo($curl, CURLINFO_RESPONSE_CODE); - $this->downloadStatus['errCode'] = curl_errno($curl); - $this->downloadStatus['errText'] = curl_error($curl); - $this->downloadStatus['possibleStatus'] = $this->guessStatus($this->downloadStatus['errCode']); - curl_close($curl); - - return $this->downloadStatus['httpCode'] < 400; - } - - protected function makeCurl(array $customOptions = []): CurlHandle - { - $options = [ - CURLOPT_URL => $this->pls, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_TIMEOUT => 30, - CURLOPT_HEADER => false, - CURLOPT_FAILONERROR => true, - CURLOPT_FOLLOWLOCATION => true, - CURLOPT_MAXREDIRS => 5, - CURLOPT_USERAGENT => config('app.user_agent'), - ]; - - $curl = curl_init(); - - foreach ($options as $option => $value) { - curl_setopt($curl, $option, $value); - } - - // array_merge($options, $customOptions) loses keys - foreach ($customOptions as $option => $value) { - curl_setopt($curl, $option, $value); - } - - return $curl; - } - - /** - * Парсит атрибуты строки и возвращает ассоциативный массив - * - * @param string $line - * @return array - */ - protected function parseAttributes(string $line): array - { - if (str_starts_with($line, '#')) { - $line = trim(substr($line, strpos($line, ' ') + 1)); - } - - preg_match_all('#(?[a-z-]+)="(?.*)"#U', $line, $matches); - return array_combine($matches['key'], $matches['value']); - } - - /** - * Возвращает содержимое объекта в виде массива - * - * @return array - */ - public function toArray(): array - { - return [ - 'id' => $this->id, - 'url' => $this->url, - 'name' => $this->name, - 'desc' => $this->desc, - 'pls' => $this->pls, - 'src' => $this->src, - 'status' => $this->status(), - 'content' => [ - ...$this->parsed(), - 'channelCount' => count($this->parsed()['channels']) - ], - ]; - } - - /** - * Возвращает ссылку на плейлист в рамках проекта - * - * @return string - */ - public function url(): string - { - return sprintf('%s/%s', base_url(), $this->id); - } - - /** - * Возвращает статус скачивания плейлиста - * - * @return array|string[] - */ - public function status(): array - { - return $this->downloadStatus; - } - - /** - * Возвращает обработанное содержимое плейлиста - * - * @return array - */ - public function parsed(): array - { - return $this->parsedContent; - } -} diff --git a/src/app/Core/TwigExtention.php b/src/app/Core/TwigExtention.php deleted file mode 100644 index 909efa7..0000000 --- a/src/app/Core/TwigExtention.php +++ /dev/null @@ -1,41 +0,0 @@ -payload($exception, $displayErrorDetails); - - $response = app()->getResponseFactory()->createResponse(); - $response->getBody()->write(json_encode($payload, JSON_UNESCAPED_UNICODE)); - - return $response; - } - - /** - * Возвращает структуру исключения для контекста - * - * @param Throwable $e Исключение - * @param bool $logErrorDetails Признак дополнения деталями - * @return array - */ - protected function context(Throwable $e, bool $logErrorDetails): array - { - $result = ['code' => $e->getCode()]; - - $logErrorDetails && $result += [ - 'class' => $e::class, - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'trace' => $e->getTrace() - ]; - - return $result; - } - - /** - * Возвращает структуру исключения для передачи в ответе - * - * @param Throwable $e Исключение - * @param bool $displayErrorDetails Признак дополнения деталями - * @return array - */ - protected function payload(Throwable $e, bool $displayErrorDetails): array - { - $result = [ - 'error' => [ - 'code' => $e->getCode(), - 'message' => $e->getMessage(), - ], - ]; - - $displayErrorDetails && $result['error'] += [ - 'class' => $e::class, - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'trace' => $e->getTrace(), - ]; - - return $result; - } -} diff --git a/src/app/Errors/PlaylistNotFoundException.php b/src/app/Errors/PlaylistNotFoundException.php deleted file mode 100644 index 1a24043..0000000 --- a/src/app/Errors/PlaylistNotFoundException.php +++ /dev/null @@ -1,15 +0,0 @@ -withHeader('X-Request-ID', uniqid()); - - return $handler->handle($request); - } -} diff --git a/src/app/helpers.php b/src/app/helpers.php deleted file mode 100644 index 4329899..0000000 --- a/src/app/helpers.php +++ /dev/null @@ -1,159 +0,0 @@ -render($template, $data); -} - -/** - * Returns core object - * - * @return Core - */ -function core(): Core -{ - return Core::get(); -} - -/** - * Returns app object - * - * @return App - */ -function app(): App -{ - return Core::get()->app(); -} - -/** - * Returns any value as boolean - * - * @param mixed $value - * @return bool - */ -function bool(mixed $value): bool -{ - is_string($value) && $value = strtolower(trim($value)); - if (in_array($value, [true, 1, '1', '+', 'y', 'yes', 'on', 'true', 'enable', 'enabled'], true)) { - return true; - } - if (in_array($value, [false, 0, '0', '-', 'n', 'no', 'off', 'false', 'disable', 'disabled'], true)) { - return false; - } - return (bool)$value; -} - -/** - * Get config values - * - * @param string $key - * @param mixed|null $default - * @return mixed - */ -function config(string $key, mixed $default = null): mixed -{ - return Core::get()->config($key, $default); -} - -/** - * Get Redis instance - * - * @return Redis - */ -function redis(): Redis -{ - return Core::get()->redis(); -} - -/** - * Get ini-file instance - * - * @return IniFile - */ -function ini(): IniFile -{ - return Core::get()->ini(); -} diff --git a/src/cache/.gitkeep b/src/cache/.gitkeep deleted file mode 100755 index e69de29..0000000 diff --git a/src/composer.json b/src/composer.json deleted file mode 100644 index c670d6d..0000000 --- a/src/composer.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "axenov/iptv", - "type": "project", - "description": "Сервис для сбора IPTV-плейлистов и сокращения ссылок", - "authors": [ - { - "name": "Anthony Axenov", - "homepage": "https://axenov.dev/", - "role": "author" - } - ], - "license": "MIT", - "require": { - "php": "^8.3", - "ext-json": "*", - "ext-curl": "*", - "ext-redis": "*", - "ext-fileinfo": "*", - "guzzlehttp/guzzle": "^7.8", - "nyholm/psr7": "^1.6", - "vlucas/phpdotenv": "*", - "slim/slim": "^4.11", - "slim/twig-view": "^3.4" - }, - "autoload": { - "psr-4": { - "App\\": "app/" - }, - "files": [ - "app/helpers.php" - ] - }, - "scripts": { - "clear-views": "rm -rf cache/views", - "post-install-cmd": [ - "@clear-views" - ] - }, - "config": { - "optimize-autoloader": true, - "preferred-install": "dist", - "sort-packages": true - }, - "minimum-stability": "dev", - "prefer-stable": true -} diff --git a/src/composer.lock b/src/composer.lock deleted file mode 100644 index 8acacda..0000000 --- a/src/composer.lock +++ /dev/null @@ -1,1860 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "3dab02381fde206f9cddedb4dbcd7703", - "packages": [ - { - "name": "graham-campbell/result-type", - "version": "v1.1.3", - "source": { - "type": "git", - "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", - "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.3" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" - }, - "type": "library", - "autoload": { - "psr-4": { - "GrahamCampbell\\ResultType\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - } - ], - "description": "An Implementation Of The Result Type", - "keywords": [ - "Graham Campbell", - "GrahamCampbell", - "Result Type", - "Result-Type", - "result" - ], - "support": { - "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", - "type": "tidelift" - } - ], - "time": "2024-07-20T21:45:45+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "7.9.2", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.3", - "guzzlehttp/psr7": "^2.7.0", - "php": "^7.2.5 || ^8.0", - "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" - }, - "provide": { - "psr/http-client-implementation": "1.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "ext-curl": "*", - "guzzle/client-integration-tests": "3.0.2", - "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.39 || ^9.6.20", - "psr/log": "^1.1 || ^2.0 || ^3.0" - }, - "suggest": { - "ext-curl": "Required for CURL handler support", - "ext-intl": "Required for Internationalized Domain Name (IDN) support", - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Jeremy Lindblom", - "email": "jeremeamia@gmail.com", - "homepage": "https://github.com/jeremeamia" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "psr-18", - "psr-7", - "rest", - "web service" - ], - "support": { - "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.9.2" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", - "type": "tidelift" - } - ], - "time": "2024-07-24T11:22:20+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", - "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" - }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "support": { - "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", - "type": "tidelift" - } - ], - "time": "2024-10-17T10:06:22+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "2.7.0", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0", - "ralouphie/getallheaders": "^3.0" - }, - "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "0.9.0", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" - }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.7.0" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", - "type": "tidelift" - } - ], - "time": "2024-07-18T11:15:46+00:00" - }, - { - "name": "monolog/monolog", - "version": "3.8.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/aef6ee73a77a66e404dd6540934a9ef1b3c855b4", - "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/log": "^2.0 || ^3.0" - }, - "provide": { - "psr/log-implementation": "3.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^3.0", - "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7 || ^8", - "ext-json": "*", - "graylog2/gelf-php": "^1.4.2 || ^2.0", - "guzzlehttp/guzzle": "^7.4.5", - "guzzlehttp/psr7": "^2.2", - "mongodb/mongodb": "^1.8", - "php-amqplib/php-amqplib": "~2.4 || ^3", - "php-console/php-console": "^3.1.8", - "phpstan/phpstan": "^2", - "phpstan/phpstan-deprecation-rules": "^2", - "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "^10.5.17 || ^11.0.7", - "predis/predis": "^1.1 || ^2", - "rollbar/rollbar": "^4.0", - "ruflin/elastica": "^7 || ^8", - "symfony/mailer": "^5.4 || ^6", - "symfony/mime": "^5.4 || ^6" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", - "ext-mbstring": "Allow to work properly with unicode symbols", - "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", - "ext-openssl": "Required to send log messages using SSL", - "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "https://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "support": { - "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.8.1" - }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", - "type": "tidelift" - } - ], - "time": "2024-12-05T17:15:07+00:00" - }, - { - "name": "nikic/fast-route", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/FastRoute.git", - "reference": "181d480e08d9476e61381e04a71b34dc0432e812" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", - "reference": "181d480e08d9476e61381e04a71b34dc0432e812", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35|~5.7" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "FastRoute\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov", - "email": "nikic@php.net" - } - ], - "description": "Fast request router for PHP", - "keywords": [ - "router", - "routing" - ], - "support": { - "issues": "https://github.com/nikic/FastRoute/issues", - "source": "https://github.com/nikic/FastRoute/tree/master" - }, - "time": "2018-02-13T20:26:39+00:00" - }, - { - "name": "nyholm/psr7", - "version": "1.8.2", - "source": { - "type": "git", - "url": "https://github.com/Nyholm/psr7.git", - "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", - "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", - "shasum": "" - }, - "require": { - "php": ">=7.2", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0" - }, - "provide": { - "php-http/message-factory-implementation": "1.0", - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "http-interop/http-factory-tests": "^0.9", - "php-http/message-factory": "^1.0", - "php-http/psr7-integration-tests": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", - "symfony/error-handler": "^4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.8-dev" - } - }, - "autoload": { - "psr-4": { - "Nyholm\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com" - }, - { - "name": "Martijn van der Ven", - "email": "martijn@vanderven.se" - } - ], - "description": "A fast PHP7 implementation of PSR-7", - "homepage": "https://tnyholm.se", - "keywords": [ - "psr-17", - "psr-7" - ], - "support": { - "issues": "https://github.com/Nyholm/psr7/issues", - "source": "https://github.com/Nyholm/psr7/tree/1.8.2" - }, - "funding": [ - { - "url": "https://github.com/Zegnat", - "type": "github" - }, - { - "url": "https://github.com/nyholm", - "type": "github" - } - ], - "time": "2024-09-09T07:06:30+00:00" - }, - { - "name": "phpoption/phpoption", - "version": "1.9.3", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", - "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" - }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - }, - "branch-alias": { - "dev-master": "1.9-dev" - } - }, - "autoload": { - "psr-4": { - "PhpOption\\": "src/PhpOption/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh" - }, - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - } - ], - "description": "Option Type for PHP", - "keywords": [ - "language", - "option", - "php", - "type" - ], - "support": { - "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", - "type": "tidelift" - } - ], - "time": "2024-07-20T21:41:07+00:00" - }, - { - "name": "psr/container", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" - }, - "time": "2021-11-05T16:47:00+00:00" - }, - { - "name": "psr/http-client", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client" - }, - "time": "2023-09-23T14:17:50+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory" - }, - "time": "2024-04-15T12:06:14+00:00" - }, - { - "name": "psr/http-message", - "version": "2.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/2.0" - }, - "time": "2023-04-04T09:54:51+00:00" - }, - { - "name": "psr/http-server-handler", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-server-handler.git", - "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", - "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", - "shasum": "" - }, - "require": { - "php": ">=7.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Server\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP server-side request handler", - "keywords": [ - "handler", - "http", - "http-interop", - "psr", - "psr-15", - "psr-7", - "request", - "response", - "server" - ], - "support": { - "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" - }, - "time": "2023-04-10T20:06:20+00:00" - }, - { - "name": "psr/http-server-middleware", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-server-middleware.git", - "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", - "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", - "shasum": "" - }, - "require": { - "php": ">=7.0", - "psr/http-message": "^1.0 || ^2.0", - "psr/http-server-handler": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Server\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP server-side middleware", - "keywords": [ - "http", - "http-interop", - "middleware", - "psr", - "psr-15", - "psr-7", - "request", - "response" - ], - "support": { - "issues": "https://github.com/php-fig/http-server-middleware/issues", - "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" - }, - "time": "2023-04-11T06:14:47+00:00" - }, - { - "name": "psr/log", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/3.0.2" - }, - "time": "2024-09-11T13:17:53+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" - }, - "time": "2019-03-08T08:55:37+00:00" - }, - { - "name": "slim/slim", - "version": "4.14.0", - "source": { - "type": "git", - "url": "https://github.com/slimphp/Slim.git", - "reference": "5943393b88716eb9e82c4161caa956af63423913" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/slimphp/Slim/zipball/5943393b88716eb9e82c4161caa956af63423913", - "reference": "5943393b88716eb9e82c4161caa956af63423913", - "shasum": "" - }, - "require": { - "ext-json": "*", - "nikic/fast-route": "^1.3", - "php": "^7.4 || ^8.0", - "psr/container": "^1.0 || ^2.0", - "psr/http-factory": "^1.1", - "psr/http-message": "^1.1 || ^2.0", - "psr/http-server-handler": "^1.0", - "psr/http-server-middleware": "^1.0", - "psr/log": "^1.1 || ^2.0 || ^3.0" - }, - "require-dev": { - "adriansuter/php-autoload-override": "^1.4", - "ext-simplexml": "*", - "guzzlehttp/psr7": "^2.6", - "httpsoft/http-message": "^1.1", - "httpsoft/http-server-request": "^1.1", - "laminas/laminas-diactoros": "^2.17 || ^3", - "nyholm/psr7": "^1.8", - "nyholm/psr7-server": "^1.1", - "phpspec/prophecy": "^1.19", - "phpspec/prophecy-phpunit": "^2.1", - "phpstan/phpstan": "^1.11", - "phpunit/phpunit": "^9.6", - "slim/http": "^1.3", - "slim/psr7": "^1.6", - "squizlabs/php_codesniffer": "^3.10", - "vimeo/psalm": "^5.24" - }, - "suggest": { - "ext-simplexml": "Needed to support XML format in BodyParsingMiddleware", - "ext-xml": "Needed to support XML format in BodyParsingMiddleware", - "php-di/php-di": "PHP-DI is the recommended container library to be used with Slim", - "slim/psr7": "Slim PSR-7 implementation. See https://www.slimframework.com/docs/v4/start/installation.html for more information." - }, - "type": "library", - "autoload": { - "psr-4": { - "Slim\\": "Slim" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Josh Lockhart", - "email": "hello@joshlockhart.com", - "homepage": "https://joshlockhart.com" - }, - { - "name": "Andrew Smith", - "email": "a.smith@silentworks.co.uk", - "homepage": "http://silentworks.co.uk" - }, - { - "name": "Rob Allen", - "email": "rob@akrabat.com", - "homepage": "http://akrabat.com" - }, - { - "name": "Pierre Berube", - "email": "pierre@lgse.com", - "homepage": "http://www.lgse.com" - }, - { - "name": "Gabriel Manricks", - "email": "gmanricks@me.com", - "homepage": "http://gabrielmanricks.com" - } - ], - "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs", - "homepage": "https://www.slimframework.com", - "keywords": [ - "api", - "framework", - "micro", - "router" - ], - "support": { - "docs": "https://www.slimframework.com/docs/v4/", - "forum": "https://discourse.slimframework.com/", - "irc": "irc://irc.freenode.net:6667/slimphp", - "issues": "https://github.com/slimphp/Slim/issues", - "rss": "https://www.slimframework.com/blog/feed.rss", - "slack": "https://slimphp.slack.com/", - "source": "https://github.com/slimphp/Slim", - "wiki": "https://github.com/slimphp/Slim/wiki" - }, - "funding": [ - { - "url": "https://opencollective.com/slimphp", - "type": "open_collective" - }, - { - "url": "https://tidelift.com/funding/github/packagist/slim/slim", - "type": "tidelift" - } - ], - "time": "2024-06-13T08:54:48+00:00" - }, - { - "name": "slim/twig-view", - "version": "3.4.1", - "source": { - "type": "git", - "url": "https://github.com/slimphp/Twig-View.git", - "reference": "b4268d87d0e327feba5f88d32031e9123655b909" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/slimphp/Twig-View/zipball/b4268d87d0e327feba5f88d32031e9123655b909", - "reference": "b4268d87d0e327feba5f88d32031e9123655b909", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0", - "psr/http-message": "^1.1 || ^2.0", - "slim/slim": "^4.12", - "symfony/polyfill-php81": "^1.29", - "twig/twig": "^3.11" - }, - "require-dev": { - "phpspec/prophecy-phpunit": "^2.0", - "phpstan/phpstan": "^1.10.59", - "phpunit/phpunit": "^9.6 || ^10", - "psr/http-factory": "^1.0", - "squizlabs/php_codesniffer": "^3.9" - }, - "type": "library", - "autoload": { - "psr-4": { - "Slim\\Views\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Josh Lockhart", - "email": "hello@joshlockhart.com", - "homepage": "http://joshlockhart.com" - }, - { - "name": "Pierre Berube", - "email": "pierre@lgse.com", - "homepage": "http://www.lgse.com" - } - ], - "description": "Slim Framework 4 view helper built on top of the Twig 3 templating component", - "homepage": "https://www.slimframework.com", - "keywords": [ - "framework", - "slim", - "template", - "twig", - "view" - ], - "support": { - "issues": "https://github.com/slimphp/Twig-View/issues", - "source": "https://github.com/slimphp/Twig-View/tree/3.4.1" - }, - "time": "2024-09-26T05:42:02+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v3.5.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.5-dev" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-25T14:20:29+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.31.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-09T11:45:10+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-09T11:45:10+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.31.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-09T11:45:10+00:00" - }, - { - "name": "symfony/polyfill-php81", - "version": "v1.31.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", - "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-09T11:45:10+00:00" - }, - { - "name": "twig/twig", - "version": "v3.20.0", - "source": { - "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "3468920399451a384bef53cf7996965f7cd40183" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/3468920399451a384bef53cf7996965f7cd40183", - "reference": "3468920399451a384bef53cf7996965f7cd40183", - "shasum": "" - }, - "require": { - "php": ">=8.1.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3" - }, - "require-dev": { - "phpstan/phpstan": "^2.0", - "psr/container": "^1.0|^2.0", - "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" - }, - "type": "library", - "autoload": { - "files": [ - "src/Resources/core.php", - "src/Resources/debug.php", - "src/Resources/escaper.php", - "src/Resources/string_loader.php" - ], - "psr-4": { - "Twig\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Twig Team", - "role": "Contributors" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - } - ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", - "keywords": [ - "templating" - ], - "support": { - "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.20.0" - }, - "funding": [ - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" - } - ], - "time": "2025-02-13T08:34:43+00:00" - }, - { - "name": "vlucas/phpdotenv", - "version": "v5.6.1", - "source": { - "type": "git", - "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", - "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", - "shasum": "" - }, - "require": { - "ext-pcre": "*", - "graham-campbell/result-type": "^1.1.3", - "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.3", - "symfony/polyfill-ctype": "^1.24", - "symfony/polyfill-mbstring": "^1.24", - "symfony/polyfill-php80": "^1.24" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "ext-filter": "*", - "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" - }, - "suggest": { - "ext-filter": "Required to use the boolean validator." - }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - }, - "branch-alias": { - "dev-master": "5.6-dev" - } - }, - "autoload": { - "psr-4": { - "Dotenv\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Vance Lucas", - "email": "vance@vancelucas.com", - "homepage": "https://github.com/vlucas" - } - ], - "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", - "keywords": [ - "dotenv", - "env", - "environment" - ], - "support": { - "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", - "type": "tidelift" - } - ], - "time": "2024-07-20T21:52:34+00:00" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "dev", - "stability-flags": {}, - "prefer-stable": true, - "prefer-lowest": false, - "platform": { - "php": "^8.3" - }, - "platform-dev": {}, - "plugin-api-version": "2.6.0" -} diff --git a/src/config/app.php b/src/config/app.php deleted file mode 100644 index c7395b7..0000000 --- a/src/config/app.php +++ /dev/null @@ -1,18 +0,0 @@ - env('APP_URL', 'http://localhost:8080'), - 'debug' => bool(env('APP_DEBUG', false)), - 'env' => env('APP_ENV', env('IPTV_ENV', 'prod')), - 'title' => env('APP_TITLE', 'IPTV Плейлисты'), - 'user_agent' => env('USER_AGENT'), - 'page_size' => (int)env('PAGE_SIZE', 10), - 'pls_encodings' => [ - 'UTF-8', - 'CP1251', - // 'CP866', - // 'ISO-8859-5', - ], -]; diff --git a/src/config/redis.php b/src/config/redis.php deleted file mode 100644 index c97ab7d..0000000 --- a/src/config/redis.php +++ /dev/null @@ -1,11 +0,0 @@ - env('REDIS_HOST', 'keydb'), - 'port' => (int)env('REDIS_PORT', 6379), - 'password' => env('REDIS_PASSWORD'), - 'db' => (int)env('REDIS_DB', 0), - 'ttl_days' => (int)env('REDIS_TTL_DAYS', 14) * 60 * 60 * 24, // 2 недели -]; diff --git a/src/config/routes.php b/src/config/routes.php deleted file mode 100644 index d547ec1..0000000 --- a/src/config/routes.php +++ /dev/null @@ -1,52 +0,0 @@ - 'GET', - 'path' => '/[page/{page:[0-9]+}]', - 'handler' => [WebController::class, 'home'], - 'name' => 'home', - ], - [ - 'method' => 'GET', - 'path' => '/faq', - 'handler' => [WebController::class, 'faq'], - 'name' => 'faq', - ], - [ - 'method' => 'GET', - 'path' => '/logo', - 'handler' => [WebController::class, 'logo'], - 'name' => 'logo', - ], - [ - 'method' => 'GET', - 'path' => '/{code:[0-9a-zA-Z]+}', - 'handler' => [WebController::class, 'redirect'], - 'name' => 'redirect', - ], - [ - 'method' => 'GET', - 'path' => '/{code:[0-9a-zA-Z]+}/details', - 'handler' => [WebController::class, 'details'], - 'name' => 'details', - ], - [ - 'method' => 'GET', - 'path' => '/{code:[0-9a-zA-Z]+}/json', - 'handler' => [ApiController::class, 'json'], - 'name' => 'json', - ], - [ - 'method' => '*', - 'path' => '/{path:.*}', - 'handler' => [BasicController::class, 'notFound'], - 'name' => 'not-found', - ], - // ... -]; - diff --git a/src/config/twig.php b/src/config/twig.php deleted file mode 100644 index d3aed55..0000000 --- a/src/config/twig.php +++ /dev/null @@ -1,8 +0,0 @@ - bool(env('TWIG_USE_CACHE', true)) ? cache_path() . '/views' : false, - 'debug' => bool(env('TWIG_DEBUG', false)), -]; diff --git a/src/public/boosty.svg b/src/public/boosty.svg deleted file mode 100644 index f6b84a1..0000000 --- a/src/public/boosty.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - diff --git a/src/public/css/bootstrap.min.css b/src/public/css/bootstrap.min.css deleted file mode 100644 index f06f523..0000000 --- a/src/public/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -@charset "UTF-8";/*! - * Bootstrap v5.2.3 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors - * Copyright 2011-2022 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#0d6efd;--bs-link-hover-color:#0a58ca;--bs-code-color:#d63384;--bs-highlight-bg:#fff3cd}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--bs-link-color);text-decoration:underline}a:hover{color:var(--bs-link-hover-color)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid var(--bs-border-color);border-radius:.375rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color:var(--bs-body-color);--bs-table-bg:transparent;--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-body-color);--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:var(--bs-body-color);--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:var(--bs-body-color);--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:var(--bs-table-color);vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:2px solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#bacbe6;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#cbccce;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#bcd0c7;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#badce3;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#e6dbb9;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#dfc2c4;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#dfe0e1;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#373b3e;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.25rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:calc(1.5em + .75rem + 2px);padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:.375rem}.form-control-color::-webkit-color-swatch{border-radius:.375rem}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + 2px)}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + 2px)}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:.25rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.5rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;width:100%;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.375rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.25rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.375rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.375rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:#212529;--bs-btn-bg:transparent;--bs-btn-border-width:1px;--bs-btn-border-color:transparent;--bs-btn-border-radius:0.375rem;--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:none;--bs-btn-focus-shadow-rgb:49,132,253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:0.5rem}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:0.25rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:#212529;--bs-dropdown-bg:#fff;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:0.375rem;--bs-dropdown-border-width:1px;--bs-dropdown-inner-border-radius:calc(0.375rem - 1px);--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color:#212529;--bs-dropdown-link-hover-color:#1e2125;--bs-dropdown-link-hover-bg:#e9ecef;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.375rem}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:#6c757d;display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link.disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:1px;--bs-nav-tabs-border-color:#dee2e6;--bs-nav-tabs-border-radius:0.375rem;--bs-nav-tabs-link-hover-border-color:#e9ecef #e9ecef #dee2e6;--bs-nav-tabs-link-active-color:#495057;--bs-nav-tabs-link-active-bg:#fff;--bs-nav-tabs-link-active-border-color:#dee2e6 #dee2e6 #fff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));background:0 0;border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.disabled,.nav-tabs .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:0.375rem;--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{background:0 0;border:0;border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(0, 0, 0, 0.55);--bs-navbar-hover-color:rgba(0, 0, 0, 0.7);--bs-navbar-disabled-color:rgba(0, 0, 0, 0.3);--bs-navbar-active-color:rgba(0, 0, 0, 0.9);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(0, 0, 0, 0.9);--bs-navbar-brand-hover-color:rgba(0, 0, 0, 0.9);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(0, 0, 0, 0.1);--bs-navbar-toggler-border-radius:0.375rem;--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .show>.nav-link{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark{--bs-navbar-color:rgba(255, 255, 255, 0.55);--bs-navbar-hover-color:rgba(255, 255, 255, 0.75);--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-border-width:1px;--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:0.375rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(0.375rem - 1px);--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(0, 0, 0, 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:#fff;--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:#212529;--bs-accordion-bg:#fff;--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:1px;--bs-accordion-border-radius:0.375rem;--bs-accordion-inner-border-radius:calc(0.375rem - 1px);--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:#212529;--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color:#86b7fe;--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:#0c63e4;--bs-accordion-active-bg:#e7f1ff}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:#6c757d;--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:#6c757d;display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:#fff;--bs-pagination-border-width:1px;--bs-pagination-border-color:#dee2e6;--bs-pagination-border-radius:0.375rem;--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:#e9ecef;--bs-pagination-hover-border-color:#dee2e6;--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:#e9ecef;--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:#6c757d;--bs-pagination-disabled-bg:#fff;--bs-pagination-disabled-border-color:#dee2e6;display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:0.5rem}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:0.25rem}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:0.375rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:1px solid var(--bs-alert-border-color);--bs-alert-border-radius:0.375rem;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:#084298;--bs-alert-bg:#cfe2ff;--bs-alert-border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{--bs-alert-color:#41464b;--bs-alert-bg:#e2e3e5;--bs-alert-border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{--bs-alert-color:#0f5132;--bs-alert-bg:#d1e7dd;--bs-alert-border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{--bs-alert-color:#055160;--bs-alert-bg:#cff4fc;--bs-alert-border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{--bs-alert-color:#664d03;--bs-alert-bg:#fff3cd;--bs-alert-border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{--bs-alert-color:#842029;--bs-alert-bg:#f8d7da;--bs-alert-border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{--bs-alert-color:#636464;--bs-alert-bg:#fefefe;--bs-alert-border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{--bs-alert-color:#141619;--bs-alert-bg:#d3d3d4;--bs-alert-border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:#e9ecef;--bs-progress-border-radius:0.375rem;--bs-progress-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:#212529;--bs-list-group-bg:#fff;--bs-list-group-border-color:rgba(0, 0, 0, 0.125);--bs-list-group-border-width:1px;--bs-list-group-border-radius:0.375rem;--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:#495057;--bs-list-group-action-hover-color:#495057;--bs-list-group-action-hover-bg:#f8f9fa;--bs-list-group-action-active-color:#212529;--bs-list-group-action-active-bg:#e9ecef;--bs-list-group-disabled-color:#6c757d;--bs-list-group-disabled-bg:#fff;--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(255, 255, 255, 0.85);--bs-toast-border-width:1px;--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:0.375rem;--bs-toast-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color:#6c757d;--bs-toast-header-bg:rgba(255, 255, 255, 0.85);--bs-toast-header-border-color:rgba(0, 0, 0, 0.05);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:#fff;--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:1px;--bs-modal-border-radius:0.5rem;--bs-modal-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius:calc(0.5rem - 1px);--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:1px;--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:#fff;--bs-tooltip-bg:#000;--bs-tooltip-border-radius:0.375rem;--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;padding:var(--bs-tooltip-arrow-height);margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:#fff;--bs-popover-border-width:1px;--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:0.5rem;--bs-popover-inner-border-radius:calc(0.5rem - 1px);--bs-popover-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: ;--bs-popover-header-bg:#f0f0f0;--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:#212529;--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color: ;--bs-offcanvas-bg:#fff;--bs-offcanvas-border-width:1px;--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075)}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:575.98px){.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}}@media (max-width:575.98px){.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:767.98px){.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}}@media (max-width:767.98px){.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:991.98px){.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}}@media (max-width:991.98px){.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:1199.98px){.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}}@media (max-width:1199.98px){.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:1399.98px){.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}}@media (max-width:1399.98px){.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(13,110,253,var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(108,117,125,var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(25,135,84,var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(13,202,240,var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(255,193,7,var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(220,53,69,var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(248,249,250,var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(33,37,41,var(--bs-bg-opacity,1))!important}.link-primary{color:#0d6efd!important}.link-primary:focus,.link-primary:hover{color:#0a58ca!important}.link-secondary{color:#6c757d!important}.link-secondary:focus,.link-secondary:hover{color:#565e64!important}.link-success{color:#198754!important}.link-success:focus,.link-success:hover{color:#146c43!important}.link-info{color:#0dcaf0!important}.link-info:focus,.link-info:hover{color:#3dd5f3!important}.link-warning{color:#ffc107!important}.link-warning:focus,.link-warning:hover{color:#ffcd39!important}.link-danger{color:#dc3545!important}.link-danger:focus,.link-danger:hover{color:#b02a37!important}.link-light{color:#f8f9fa!important}.link-light:focus,.link-light:hover{color:#f9fafb!important}.link-dark{color:#212529!important}.link-dark:focus,.link-dark:hover{color:#1a1e21!important}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-1{--bs-border-width:1px}.border-2{--bs-border-width:2px}.border-3{--bs-border-width:3px}.border-4{--bs-border-width:4px}.border-5{--bs-border-width:5px}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-semibold{font-weight:600!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-2xl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/src/public/favicon/android-chrome-192x192.png b/src/public/favicon/android-chrome-192x192.png deleted file mode 100644 index 2c5f78b4c411ac2ef2769dc5350558cb47d52fd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10799 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 PA^=smChVtzdFcNDvK%

- - - - - #da532c - - - diff --git a/src/public/favicon/favicon-16x16.png b/src/public/favicon/favicon-16x16.png deleted file mode 100644 index d0d87583049b69b474a7f8984aa4df9c2ecabf1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>8E;1l8sRNxww;vA9W z5|IRC;6l#f2|xwT;fX-x5}DM#?c}7Rx2Bx9H|50LSr?u~lr#opl?G&%h8EOx@3}Db z)cwvKr>hrli7c-5OU(33%<@ah@=wn8OUm{Ivw;l1WFR{;qOiJh;l_d~i*x$s6iix} z)iX1H;)3kn+4&RaXLZla>6@KDX+g=Xm4(xmHm=#%x#h^jy=VJ(pX%Fjyl30d-W|vL zcAYGpwK8ww{NfqQ8&>b}1)86fWoT)uVs4}FAFdx7rx}`{6`rIOk)#=xpcxpg;T5E8 zXriL3X65c{;p}1L=xR||pFC$}K>u9*%5MECAnMVIOwrKM3(l=@42&@L@UyP!aPOFI zTGOjv(WzhArIT8$s-T)LD5`GL{}1CN9hKbxbB8;3xkuuuqxn7FuT{QO0Ql42Zr*REf` ze&fUU+d%4C-b6U)?|15lar&KV-n*0ljbTjkc6XWnEKhnpki%Kv5n0T@V9f`@jAynj zYz7Llmw5WRvOnWwX45vmsk0lT>7J*HV~E7%;$OsV=T9sgh5gh>A>|5*iZ|di9E_$<{5BC3o)F z+U(s^Tl4o1GgEU@spJkyL@WZi78nE_N$g{TPLS+;lhn8F;_1| zUA=SV+P#aJClan*y?gog_51dTkCvPaUgl?zm0Xkxq!^40jEr;*EOiZxLk!HUOpL8eO|=aStPBiHrffKb zq9HdwB{QuOw+7df9Cbhqk{}y`^V3So6N^$A%FE03GV`*FlM@S4_413-XTP(N0xAlx z3W+EQN-S3>D9TUE%t=)!sVqoU$Sf#HW?-n8^Y{}FM`4(T#wq{PXFQ(m_pw zD+_y17GV}vaA`0(oWiWUIYi;~jVmXPoH-(Mg#C1b#{w@shF9W(C7+y3rvj~D@O1Ta JS?83{1OV0Ey)FO% diff --git a/src/public/favicon/favicon-32x32.png b/src/public/favicon/favicon-32x32.png deleted file mode 100644 index ed2ca436d5df6e48d09e5e7f05eea34842561e0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1775 zcmZ`(dpHyNAO4zQb03Oa$0UbZ!#K=c6HBy%Y&eLyG#ne|E{$9gH9C|+Epl8s4w@*J zTyrT>a-5WQoFtipT(WX$Xa4;C@q0ec`+1+|eLwH>{`bixx;e>6s!9R?WC+f9cOfJ9 z023GP*yQ95Awk3JUF`vAVoB`;itU*cXLnZslJx*!W&*G!l$f6Yh{FKDI|Bf&1OR1v zS=&!mLPI>r#R(4td&BOm{#B^J>CWD<09eZIL1d)m&IO?;!63LgN_>QiiW~kob-0}Y zfS4BnZ|_O&o4e*3`7>$X;Q9H-4c}sRjNDWQzagVf6e`>+ER~Tea6S!}zr=*;K5cYvFKyFNT6|a%avHHI{X) z?ePK)k_iX5ZY$Wf6{I{*7w}OjVpjYeDS%)zcl(Y8sO#B4A;`CeTxr4vl&%R&hR3^T z0%hi_J|O2ZV}_9}b1GVL-b<(@-;$7p{FNgjyD3@Hl~#OX%0g}$Vk4&@vTnkO9SP`a z`|=TtL2g6SB%AqHwVwJcjgG68tsa?~?@nNv&U|qyGM7pf`>Oq!7;-8_rW$nDtC31> zlviF)gn!keE0UM9tl+82iHJn08P>7sw6hSkD)X(E9(Y2`Sc(=rweKF+F3vqut7dKc zu1|`^DG&eMFGsVp9MS%5((+<~WT^^reDVz)M4&h ztNoKE5%}=2+DRqSN%_Hsimgs!ep2tpDdoR+-qGAT_^i^4h4<$o*^oL`@Eh+J#LViM zK8I^6l9Jo3QTk?VfT}C+^6e~p`I}f@Q~vj~3svm`JRS)v#AIL`dSSUiy3#$+Ga1Im z?N0Zk&}HMqe3XbE&aSi@m4=} zbODwB@9m(u&hvajY6}-{aQfsqt(@adXU)RzCb|7+__V*h`1{MCdl^R1N>{rf%f)8W zHL5lFH_jHI|D^*M`NiXzDgbI0|8{;#8!cW_&^g>`y#vZgJ7``iO=ux9qjFj zdZj`eFT-_kAVZCdJ&n@R7w>S|M#>{-jj3U`CdYMnm%hhp>atn0Tv6s+1OIpQbV%GP znrpFXDi_(n#BGxaHL>hlO|>Yjo*ZPR{vfSkb6r|N|HS&PGA*hUMf@MvPSHSjG{<7Tk!%Ta*tJR<5({+(c;iXV$^V=W1ZTE|HH#8LYgoy~3(yt-y&E5XisjoyK64i1q)8h>G*{4BCLN`FQDqrCFd=o?0c)29DaHZytb!-O_Eb!o9#(`II=YqwZ#|1u|DU_)(n ziPG@e$J)sLv=Xtkqojm2*7BveYfavYdSFnd6c-Y2K%fy^Rr3`SF9?)y?`sO zYl*uv-IAOKe?vRSv!MgDq<8{hz=uv|wsz(*F-Q4#U!ffdhLD9<)$KLSRe?NJvOPQ==kcDS`A5G%Y5q zblFN(ctlF}Bs1It6Oi;6S|~L#1j$IEhajnR1_gk`ve`9hShSbE{?k*>MhJ86Koli~ zrbsEG6kUE*5>-Uvnb^KyQ544$`Rw(?Q2$83dcVXorZf8l8t{}6j5P<-Vqpa!IJ)8g Ia5$6kA4p0NL;wH) diff --git a/src/public/favicon/favicon.ico b/src/public/favicon/favicon.ico deleted file mode 100644 index 32e861e29af419b78ea1e1506961d11f066d795a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 zcmeHO2~?CGXjW!-C5$9Ihvmtf?0AujKq~9gFGqJGFAKutQci!Dg zzqqxZ`ad{G_kMne?*F1kwEfhA9@BoJfS+TcLugujI89H9rkt!qnqQDk6-)D|X-z40f!4`m z272%M9(s81IQ{-N=jeC8K1*e#vuVl{JJJPuP<*66#YgxVf#<2dYMScjPJO$VW6m4& zL*)a_a(8nOG?#FGNsZHeP z>j^$`%9#;D^JhlUyc{F=IW193f&LzJY*+QL@`vkuN#UrVoa_X0Qz^+)<3RD@c%SY} zMYEJtK3_$(3*D%0iJBV9)znz2p{8XTY6e=WM+TQSR%vKWg_`Qi)Kt63P0(5}Q%UKG zPNemhk&~000{p$mLFz!xPRug|vPV)uwh{cCmY}7efRW{o2=OI5J3BFd;lT>hL(bOa z8fr6vp9Mydb+mqPSu4Xt$4r;UA$6KF+1uL#Sj* zIzJWp7v;K=TxOJiChz~Iy`Rqj-v86F{|Ak-|MULI^3R;^BKFL&j^TLf^ZH*pPeqOj zDf%Fz=ujW*sX;Wu1bzdla<>zsBRLChd z+>d6ZhSJ=uNJ>oz#=4S{pAF-mm;Q9de{lUkj|dKM7rKvrX$Ey~E2nMkMHqWE`FX2H zT|ZMWN3&);o%O#IItzclJpM6ZzN9bDpr5|6O6bc~#VHgT_3@F&V&0;>vDJO zrS4DsEav@xp=tkQJuU>Y?lvqEs47XJ{LBdQ@l;urpUhd_f&OM8zY_Pe$PnCvaWCXMjV=2ppT9nya$3DqEyjEQmRvfty-=Wgdl7Zx zdB=uSYMtOd@I5X}3mG9l&wSXU{~WJYGC*EIT7Y=S@YkW3YEt(B4-|h5n=Ucence z@*J@aRXEFa@C@GE7)jkbis@AM3W1%5bjUt&dlKLCDsZ=E-NC%}S^p`X6HAA;SJHva zWwc;cH0%H#Hp$QZ_xF~IJ2u~AnwP1mz1EXDS8IVFYOnDS`zz1SSis+?CAcl$?N{JF zAFg#2u@wt$j=0a>Y zU|pB*$Q97JSZ`Tg>_#;uZercBjiLrvj`wPmRTip*Zn-$mRm>}&?@TKZ_bp!Yd|x$> zyJhOleaMJ}EhUURG)nYq^!pXdvu~{GztXq% z;#m1zhKwvL@UmHcPVxRM@ZHD3&C@L}K*#dHez&!7cFeuPS<#>IerE~f{TcWp%0Dd0 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 diff --git a/src/public/favicon/safari-pinned-tab.svg b/src/public/favicon/safari-pinned-tab.svg deleted file mode 100644 index 28df5b6..0000000 --- a/src/public/favicon/safari-pinned-tab.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - -Created by potrace 1.14, written by Peter Selinger 2001-2017 - - - - - diff --git a/src/public/favicon/site.webmanifest b/src/public/favicon/site.webmanifest deleted file mode 100644 index b20abb7..0000000 --- a/src/public/favicon/site.webmanifest +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "", - "short_name": "", - "icons": [ - { - "src": "/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" -} diff --git a/src/public/index.php b/src/public/index.php deleted file mode 100644 index 58acd6d..0000000 --- a/src/public/index.php +++ /dev/null @@ -1,7 +0,0 @@ -boot()->run(); diff --git a/src/public/js/bootstrap.bundle.min.js b/src/public/js/bootstrap.bundle.min.js deleted file mode 100644 index 819659b..0000000 --- a/src/public/js/bootstrap.bundle.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v5.2.3 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t="transitionend",e=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e},i=t=>{const i=e(t);return i&&document.querySelector(i)?i:null},n=t=>{const i=e(t);return i?document.querySelector(i):null},s=e=>{e.dispatchEvent(new Event(t))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(t):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,g=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},m=t=>{"function"==typeof t&&t()},_=(e,i,n=!0)=>{if(!n)return void m(e);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(i)+5;let r=!1;const a=({target:n})=>{n===i&&(r=!0,i.removeEventListener(t,a),m(e))};i.addEventListener(t,a),setTimeout((()=>{r||s(i)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=N(t);return C.has(o)||(o=t),[n,s,o]}function D(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return j(s,{delegateTarget:r}),n.oneOff&&P.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return j(n,{delegateTarget:t}),i.oneOff&&P.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function S(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function I(t,e,i,n){const s=e[i]||{};for(const o of Object.keys(s))if(o.includes(n)){const n=s[o];S(t,e,i,n.callable,n.delegationSelector)}}function N(t){return t=t.replace(y,""),T[t]||t}const P={on(t,e,i,n){D(t,e,i,n,!1)},one(t,e,i,n){D(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))I(t,l,i,e.slice(1));for(const i of Object.keys(c)){const n=i.replace(w,"");if(!a||e.includes(n)){const e=c[i];S(t,l,r,e.callable,e.delegationSelector)}}}else{if(!Object.keys(c).length)return;S(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==N(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());let l=new Event(e,{bubbles:o,cancelable:!0});return l=j(l,i),a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function j(t,e){for(const[i,n]of Object.entries(e||{}))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}const M=new Map,H={set(t,e,i){M.has(t)||M.set(t,new Map);const n=M.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>M.has(t)&&M.get(t).get(e)||null,remove(t,e){if(!M.has(t))return;const i=M.get(t);i.delete(e),0===i.size&&M.delete(t)}};function $(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function W(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const B={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${W(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${W(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=$(t.dataset[n])}return e},getDataAttribute:(t,e)=>$(t.getAttribute(`data-bs-${W(e)}`))};class F{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?B.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?B.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const n of Object.keys(e)){const s=e[n],r=t[n],a=o(r)?"element":null==(i=r)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(a))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${a}" but expected type "${s}".`)}var i}}class z extends F{constructor(t,e){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(e),H.set(this._element,this.constructor.DATA_KEY,this))}dispose(){H.remove(this._element,this.constructor.DATA_KEY),P.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return H.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.2.3"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const q=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;P.on(document,i,`[data-bs-dismiss="${s}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const o=n(this)||this.closest(`.${s}`);t.getOrCreateInstance(o)[e]()}))};class R extends z{static get NAME(){return"alert"}close(){if(P.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),P.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=R.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}q(R,"close"),g(R);const V='[data-bs-toggle="button"]';class K extends z{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=K.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}P.on(document,"click.bs.button.data-api",V,(t=>{t.preventDefault();const e=t.target.closest(V);K.getOrCreateInstance(e).toggle()})),g(K);const Q={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))}},X={endCallback:null,leftCallback:null,rightCallback:null},Y={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class U extends F{constructor(t,e){super(),this._element=t,t&&U.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return X}static get DefaultType(){return Y}static get NAME(){return"swipe"}dispose(){P.off(this._element,".bs.swipe")}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),m(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&m(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(P.on(this._element,"pointerdown.bs.swipe",(t=>this._start(t))),P.on(this._element,"pointerup.bs.swipe",(t=>this._end(t))),this._element.classList.add("pointer-event")):(P.on(this._element,"touchstart.bs.swipe",(t=>this._start(t))),P.on(this._element,"touchmove.bs.swipe",(t=>this._move(t))),P.on(this._element,"touchend.bs.swipe",(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const G="next",J="prev",Z="left",tt="right",et="slid.bs.carousel",it="carousel",nt="active",st={ArrowLeft:tt,ArrowRight:Z},ot={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},rt={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class at extends z{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=Q.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===it&&this.cycle()}static get Default(){return ot}static get DefaultType(){return rt}static get NAME(){return"carousel"}next(){this._slide(G)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(J)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?P.one(this._element,et,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void P.one(this._element,et,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?G:J;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&P.on(this._element,"keydown.bs.carousel",(t=>this._keydown(t))),"hover"===this._config.pause&&(P.on(this._element,"mouseenter.bs.carousel",(()=>this.pause())),P.on(this._element,"mouseleave.bs.carousel",(()=>this._maybeEnableCycle()))),this._config.touch&&U.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of Q.find(".carousel-item img",this._element))P.on(t,"dragstart.bs.carousel",(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(Z)),rightCallback:()=>this._slide(this._directionToOrder(tt)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new U(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=st[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=Q.findOne(".active",this._indicatorsElement);e.classList.remove(nt),e.removeAttribute("aria-current");const i=Q.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(nt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===G,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>P.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r("slide.bs.carousel").defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(nt),i.classList.remove(nt,c,l),this._isSliding=!1,r(et)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return Q.findOne(".active.carousel-item",this._element)}_getItems(){return Q.find(".carousel-item",this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===Z?J:G:t===Z?G:J}_orderToDirection(t){return p()?t===J?Z:tt:t===J?tt:Z}static jQueryInterface(t){return this.each((function(){const e=at.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}P.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",(function(t){const e=n(this);if(!e||!e.classList.contains(it))return;t.preventDefault();const i=at.getOrCreateInstance(e),s=this.getAttribute("data-bs-slide-to");return s?(i.to(s),void i._maybeEnableCycle()):"next"===B.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),P.on(window,"load.bs.carousel.data-api",(()=>{const t=Q.find('[data-bs-ride="carousel"]');for(const e of t)at.getOrCreateInstance(e)})),g(at);const lt="show",ct="collapse",ht="collapsing",dt='[data-bs-toggle="collapse"]',ut={parent:null,toggle:!0},ft={parent:"(null|element)",toggle:"boolean"};class pt extends z{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const n=Q.find(dt);for(const t of n){const e=i(t),n=Q.find(e).filter((t=>t===this._element));null!==e&&n.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return ut}static get DefaultType(){return ft}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>pt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(P.trigger(this._element,"show.bs.collapse").defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(ct),this._element.classList.add(ht),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct,lt),this._element.style[e]="",P.trigger(this._element,"shown.bs.collapse")}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(P.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(ht),this._element.classList.remove(ct,lt);for(const t of this._triggerArray){const e=n(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct),P.trigger(this._element,"hidden.bs.collapse")}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(lt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(dt);for(const e of t){const t=n(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=Q.find(":scope .collapse .collapse",this._config.parent);return Q.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=pt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}P.on(document,"click.bs.collapse.data-api",dt,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=i(this),n=Q.find(e);for(const t of n)pt.getOrCreateInstance(t,{toggle:!1}).toggle()})),g(pt);var gt="top",mt="bottom",_t="right",bt="left",vt="auto",yt=[gt,mt,_t,bt],wt="start",At="end",Et="clippingParents",Tt="viewport",Ct="popper",Ot="reference",xt=yt.reduce((function(t,e){return t.concat([e+"-"+wt,e+"-"+At])}),[]),kt=[].concat(yt,[vt]).reduce((function(t,e){return t.concat([e,e+"-"+wt,e+"-"+At])}),[]),Lt="beforeRead",Dt="read",St="afterRead",It="beforeMain",Nt="main",Pt="afterMain",jt="beforeWrite",Mt="write",Ht="afterWrite",$t=[Lt,Dt,St,It,Nt,Pt,jt,Mt,Ht];function Wt(t){return t?(t.nodeName||"").toLowerCase():null}function Bt(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function Ft(t){return t instanceof Bt(t).Element||t instanceof Element}function zt(t){return t instanceof Bt(t).HTMLElement||t instanceof HTMLElement}function qt(t){return"undefined"!=typeof ShadowRoot&&(t instanceof Bt(t).ShadowRoot||t instanceof ShadowRoot)}const Rt={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];zt(s)&&Wt(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});zt(n)&&Wt(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function Vt(t){return t.split("-")[0]}var Kt=Math.max,Qt=Math.min,Xt=Math.round;function Yt(){var t=navigator.userAgentData;return null!=t&&t.brands?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ut(){return!/^((?!chrome|android).)*safari/i.test(Yt())}function Gt(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&zt(t)&&(s=t.offsetWidth>0&&Xt(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&Xt(n.height)/t.offsetHeight||1);var r=(Ft(t)?Bt(t):window).visualViewport,a=!Ut()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Jt(t){var e=Gt(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Zt(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&qt(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function te(t){return Bt(t).getComputedStyle(t)}function ee(t){return["table","td","th"].indexOf(Wt(t))>=0}function ie(t){return((Ft(t)?t.ownerDocument:t.document)||window.document).documentElement}function ne(t){return"html"===Wt(t)?t:t.assignedSlot||t.parentNode||(qt(t)?t.host:null)||ie(t)}function se(t){return zt(t)&&"fixed"!==te(t).position?t.offsetParent:null}function oe(t){for(var e=Bt(t),i=se(t);i&&ee(i)&&"static"===te(i).position;)i=se(i);return i&&("html"===Wt(i)||"body"===Wt(i)&&"static"===te(i).position)?e:i||function(t){var e=/firefox/i.test(Yt());if(/Trident/i.test(Yt())&&zt(t)&&"fixed"===te(t).position)return null;var i=ne(t);for(qt(i)&&(i=i.host);zt(i)&&["html","body"].indexOf(Wt(i))<0;){var n=te(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function re(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function ae(t,e,i){return Kt(t,Qt(e,i))}function le(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function ce(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const he={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=Vt(i.placement),l=re(a),c=[bt,_t].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return le("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:ce(t,yt))}(s.padding,i),d=Jt(o),u="y"===l?gt:bt,f="y"===l?mt:_t,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],g=r[l]-i.rects.reference[l],m=oe(o),_=m?"y"===l?m.clientHeight||0:m.clientWidth||0:0,b=p/2-g/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=ae(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Zt(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function de(t){return t.split("-")[1]}var ue={top:"auto",right:"auto",bottom:"auto",left:"auto"};function fe(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,g=void 0===p?0:p,m="function"==typeof h?h({x:f,y:g}):{x:f,y:g};f=m.x,g=m.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=bt,y=gt,w=window;if(c){var A=oe(i),E="clientHeight",T="clientWidth";A===Bt(i)&&"static"!==te(A=ie(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===gt||(s===bt||s===_t)&&o===At)&&(y=mt,g-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,g*=l?1:-1),s!==bt&&(s!==gt&&s!==mt||o!==At)||(v=_t,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&ue),x=!0===h?function(t){var e=t.x,i=t.y,n=window.devicePixelRatio||1;return{x:Xt(e*n)/n||0,y:Xt(i*n)/n||0}}({x:f,y:g}):{x:f,y:g};return f=x.x,g=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+g+"px)":"translate3d("+f+"px, "+g+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?g+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const pe={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:Vt(e.placement),variation:de(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,fe(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,fe(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ge={passive:!0};const me={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=Bt(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ge)})),a&&l.addEventListener("resize",i.update,ge),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ge)})),a&&l.removeEventListener("resize",i.update,ge)}},data:{}};var _e={left:"right",right:"left",bottom:"top",top:"bottom"};function be(t){return t.replace(/left|right|bottom|top/g,(function(t){return _e[t]}))}var ve={start:"end",end:"start"};function ye(t){return t.replace(/start|end/g,(function(t){return ve[t]}))}function we(t){var e=Bt(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ae(t){return Gt(ie(t)).left+we(t).scrollLeft}function Ee(t){var e=te(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Te(t){return["html","body","#document"].indexOf(Wt(t))>=0?t.ownerDocument.body:zt(t)&&Ee(t)?t:Te(ne(t))}function Ce(t,e){var i;void 0===e&&(e=[]);var n=Te(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=Bt(n),r=s?[o].concat(o.visualViewport||[],Ee(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Ce(ne(r)))}function Oe(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function xe(t,e,i){return e===Tt?Oe(function(t,e){var i=Bt(t),n=ie(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ut();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ae(t),y:l}}(t,i)):Ft(e)?function(t,e){var i=Gt(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Oe(function(t){var e,i=ie(t),n=we(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=Kt(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=Kt(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ae(t),l=-n.scrollTop;return"rtl"===te(s||i).direction&&(a+=Kt(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(ie(t)))}function ke(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?Vt(s):null,r=s?de(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case gt:e={x:a,y:i.y-n.height};break;case mt:e={x:a,y:i.y+i.height};break;case _t:e={x:i.x+i.width,y:l};break;case bt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?re(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case wt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case At:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function Le(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Et:a,c=i.rootBoundary,h=void 0===c?Tt:c,d=i.elementContext,u=void 0===d?Ct:d,f=i.altBoundary,p=void 0!==f&&f,g=i.padding,m=void 0===g?0:g,_=le("number"!=typeof m?m:ce(m,yt)),b=u===Ct?Ot:Ct,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Ce(ne(t)),i=["absolute","fixed"].indexOf(te(t).position)>=0&&zt(t)?oe(t):t;return Ft(i)?e.filter((function(t){return Ft(t)&&Zt(t,i)&&"body"!==Wt(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=xe(t,i,n);return e.top=Kt(s.top,e.top),e.right=Qt(s.right,e.right),e.bottom=Qt(s.bottom,e.bottom),e.left=Kt(s.left,e.left),e}),xe(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(Ft(y)?y:y.contextElement||ie(t.elements.popper),l,h,r),A=Gt(t.elements.reference),E=ke({reference:A,element:v,strategy:"absolute",placement:s}),T=Oe(Object.assign({},v,E)),C=u===Ct?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Ct&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[_t,mt].indexOf(t)>=0?1:-1,i=[gt,mt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function De(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?kt:l,h=de(n),d=h?a?xt:xt.filter((function(t){return de(t)===h})):yt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=Le(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[Vt(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const Se={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,g=i.allowedAutoPlacements,m=e.options.placement,_=Vt(m),b=l||(_!==m&&p?function(t){if(Vt(t)===vt)return[];var e=be(t);return[ye(t),e,ye(e)]}(m):[be(m)]),v=[m].concat(b).reduce((function(t,i){return t.concat(Vt(i)===vt?De(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:g}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,D=L?"width":"height",S=Le(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),I=L?k?_t:bt:k?mt:gt;y[D]>w[D]&&(I=be(I));var N=be(I),P=[];if(o&&P.push(S[x]<=0),a&&P.push(S[I]<=0,S[N]<=0),P.every((function(t){return t}))){T=O,E=!1;break}A.set(O,P)}if(E)for(var j=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==j(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function Ie(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function Ne(t){return[gt,_t,mt,bt].some((function(e){return t[e]>=0}))}const Pe={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=Le(e,{elementContext:"reference"}),a=Le(e,{altBoundary:!0}),l=Ie(r,n),c=Ie(a,s,o),h=Ne(l),d=Ne(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},je={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=kt.reduce((function(t,i){return t[i]=function(t,e,i){var n=Vt(t),s=[bt,gt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[bt,_t].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},Me={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ke({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},He={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,g=void 0===p?0:p,m=Le(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=Vt(e.placement),b=de(e.placement),v=!b,y=re(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof g?g(Object.assign({},e.rects,{placement:e.placement})):g,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,D="y"===y?gt:bt,S="y"===y?mt:_t,I="y"===y?"height":"width",N=A[y],P=N+m[D],j=N-m[S],M=f?-T[I]/2:0,H=b===wt?E[I]:T[I],$=b===wt?-T[I]:-E[I],W=e.elements.arrow,B=f&&W?Jt(W):{width:0,height:0},F=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=F[D],q=F[S],R=ae(0,E[I],B[I]),V=v?E[I]/2-M-R-z-O.mainAxis:H-R-z-O.mainAxis,K=v?-E[I]/2+M+R+q+O.mainAxis:$+R+q+O.mainAxis,Q=e.elements.arrow&&oe(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=N+K-Y,G=ae(f?Qt(P,N+V-Y-X):P,N,f?Kt(j,U):j);A[y]=G,k[y]=G-N}if(a){var J,Z="x"===y?gt:bt,tt="x"===y?mt:_t,et=A[w],it="y"===w?"height":"width",nt=et+m[Z],st=et-m[tt],ot=-1!==[gt,bt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=ae(t,e,i);return n>i?i:n}(at,et,lt):ae(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function $e(t,e,i){void 0===i&&(i=!1);var n,s,o=zt(e),r=zt(e)&&function(t){var e=t.getBoundingClientRect(),i=Xt(e.width)/t.offsetWidth||1,n=Xt(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=ie(e),l=Gt(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==Wt(e)||Ee(a))&&(c=(n=e)!==Bt(n)&&zt(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:we(n)),zt(e)?((h=Gt(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ae(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function We(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var Be={placement:"bottom",modifiers:[],strategy:"absolute"};function Fe(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(B.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const i=Q.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ye,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=hi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=Q.find(ti);for(const i of e){const e=hi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Xe,Ye].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ze)?this:Q.prev(this,Ze)[0]||Q.next(this,Ze)[0]||Q.findOne(Ze,t.delegateTarget.parentNode),o=hi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}P.on(document,Ge,Ze,hi.dataApiKeydownHandler),P.on(document,Ge,ei,hi.dataApiKeydownHandler),P.on(document,Ue,hi.clearMenus),P.on(document,"keyup.bs.dropdown.data-api",hi.clearMenus),P.on(document,Ue,Ze,(function(t){t.preventDefault(),hi.getOrCreateInstance(this).toggle()})),g(hi);const di=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",ui=".sticky-top",fi="padding-right",pi="margin-right";class gi{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,fi,(e=>e+t)),this._setElementAttributes(di,fi,(e=>e+t)),this._setElementAttributes(ui,pi,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,fi),this._resetElementAttributes(di,fi),this._resetElementAttributes(ui,pi)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&B.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=B.getDataAttribute(t,e);null!==i?(B.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of Q.find(t,this._element))e(i)}}const mi="show",_i="mousedown.bs.backdrop",bi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},vi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class yi extends F{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return bi}static get DefaultType(){return vi}static get NAME(){return"backdrop"}show(t){if(!this._config.isVisible)return void m(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(mi),this._emulateAnimation((()=>{m(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(mi),this._emulateAnimation((()=>{this.dispose(),m(t)}))):m(t)}dispose(){this._isAppended&&(P.off(this._element,_i),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),P.on(t,_i,(()=>{m(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const wi=".bs.focustrap",Ai="backward",Ei={autofocus:!0,trapElement:null},Ti={autofocus:"boolean",trapElement:"element"};class Ci extends F{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Ei}static get DefaultType(){return Ti}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),P.off(document,wi),P.on(document,"focusin.bs.focustrap",(t=>this._handleFocusin(t))),P.on(document,"keydown.tab.bs.focustrap",(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,P.off(document,wi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=Q.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===Ai?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?Ai:"forward")}}const Oi="hidden.bs.modal",xi="show.bs.modal",ki="modal-open",Li="show",Di="modal-static",Si={backdrop:!0,focus:!0,keyboard:!0},Ii={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ni extends z{constructor(t,e){super(t,e),this._dialog=Q.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new gi,this._addEventListeners()}static get Default(){return Si}static get DefaultType(){return Ii}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||P.trigger(this._element,xi,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(ki),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(P.trigger(this._element,"hide.bs.modal").defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Li),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){for(const t of[window,this._dialog])P.off(t,".bs.modal");this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new yi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Ci({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=Q.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(Li),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,P.trigger(this._element,"shown.bs.modal",{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){P.on(this._element,"keydown.dismiss.bs.modal",(t=>{if("Escape"===t.key)return this._config.keyboard?(t.preventDefault(),void this.hide()):void this._triggerBackdropTransition()})),P.on(window,"resize.bs.modal",(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),P.on(this._element,"mousedown.dismiss.bs.modal",(t=>{P.one(this._element,"click.dismiss.bs.modal",(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(ki),this._resetAdjustments(),this._scrollBar.reset(),P.trigger(this._element,Oi)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(P.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(Di)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(Di),this._queueCallback((()=>{this._element.classList.remove(Di),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Ni.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}P.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=n(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),P.one(e,xi,(t=>{t.defaultPrevented||P.one(e,Oi,(()=>{a(this)&&this.focus()}))}));const i=Q.findOne(".modal.show");i&&Ni.getInstance(i).hide(),Ni.getOrCreateInstance(e).toggle(this)})),q(Ni),g(Ni);const Pi="show",ji="showing",Mi="hiding",Hi=".offcanvas.show",$i="hidePrevented.bs.offcanvas",Wi="hidden.bs.offcanvas",Bi={backdrop:!0,keyboard:!0,scroll:!1},Fi={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class zi extends z{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Bi}static get DefaultType(){return Fi}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||P.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new gi).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(ji),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Pi),this._element.classList.remove(ji),P.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(P.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Mi),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Pi,Mi),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new gi).reset(),P.trigger(this._element,Wi)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new yi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():P.trigger(this._element,$i)}:null})}_initializeFocusTrap(){return new Ci({trapElement:this._element})}_addEventListeners(){P.on(this._element,"keydown.dismiss.bs.offcanvas",(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():P.trigger(this._element,$i))}))}static jQueryInterface(t){return this.each((function(){const e=zi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}P.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=n(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;P.one(e,Wi,(()=>{a(this)&&this.focus()}));const i=Q.findOne(Hi);i&&i!==e&&zi.getInstance(i).hide(),zi.getOrCreateInstance(e).toggle(this)})),P.on(window,"load.bs.offcanvas.data-api",(()=>{for(const t of Q.find(Hi))zi.getOrCreateInstance(t).show()})),P.on(window,"resize.bs.offcanvas",(()=>{for(const t of Q.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&zi.getOrCreateInstance(t).hide()})),q(zi),g(zi);const qi=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Ri=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,Vi=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,Ki=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!qi.has(i)||Boolean(Ri.test(t.nodeValue)||Vi.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Qi={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Xi={allowList:Qi,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"

"},Yi={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Ui={entry:"(string|element|function|null)",selector:"(string|element)"};class Gi extends F{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Ui)}_setContent(t,e,i){const n=Q.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Ki(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return"function"==typeof t?t(this):t}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Ji=new Set(["sanitize","allowList","sanitizeFn"]),Zi="fade",tn="show",en=".modal",nn="hide.bs.modal",sn="hover",on="focus",rn={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},an={allowList:Qi,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,0],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ln={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cn extends z{constructor(t,e){if(void 0===Ke)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return an}static get DefaultType(){return ln}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),P.off(this._element.closest(en),nn,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=P.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),P.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(tn),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.on(t,"mouseover",h);this._queueCallback((()=>{P.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!P.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(tn),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),P.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(Zi,tn),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(Zi),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Gi({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Zi)}_isShown(){return this.tip&&this.tip.classList.contains(tn)}_createPopper(t){const e="function"==typeof this._config.placement?this._config.placement.call(this,t,this._element):this._config.placement,i=rn[e.toUpperCase()];return Ve(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return"function"==typeof t?t.call(this._element):t}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)P.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===sn?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===sn?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");P.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?on:sn]=!0,e._enter()})),P.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?on:sn]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},P.on(this._element.closest(en),nn,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=B.getDataAttributes(this._element);for(const t of Object.keys(e))Ji.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(cn);const hn={...cn.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},dn={...cn.DefaultType,content:"(null|string|element|function)"};class un extends cn{static get Default(){return hn}static get DefaultType(){return dn}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=un.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(un);const fn="click.bs.scrollspy",pn="active",gn="[href]",mn={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},_n={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class bn extends z{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return mn}static get DefaultType(){return _n}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(P.off(this._config.target,fn),P.on(this._config.target,fn,gn,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=Q.find(gn,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=Q.findOne(e.hash,this._element);a(t)&&(this._targetLinks.set(e.hash,e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(pn),this._activateParents(t),P.trigger(this._element,"activate.bs.scrollspy",{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))Q.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(pn);else for(const e of Q.parents(t,".nav, .list-group"))for(const t of Q.prev(e,".nav-link, .nav-item > .nav-link, .list-group-item"))t.classList.add(pn)}_clearActiveClass(t){t.classList.remove(pn);const e=Q.find("[href].active",t);for(const t of e)t.classList.remove(pn)}static jQueryInterface(t){return this.each((function(){const e=bn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(window,"load.bs.scrollspy.data-api",(()=>{for(const t of Q.find('[data-bs-spy="scroll"]'))bn.getOrCreateInstance(t)})),g(bn);const vn="ArrowLeft",yn="ArrowRight",wn="ArrowUp",An="ArrowDown",En="active",Tn="fade",Cn="show",On='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',xn=`.nav-link:not(.dropdown-toggle), .list-group-item:not(.dropdown-toggle), [role="tab"]:not(.dropdown-toggle), ${On}`;class kn extends z{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),P.on(this._element,"keydown.bs.tab",(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?P.trigger(e,"hide.bs.tab",{relatedTarget:t}):null;P.trigger(t,"show.bs.tab",{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(En),this._activate(n(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),P.trigger(t,"shown.bs.tab",{relatedTarget:e})):t.classList.add(Cn)}),t,t.classList.contains(Tn)))}_deactivate(t,e){t&&(t.classList.remove(En),t.blur(),this._deactivate(n(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),P.trigger(t,"hidden.bs.tab",{relatedTarget:e})):t.classList.remove(Cn)}),t,t.classList.contains(Tn)))}_keydown(t){if(![vn,yn,wn,An].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=[yn,An].includes(t.key),i=b(this._getChildren().filter((t=>!l(t))),t.target,e,!0);i&&(i.focus({preventScroll:!0}),kn.getOrCreateInstance(i).show())}_getChildren(){return Q.find(xn,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=n(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`#${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=Q.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",En),n(".dropdown-menu",Cn),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(En)}_getInnerElement(t){return t.matches(xn)?t:Q.findOne(xn,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=kn.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(document,"click.bs.tab",On,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||kn.getOrCreateInstance(this).show()})),P.on(window,"load.bs.tab",(()=>{for(const t of Q.find('.active[data-bs-toggle="tab"], .active[data-bs-toggle="pill"], .active[data-bs-toggle="list"]'))kn.getOrCreateInstance(t)})),g(kn);const Ln="hide",Dn="show",Sn="showing",In={animation:"boolean",autohide:"boolean",delay:"number"},Nn={animation:!0,autohide:!0,delay:5e3};class Pn extends z{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Nn}static get DefaultType(){return In}static get NAME(){return"toast"}show(){P.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(Ln),d(this._element),this._element.classList.add(Dn,Sn),this._queueCallback((()=>{this._element.classList.remove(Sn),P.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(P.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add(Sn),this._queueCallback((()=>{this._element.classList.add(Ln),this._element.classList.remove(Sn,Dn),P.trigger(this._element,"hidden.bs.toast")}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(Dn),super.dispose()}isShown(){return this._element.classList.contains(Dn)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){P.on(this._element,"mouseover.bs.toast",(t=>this._onInteraction(t,!0))),P.on(this._element,"mouseout.bs.toast",(t=>this._onInteraction(t,!1))),P.on(this._element,"focusin.bs.toast",(t=>this._onInteraction(t,!0))),P.on(this._element,"focusout.bs.toast",(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=Pn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return q(Pn),g(Pn),{Alert:R,Button:K,Carousel:at,Collapse:pt,Dropdown:hi,Modal:Ni,Offcanvas:zi,Popover:un,ScrollSpy:bn,Tab:kn,Toast:Pn,Tooltip:cn}})); -//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/src/public/js/list.min.js b/src/public/js/list.min.js deleted file mode 100644 index 8131881..0000000 --- a/src/public/js/list.min.js +++ /dev/null @@ -1,2 +0,0 @@ -var List;List=function(){var t={"./src/add-async.js":function(t){t.exports=function(t){return function e(r,n,s){var i=r.splice(0,50);s=(s=s||[]).concat(t.add(i)),r.length>0?setTimeout((function(){e(r,n,s)}),1):(t.update(),n(s))}}},"./src/filter.js":function(t){t.exports=function(t){return t.handlers.filterStart=t.handlers.filterStart||[],t.handlers.filterComplete=t.handlers.filterComplete||[],function(e){if(t.trigger("filterStart"),t.i=1,t.reset.filter(),void 0===e)t.filtered=!1;else{t.filtered=!0;for(var r=t.items,n=0,s=r.length;nv.page,a=new g(t[s],void 0,n),v.items.push(a),r.push(a)}return v.update(),r}m(t.slice(0),e)}},this.show=function(t,e){return this.i=t,this.page=e,v.update(),v},this.remove=function(t,e,r){for(var n=0,s=0,i=v.items.length;s-1&&r.splice(n,1),v},this.trigger=function(t){for(var e=v.handlers[t].length;e--;)v.handlers[t][e](v);return v},this.reset={filter:function(){for(var t=v.items,e=t.length;e--;)t[e].filtered=!1;return v},search:function(){for(var t=v.items,e=t.length;e--;)t[e].found=!1;return v}},this.update=function(){var t=v.items,e=t.length;v.visibleItems=[],v.matchingItems=[],v.templater.clear();for(var r=0;r=v.i&&v.visibleItems.lengthe},innerWindow:function(t,e,r){return t>=e-r&&t<=e+r},dotted:function(t,e,r,n,s,i,a){return this.dottedLeft(t,e,r,n,s,i)||this.dottedRight(t,e,r,n,s,i,a)},dottedLeft:function(t,e,r,n,s,i){return e==r+1&&!this.innerWindow(e,s,i)&&!this.right(e,n)},dottedRight:function(t,e,r,n,s,i,a){return!t.items[a-1].values().dotted&&(e==n&&!this.innerWindow(e,s,i)&&!this.right(e,n))}};return function(e){var n=new i(t.listContainer.id,{listClass:e.paginationClass||"pagination",item:e.item||"
  • ",valueNames:["page","dotted"],searchClass:"pagination-search-that-is-not-supposed-to-exist",sortClass:"pagination-sort-that-is-not-supposed-to-exist"});s.bind(n.listContainer,"click",(function(e){var r=e.target||e.srcElement,n=t.utils.getAttribute(r,"data-page"),s=t.utils.getAttribute(r,"data-i");s&&t.show((s-1)*n+1,n)})),t.on("updated",(function(){r(n,e)})),r(n,e)}}},"./src/parse.js":function(t,e,r){t.exports=function(t){var e=r("./src/item.js")(t),n=function(r,n){for(var s=0,i=r.length;s0?setTimeout((function(){e(r,s)}),1):(t.update(),t.trigger("parseComplete"))};return t.handlers.parseComplete=t.handlers.parseComplete||[],function(){var e=function(t){for(var e=t.childNodes,r=[],n=0,s=e.length;n]/g.exec(t)){var e=document.createElement("tbody");return e.innerHTML=t,e.firstElementChild}if(-1!==t.indexOf("<")){var r=document.createElement("div");return r.innerHTML=t,r.firstElementChild}}},a=function(e,r,n){var s=void 0,i=function(e){for(var r=0,n=t.valueNames.length;r=1;)t.list.removeChild(t.list.firstChild)},function(){var r;if("function"!=typeof t.item){if(!(r="string"==typeof t.item?-1===t.item.indexOf("<")?document.getElementById(t.item):i(t.item):s()))throw new Error("The list needs to have at least one item on init otherwise you'll have to add a template.");r=n(r,t.valueNames),e=function(){return r.cloneNode(!0)}}else e=function(e){var r=t.item(e);return i(r)}}()};t.exports=function(t){return new e(t)}},"./src/utils/classes.js":function(t,e,r){var n=r("./src/utils/index-of.js"),s=/\s+/;Object.prototype.toString;function i(t){if(!t||!t.nodeType)throw new Error("A DOM element reference is required");this.el=t,this.list=t.classList}t.exports=function(t){return new i(t)},i.prototype.add=function(t){if(this.list)return this.list.add(t),this;var e=this.array();return~n(e,t)||e.push(t),this.el.className=e.join(" "),this},i.prototype.remove=function(t){if(this.list)return this.list.remove(t),this;var e=this.array(),r=n(e,t);return~r&&e.splice(r,1),this.el.className=e.join(" "),this},i.prototype.toggle=function(t,e){return this.list?(void 0!==e?e!==this.list.toggle(t,e)&&this.list.toggle(t):this.list.toggle(t),this):(void 0!==e?e?this.add(t):this.remove(t):this.has(t)?this.remove(t):this.add(t),this)},i.prototype.array=function(){var t=(this.el.getAttribute("class")||"").replace(/^\s+|\s+$/g,"").split(s);return""===t[0]&&t.shift(),t},i.prototype.has=i.prototype.contains=function(t){return this.list?this.list.contains(t):!!~n(this.array(),t)}},"./src/utils/events.js":function(t,e,r){var n=window.addEventListener?"addEventListener":"attachEvent",s=window.removeEventListener?"removeEventListener":"detachEvent",i="addEventListener"!==n?"on":"",a=r("./src/utils/to-array.js");e.bind=function(t,e,r,s){for(var o=0,l=(t=a(t)).length;o32)return!1;var a=n,o=function(){var t,r={};for(t=0;t=p;b--){var j=o[t.charAt(b-1)];if(C[b]=0===m?(C[b+1]<<1|1)&j:(C[b+1]<<1|1)&j|(v[b+1]|v[b])<<1|1|v[b+1],C[b]&d){var x=l(m,b-1);if(x<=u){if(u=x,!((c=b-1)>a))break;p=Math.max(1,2*a-c)}}}if(l(m+1,a)>u)break;v=C}return!(c<0)}},"./src/utils/get-attribute.js":function(t){t.exports=function(t,e){var r=t.getAttribute&&t.getAttribute(e)||null;if(!r)for(var n=t.attributes,s=n.length,i=0;i=48&&t<=57}function i(t,e){for(var i=(t+="").length,a=(e+="").length,o=0,l=0;o=i&&l=a?-1:l>=a&&o=i?1:i-a}i.caseInsensitive=i.i=function(t,e){return i((""+t).toLowerCase(),(""+e).toLowerCase())},Object.defineProperties(i,{alphabet:{get:function(){return e},set:function(t){r=[];var s=0;if(e=t)for(;sEX>4Tx04R}tkv&MmP!xqvQ>7{u2Ro=ZWT;MdQ4z;lg(6f4wL+^7CNKSiCJjl7 zi=*ILaPVib>fqw6tAnc`2>yULJ2)x2NQw6)g%&YBc)XAE?m4`7FCa83OtZS;fTr7K zI++l&xm7Xrie3yO03akY%b1g-6nxj$y<3U97|-&r`*ZcHd5Zx7kvPr_(R+3fXbK(h;9!UJib;aX1&PA66o*6MS>3QM^u~_V2rGr_?)QG2vqpGG;zL51; z<-EmNtJGNQo&1O4yuPx`b=spyVi8M_AVNV6WmI4zMyF1Sg*4qKeEcJ>Um}-6t}+-o z7Epx-+4Y0Z;CFAW!qlXf6ixu$FOKsuM&sE9nsvwdK6aeu2@re+uJpFQ+5l!hNw2rH z=n*im4P0EeHDwRD+yRE34B3=jDM(u=6oB_L8dDA!yaoE!yuP*Waryvcs8^{Q;NTD# zFH-ip&%b**`}S{5tA9TS4|01TZ6F{3000JJOGiWiApj)+DS6hRtN;K232;bRa{vG? zBLDy{BLR4&KXw2B00(qQO+^Rj2^j$Z5q+=&?f?J)8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b1`kO@K~#9!?OSVC8c7taYCti#x}w2XlHEOL|Nn2=jT%AY z6A=*TyC0~|b|xSopiI(rjz^K{>7MGkkG|alBqSsxBqSsxBqSsxBqSsxBqZbpoTssw zy#w&uy!UxS7=R|p$CuuqI0tzIu%(||i^$B{B<)oR%qaLCz+=vcd#A~t%X*3n8cdty zeXeZxe+!xmE`@>lP|S&13IHk^Zy!L5~z%OsCwp3h-TzrUqOB)!x)vjC$037`d_o;MTTk5Y#<03Roi7!ysm6_MAP)@_*C zp4#;QoRIA2DTvghJP)8wvMKZFL`p3Gu*?}gWL;!!0@%~<0f1Se@TP)>0r*O?n~O9? zQS^PJyhd2KlN^}YX{4wFGds^d9Lctsorr{x2R5_h$-nJrlJ0_enpp+FfiAn!j}XjOauU|nc0QXpPGWk4aw_8KcHKp&pRBY zyb)$P0B|CIR*(|cXXwjG<-sp{0NXP61CjWcod7c{nb~_Y+gL>(7@KXK}_l@d!6qH`dx zCgt@3oT{&uqBkP-58`%awjY^0S4n}f^3F-NW@#KL@lhm>RHDc`$VB$wH+M9Kkn3e5 z?(b6UO8Gz+DbLTMyfI2Vi%9%ViIMU)HBl#_FEiT&P}QXu*$LDZ#BNvvuM&Y_)_VZH z%&NRGN~~whxg0IUwz3Kn$?x?{w*Zs@l{PdFv!vnb^~qr})}^)m&6N<{1+Q+U`HX+1@GQy{6X5`l&#LP|W#79dny z2*G63+PE4e*kL8q(0B`ZDkdy~#DUB?6d*oD5%r2>J7c=r`ko@Mt@|`1CH^`DM#a=K z`8r1A-HnL2dm`yF>zhU9)h|b2gkXO6Bi6V@CD{d~GPh&yv5;N8VxCwNIU%BUq`o*^ zDe3#7{N=?w8%94Bfl<|E13*_nBdel4r8-@a=a)UMylkvfsYghnFGi#*dzm$G?={A@ zC;~UkY?-FAE&?r%s1dgHeL&gF)+UX46$lKZy~Z)Ou%9t%wNs6vaws;uN)G#C0!f;g z-D?1^alo>R@tf$^@_jFvl;*MnO+rFKLPA19LPA19LPEmNgsF=F-un*#dd|6T`>rZ- z{%vMw&bd}}?GA?Jr6PbQ09Ver2k-qc$;uBadb20z+&^Rb-6gr3xxV3?yBpJAAHbb+ z?m8Yj$#tI+r-1puWoO74arS|~7eI_}Wq3!Dt2w+D?D}o|#z4u!Hww!Yp zdg!2hKgBCsB>+$1Ix|D2cDsx3kM8!u5jOArm2)l}^)=^Qwy&w$E|S1)kr7M@Bx5y{ zNES4J{fw)4>8bb<#+=6Y-WN$asV6q^4u=KHu=%vmw(}6!B>6S!i~#h`zUYQz)qCF)(d!uQ(A`e4 ztvOHI$9btJe-@!6&^-ayd - img.tvg-logo{max-width:80px;max-height:80px;padding:2px;border-radius:5px} - tr.chrow td{padding:3px} - td.chindex{width:1%} - td.chlogo{width:100px} - div.chlist-table{max-height:550px} - -{% endblock %} - -{% block header %} -

    О плейлисте: {{ name }}

    - {% if (content.encoding.alert) %} - - {% endif %} - {% if (status.errCode > 0) %} - - {% endif %} -{% endblock %} - -{% block footer %} - - -{% endblock %} - -{% block content %} -
    -
    - - - - - - - - - - - - - - - - - - - - - - - -
    ID - {{ id }} {% if status.possibleStatus == 'online' %} - online - {% elseif status.possibleStatus == 'offline' %} - offline - {% elseif status.possibleStatus == 'timeout' %} - timeout - {% elseif status.possibleStatus == 'error' %} - error - {% endif %} -
    Описание

    {{ desc }}

    Ccылка для ТВ{{ url }}
    M3U{{ pls }}
    Источник{{ src }}
    - - {% if (content.attributes) %} -

    Дополнительные атрибуты

    - - - {% for attribute,value in content.attributes %} - - - - - {% endfor %} - -
    {{ attribute }}{{ value }}
    - {% endif %} -
    - -
    -

    Список каналов ({{ content.channelCount ?? 0 }})

    - {% if (content.channelCount > 0) %} -
    - -
    - - - {% for channel in content.channels %} - - - - - - {% endfor %} - -
    {{ loop.index }}{{ channel.name }}
    -
    -
    - {% endif %} -
    -
    -{% endblock %} diff --git a/src/views/faq.twig b/src/views/faq.twig deleted file mode 100644 index 114ad6e..0000000 --- a/src/views/faq.twig +++ /dev/null @@ -1,297 +0,0 @@ -{% extends "template.twig" %} - -{% block header %} -

    FAQ

    -{% endblock %} - -{% block content %} -
    -
    -

    - В этом сервисе собраны ссылки на IPTV-плейлисты, которые находятся в открытом доступе. - Они отбираются вручную и постоянно проверяются здесь автоматически. -

    -

    - Сервис "{{ config('app.title') }}" ({{ base_url() }}) не предназначен для хранения или трансляции - видео/аудио потоков, программ телепередач, плейлистов и их поддержки. Этим занимаются администраторы - ресурсов, указанные как источник, и те, с чьих ресурсов ведётся трансляция. -

    -

    - За содержимое плейлистов и их качество отвечают авторы плейлистов. На стороне сервиса управляются сами - плейлисты. -

    -

    - Сервис "{{ config('app.title') }}" ({{ base_url() }}) предоставляет только информацию об активности - плейлистов, найденных в открытом доступе, и короткие ссылки на них для удобства использования в ПО. - Вопросы по содержанию и работоспособности плейлистов, а также вопросы юридического характера, адресуйте - тем, кто несёт за них ответственность (см. источники плейлистов). -

    - -
    -
    -

    - -

    -
    -
    -

    Изначально сервис создавался "для себя", чтобы:

    -
      -
    • сократить ссылки на сторонние плейлисты и их было проще вводить с пульта;
    • -
    • собрать в одном месте наиболее годные плейлисты.
    • -
    -
    -
    - -
    - -
    -

    - -

    -
    -

    - На главной странице отображается список доступных в плейлистов, их идентификаторы, статусы, - количество каналов и короткие ссылки. - Для просмотра списка каналов следует нажать на ссылку "Подробнее..." под интересующим плейлистом. - Для добавления плейлиста в свой медиаплеер удобно использовать "Ссылку для ТВ". - Это делается для удобства ввода, например, на телевизоре с пульта. - На странице детальной информации также есть прямая ссылка на сам плейлист от источника. - Можно использовать и её. -

    -
    -
    - -
    -

    - -

    -
    -

    - - Добавь в свой медиаплеер "Ссылку для ТВ". -

    -
    -
    - -
    -

    - -

    -
    -

    - Возможно. По крайней мере, так утверждают источники. Но гарантий никаких никто не даёт. -

    -
    -
    - -
    -

    - -

    -
    -

    - Всё это (не) указывается внутри плейлиста его авторами. - Но в некоторых плеерах можно вручную указывать программу передач (см. ниже). -

    -
    -
    - -
    -

    - -

    -
    -
    -

    Есть некоторые критерии, по которым плейлисты отбираются в этот список:

    -
      -
    • Прежде всего -- каналы РФ и бывшего СНГ, но не только
    • -
    • Открытый источник
    • -
    • Прямая ссылка на плейлист
    • -
    • Автообновление плейлиста
    • -
    -

    - В основном, в плейлистах именно трансляции телеканалов, но могут быть просто список каких-то - (мульт)фильмов и передач, находящихся на чужих дисках (как если бы вы сами составили плейлист с музыкой, - например). -

    -
    -
    -
    - -
    -

    - -

    -
    -
    -
      -
    • - loading - Загрузка данных, нужно немного подождать. -
    • -
    • - online - Плейлист, возможно, активен. Если каналов 0, значит, вероятно, источник поставил - редирект с плейлиста на куда ему вздумалось. То есть плейлист, наверное, отсутствует - и, возможно, больше никогда не появится по текущему адресу. -
    • -
    • - timeout - Не удалось вовремя проверить плейлист, сервер с плейлистом слишком долго запрягает. -
    • -
    • - offline - Плейлист недоступен, вообще. -
    • -
    • - error - Ошибка при проверке плейлиста. Пора удалять плейлист отсюда. -
    • -
    -
    -
    -
    - -
    -

    - -

    -
    -
    -

    - Я не гарантирую корректность и актуальность информации, которую ты увидишь здесь. - Хотя я и стараюсь улучшать качество проверок, но всё же рекомендую проверять желаемые - плейлисты самостоятельно вручную, ибо нет никаких гарантий: -

    -
      -
    • что это вообще плейлисты, а не чьи-то архивы с мокрыми кисками;
    • -
    • что плейлисты по разным ссылкам не дублируют друг друга и отличаются каналами хотя бы на четверть;
    • -
    • что плейлист работоспособен (каналы работают, корректно названы, имеют аудио, etc.);
    • -
    • что подгрузится корректное количество каналов и их список (хотя на это я ещё могу влиять и стараюсь как-то улучшить).
    • -
    -
    -
    -
    - -
    -

    - -

    -
    -

    - Никакова. - Мёртвые плейлисты я периодически вычищаю, реже -- добавляю новые. - ID плейлистов могут меняться, поэтому вполне может произойти внезапная подмена одного другим, однако - намеренно я так не делаю. - Если один плейлист переезжает на новый адрес, то я ставлю временное перенаправление со старого ID на - новый. - Плюс читай выше про доверие результатам проверки (проблема может быть не стороне сервиса). -

    -
    -
    - -
    -

    - -

    -
    -

    Ну штош ¯\_(ツ)_/¯

    -
    -
    - -
    -

    - -

    -
    -
    -
      -
    • https://iptvx.one/viewtopic.php?f=12&t=4
    • -
    • https://iptvmaster.ru/epg-for-iptv
    • -
    • https://google.com
    • -
    -
    -
    -
    - -
    -

    - -

    -
    -

    - Время от времени. - Иногда я захожу сюда и проверяю всё ли на месте, иногда занимаюсь какими-то доработками. - Если есть кандидаты на добавление, то читай ниже. -

    -
    -
    - -
    -

    - -

    -
    -

    - Зависит от источника. Я этим не занимаюсь. -

    -
    -
    - -
    -

    - -

    -
    -

    - Есть, подробности здесь. -

    -
    -
    - -
    -

    - -

    -
    -

    - Сделать pull-request в репозиторий. - Я проверю плейлист и добавлю его в общий список, если всё ок. -

    -
    -
    - -
    -
    -
    -{% endblock %} diff --git a/src/views/list.twig b/src/views/list.twig deleted file mode 100644 index 5178c47..0000000 --- a/src/views/list.twig +++ /dev/null @@ -1,66 +0,0 @@ -{% extends "template.twig" %} - -{% block header %} -

    - Обновлено: {{ updated_at }} МСК
    - Плейлистов в списке: {{ count }} -

    -
    -{% endblock %} - -{% block content %} -
    - - - - - - - - - - {% for id, playlist in playlists %} - - - - - - {% endfor %} - -
    IDИнформация о плейлистеСсылка для ТВ
    {{ id }} - {{ playlist.name }} -
    - {% if playlist.desc|length > 0 %} -

    {{ playlist.desc }}

    - {% endif %} - Подробнее... -
    -
    - - {{ playlist.url }} - -
    - {% if pageCount > 0 %} -
    -
      - {% for page in range(1, pageCount) %} - {% if page == pageCurrent %} -
    • - {{ page }} -
    • - {% else %} -
    • - {{ page }} -
    • - {% endif %} - {% endfor %} -
    -
    - {% endif %} -
    -{% endblock %} - -{% block footer %} -{% endblock %} diff --git a/src/views/notfound.twig b/src/views/notfound.twig deleted file mode 100644 index 1b7f199..0000000 --- a/src/views/notfound.twig +++ /dev/null @@ -1,18 +0,0 @@ -{% extends "template.twig" %} - -{% block header %} -

    Плейлист не найден

    -{% endblock %} - -{% block content %} -
    -
    -

    - Плейлист {{ id }} не найден -

    - - Перейти к списку - -
    -
    -{% endblock %} diff --git a/src/views/template.twig b/src/views/template.twig deleted file mode 100644 index e6e53cb..0000000 --- a/src/views/template.twig +++ /dev/null @@ -1,81 +0,0 @@ - - - - {% block title %}{{ config('app.title') }}{% endblock %} - - - - - - - - - - - - - - - - {% block head %}{% endblock %} - - -
    -
    - -
    - -
    - {% block header %}{% endblock %} - {% block content %}{% endblock %} -
    - - -
    - {% include("custom.twig") ignore missing %} - - diff --git a/tools/check-pls.sh b/tools/check-pls.sh deleted file mode 100755 index 5df055a..0000000 --- a/tools/check-pls.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/bash - -################################################# -# -# IPTV Playlist check tool -# -# Usage: -# ./check-pls.sh local/pls.m3u -# ./check-pls.sh https://example.com/pls.m3u -# -# 1st argument is playlist file name or URL. -# If it is an URL it will be saved in /tmp and -# checked as local file. -# -# Both *.m3u and *.m3u8 are supported. -# -# Anthony Axenov (c) 2022 -# The MIT License: -# https://github.com/anthonyaxenov/iptv/blob/master/LICENSE -# -################################################# - -awk ' - BEGIN { - total_count=0 - success_count=0 - fail_count=0 - print "\033[20m\033[97mPlaylist:\033[0m " ARGV[1] - if (ARGV[1] ~ /^http(s)?:\/\/.*/) { - parts_count = split(ARGV[1], parts, "/") - file_name = parts[parts_count] - code = system("wget " ARGV[1] " -qO /tmp/" file_name " > /dev/null") - if (code == 0) { - print "Saved in /tmp/" file_name - } else { - print "ERROR: cannot download playlist: " ARGV[1] - exit 1 - } - ARGV[1] = "/tmp/" file_name - } - print "" - print "\033[20m\033[97mNote 1:\033[0m operation may take some time, press CTRL+C to stop." - print "\033[20m\033[97mNote 2:\033[0m results may be inaccurate, you should use proper IPTV software to re-check." - print "\033[20m\033[97mNote 3:\033[0m error codes listed here - https://everything.curl.dev/usingcurl/returns" - print "--------------------" - } - { - sub("\r$", "", $0) # crlf -> lf - if ($0 ~ /^#EXTINF:.+,/) { - total_count++ - channel_name = substr($0, index($0, ",") + 1, length($0)) - print "\n[" total_count "] " channel_name - } - if ($0 ~ /^http(s)?:\/\/.*/) { - url = sprintf("%c%s%c", 34, $0, 34) # 34 is " - cmd = "curl -fs --max-time 5 -w \"%{http_code}\" --max-filesize 5000 -o /dev/null " url - cmd | getline http_code - code = close(cmd) - if (http_code == "000") { - http_code = "-" - } - if (code == 0 || code == 63) { - print "\033[32mOK:\033[0m " url - success_count++ - } else { - print "\033[91mERROR\033[0m " code " (" http_code "): " url - fail_count++ - } - } - } - END { - print "--------------------" - print "\033[20m\033[97mPlaylist:\033[0m " ARGV[1] - print "- Success:\t\033[32m" success_count "\033[0m/" total_count - print "- Failed: \t\033[91m" fail_count "\033[0m/" total_count - } -' $1 diff --git a/tools/download-all.sh b/tools/download-all.sh deleted file mode 100755 index fe01daf..0000000 --- a/tools/download-all.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -################################################# -# -# IPTV Playlist download tool -# -# Usage: -# ./download-all.sh -# -# All playlists from playlists.ini will be -# downloaded in ./downloaded directory -# -# Anthony Axenov (c) 2022 -# The MIT License: -# https://github.com/anthonyaxenov/iptv/blob/master/LICENSE -# -################################################# - -TOOLS_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null && pwd 2> /dev/null; )"; -DL_DIR="$TOOLS_DIR/downloaded" -INI_FILE="$(dirname "$TOOLS_DIR")/playlists.ini" - -rm -rf "$DL_DIR" && \ - mkdir -p "$DL_DIR" && \ - cd "$DL_DIR" && \ - cat "$INI_FILE" \ - | grep -P "pls\s*=\s*'(.*)'" \ - | sed "s#^pls\s*=\s*##g" \ - | sed "s#'##g" \ - | tr -d '\r' \ - | xargs wget diff --git a/tools/find-in-all.sh b/tools/find-in-all.sh deleted file mode 100755 index a01cb77..0000000 --- a/tools/find-in-all.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -################################################# -# -# IPTV channel finder (all playlists) -# -# Usage: -# ./download-all.sh -# ./find-in-all.sh "(disney|atv)" -# -# 1st argument is channel name pattern. -# -# Anthony Axenov (c) 2022 -# The MIT License: -# https://github.com/anthonyaxenov/iptv/blob/master/LICENSE -# -################################################# - -TOOLS_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null && pwd 2> /dev/null; )"; -DL_DIR="$TOOLS_DIR/downloaded" -[ ! -d "$DL_DIR" ] && echo "Error: 'tools/downloaded' directory does not exist. Run tools/download-all.sh" && exit 1 -[ ! "$(ls -A "$DL_DIR")" ] && echo "Error: 'tools/downloaded' directory is empty. Run tools/download-all.sh" && exit 2 -for file in $TOOLS_DIR/downloaded/*; do - $TOOLS_DIR/find-in-pls.sh "$1" "$file" -done diff --git a/tools/find-in-pls.sh b/tools/find-in-pls.sh deleted file mode 100755 index adfcdea..0000000 --- a/tools/find-in-pls.sh +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/bash - -################################################# -# -# IPTV channel finder (one playlist) -# -# Usage: -# ./find-in-pls.sh "disney" local/pls.m3u -# ./find-in-pls.sh "disney" https://example.com/pls.m3u -# -# 1st argument is channel name pattern. -# -# 2nd argument is playlist file name or URL. -# If it is an URL it will be saved in /tmp and -# checked as local file. -# -# Both *.m3u and *.m3u8 are supported. -# -# Anthony Axenov (c) 2022 -# The MIT License: -# https://github.com/anthonyaxenov/iptv/blob/master/LICENSE -# -################################################# - -channel="$1" -playlist="$2" -playlist_url="$playlist" -regex_ch="^#extinf:\s*-?[01]\s*.*,(.*${channel,,}.*)" -regex_url="^https?:\/\/.*$" - -is_downloaded=0 -download_dir="/tmp/$(date '+%s%N')" - -found_count=0 -found_last=0 -line_count=1 - -if [[ "$playlist" =~ $regex_url ]]; then - mkdir -p "$download_dir" - cd "$download_dir" - wget "$playlist" -q > /dev/null - if [ $? -eq 0 ]; then - is_downloaded=1 - playlist="$download_dir/$(ls -1 "$download_dir")" - cd - > /dev/null - else - echo "ERROR: cannot download playlist: $playlist" - exit 1 - fi -fi - -echo "--------------------" -echo -e "\033[20m\033[97mChannel:\033[0m $channel" -echo -e "\033[20m\033[97mPlaylist:\033[0m $playlist_url" -echo -e "\033[20m\033[97mRegex:\033[0m $regex_ch" -echo "--------------------" - -while read line; do - if [[ "${line,,}" =~ $regex_ch ]]; then - echo -e "\n\033[32m$line_count FOUND:\033[0m\t$line" - ((found_count += 1)) - found_last=$found_count - fi - if [ $found_last -gt 0 ]; then - if [[ "${line,,}" =~ $regex_url ]]; then - echo -e "\t\t$line" - found_last=0 - fi - fi - ((line_count += 1)) -done < $playlist - -if [ $found_count -eq 0 ]; then - echo -e "\033[91mNothing found\033[0m" -else - echo "--------------------" - echo -e "\033[20m\033[97mChannel:\033[0m $channel" - echo -e "\033[20m\033[97mPlaylist:\033[0m $playlist_url" - echo -e "\033[20m\033[97mFound:\033[0m\033[32m $found_count\033[0m" -fi - -if [ $is_downloaded -eq 1 ]; then - rm -rf "$download_dir" -fi diff --git a/tools/make-pls.sh b/tools/make-pls.sh deleted file mode 100755 index 83740b7..0000000 --- a/tools/make-pls.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash - -################################################# -# -# IPTV channel maker (all playlists) -# -# Usage: -# ./download-all.sh -# ./make-pls.sh "disney" -# -# 1st argument is channel name pattern. -# -# To save output in file use redirection: -# ./make-pls.sh "disney" > disney.m3u8 -# -# Anthony Axenov (c) 2022 -# The MIT License: -# https://github.com/anthonyaxenov/iptv/blob/master/LICENSE -# -################################################# - -TOOLS_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null && pwd 2> /dev/null; )"; -DL_DIR="$TOOLS_DIR/downloaded" -[ ! -d "$DL_DIR" ] && echo "Error: 'tools/downloaded' directory does not exist. Run tools/download-all.sh" && exit 1 -[ ! "$(ls -A "$DL_DIR")" ] && echo "Error: 'tools/downloaded' directory is empty. Run tools/download-all.sh" && exit 2 - -channel="$1" -playlist="$2" - -regex_ch="^#extinf:\s*-?[01]\s*.*,(.*${channel,,}.*)" -regex_url="^https?:\/\/.*$" - -found_count=0 -found_last=0 - -echo "#EXTM3U" -echo "# Autogenerated at `date +%d.%m.%Y`" -echo "# https://github.com/anthonyaxenov/iptv" -echo - -for file in ./downloaded/*; do - while read line; do - if [[ "${line,,}" =~ $regex_ch ]]; then - echo -e "$line" - ((found_count += 1)) - found_last=$found_count - fi - if [ $found_last -gt 0 ]; then - if [[ "${line,,}" =~ $regex_url ]]; then - echo -e "$line\n" - found_last=0 - fi - fi - done < $file -done