diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..01f441d
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,6 @@
+.venv
+.git
+__pycache__
+*.pyc
+.ruff_cache
+.mypy_cache
diff --git a/.github/workflows/build_docker.yml b/.github/workflows/build_docker.yml
new file mode 100644
index 0000000..8e18e3a
--- /dev/null
+++ b/.github/workflows/build_docker.yml
@@ -0,0 +1,47 @@
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+
+# GitHub recommends pinning actions to a commit SHA.
+# To get a newer version, you will need to update the SHA.
+# You can also reference a tag or branch, but the action may change without warning.
+
+name: Publish Docker image
+
+on:
+ push:
+ branches:
+ - main
+
+jobs:
+ push_to_registries:
+ name: Push Docker image to multiple registries
+ runs-on: ubuntu-latest
+ permissions:
+ packages: write
+ contents: read
+ steps:
+ - name: Check out the repo
+ uses: actions/checkout@v3
+
+ - name: Log in to the Container registry
+ uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Extract metadata (tags, labels) for Docker
+ id: meta
+ uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
+ with:
+ images: ghcr.io/${{ github.repository }}
+
+ - name: Build and push Docker images
+ uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
+ with:
+ context: .
+ push: true
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..b99eba5
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,20 @@
+# Build stage
+FROM python:3.11 AS builder
+
+COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
+
+WORKDIR /app
+COPY pyproject.toml uv.lock ./
+RUN uv sync --frozen --no-install-project
+COPY . .
+RUN uv sync
+
+# Runtime stage
+FROM python:3.11-slim
+
+WORKDIR /app
+COPY --from=builder /app/ /app/
+
+ENV PATH="/app/.venv/bin:$PATH"
+
+CMD ["fastapi", "dev", "--host", "0.0.0.0", "--port", "31337", "labeler/adapter/fastapi_srv.py" ]
diff --git a/README.md b/README.md
index 2e5ba86..fe4b2e2 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,24 @@
Skrypt, który generuje podsumowanie [Bazy Wiedzy zasobów Hackerspace Trójmiasto](https://kb.hs3.pl/docs) w formie statycznej strony internetowej.
+## Uruchomienie połączenia z drukarką etykiet
+
+Potrzebne, by działał przycisk w kolumnie `print`. Po kliknięciu, nastąpi próba połączenia się z drukarką Brother PT-E550W, pod adresem IP zdefiniowanym w `PRINTER_IT`, w celu wydruku naklejki z kodem QR.
+
+```bash
+uv venv --python 3.11
+source .venv.bin/activate
+uv sync
+fastapi dev --port 31337 labeler/adapter/fastapi_srv.py
+export PRINTER_IT=192.168.0.147
+```
+
+W razie problemów, spróbuj alternatywnych komend:
+```bash
+source .venv/Scripts/activate
+uv run -- fastapi dev --port 31337 labeler/adapter/fastapi_srv.py
+```
+
## Sposób działania
1. Baza Wiedzy znajduje się na Discourse Hackerspace Trójmiasto i jest dostępna publicznie. Projekt wykorzystuje Discourse REST API do pobrania listy zasobów.
@@ -43,3 +61,4 @@ ID, nazwa, miejsce, ilość, opiekunowie, tagi
## Dokumentacja
- [Discourse REST API](https://docs.discourse.org/)
+- [hbrylkowski/labeling_bot](https://github.com/hbrylkowski/labeling_bot)
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..f0d3f49
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,12 @@
+version: "3.8"
+services:
+ bot:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ environment:
+ - PRINTER_IP=192.168.1.93
+ - TELEGRAM_TOKEN=6386069775:AAFOQL7lIsDe_5njXptfOwmHWEVo_yyVAi4
+ command:
+ - python
+ - labeler/adapter/telegram_bot.py
\ No newline at end of file
diff --git a/fegen/__init__.py b/fegen/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/discourse.py b/fegen/discourse.py
similarity index 99%
rename from discourse.py
rename to fegen/discourse.py
index dc31edc..cf42b56 100644
--- a/discourse.py
+++ b/fegen/discourse.py
@@ -16,6 +16,7 @@ PLACES = [
"audiolab",
"server-room"
]
+
class DiscourseDatabase():
def __init__(self):
data = self.get_category_data()
diff --git a/docs/index.html b/fegen/docs/index.html
similarity index 75%
rename from docs/index.html
rename to fegen/docs/index.html
index 77039e7..59ee207 100644
--- a/docs/index.html
+++ b/fegen/docs/index.html
@@ -30,6 +30,7 @@
Baza Zasobów Hackerspace Trójmiasto
+
@@ -44,6 +45,8 @@
| label |
+ print |
+
@@ -60,6 +63,8 @@
|
+ |
+
@@ -74,6 +79,40 @@
|
+ |
+
+
+
+
+
+ | 747 |
+
+ Gra handheld "Crazy Brick" |
+
+ cow-work |
+
+ ['cow-work', 'video-game'] |
+
+ |
+
+ |
+
+
+
+
+
+ | 745 |
+
+ Statyw na aparat |
+
+ unknown |
+
+ [] |
+
+ |
+
+ |
+
@@ -88,6 +127,8 @@
|
+ |
+
@@ -102,6 +143,8 @@
|
+ |
+
@@ -116,6 +159,8 @@
|
+ |
+
@@ -130,6 +175,8 @@
|
+ |
+
@@ -144,6 +191,8 @@
|
+ |
+
@@ -158,6 +207,8 @@
|
+ |
+
@@ -172,6 +223,8 @@
|
+ |
+
@@ -186,6 +239,8 @@
|
+ |
+
@@ -200,6 +255,8 @@
|
+ |
+
@@ -214,6 +271,8 @@
|
+ |
+
@@ -228,6 +287,8 @@
|
+ |
+
@@ -242,6 +303,8 @@
|
+ |
+
@@ -256,6 +319,8 @@
|
+ |
+
@@ -270,6 +335,8 @@
|
+ |
+
@@ -284,6 +351,8 @@
|
+ |
+
@@ -298,6 +367,8 @@
|
+ |
+
@@ -312,6 +383,8 @@
|
+ |
+
@@ -326,6 +399,8 @@
|
+ |
+
@@ -340,6 +415,8 @@
|
+ |
+
@@ -354,6 +431,8 @@
|
+ |
+
@@ -368,6 +447,8 @@
|
+ |
+
@@ -382,6 +463,8 @@
|
+ |
+
@@ -396,6 +479,8 @@
|
+ |
+
@@ -410,6 +495,8 @@
|
+ |
+
@@ -424,6 +511,8 @@
|
+ |
+
@@ -438,6 +527,8 @@
|
+ |
+
@@ -452,6 +543,8 @@
|
+ |
+
@@ -466,6 +559,8 @@
|
+ |
+
@@ -480,6 +575,8 @@
|
+ |
+
@@ -494,6 +591,8 @@
|
+ |
+
@@ -508,6 +607,8 @@
|
+ |
+
@@ -522,6 +623,8 @@
|
+ |
+
@@ -536,6 +639,8 @@
|
+ |
+
@@ -550,6 +655,8 @@
|
+ |
+
@@ -564,6 +671,8 @@
|
+ |
+
@@ -578,6 +687,8 @@
|
+ |
+
@@ -592,6 +703,8 @@
|
+ |
+
@@ -606,6 +719,8 @@
|
+ |
+
@@ -620,6 +735,8 @@
|
+ |
+
@@ -634,6 +751,8 @@
|
+ |
+
@@ -648,6 +767,8 @@
|
+ |
+
@@ -662,6 +783,8 @@
|
+ |
+
@@ -676,6 +799,8 @@
|
+ |
+
@@ -690,6 +815,8 @@
|
+ |
+
@@ -704,6 +831,8 @@
|
+ |
+
@@ -718,6 +847,8 @@
|
+ |
+
@@ -732,6 +863,8 @@
|
+ |
+
@@ -746,6 +879,8 @@
|
+ |
+
@@ -760,6 +895,8 @@
|
+ |
+
@@ -774,6 +911,8 @@
|
+ |
+
@@ -788,6 +927,8 @@
|
+ |
+
@@ -802,6 +943,8 @@
|
+ |
+
@@ -816,6 +959,8 @@
|
+ |
+
@@ -830,6 +975,8 @@
|
+ |
+
@@ -844,6 +991,8 @@
|
+ |
+
@@ -858,6 +1007,8 @@
|
+ |
+
@@ -872,6 +1023,8 @@
|
+ |
+
@@ -886,6 +1039,8 @@
|
+ |
+
@@ -900,6 +1055,8 @@
|
+ |
+
@@ -914,6 +1071,8 @@
|
+ |
+
@@ -928,6 +1087,8 @@
|
+ |
+
@@ -942,6 +1103,8 @@
|
+ |
+
@@ -956,6 +1119,8 @@
|
+ |
+
@@ -970,6 +1135,8 @@
|
+ |
+
@@ -984,6 +1151,8 @@
|
+ |
+
@@ -998,6 +1167,8 @@
|
+ |
+
@@ -1012,6 +1183,8 @@
|
+ |
+
@@ -1026,6 +1199,8 @@
|
+ |
+
@@ -1040,6 +1215,8 @@
|
+ |
+
@@ -1054,6 +1231,8 @@
|
+ |
+
@@ -1068,6 +1247,8 @@
|
+ |
+
@@ -1082,6 +1263,8 @@
|
+ |
+
@@ -1096,6 +1279,8 @@
|
+ |
+
@@ -1110,6 +1295,8 @@
|
+ |
+
@@ -1124,6 +1311,8 @@
|
+ |
+
@@ -1138,6 +1327,8 @@
|
+ |
+
@@ -1152,6 +1343,8 @@
|
+ |
+
@@ -1166,6 +1359,8 @@
|
+ |
+
@@ -1180,6 +1375,8 @@
|
+ |
+
@@ -1194,6 +1391,8 @@
|
+ |
+
@@ -1208,6 +1407,8 @@
|
+ |
+
@@ -1222,6 +1423,8 @@
|
+ |
+
@@ -1236,6 +1439,8 @@
|
+ |
+
@@ -1250,6 +1455,8 @@
|
+ |
+
@@ -1264,6 +1471,8 @@
|
+ |
+
@@ -1278,6 +1487,8 @@
|
+ |
+
@@ -1292,6 +1503,8 @@
|
+ |
+
@@ -1306,6 +1519,8 @@
|
+ |
+
@@ -1320,6 +1535,8 @@
|
+ |
+
@@ -1334,6 +1551,8 @@
|
+ |
+
@@ -1348,6 +1567,8 @@
|
+ |
+
@@ -1362,6 +1583,8 @@
|
+ |
+
@@ -1376,6 +1599,8 @@
|
+ |
+
@@ -1390,6 +1615,8 @@
|
+ |
+
@@ -1404,6 +1631,8 @@
|
+ |
+
@@ -1418,6 +1647,8 @@
|
+ |
+
@@ -1432,6 +1663,8 @@
|
+ |
+
@@ -1446,6 +1679,8 @@
|
+ |
+
@@ -1460,6 +1695,8 @@
|
+ |
+
@@ -1474,6 +1711,8 @@
|
+ |
+
@@ -1488,6 +1727,8 @@
|
+ |
+
@@ -1502,6 +1743,8 @@
|
+ |
+
@@ -1516,6 +1759,8 @@
|
+ |
+
@@ -1530,6 +1775,8 @@
|
+ |
+
@@ -1544,6 +1791,8 @@
|
+ |
+
@@ -1558,6 +1807,8 @@
|
+ |
+
@@ -1572,6 +1823,8 @@
|
+ |
+
@@ -1586,6 +1839,8 @@
|
+ |
+
@@ -1600,6 +1855,8 @@
|
+ |
+
@@ -1614,6 +1871,8 @@
|
+ |
+
@@ -1628,6 +1887,8 @@
|
+ |
+
@@ -1642,6 +1903,8 @@
|
+ |
+
@@ -1656,6 +1919,8 @@
|
+ |
+
@@ -1670,6 +1935,8 @@
|
+ |
+
@@ -1684,6 +1951,8 @@
|
+ |
+
@@ -1698,6 +1967,8 @@
|
+ |
+
@@ -1712,6 +1983,8 @@
|
+ |
+
@@ -1726,6 +1999,8 @@
|
+ |
+
@@ -1740,6 +2015,8 @@
|
+ |
+
@@ -1754,6 +2031,8 @@
|
+ |
+
@@ -1768,6 +2047,8 @@
|
+ |
+
@@ -1782,6 +2063,8 @@
|
+ |
+
@@ -1796,6 +2079,8 @@
|
+ |
+
@@ -1810,6 +2095,8 @@
|
+ |
+
@@ -1824,6 +2111,8 @@
|
+ |
+
@@ -1838,6 +2127,8 @@
|
+ |
+
@@ -1852,6 +2143,8 @@
|
+ |
+
@@ -1866,6 +2159,8 @@
|
+ |
+
@@ -1880,6 +2175,8 @@
|
+ |
+
@@ -1894,6 +2191,8 @@
|
+ |
+
@@ -1908,6 +2207,8 @@
|
+ |
+
@@ -1922,6 +2223,8 @@
|
+ |
+
@@ -1936,6 +2239,8 @@
|
+ |
+
@@ -1950,6 +2255,8 @@
|
+ |
+
@@ -1964,6 +2271,8 @@
|
+ |
+
@@ -1978,6 +2287,8 @@
|
+ |
+
@@ -1992,6 +2303,8 @@
|
+ |
+
@@ -2006,6 +2319,8 @@
|
+ |
+
@@ -2020,6 +2335,8 @@
|
+ |
+
@@ -2034,6 +2351,8 @@
|
+ |
+
@@ -2048,6 +2367,8 @@
|
+ |
+
@@ -2062,6 +2383,8 @@
|
+ |
+
@@ -2076,6 +2399,8 @@
|
+ |
+
@@ -2090,6 +2415,8 @@
|
+ |
+
@@ -2104,6 +2431,8 @@
|
+ |
+
@@ -2118,6 +2447,8 @@
|
+ |
+
@@ -2132,6 +2463,8 @@
|
+ |
+
@@ -2146,6 +2479,8 @@
|
+ |
+
@@ -2160,6 +2495,8 @@
|
+ |
+
@@ -2174,6 +2511,8 @@
|
+ |
+
@@ -2188,6 +2527,8 @@
|
+ |
+
@@ -2202,6 +2543,8 @@
|
+ |
+
@@ -2216,6 +2559,8 @@
|
+ |
+
@@ -2230,6 +2575,8 @@
|
+ |
+
@@ -2244,6 +2591,8 @@
|
+ |
+
@@ -2258,6 +2607,8 @@
|
+ |
+
@@ -2272,6 +2623,8 @@
|
+ |
+
@@ -2286,6 +2639,8 @@
|
+ |
+
@@ -2300,6 +2655,8 @@
|
+ |
+
@@ -2314,6 +2671,8 @@
|
+ |
+
@@ -2328,6 +2687,8 @@
|
+ |
+
@@ -2342,6 +2703,8 @@
|
+ |
+
@@ -2356,6 +2719,8 @@
|
+ |
+
@@ -2370,6 +2735,8 @@
|
+ |
+
@@ -2384,6 +2751,8 @@
|
+ |
+
@@ -2398,6 +2767,8 @@
|
+ |
+
@@ -2412,6 +2783,8 @@
|
+ |
+
@@ -2426,6 +2799,8 @@
|
+ |
+
@@ -2440,6 +2815,8 @@
|
+ |
+
@@ -2454,6 +2831,8 @@
|
+ |
+
@@ -2468,6 +2847,8 @@
|
+ |
+
@@ -2482,6 +2863,8 @@
|
+ |
+
@@ -2496,6 +2879,8 @@
|
+ |
+
@@ -2510,6 +2895,8 @@
|
+ |
+
@@ -2524,6 +2911,8 @@
|
+ |
+
@@ -2538,6 +2927,8 @@
|
+ |
+
@@ -2552,6 +2943,8 @@
|
+ |
+
@@ -2566,6 +2959,8 @@
|
+ |
+
@@ -2580,6 +2975,8 @@
|
+ |
+
@@ -2594,6 +2991,8 @@
|
+ |
+
@@ -2608,6 +3007,8 @@
|
+ |
+
@@ -2622,6 +3023,8 @@
|
+ |
+
@@ -2636,6 +3039,8 @@
|
+ |
+
@@ -2650,6 +3055,8 @@
|
+ |
+
@@ -2664,6 +3071,8 @@
|
+ |
+
@@ -2678,6 +3087,8 @@
|
+ |
+
@@ -2692,6 +3103,8 @@
|
+ |
+
@@ -2706,6 +3119,8 @@
|
+ |
+
@@ -2720,6 +3135,8 @@
|
+ |
+
@@ -2734,6 +3151,8 @@
|
+ |
+
@@ -2748,6 +3167,8 @@
|
+ |
+
@@ -2762,6 +3183,8 @@
|
+ |
+
@@ -2776,6 +3199,8 @@
|
+ |
+
@@ -2790,6 +3215,8 @@
|
+ |
+
@@ -2804,6 +3231,8 @@
|
+ |
+
@@ -2818,6 +3247,8 @@
|
+ |
+
@@ -2832,6 +3263,8 @@
|
+ |
+
@@ -2846,6 +3279,8 @@
|
+ |
+
@@ -2860,6 +3295,8 @@
|
+ |
+
@@ -2874,6 +3311,8 @@
|
+ |
+
@@ -2888,6 +3327,8 @@
|
+ |
+
@@ -2902,6 +3343,8 @@
|
+ |
+
@@ -2916,6 +3359,8 @@
|
+ |
+
@@ -2930,6 +3375,8 @@
|
+ |
+
@@ -2944,6 +3391,8 @@
|
+ |
+
@@ -2958,6 +3407,8 @@
|
+ |
+
@@ -2972,6 +3423,8 @@
|
+ |
+
@@ -2986,6 +3439,8 @@
|
+ |
+
@@ -3000,6 +3455,8 @@
|
+ |
+
@@ -3014,6 +3471,8 @@
|
+ |
+
@@ -3028,6 +3487,8 @@
|
+ |
+
@@ -3042,6 +3503,8 @@
|
+ |
+
@@ -3056,6 +3519,8 @@
|
+ |
+
@@ -3070,6 +3535,8 @@
|
+ |
+
@@ -3084,6 +3551,8 @@
|
+ |
+
@@ -3098,6 +3567,8 @@
|
+ |
+
@@ -3112,6 +3583,8 @@
|
+ |
+
@@ -3126,6 +3599,8 @@
|
+ |
+
@@ -3140,6 +3615,8 @@
|
+ |
+
@@ -3154,6 +3631,8 @@
|
+ |
+
@@ -3168,6 +3647,8 @@
|
+ |
+
@@ -3182,6 +3663,8 @@
|
+ |
+
@@ -3196,6 +3679,8 @@
|
+ |
+
@@ -3210,6 +3695,8 @@
|
+ |
+
@@ -3224,6 +3711,8 @@
|
+ |
+
@@ -3238,6 +3727,8 @@
|
+ |
+
@@ -3252,6 +3743,8 @@
|
+ |
+
@@ -3266,6 +3759,8 @@
|
+ |
+
@@ -3280,6 +3775,8 @@
|
+ |
+
@@ -3294,6 +3791,8 @@
|
+ |
+
@@ -3308,6 +3807,8 @@
|
+ |
+
@@ -3322,6 +3823,8 @@
|
+ |
+
@@ -3336,6 +3839,8 @@
|
+ |
+
@@ -3350,6 +3855,8 @@
|
+ |
+
@@ -3364,6 +3871,8 @@
|
+ |
+
@@ -3378,6 +3887,8 @@
|
+ |
+
@@ -3392,6 +3903,8 @@
|
+ |
+
@@ -3406,6 +3919,8 @@
|
+ |
+
@@ -3420,6 +3935,8 @@
|
+ |
+
@@ -3434,6 +3951,8 @@
|
+ |
+
@@ -3448,6 +3967,8 @@
|
+ |
+
@@ -3462,6 +3983,8 @@
|
+ |
+
@@ -3476,6 +3999,8 @@
|
+ |
+
@@ -3490,6 +4015,8 @@
|
+ |
+
@@ -3504,6 +4031,8 @@
|
+ |
+
@@ -3518,6 +4047,8 @@
|
+ |
+
@@ -3532,6 +4063,8 @@
|
+ |
+
@@ -3546,6 +4079,8 @@
|
+ |
+
@@ -3560,6 +4095,8 @@
|
+ |
+
@@ -3574,6 +4111,8 @@
|
+ |
+
@@ -3588,6 +4127,8 @@
|
+ |
+
@@ -3602,6 +4143,8 @@
|
+ |
+
@@ -3616,6 +4159,8 @@
|
+ |
+
@@ -3630,6 +4175,8 @@
|
+ |
+
@@ -3644,6 +4191,8 @@
|
+ |
+
@@ -3658,6 +4207,8 @@
|
+ |
+
@@ -3672,6 +4223,8 @@
|
+ |
+
@@ -3686,6 +4239,8 @@
|
+ |
+
@@ -3700,6 +4255,8 @@
|
+ |
+
@@ -3714,6 +4271,8 @@
|
+ |
+
@@ -3728,6 +4287,8 @@
|
+ |
+
@@ -3742,6 +4303,8 @@
|
+ |
+
@@ -3756,6 +4319,8 @@
|
+ |
+
@@ -3770,6 +4335,8 @@
|
+ |
+
@@ -3784,6 +4351,8 @@
|
+ |
+
@@ -3798,6 +4367,8 @@
|
+ |
+
@@ -3812,6 +4383,8 @@
|
+ |
+
@@ -3826,6 +4399,8 @@
|
+ |
+
@@ -3840,6 +4415,8 @@
|
+ |
+
@@ -3854,6 +4431,8 @@
|
+ |
+
@@ -3868,6 +4447,8 @@
|
+ |
+
@@ -3882,6 +4463,8 @@
|
+ |
+
@@ -3896,6 +4479,8 @@
|
+ |
+
@@ -3910,6 +4495,8 @@
|
+ |
+
@@ -3924,6 +4511,8 @@
|
+ |
+
@@ -3938,6 +4527,8 @@
|
+ |
+
@@ -3952,6 +4543,8 @@
|
+ |
+
@@ -3966,6 +4559,8 @@
|
+ |
+
@@ -3980,6 +4575,8 @@
|
+ |
+
@@ -3994,6 +4591,8 @@
|
+ |
+
@@ -4008,6 +4607,8 @@
|
+ |
+
@@ -4022,6 +4623,8 @@
|
+ |
+
@@ -4036,6 +4639,8 @@
|
+ |
+
@@ -4050,6 +4655,8 @@
|
+ |
+
@@ -4064,6 +4671,8 @@
|
+ |
+
@@ -4078,6 +4687,8 @@
|
+ |
+
@@ -4092,6 +4703,8 @@
|
+ |
+
@@ -4106,6 +4719,8 @@
|
+ |
+
@@ -4120,6 +4735,8 @@
|
+ |
+
@@ -4134,6 +4751,8 @@
|
+ |
+
@@ -4148,6 +4767,8 @@
|
+ |
+
@@ -4162,6 +4783,8 @@
|
+ |
+
@@ -4176,6 +4799,8 @@
|
+ |
+
@@ -4190,6 +4815,8 @@
|
+ |
+
@@ -4204,6 +4831,8 @@
|
+ |
+
@@ -4218,6 +4847,8 @@
|
+ |
+
@@ -4232,6 +4863,8 @@
|
+ |
+
@@ -4246,6 +4879,8 @@
|
+ |
+
@@ -4260,6 +4895,8 @@
|
+ |
+
@@ -4274,6 +4911,8 @@
|
+ |
+
@@ -4288,6 +4927,8 @@
|
+ |
+
@@ -4302,6 +4943,8 @@
|
+ |
+
@@ -4316,6 +4959,8 @@
|
+ |
+
@@ -4330,6 +4975,8 @@
|
+ |
+
@@ -4344,6 +4991,8 @@
|
+ |
+
@@ -4358,6 +5007,8 @@
|
+ |
+
@@ -4372,6 +5023,8 @@
|
+ |
+
@@ -4386,6 +5039,8 @@
|
+ |
+
@@ -4400,6 +5055,8 @@
|
+ |
+
@@ -4414,6 +5071,8 @@
|
+ |
+
@@ -4428,6 +5087,8 @@
|
+ |
+
@@ -4442,6 +5103,8 @@
|
+ |
+
@@ -4456,6 +5119,8 @@
|
+ |
+
@@ -4470,6 +5135,8 @@
|
+ |
+
@@ -4484,6 +5151,8 @@
|
+ |
+
@@ -4498,6 +5167,8 @@
|
+ |
+
@@ -4512,6 +5183,8 @@
|
+ |
+
@@ -4526,6 +5199,8 @@
|
+ |
+
@@ -4540,6 +5215,8 @@
|
+ |
+
@@ -4554,6 +5231,8 @@
|
+ |
+
@@ -4568,6 +5247,8 @@
|
+ |
+
@@ -4582,6 +5263,8 @@
|
+ |
+
@@ -4596,6 +5279,8 @@
|
+ |
+
@@ -4610,6 +5295,8 @@
|
+ |
+
@@ -4624,6 +5311,8 @@
|
+ |
+
@@ -4638,6 +5327,8 @@
|
+ |
+
@@ -4652,6 +5343,8 @@
|
+ |
+
@@ -4666,6 +5359,8 @@
|
+ |
+
@@ -4680,6 +5375,8 @@
|
+ |
+
@@ -4694,6 +5391,8 @@
|
+ |
+
@@ -4708,6 +5407,8 @@
|
+ |
+
@@ -4722,6 +5423,8 @@
|
+ |
+
@@ -4736,6 +5439,8 @@
|
+ |
+
@@ -4750,6 +5455,8 @@
|
+ |
+
@@ -4764,6 +5471,8 @@
|
+ |
+
@@ -4778,6 +5487,8 @@
|
+ |
+
@@ -4792,6 +5503,8 @@
|
+ |
+
@@ -4806,6 +5519,8 @@
|
+ |
+
@@ -4820,6 +5535,8 @@
|
+ |
+
@@ -4834,6 +5551,8 @@
|
+ |
+
@@ -4848,6 +5567,8 @@
|
+ |
+
@@ -4862,6 +5583,8 @@
|
+ |
+
@@ -4876,6 +5599,8 @@
|
+ |
+
@@ -4890,6 +5615,8 @@
|
+ |
+
@@ -4904,6 +5631,8 @@
|
+ |
+
@@ -4918,6 +5647,8 @@
|
+ |
+
@@ -4932,6 +5663,8 @@
|
+ |
+
@@ -4946,6 +5679,8 @@
|
+ |
+
@@ -4960,6 +5695,8 @@
|
+ |
+
@@ -4974,6 +5711,8 @@
|
+ |
+
@@ -4988,6 +5727,8 @@
|
+ |
+
@@ -5002,6 +5743,8 @@
|
+ |
+
@@ -5016,6 +5759,8 @@
|
+ |
+
@@ -5030,6 +5775,8 @@
|
+ |
+
@@ -5044,6 +5791,8 @@
|
+ |
+
@@ -5058,6 +5807,8 @@
|
+ |
+
@@ -5072,6 +5823,8 @@
|
+ |
+
@@ -5086,6 +5839,8 @@
|
+ |
+
@@ -5100,6 +5855,8 @@
|
+ |
+
@@ -5114,6 +5871,8 @@
|
+ |
+
@@ -5128,6 +5887,8 @@
|
+ |
+
@@ -5142,6 +5903,8 @@
|
+ |
+
@@ -5156,6 +5919,8 @@
|
+ |
+
@@ -5170,6 +5935,8 @@
|
+ |
+
@@ -5184,6 +5951,8 @@
|
+ |
+
@@ -5198,6 +5967,8 @@
|
+ |
+
@@ -5212,6 +5983,8 @@
|
+ |
+
@@ -5226,6 +5999,8 @@
|
+ |
+
@@ -5240,6 +6015,8 @@
|
+ |
+
@@ -5254,6 +6031,8 @@
|
+ |
+
@@ -5268,6 +6047,8 @@
|
+ |
+
@@ -5282,6 +6063,8 @@
|
+ |
+
@@ -5296,6 +6079,8 @@
|
+ |
+
@@ -5310,6 +6095,8 @@
|
+ |
+
@@ -5324,6 +6111,8 @@
|
+ |
+
@@ -5338,6 +6127,8 @@
|
+ |
+
@@ -5352,6 +6143,8 @@
|
+ |
+
@@ -5366,6 +6159,8 @@
|
+ |
+
@@ -5380,6 +6175,8 @@
|
+ |
+
@@ -5394,6 +6191,8 @@
|
+ |
+
@@ -5408,6 +6207,8 @@
|
+ |
+
@@ -5422,6 +6223,8 @@
|
+ |
+
@@ -5436,6 +6239,8 @@
|
+ |
+
@@ -5450,6 +6255,8 @@
|
+ |
+
@@ -5464,6 +6271,8 @@
|
+ |
+
@@ -5478,6 +6287,8 @@
|
+ |
+
@@ -5492,6 +6303,8 @@
|
+ |
+
@@ -5506,6 +6319,8 @@
|
+ |
+
@@ -5520,6 +6335,8 @@
|
+ |
+
@@ -5534,6 +6351,8 @@
|
+ |
+
@@ -5548,6 +6367,8 @@
|
+ |
+
@@ -5562,6 +6383,8 @@
|
+ |
+
@@ -5576,6 +6399,8 @@
|
+ |
+
@@ -5590,6 +6415,8 @@
|
+ |
+
@@ -5604,6 +6431,8 @@
|
+ |
+
@@ -5618,6 +6447,8 @@
|
+ |
+
@@ -5632,6 +6463,8 @@
|
+ |
+
@@ -5646,6 +6479,8 @@
|
+ |
+
@@ -5660,6 +6495,8 @@
|
+ |
+
@@ -5674,6 +6511,8 @@
|
+ |
+
@@ -5688,6 +6527,8 @@
|
+ |
+
@@ -5702,6 +6543,8 @@
|
+ |
+
@@ -5716,6 +6559,8 @@
|
+ |
+
@@ -5730,6 +6575,8 @@
|
+ |
+
@@ -5744,6 +6591,8 @@
|
+ |
+
@@ -5758,6 +6607,8 @@
|
+ |
+
@@ -5772,6 +6623,8 @@
|
+ |
+
@@ -5786,6 +6639,8 @@
|
+ |
+
@@ -5800,6 +6655,8 @@
|
+ |
+
@@ -5814,6 +6671,8 @@
|
+ |
+
@@ -5828,6 +6687,8 @@
|
+ |
+
@@ -5842,6 +6703,8 @@
|
+ |
+
@@ -5856,6 +6719,8 @@
|
+ |
+
@@ -5870,6 +6735,8 @@
|
+ |
+
@@ -5884,6 +6751,8 @@
|
+ |
+
@@ -5898,6 +6767,8 @@
|
+ |
+
@@ -5912,6 +6783,8 @@
|
+ |
+
@@ -5926,6 +6799,8 @@
|
+ |
+
@@ -5940,6 +6815,8 @@
|
+ |
+
@@ -5954,6 +6831,8 @@
|
+ |
+
@@ -5968,6 +6847,8 @@
|
+ |
+
@@ -5982,6 +6863,8 @@
|
+ |
+
@@ -5996,6 +6879,8 @@
|
+ |
+
@@ -6010,6 +6895,8 @@
|
+ |
+
@@ -6024,6 +6911,8 @@
|
+ |
+
@@ -6038,6 +6927,8 @@
|
+ |
+
@@ -6052,6 +6943,8 @@
|
+ |
+
@@ -6066,6 +6959,8 @@
|
+ |
+
@@ -6080,6 +6975,8 @@
|
+ |
+
@@ -6094,6 +6991,8 @@
|
+ |
+
@@ -6108,6 +7007,8 @@
|
+ |
+
@@ -6122,6 +7023,8 @@
|
+ |
+
@@ -6136,6 +7039,8 @@
|
+ |
+
@@ -6150,6 +7055,8 @@
|
+ |
+
@@ -6164,6 +7071,8 @@
|
+ |
+
@@ -6178,6 +7087,8 @@
|
+ |
+
@@ -6192,6 +7103,8 @@
|
+ |
+
@@ -6206,6 +7119,8 @@
|
+ |
+
@@ -6220,6 +7135,8 @@
|
+ |
+
@@ -6234,6 +7151,8 @@
|
+ |
+
@@ -6248,6 +7167,8 @@
|
+ |
+
@@ -6262,6 +7183,8 @@
|
+ |
+
@@ -6276,6 +7199,8 @@
|
+ |
+
@@ -6290,6 +7215,8 @@
|
+ |
+
@@ -6304,6 +7231,8 @@
|
+ |
+
@@ -6318,6 +7247,8 @@
|
+ |
+
@@ -6332,6 +7263,8 @@
|
+ |
+
@@ -6346,6 +7279,8 @@
|
+ |
+
@@ -6360,6 +7295,8 @@
|
+ |
+
@@ -6374,6 +7311,8 @@
|
+ |
+
@@ -6388,6 +7327,8 @@
|
+ |
+
@@ -6402,6 +7343,8 @@
|
+ |
+
@@ -6416,6 +7359,8 @@
|
+ |
+
@@ -6430,6 +7375,8 @@
|
+ |
+
@@ -6444,6 +7391,8 @@
|
+ |
+
@@ -6458,6 +7407,8 @@
|
+ |
+
@@ -6571,7 +7522,7 @@
link.download = "hs3_db_label_" + template + "_" + item_id + ".lbx";
link.click();
}
-
+
document.addEventListener("DOMContentLoaded", async () => {
await initTemplates();
diff --git a/docs/static/css/style.css b/fegen/docs/static/css/style.css
similarity index 100%
rename from docs/static/css/style.css
rename to fegen/docs/static/css/style.css
diff --git a/docs/static/xml/label_12.xml b/fegen/docs/static/xml/label_12.xml
similarity index 100%
rename from docs/static/xml/label_12.xml
rename to fegen/docs/static/xml/label_12.xml
diff --git a/docs/static/xml/label_18.xml b/fegen/docs/static/xml/label_18.xml
similarity index 100%
rename from docs/static/xml/label_18.xml
rename to fegen/docs/static/xml/label_18.xml
diff --git a/docs/static/xml/label_18_flag.xml b/fegen/docs/static/xml/label_18_flag.xml
similarity index 100%
rename from docs/static/xml/label_18_flag.xml
rename to fegen/docs/static/xml/label_18_flag.xml
diff --git a/docs/static/xml/label_18_ribbon.xml b/fegen/docs/static/xml/label_18_ribbon.xml
similarity index 100%
rename from docs/static/xml/label_18_ribbon.xml
rename to fegen/docs/static/xml/label_18_ribbon.xml
diff --git a/docs/static/xml/prop.xml b/fegen/docs/static/xml/prop.xml
similarity index 100%
rename from docs/static/xml/prop.xml
rename to fegen/docs/static/xml/prop.xml
diff --git a/main.py b/fegen/main.py
similarity index 67%
rename from main.py
rename to fegen/main.py
index 1415ca2..eb8dd58 100644
--- a/main.py
+++ b/fegen/main.py
@@ -1,7 +1,6 @@
import os, re, shutil
from jinja2 import Environment, FileSystemLoader
import pandas as pd
-from discourse import DiscourseDatabase
def add_download_button(row):
@@ -9,23 +8,22 @@ def add_download_button(row):
download_button = (
f''
)
- return row + [download_button]
+ print_button = f''
+ return row + [download_button, print_button]
def generate_dashboard():
"""Generate dashboard from zasoby.csv file"""
print("Generating HTML dashboard")
- website_folder = "docs"
+ website_folder = "fegen/docs"
data = pd.read_csv("zasoby.csv")
- env = Environment(loader=FileSystemLoader("template"))
+ env = Environment(loader=FileSystemLoader("fegen/template"))
print("Removing old website files")
- shutil.rmtree(f"./{website_folder}")
- os.mkdir(f"./{website_folder}")
print("Creating a new website")
- shutil.copytree("template/static", f"{website_folder}/static")
+ shutil.copytree("fegen/template/static", f"{website_folder}/static", dirs_exist_ok=True)
template = env.get_template("_main_layout.html")
with open(f"{website_folder}/index.html", "w+", encoding="utf-8") as file:
- header_row = data.columns.values.tolist() + ["label"]
+ header_row = data.columns.values.tolist() + ["label", "print"]
rows = map(
add_download_button,
data.values.tolist(),
@@ -39,7 +37,8 @@ def generate_dashboard():
if __name__ == "__main__":
+ from discourse import DiscourseDatabase
+
DiscourseDatabase()
generate_dashboard()
print("Done!")
-
diff --git a/template/_base_template.html b/fegen/template/_base_template.html
similarity index 99%
rename from template/_base_template.html
rename to fegen/template/_base_template.html
index ffdbc2a..a690ec7 100644
--- a/template/_base_template.html
+++ b/fegen/template/_base_template.html
@@ -130,7 +130,7 @@
link.download = "hs3_db_label_" + template + "_" + item_id + ".lbx";
link.click();
}
-
+
document.addEventListener("DOMContentLoaded", async () => {
await initTemplates();
diff --git a/template/_main_layout.html b/fegen/template/_main_layout.html
similarity index 87%
rename from template/_main_layout.html
rename to fegen/template/_main_layout.html
index b2be738..579f45d 100644
--- a/template/_main_layout.html
+++ b/fegen/template/_main_layout.html
@@ -4,6 +4,7 @@
{% block sidenav %}{% endblock sidenav %}
Baza Zasobów Hackerspace Trójmiasto
+
diff --git a/template/static/css/style.css b/fegen/template/static/css/style.css
similarity index 100%
rename from template/static/css/style.css
rename to fegen/template/static/css/style.css
diff --git a/template/static/xml/label_12.xml b/fegen/template/static/xml/label_12.xml
similarity index 100%
rename from template/static/xml/label_12.xml
rename to fegen/template/static/xml/label_12.xml
diff --git a/template/static/xml/label_18.xml b/fegen/template/static/xml/label_18.xml
similarity index 100%
rename from template/static/xml/label_18.xml
rename to fegen/template/static/xml/label_18.xml
diff --git a/template/static/xml/label_18_flag.xml b/fegen/template/static/xml/label_18_flag.xml
similarity index 100%
rename from template/static/xml/label_18_flag.xml
rename to fegen/template/static/xml/label_18_flag.xml
diff --git a/template/static/xml/label_18_ribbon.xml b/fegen/template/static/xml/label_18_ribbon.xml
similarity index 100%
rename from template/static/xml/label_18_ribbon.xml
rename to fegen/template/static/xml/label_18_ribbon.xml
diff --git a/template/static/xml/prop.xml b/fegen/template/static/xml/prop.xml
similarity index 100%
rename from template/static/xml/prop.xml
rename to fegen/template/static/xml/prop.xml
diff --git a/fonts/SourceCodePro-SemiBold.ttf b/fonts/SourceCodePro-SemiBold.ttf
new file mode 100644
index 0000000..210f974
Binary files /dev/null and b/fonts/SourceCodePro-SemiBold.ttf differ
diff --git a/img.png b/img.png
new file mode 100644
index 0000000..3048372
Binary files /dev/null and b/img.png differ
diff --git a/img_1.png b/img_1.png
new file mode 100644
index 0000000..d6665b2
Binary files /dev/null and b/img_1.png differ
diff --git a/labeler/adapter/cli.py b/labeler/adapter/cli.py
new file mode 100644
index 0000000..624770c
--- /dev/null
+++ b/labeler/adapter/cli.py
@@ -0,0 +1,75 @@
+import os
+
+from labeler.app.labeler import Application
+from labeler.infra.e550w_printer.printer import E550W
+from labeler.infra.renderer import PILRenderer
+
+
+class LabelingBot:
+ def __init__(self, app: Application):
+ self.app = app
+
+ def media_info(self):
+ media = self.app.get_installed_media()
+ print(f"Installed medium: {media}")
+
+ def simple_label(self, label_text, label_length=0):
+ try:
+ label = self.app.print_label(text=label_text, length=label_length)
+ except Exception as e:
+ print(f"There was an exception: {e}")
+
+ def get_qrcode(self, label_text, label_length=0):
+ label = self.app.render_qrcode_preview(text=label_text, length=label_length)
+ return label
+
+ def print_qrcode(self, label_text, label_length=0):
+ try:
+ label = self.app.print_qrcode(text=label_text, length=label_length)
+ except Exception as e:
+ print(f"There was an exception: {e}")
+
+ # async def label_length(self):
+ # await update.message.reply_text(
+ # "Hello! Please tell me the length of the label, enter 0 for auto:"
+ # )
+ # return LABEL_LENGTH
+ #
+ # async def label_text(self, update: Update, context: CallbackContext) -> int:
+ # user_input = update.message.text
+ # context.user_data["length"] = int(user_input)
+ # await update.message.reply_text("Now, please tell me the text of the label:")
+ # return LABEL_TEXT
+ #
+ # async def simple_label(self, update: Update, context: CallbackContext) -> int:
+ # user_input = update.message.text
+ # context.user_data["label"] = user_input
+ # try:
+ # label = self.app.print_label(
+ # text=context.user_data["label"], length=context.user_data["length"]
+ # )
+ # except Exception as e:
+ # await update.message.reply_text(f"There was an exception: {e}")
+ # return ConversationHandler.END
+ #
+ # await update.message.reply_photo(
+ # label.bytes, f'Your label is: {context.user_data["label"]}'
+ # )
+ # return ConversationHandler.END
+ #
+ # async def cancel(self, update: Update, context: CallbackContext) -> int:
+ # await update.message.reply_text("Cancelled.")
+ # return ConversationHandler.END
+
+
+if __name__ == "__main__":
+ application = Application(PILRenderer(), E550W(os.environ.get("PRINTER_IP")))
+ bot = LabelingBot(application)
+
+ LABEL_LENGTH, LABEL_TEXT = range(2)
+
+ bot.media_info()
+ label = bot.get_qrcode("512", 25)
+ with open("label.png", "wb") as preview:
+ preview.write(label.bytes)
+ label = bot.print_qrcode("512", 25)
diff --git a/labeler/adapter/fastapi_srv.py b/labeler/adapter/fastapi_srv.py
new file mode 100644
index 0000000..1aaf482
--- /dev/null
+++ b/labeler/adapter/fastapi_srv.py
@@ -0,0 +1,98 @@
+import os
+
+from labeler.app.labeler import Application
+from labeler.infra.e550w_printer.printer import E550W
+from labeler.infra.renderer import PILRenderer
+
+from fastapi import FastAPI
+from fastapi.responses import HTMLResponse, RedirectResponse
+from fastapi.staticfiles import StaticFiles
+
+from fegen import discourse, main
+
+app = FastAPI()
+
+app.mount("/static", StaticFiles(directory="fegen/docs/static"), name="static")
+
+
+class LabelingBot:
+ def __init__(self, app: Application):
+ self.app = app
+
+ def media_info(self):
+ media = self.app.get_installed_media()
+ print(f"Installed medium: {media}")
+
+ def simple_label(self, label_text, label_length=0):
+ try:
+ label = self.app.print_label(text=label_text, length=label_length)
+ except Exception as e:
+ print(f"There was an exception: {e}")
+
+ def get_qrcode(self, label_text, label_length=0):
+ label = self.app.render_qrcode_preview(text=label_text, length=label_length)
+ return label
+
+ def print_qrcode(self, label_text, label_length=0):
+ try:
+ label = self.app.print_qrcode(text=label_text, length=label_length)
+ except Exception as e:
+ print(f"There was an exception: {e}")
+
+ # async def label_length(self):
+ # await update.message.reply_text(
+ # "Hello! Please tell me the length of the label, enter 0 for auto:"
+ # )
+ # return LABEL_LENGTH
+ #
+ # async def label_text(self, update: Update, context: CallbackContext) -> int:
+ # user_input = update.message.text
+ # context.user_data["length"] = int(user_input)
+ # await update.message.reply_text("Now, please tell me the text of the label:")
+ # return LABEL_TEXT
+ #
+ # async def simple_label(self, update: Update, context: CallbackContext) -> int:
+ # user_input = update.message.text
+ # context.user_data["label"] = user_input
+ # try:
+ # label = self.app.print_label(
+ # text=context.user_data["label"], length=context.user_data["length"]
+ # )
+ # except Exception as e:
+ # await update.message.reply_text(f"There was an exception: {e}")
+ # return ConversationHandler.END
+ #
+ # await update.message.reply_photo(
+ # label.bytes, f'Your label is: {context.user_data["label"]}'
+ # )
+ # return ConversationHandler.END
+ #
+ # async def cancel(self, update: Update, context: CallbackContext) -> int:
+ # await update.message.reply_text("Cancelled.")
+ # return ConversationHandler.END
+
+@app.get("/", response_class=HTMLResponse)
+async def root():
+ with open("fegen/docs/index.html", "rb") as f:
+ index = f.read()
+ return index
+
+@app.get("/print/{item_id}")
+def print_item(item_id: int, q: str | None = None):
+ application = Application(PILRenderer(), E550W(os.environ.get("PRINTER_IP")))
+ bot = LabelingBot(application)
+
+ LABEL_LENGTH, LABEL_TEXT = range(2)
+
+ bot.media_info()
+ label = bot.get_qrcode(item_id, 25)
+ with open("label.png", "wb") as preview:
+ preview.write(label.bytes)
+ bot.print_qrcode(item_id, 25)
+ return RedirectResponse(url="/", status_code=302)
+
+@app.get("/refresh")
+def refresh():
+ discourse.DiscourseDatabase()
+ main.generate_dashboard()
+ return RedirectResponse(url="/", status_code=302)
diff --git a/labeler/adapter/telegram_bot.py b/labeler/adapter/telegram_bot.py
new file mode 100644
index 0000000..ca24fa4
--- /dev/null
+++ b/labeler/adapter/telegram_bot.py
@@ -0,0 +1,82 @@
+import os
+
+from telegram import Update
+from telegram.ext import (
+ CommandHandler,
+ ApplicationBuilder,
+ ConversationHandler,
+ CallbackContext,
+ filters,
+ MessageHandler,
+)
+
+from labeler.app.labeler import Application
+from labeler.infra.e550w_printer.printer import E550W
+from labeler.infra.renderer import PILRenderer
+
+
+class LabelingBot:
+ def __init__(self, app: Application):
+ self.app = app
+
+ async def media_info(self, update, context):
+ media = self.app.get_installed_media()
+ await update.message.reply_text(f"Installed media: {media.description}")
+
+ async def label_length(self, update, context):
+ await update.message.reply_text(
+ "Hello! Please tell me the length of the label, enter 0 for auto:"
+ )
+ return LABEL_LENGTH
+
+ async def label_text(self, update: Update, context: CallbackContext) -> int:
+ user_input = update.message.text
+ context.user_data["length"] = int(user_input)
+ await update.message.reply_text("Now, please tell me the text of the label:")
+ return LABEL_TEXT
+
+ async def simple_label(self, update: Update, context: CallbackContext) -> int:
+ user_input = update.message.text
+ context.user_data["label"] = user_input
+ try:
+ label = self.app.print_label(
+ text=context.user_data["label"], length=context.user_data["length"]
+ )
+ except Exception as e:
+ await update.message.reply_text(f"There was an exception: {e}")
+ return ConversationHandler.END
+
+ await update.message.reply_photo(
+ label.bytes, f'Your label is: {context.user_data["label"]}'
+ )
+ return ConversationHandler.END
+
+ async def cancel(self, update: Update, context: CallbackContext) -> int:
+ await update.message.reply_text("Cancelled.")
+ return ConversationHandler.END
+
+
+if __name__ == "__main__":
+ application = Application(PILRenderer(), E550W(os.environ.get("PRINTER_IP")))
+ bot = LabelingBot(application)
+
+ LABEL_LENGTH, LABEL_TEXT = range(2)
+
+ conv_handler = ConversationHandler(
+ entry_points=[CommandHandler("simple_label", bot.label_length)],
+ states={
+ LABEL_LENGTH: [
+ MessageHandler(filters.Text() & ~filters.Command(), bot.label_text)
+ ],
+ LABEL_TEXT: [
+ MessageHandler(filters.Text() & ~filters.Command(), bot.simple_label)
+ ],
+ },
+ fallbacks=[CommandHandler("cancel", bot.cancel)],
+ )
+
+ app = ApplicationBuilder().token(os.environ["TELEGRAM_TOKEN"]).build()
+ app.add_handler(CommandHandler("media_info", bot.media_info))
+ app.add_handler(conv_handler)
+
+ app.run_polling()
diff --git a/labeler/app/labeler.py b/labeler/app/labeler.py
new file mode 100644
index 0000000..1337622
--- /dev/null
+++ b/labeler/app/labeler.py
@@ -0,0 +1,90 @@
+from labeler.domain.objects import (
+ Label,
+ LabelRequest,
+ LabelDefinition,
+ MediaDefinition,
+ Dimension,
+ Image,
+)
+from labeler.interfaces import Renderer, Printer
+
+
+class Application:
+ def __init__(self, renderer: Renderer, printer: Printer):
+ self.renderer = renderer
+ self.printer = printer
+
+ def render_preview(self, text: str, length: int = None) -> Label:
+ media = self.printer.get_installed_media()
+
+ if length != 0:
+ label_length = Dimension(mm=length) - 2 * media.minimal_margin_horizontal
+ else:
+ label_length = None
+
+ label_definition = LabelDefinition(
+ text=text,
+ length=label_length,
+ width=media.printable_width,
+ dpi=media.dpi,
+ )
+
+ self.renderer.render_label(label_definition)
+
+ def render_qrcode_preview(self, text: str, length: int = None) -> Label:
+ media = self.printer.get_installed_media()
+
+ if length != 0:
+ label_length = Dimension(mm=length) - 2 * media.minimal_margin_horizontal
+ else:
+ label_length = None
+
+ label_definition = LabelDefinition(
+ text=text,
+ length=label_length,
+ width=media.printable_width,
+ dpi=media.dpi,
+ )
+
+ return self.renderer.render_qrcode(label_definition)
+
+ def print_label(self, text: str, length: int = None) -> Image:
+ media = self.printer.get_installed_media()
+
+ if length != 0:
+ label_length = Dimension(mm=length) - 2 * media.minimal_margin_horizontal
+ else:
+ label_length = None
+
+ label_definition = LabelDefinition(
+ text=text,
+ length=label_length,
+ width=media.printable_width,
+ dpi=media.dpi,
+ )
+
+ label = self.renderer.render_label(label_definition)
+ self.printer.print_label(label)
+ return label
+
+ def print_qrcode(self, text: str, length: int = None) -> Image:
+ media = self.printer.get_installed_media()
+
+ if length != 0:
+ label_length = Dimension(mm=length) - 2 * media.minimal_margin_horizontal
+ else:
+ label_length = None
+
+ label_definition = LabelDefinition(
+ text=text,
+ length=label_length,
+ width=media.printable_width,
+ dpi=media.dpi,
+ )
+
+ label = self.renderer.render_qrcode(label_definition)
+ self.printer.print_label(label)
+ return label
+
+ def get_installed_media(self) -> MediaDefinition:
+ return self.printer.get_installed_media()
diff --git a/labeler/domain/objects.py b/labeler/domain/objects.py
new file mode 100644
index 0000000..7d4c0c6
--- /dev/null
+++ b/labeler/domain/objects.py
@@ -0,0 +1,125 @@
+import io
+from math import inf
+
+from pydantic import BaseModel, Field
+
+
+class Image(BaseModel):
+ bytes: bytes
+ width: int
+ height: int
+
+ @classmethod
+ def from_pil(cls, pil_image):
+ buffer = io.BytesIO()
+ pil_image.save(buffer, format="PNG")
+ buffer.seek(0)
+
+ return cls(
+ bytes=buffer.read(),
+ width=pil_image.width,
+ height=pil_image.height,
+ )
+
+
+class Dimension(BaseModel):
+ mm: float
+ __EPSILON = 0.0001
+
+ @classmethod
+ def from_inch(cls, inch: float) -> "Dimension":
+ return cls(mm=inch * 25.4)
+
+ @classmethod
+ def from_points(cls, points: float, dpi: int) -> "Dimension":
+ return cls.from_inch(points / dpi)
+
+ @property
+ def inch(self) -> float:
+ return self.mm / 25.4
+
+ def in_pixels(self, dpi: int) -> int:
+ return int(self.inch * dpi)
+
+ def __ensure_same_type(self, other):
+ if type(other) != Dimension:
+ raise TypeError(f"Cannot use {other} to {self}")
+
+ def __add__(self, other):
+ self.__ensure_same_type(other)
+ return Dimension(mm=self.mm + other.mm)
+
+ def __sub__(self, other):
+ self.__ensure_same_type(other)
+ return Dimension(mm=self.mm - other.mm)
+
+ def __mul__(self, other):
+ if type(other) not in (int, float):
+ raise TypeError(f"Cannot multiply {self} by {other}")
+ return Dimension(mm=self.mm * other)
+
+ def __rmul__(self, other):
+ return self.__mul__(other)
+
+ def __truediv__(self, other):
+ if type(other) not in (int, float):
+ raise TypeError(f"Cannot divide {self} by {other}")
+
+ return Dimension(mm=self.mm / other)
+
+ def __eq__(self, other):
+ self.__ensure_same_type(other)
+ if self.mm == inf and other.mm == inf:
+ return True
+ return abs(self.mm - other.mm) < self.__EPSILON
+
+ def __lt__(self, other):
+ self.__ensure_same_type(other)
+ return self.mm < other.mm
+
+ def __gt__(self, other):
+ self.__ensure_same_type(other)
+ return self.mm > other.mm
+
+
+class LabelRequest(BaseModel):
+ text: str
+ length: Dimension | None
+
+
+class LabelDefinition(BaseModel):
+ text: str
+ length: Dimension | None = None
+ width: Dimension
+ dpi: int
+
+ @property
+ def pixel_width(self):
+ return self.width.in_pixels(self.dpi)
+
+ @property
+ def pixel_length(self):
+ return self.length.in_pixels(self.dpi)
+
+
+class MediaDefinition(BaseModel):
+ width: Dimension
+ length: Dimension
+ minimal_margin_vertical: Dimension
+ minimal_margin_horizontal: Dimension
+ minimum_length: Dimension = Field(default_factory=lambda: Dimension(mm=5))
+ dpi: int
+ description: str
+
+ @property
+ def printable_width(self) -> Dimension:
+ return self.width - 2 * self.minimal_margin_vertical
+
+ @property
+ def printable_length(self) -> Dimension:
+ return self.length - 2 * self.minimal_margin_horizontal
+
+
+class Label(BaseModel):
+ dpi: str
+ image: Image
diff --git a/labeler/infra/e550w_printer/media_definitions.py b/labeler/infra/e550w_printer/media_definitions.py
new file mode 100644
index 0000000..20afe3b
--- /dev/null
+++ b/labeler/infra/e550w_printer/media_definitions.py
@@ -0,0 +1,81 @@
+"""
+Values from technical reference manual, can be found in /labeler_docs/brother/technical_reference_manual.pdf
+"""
+
+WIDTH_BYTE = 10
+TYPE_BYTE = 11
+COLOR_BYTE = 24
+TEXT_COLOR_BYTE = 25
+
+
+def media_width(code):
+ if code == 0:
+ raise ValueError("NO TAPE")
+ elif code == 4:
+ return 3.5
+ else:
+ return code
+
+
+def media_type(code):
+ media = {
+ 0: "NO TAPE",
+ 1: "Laminated tape",
+ 0x11: "Heat-Shrink Tube",
+ 0x03: "Non-laminated tape",
+ 0xFF: "Incompatible tape",
+ }
+ return media.get(code)
+
+
+def tape_color(code):
+ colors = {
+ 0x01: "White",
+ 0x02: "Other",
+ 0x03: "Clear",
+ 0x04: "Red",
+ 0x05: "Blue",
+ 0x06: "Yellow",
+ 0x07: "Green",
+ 0x08: "Black",
+ 0x09: "Clear(White text)",
+ 0x20: "Matte White",
+ 0x21: "Matte Clear",
+ 0x22: "Matte Silver",
+ 0x23: "Satin Gold",
+ 0x24: "Satin Silver",
+ 0x30: "Blue(D)",
+ 0x31: "Red(D)",
+ 0x40: "Fluorescent Orange",
+ 0x41: "Fluorescent Yellow",
+ 0x50: "Berry Pink(S)",
+ 0x51: "Light Gray(S)",
+ 0x52: "Lime Green(S)",
+ 0x60: "Yellow(F)",
+ 0x61: "Pink(F)",
+ 0x62: "Blue(F)",
+ 0x70: "White(Heat-shrink Tube)",
+ 0x90: "White(Flex. ID)",
+ 0x91: "Yellow(Flex. ID)",
+ 0xF0: "Cleaning",
+ 0xF1: "Stencil",
+ 0xFF: "Incompatible",
+ }
+
+ return colors.get(code)
+
+
+def text_color(code):
+ colors = {
+ 0x01: "White",
+ 0x04: "Red",
+ 0x05: "Blue",
+ 0x08: "Black",
+ 0x0A: "Gold",
+ 0x62: "Blue(F)",
+ 0xF0: "Cleaning",
+ 0xF1: "Stencil",
+ 0x02: "Other",
+ 0xFF: "Incompatible",
+ }
+ return colors.get(code)
diff --git a/labeler/infra/e550w_printer/printer.py b/labeler/infra/e550w_printer/printer.py
new file mode 100644
index 0000000..4643f58
--- /dev/null
+++ b/labeler/infra/e550w_printer/printer.py
@@ -0,0 +1,127 @@
+import io
+import logging
+from math import inf
+
+from brother_ql import BrotherQLRaster, create_label
+from brother_ql.backends import guess_backend, backend_factory
+from brother_ql.conversion import convert
+from pysnmp.entity.engine import SnmpEngine
+from pysnmp.hlapi import getCmd, CommunityData, UdpTransportTarget, ContextData
+from pysnmp.smi.rfc1902 import ObjectType, ObjectIdentity
+
+from labeler.domain.objects import MediaDefinition, Dimension, Image
+from labeler.infra.e550w_printer.media_definitions import (
+ media_width,
+ tape_color,
+ text_color,
+ media_type,
+ WIDTH_BYTE,
+ COLOR_BYTE,
+ TEXT_COLOR_BYTE,
+ TYPE_BYTE,
+)
+from labeler.interfaces import Printer
+from PIL import Image as PILImage
+
+PRINTABLE_WIDTH = {
+ 6: Dimension.from_points(64, 360),
+ 9: Dimension.from_points(100, 360),
+ 12: Dimension.from_points(140, 360),
+ 18: Dimension.from_points(224, 360),
+ 24: Dimension.from_points(256, 360),
+}
+
+
+class E550W(Printer):
+ def __init__(self, ip_address: str):
+ self.ip_address = ip_address
+ self.snmp_port = 161
+
+ def get_installed_media(self) -> MediaDefinition:
+ return self.__get_printer_status()
+
+ def print_label(self, label: Image):
+ im = PILImage.open(io.BytesIO(label.bytes))
+
+ qlr = BrotherQLRaster("PT-E550W")
+ convert(
+ qlr,
+ [im],
+ self.__media_width_to_type(label.height),
+ red=False,
+ threshold=70,
+ cut=True,
+ rotate=90,
+ compress=True,
+ dpi_600=True,
+ hq=True,
+ )
+
+ try:
+ try:
+ selected_backend = guess_backend(f"tcp://{self.ip_address}:9100")
+ except ValueError:
+ logging.error(
+ "Couln't guess the backend to use from the printer string descriptor"
+ )
+ BACKEND_CLASS = backend_factory(selected_backend)["backend_class"]
+ be = BACKEND_CLASS(f"tcp://{self.ip_address}:9100")
+ be.write(qlr.data)
+ be.dispose()
+ del be
+ except Exception as e:
+ logging.exception("Exception happened: %s", e)
+
+ def __media_width_to_type(self, height: int):
+ metric_width = Dimension.from_points(height, 360)
+ for width, printable_width in PRINTABLE_WIDTH.items():
+ if printable_width == metric_width:
+ return f"pt5{width}"
+ raise ValueError(f"Unsupported media width: {metric_width}")
+
+ def __get_printer_status(self):
+ raw_snmp_data = self.__get_snmp_status().asNumbers()
+ width = media_width(raw_snmp_data[WIDTH_BYTE])
+ media_tape_color = tape_color(raw_snmp_data[COLOR_BYTE])
+ media_text_color = text_color(raw_snmp_data[TEXT_COLOR_BYTE])
+ tape_type = media_type(raw_snmp_data[TYPE_BYTE])
+
+ return MediaDefinition(
+ width=Dimension(mm=width),
+ length=Dimension(mm=inf),
+ minimal_margin_vertical=(Dimension(mm=width) - PRINTABLE_WIDTH[width]) / 2,
+ minimal_margin_horizontal=Dimension(mm=1),
+ dpi=360,
+ description=f"{tape_type} - {width}mm, {media_text_color} on {media_tape_color} background",
+ )
+
+ def __get_snmp_status(self):
+ """
+ This oid was found by using wireshark, however it's also documented here:
+ https://support.brother.com/g/s/es/dev/en/command/faq/index.html?c=eu_ot&lang=en&navi=offall&comple=on&redirect=on
+ just not for the E550W model.
+ """
+ oid = "1.3.6.1.4.1.2435.3.3.9.1.6.1.0"
+
+ error_indication, error_status, error_index, var_binds = next(
+ getCmd(
+ SnmpEngine(),
+ CommunityData("public", mpModel=0),
+ UdpTransportTarget((self.ip_address, self.snmp_port)),
+ ContextData(),
+ ObjectType(ObjectIdentity(oid)),
+ )
+ )
+
+ if error_indication:
+ raise Exception(error_indication)
+ elif error_status:
+ raise Exception(
+ "%s at %s"
+ % (
+ error_status.prettyPrint(),
+ error_index and var_binds[int(error_index) - 1][0] or "?",
+ )
+ )
+ else:
+ return var_binds[0][1]
diff --git a/labeler/infra/renderer.py b/labeler/infra/renderer.py
new file mode 100644
index 0000000..cbf2f4a
--- /dev/null
+++ b/labeler/infra/renderer.py
@@ -0,0 +1,169 @@
+import qrcode
+import textwrap
+from string import ascii_letters
+
+from PIL import ImageFont, ImageDraw, Image as PILImage
+
+from labeler.domain.objects import Image, LabelDefinition
+from labeler.interfaces import Renderer
+
+
+DPI = 360.0
+
+
+def points_to_pixels(point_size: float):
+ return int(point_size * (72 / DPI))
+
+
+class PILRenderer(Renderer):
+ def __init__(self):
+ self.font_path = "/Library/Fonts/Arial Unicode.ttf"
+
+ def render_label(self, label_definition: LabelDefinition) -> Image:
+ if label_definition.length is None:
+ pil_image = self.__render_no_fixed_lenth(label_definition)
+ else:
+ pil_image = self.__render_fixed_length(label_definition)
+
+ return Image.from_pil(pil_image)
+
+ def __render_fixed_length(self, label_definition: LabelDefinition):
+ width = label_definition.pixel_width
+ length = label_definition.pixel_length
+ font, text = self.__get_font(
+ label_definition.text,
+ width,
+ length,
+ )
+ im = PILImage.new("1", (length, width), 1)
+ draw = ImageDraw.Draw(im)
+ draw.text(
+ (length / 2, width / 2),
+ text,
+ font=font,
+ fill=0,
+ anchor="mm",
+ align="center",
+ )
+ return im
+
+ def __render_no_fixed_lenth(self, label_definition: LabelDefinition):
+ lines_to_print = label_definition.text.count("\n") + 1
+ text = "\n".join([line.strip() for line in label_definition.text.split("\n")])
+
+ text_height = label_definition.pixel_width // lines_to_print
+
+ while text_height > 0:
+ font = ImageFont.truetype(
+ "/Library/Fonts/Arial Unicode.ttf",
+ text_height,
+ )
+ if lines_to_print > 1:
+ occupied_height = font.getsize_multiline(text)[1]
+ else:
+ occupied_height = font.getsize(text)[1]
+ if occupied_height <= label_definition.pixel_width:
+ break
+ text_height -= 1
+
+ sizes = [font.getsize(line) for line in text.split("\n")]
+
+ length = max(length for length, height in sizes)
+
+ im = PILImage.new("1", (length, label_definition.pixel_width), 1)
+ draw = ImageDraw.Draw(im)
+ draw.text(
+ (length / 2, label_definition.pixel_width / 2),
+ text,
+ font=font,
+ fill=0,
+ anchor="mm",
+ align="center",
+ )
+ return im
+
+ def render_qrcode(self, label_definition: LabelDefinition) -> Image:
+ width = label_definition.pixel_width
+ length = label_definition.pixel_length
+ text = label_definition.text
+ font = self.__get_font_for_qr()
+ qr = qrcode.QRCode(box_size=7)
+ qr.add_data(f"https://hs3.pl/db/{text}")
+ qr.make(fit=True)
+ qr_img = qr.make_image()
+ print(width, length)
+ pil_image = PILImage.new("1", (width, length), 1)
+ draw = ImageDraw.Draw(pil_image)
+ pil_image.paste(qr_img)
+ draw.text(
+ (width / 2, 232),
+ "HS3-DB",
+ font=font,
+ fill=0,
+ anchor="mm",
+ align="center",
+ )
+ draw.text(
+ (20, 232 + 34),
+ f"ID: {text}",
+ font=font,
+ fill=0,
+ align="left",
+ )
+
+ return Image.from_pil(pil_image.transpose(PILImage.Transpose.ROTATE_90))
+
+ def __get_font_for_qr(self):
+ font_size = int(360 / 9)
+
+ return ImageFont.truetype("fonts/SourceCodePro-SemiBold.ttf", font_size)
+
+ def __get_font(self, text: str, max_width: int, max_length: int):
+ font_size = max_width
+ step = max_width // 2
+ last_good = None
+ last_corrected = None
+ while step > 1:
+ fits, corrected = self.__will_font_fit(
+ text, self.font_path, font_size, max_width, max_length
+ )
+ if fits:
+ last_good = font_size
+ last_corrected = corrected
+ font_size += step
+ else:
+ font_size -= step
+ step //= 2
+
+ return ImageFont.truetype(self.font_path, last_good), last_corrected
+
+ def __will_font_fit(
+ self, text: str, font_path: str, font_size: int, max_width: int, max_length: int
+ ):
+ font = ImageFont.truetype(font_path, font_size)
+ if "\n" in text:
+ text_width, text_height = font.getsize_multiline(text)
+ else:
+ text_width, text_height = font.getsize(text)
+
+ if text_height > max_width:
+ return False, None
+
+ if text_width <= max_length:
+ # Now we know that the text fits. We can stop trying
+ return True, text
+
+ avg_char_width = sum(font.getsize(char)[0] for char in ascii_letters) / len(
+ ascii_letters
+ )
+ charachters_per_line = max_length // avg_char_width
+ if charachters_per_line < max(len(line) for line in text.split(" ")):
+ return False, None
+
+ wrapped = textwrap.fill(text, charachters_per_line)
+ wrapped_width, wrapped_height = font.getsize_multiline(wrapped)
+ if wrapped_height <= max_width and wrapped_width <= max_length:
+ # Now we know that the text fits. We can stop trying
+ return True, wrapped
+
+ return False, None
diff --git a/labeler/interfaces.py b/labeler/interfaces.py
new file mode 100644
index 0000000..40bed73
--- /dev/null
+++ b/labeler/interfaces.py
@@ -0,0 +1,23 @@
+import abc
+
+from labeler.domain.objects import LabelDefinition, Image, MediaDefinition
+
+
+class Renderer(abc.ABC):
+ @abc.abstractmethod
+ def render_label(self, label_definition: LabelDefinition) -> Image:
+ pass
+
+ @abc.abstractmethod
+ def render_qrcode(self, label_definition: LabelDefinition) -> Image:
+ pass
+
+
+class Printer(abc.ABC):
+ @abc.abstractmethod
+ def get_installed_media(self) -> MediaDefinition:
+ pass
+
+ @abc.abstractmethod
+ def print_label(self, label: Image):
+ pass
diff --git a/labeler_docs/brother/technical_reference_manual.pdf b/labeler_docs/brother/technical_reference_manual.pdf
new file mode 100644
index 0000000..305e9a0
Binary files /dev/null and b/labeler_docs/brother/technical_reference_manual.pdf differ
diff --git a/lbot_readme.md b/lbot_readme.md
new file mode 100644
index 0000000..4406a7a
--- /dev/null
+++ b/lbot_readme.md
@@ -0,0 +1,36 @@
+## labeling telegram bot
+
+This application is build to render and print labels sent to it via telegram, as well
+as provide info about printer status and other useful information.
+
+
+## Supported commands
+- `/media_info` - show info about currently installed media
+
+- `/simple_label` - print a simple label
+
+
+### Usage example
+You need three things:
+1. A telegram bot token, you can write to [@BotFather](https://t.me/BotFather) to get one
+2. A compatible printer
+3. docker installed on your system
+
+```yaml
+version: "3.8"
+services:
+ bot:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ environment:
+ - PRINTER_IP=
+ - TELEGRAM_TOKEN=
+ command:
+ - python
+ - labeler/adapter/telegram_bot.py
+
+```
+
+### Supported printers
+- Brother PT-E550W
\ No newline at end of file
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..0666ff1
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,37 @@
+[project]
+name = "python-scratchpad"
+version = "0.1.0"
+description = ""
+# authors = ["Hubert Bryłkowski "]
+readme = "readme.md"
+requires-python = ">=3.11"
+dependencies = [
+ "brother-ql @ git+https://github.com/hbrylkowski/brother_ql@4225d13d209e8e4a2c17e87a75f42809e0da8fda",
+ "qrcode[pil]",
+ # https://github.com/astral-sh/uv/issues/6384
+ "setuptools<81",
+ "jinja2>=3.1.2,<4",
+ "pillow>=9.5.0,<10",
+ "pysnmp>=4.4.12,<5",
+ "pyasn1==0.4.8,<0.5",
+ "python-telegram-bot>=20.3,<21",
+ "fastapi[standard]>=0.114.0",
+ "requests==2.32.5",
+ "Jinja2==3.1.6",
+ "pandas==2.3.3",
+ "python-dotenv==1.2.1",
+]
+
+[tool.poetry.group.dev.dependencies]
+pytest = "^7.4.0"
+black = "^23.3.0"
+
+[tool.hatch]
+metadata.allow-direct-references = true
+
+[tool.hatch.build.targets.wheel]
+packages = ["labeler"]
+
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index 6c001de..0000000
--- a/requirements.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-requests==2.32.5
-Jinja2==3.1.6
-pandas==2.3.3
-python-dotenv==1.2.1
\ No newline at end of file
diff --git a/tests/conftest.py b/tests/conftest.py
new file mode 100644
index 0000000..84fb7c4
--- /dev/null
+++ b/tests/conftest.py
@@ -0,0 +1 @@
+from fixtures import * # noqa
diff --git a/tests/fixtures.py b/tests/fixtures.py
new file mode 100644
index 0000000..3ddb020
--- /dev/null
+++ b/tests/fixtures.py
@@ -0,0 +1,48 @@
+import os
+from typing import Callable
+
+import pytest
+
+from labeler.domain.objects import Dimension, MediaDefinition
+
+
+@pytest.fixture
+def current_dir(request) -> str:
+ return os.path.dirname(request.module.__file__)
+
+
+@pytest.fixture
+def get_test_image(current_dir) -> Callable[[str], bytes]:
+ def f(name):
+ return open(os.path.join(current_dir, "test_images", name), "rb").read()
+
+ return f
+
+
+@pytest.fixture
+def save_test_image(current_dir) -> Callable[[str, bytes], None]:
+ def f(name: str, data: bytes):
+ open(os.path.join(current_dir, "test_images", name), "wb").write(data)
+
+ return f
+
+
+@pytest.fixture
+def create_test_media() -> Callable[[int, int, int, int, int], MediaDefinition]:
+ def f(
+ width: int,
+ height: int,
+ dpi: int = 600,
+ margin_horizontal: int = 0,
+ margin_vertical: int = 0,
+ ):
+ return MediaDefinition(
+ width=Dimension(mm=width),
+ length=Dimension(mm=height),
+ minimal_margin_horizontal=Dimension(mm=margin_horizontal),
+ minimal_margin_vertical=Dimension(mm=margin_vertical),
+ dpi=dpi,
+ description=f"test media {width}mm x{height}mm @ {dpi}dpi",
+ )
+
+ return f
diff --git a/tests/labeler/domain/test_objects.py b/tests/labeler/domain/test_objects.py
new file mode 100644
index 0000000..128e80f
--- /dev/null
+++ b/tests/labeler/domain/test_objects.py
@@ -0,0 +1,30 @@
+import math
+
+from labeler.domain.objects import Dimension, MediaDefinition
+
+
+def test_dimension():
+ dimension = Dimension(mm=25.4)
+
+ assert dimension.mm == 25.4
+ assert dimension.inch == 1.0
+
+ assert dimension.in_pixels(dpi=300) == 300
+
+ assert dimension + Dimension(mm=10) == Dimension(mm=35.4)
+ assert dimension * 2 == Dimension(mm=50.8)
+
+ assert dimension / 2 == Dimension(mm=12.7)
+
+
+def test_infinite_media():
+ media = MediaDefinition(
+ width=Dimension(mm=12),
+ length=Dimension(mm=math.inf),
+ minimal_margin_vertical=Dimension(mm=1),
+ minimal_margin_horizontal=Dimension(mm=2),
+ dpi=300,
+ description="test media",
+ )
+
+ assert media.printable_length == Dimension(mm=math.inf)
diff --git a/tests/labeler/infra/test_images/multiline_label_no_fixed_width.png b/tests/labeler/infra/test_images/multiline_label_no_fixed_width.png
new file mode 100644
index 0000000..60a35ed
Binary files /dev/null and b/tests/labeler/infra/test_images/multiline_label_no_fixed_width.png differ
diff --git a/tests/labeler/infra/test_images/multiline_label_test.png b/tests/labeler/infra/test_images/multiline_label_test.png
new file mode 100644
index 0000000..d7a81e2
Binary files /dev/null and b/tests/labeler/infra/test_images/multiline_label_test.png differ
diff --git a/tests/labeler/infra/test_images/no_fixed_width.png b/tests/labeler/infra/test_images/no_fixed_width.png
new file mode 100644
index 0000000..abec891
Binary files /dev/null and b/tests/labeler/infra/test_images/no_fixed_width.png differ
diff --git a/tests/labeler/infra/test_images/simple_label_test.png b/tests/labeler/infra/test_images/simple_label_test.png
new file mode 100644
index 0000000..46caf96
Binary files /dev/null and b/tests/labeler/infra/test_images/simple_label_test.png differ
diff --git a/tests/labeler/infra/test_renderer.py b/tests/labeler/infra/test_renderer.py
new file mode 100644
index 0000000..8d6a6e0
--- /dev/null
+++ b/tests/labeler/infra/test_renderer.py
@@ -0,0 +1,50 @@
+from labeler.domain.objects import LabelDefinition, Dimension
+from labeler.infra.renderer import PILRenderer
+
+
+def test_simple_label(get_test_image):
+ renderer = PILRenderer()
+ expected_label = get_test_image("simple_label_test.png")
+
+ definition = LabelDefinition(
+ text="dolphin", length=Dimension(mm=40), width=Dimension(mm=10), dpi=600
+ )
+
+ label = renderer.render_label(definition)
+
+ assert label.bytes == expected_label
+
+
+def test_multiline_label(get_test_image):
+ label_text = "dolphin\nis\nawesome"
+ expected_label = get_test_image("multiline_label_test.png")
+
+ renderer = PILRenderer()
+ definition = LabelDefinition(
+ text=label_text, length=Dimension(mm=40), width=Dimension(mm=10), dpi=600
+ )
+
+ label = renderer.render_label(definition)
+ assert label.bytes == expected_label
+
+
+def test_simple_label_no_fixed_width(get_test_image):
+ renderer = PILRenderer()
+ expected_label = get_test_image("no_fixed_width.png")
+
+ definition = LabelDefinition(text="dolphin", width=Dimension(mm=10), dpi=600)
+
+ label = renderer.render_label(definition)
+ assert label.bytes == expected_label
+
+
+def test_multiline_label_no_fixed_width(get_test_image):
+ renderer = PILRenderer()
+ expected_label = get_test_image("multiline_label_no_fixed_width.png")
+
+ definition = LabelDefinition(
+ text="dolphin\nis\nawesome", width=Dimension(mm=10), dpi=600
+ )
+
+ label = renderer.render_label(definition)
+ assert label.bytes == expected_label
diff --git a/uv.lock b/uv.lock
new file mode 100644
index 0000000..727696b
--- /dev/null
+++ b/uv.lock
@@ -0,0 +1,1206 @@
+version = 1
+revision = 3
+requires-python = ">=3.11"
+resolution-markers = [
+ "python_full_version >= '3.14'",
+ "python_full_version == '3.13.*'",
+ "python_full_version == '3.12.*'",
+ "python_full_version < '3.12'",
+]
+
+[[package]]
+name = "annotated-doc"
+version = "0.0.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" },
+]
+
+[[package]]
+name = "anyio"
+version = "4.12.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "idna" },
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" },
+]
+
+[[package]]
+name = "attrs"
+version = "25.4.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" },
+]
+
+[[package]]
+name = "brother-ql"
+version = "1.0.4"
+source = { git = "https://github.com/hbrylkowski/brother_ql?rev=4225d13d209e8e4a2c17e87a75f42809e0da8fda#4225d13d209e8e4a2c17e87a75f42809e0da8fda" }
+dependencies = [
+ { name = "attrs" },
+ { name = "click" },
+ { name = "future" },
+ { name = "packbits" },
+ { name = "pillow" },
+ { name = "pyusb" },
+]
+
+[[package]]
+name = "certifi"
+version = "2026.2.25"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" },
+]
+
+[[package]]
+name = "charset-normalizer"
+version = "3.4.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" },
+ { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" },
+ { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" },
+ { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" },
+ { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" },
+ { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" },
+ { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" },
+ { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" },
+ { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" },
+ { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" },
+ { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" },
+ { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" },
+ { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" },
+ { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" },
+ { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" },
+ { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" },
+ { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" },
+ { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" },
+ { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" },
+ { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" },
+ { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" },
+ { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" },
+ { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" },
+ { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" },
+ { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" },
+ { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" },
+ { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" },
+ { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" },
+ { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" },
+ { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" },
+]
+
+[[package]]
+name = "click"
+version = "8.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
+]
+
+[[package]]
+name = "dnspython"
+version = "2.8.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/57666417c0f90f08bcafa776861060426765fdb422eb10212086fb811d26/dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f", size = 368251, upload-time = "2025-09-07T18:58:00.022Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" },
+]
+
+[[package]]
+name = "email-validator"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "dnspython" },
+ { name = "idna" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/f5/22/900cb125c76b7aaa450ce02fd727f452243f2e91a61af068b40adba60ea9/email_validator-2.3.0.tar.gz", hash = "sha256:9fc05c37f2f6cf439ff414f8fc46d917929974a82244c20eb10231ba60c54426", size = 51238, upload-time = "2025-08-26T13:09:06.831Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4", size = 35604, upload-time = "2025-08-26T13:09:05.858Z" },
+]
+
+[[package]]
+name = "fastapi"
+version = "0.115.14"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pydantic" },
+ { name = "starlette" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ca/53/8c38a874844a8b0fa10dd8adf3836ac154082cf88d3f22b544e9ceea0a15/fastapi-0.115.14.tar.gz", hash = "sha256:b1de15cdc1c499a4da47914db35d0e4ef8f1ce62b624e94e0e5824421df99739", size = 296263, upload-time = "2025-06-26T15:29:08.21Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/53/50/b1222562c6d270fea83e9c9075b8e8600b8479150a18e4516a6138b980d1/fastapi-0.115.14-py3-none-any.whl", hash = "sha256:6c0c8bf9420bd58f565e585036d971872472b4f7d3f6c73b698e10cffdefb3ca", size = 95514, upload-time = "2025-06-26T15:29:06.49Z" },
+]
+
+[package.optional-dependencies]
+standard = [
+ { name = "email-validator" },
+ { name = "fastapi-cli", extra = ["standard"] },
+ { name = "httpx" },
+ { name = "jinja2" },
+ { name = "python-multipart" },
+ { name = "uvicorn", extra = ["standard"] },
+]
+
+[[package]]
+name = "fastapi-cli"
+version = "0.0.7"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "rich-toolkit" },
+ { name = "typer" },
+ { name = "uvicorn", extra = ["standard"] },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/fe/73/82a5831fbbf8ed75905bacf5b2d9d3dfd6f04d6968b29fe6f72a5ae9ceb1/fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e", size = 16753, upload-time = "2024-12-15T14:28:10.028Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a1/e6/5daefc851b514ce2287d8f5d358ae4341089185f78f3217a69d0ce3a390c/fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4", size = 10705, upload-time = "2024-12-15T14:28:06.18Z" },
+]
+
+[package.optional-dependencies]
+standard = [
+ { name = "uvicorn", extra = ["standard"] },
+]
+
+[[package]]
+name = "future"
+version = "1.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a7/b2/4140c69c6a66432916b26158687e821ba631a4c9273c474343badf84d3ba/future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05", size = 1228490, upload-time = "2024-02-21T11:52:38.461Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216", size = 491326, upload-time = "2024-02-21T11:52:35.956Z" },
+]
+
+[[package]]
+name = "h11"
+version = "0.16.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" },
+]
+
+[[package]]
+name = "httpcore"
+version = "1.0.9"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "h11" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" },
+]
+
+[[package]]
+name = "httptools"
+version = "0.7.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b5/46/120a669232c7bdedb9d52d4aeae7e6c7dfe151e99dc70802e2fc7a5e1993/httptools-0.7.1.tar.gz", hash = "sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9", size = 258961, upload-time = "2025-10-10T03:55:08.559Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9c/08/17e07e8d89ab8f343c134616d72eebfe03798835058e2ab579dcc8353c06/httptools-0.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:474d3b7ab469fefcca3697a10d11a32ee2b9573250206ba1e50d5980910da657", size = 206521, upload-time = "2025-10-10T03:54:31.002Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/06/c9c1b41ff52f16aee526fd10fbda99fa4787938aa776858ddc4a1ea825ec/httptools-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3c3b7366bb6c7b96bd72d0dbe7f7d5eead261361f013be5f6d9590465ea1c70", size = 110375, upload-time = "2025-10-10T03:54:31.941Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/cc/10935db22fda0ee34c76f047590ca0a8bd9de531406a3ccb10a90e12ea21/httptools-0.7.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:379b479408b8747f47f3b253326183d7c009a3936518cdb70db58cffd369d9df", size = 456621, upload-time = "2025-10-10T03:54:33.176Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/84/875382b10d271b0c11aa5d414b44f92f8dd53e9b658aec338a79164fa548/httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cad6b591a682dcc6cf1397c3900527f9affef1e55a06c4547264796bbd17cf5e", size = 454954, upload-time = "2025-10-10T03:54:34.226Z" },
+ { url = "https://files.pythonhosted.org/packages/30/e1/44f89b280f7e46c0b1b2ccee5737d46b3bb13136383958f20b580a821ca0/httptools-0.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eb844698d11433d2139bbeeb56499102143beb582bd6c194e3ba69c22f25c274", size = 440175, upload-time = "2025-10-10T03:54:35.942Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/7e/b9287763159e700e335028bc1824359dc736fa9b829dacedace91a39b37e/httptools-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f65744d7a8bdb4bda5e1fa23e4ba16832860606fcc09d674d56e425e991539ec", size = 440310, upload-time = "2025-10-10T03:54:37.1Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/07/5b614f592868e07f5c94b1f301b5e14a21df4e8076215a3bccb830a687d8/httptools-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:135fbe974b3718eada677229312e97f3b31f8a9c8ffa3ae6f565bf808d5b6bcb", size = 86875, upload-time = "2025-10-10T03:54:38.421Z" },
+ { url = "https://files.pythonhosted.org/packages/53/7f/403e5d787dc4942316e515e949b0c8a013d84078a915910e9f391ba9b3ed/httptools-0.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38e0c83a2ea9746ebbd643bdfb521b9aa4a91703e2cd705c20443405d2fd16a5", size = 206280, upload-time = "2025-10-10T03:54:39.274Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/0d/7f3fd28e2ce311ccc998c388dd1c53b18120fda3b70ebb022b135dc9839b/httptools-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f25bbaf1235e27704f1a7b86cd3304eabc04f569c828101d94a0e605ef7205a5", size = 110004, upload-time = "2025-10-10T03:54:40.403Z" },
+ { url = "https://files.pythonhosted.org/packages/84/a6/b3965e1e146ef5762870bbe76117876ceba51a201e18cc31f5703e454596/httptools-0.7.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c15f37ef679ab9ecc06bfc4e6e8628c32a8e4b305459de7cf6785acd57e4d03", size = 517655, upload-time = "2025-10-10T03:54:41.347Z" },
+ { url = "https://files.pythonhosted.org/packages/11/7d/71fee6f1844e6fa378f2eddde6c3e41ce3a1fb4b2d81118dd544e3441ec0/httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fe6e96090df46b36ccfaf746f03034e5ab723162bc51b0a4cf58305324036f2", size = 511440, upload-time = "2025-10-10T03:54:42.452Z" },
+ { url = "https://files.pythonhosted.org/packages/22/a5/079d216712a4f3ffa24af4a0381b108aa9c45b7a5cc6eb141f81726b1823/httptools-0.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f72fdbae2dbc6e68b8239defb48e6a5937b12218e6ffc2c7846cc37befa84362", size = 495186, upload-time = "2025-10-10T03:54:43.937Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/9e/025ad7b65278745dee3bd0ebf9314934c4592560878308a6121f7f812084/httptools-0.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e99c7b90a29fd82fea9ef57943d501a16f3404d7b9ee81799d41639bdaae412c", size = 499192, upload-time = "2025-10-10T03:54:45.003Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/de/40a8f202b987d43afc4d54689600ff03ce65680ede2f31df348d7f368b8f/httptools-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3e14f530fefa7499334a79b0cf7e7cd2992870eb893526fb097d51b4f2d0f321", size = 86694, upload-time = "2025-10-10T03:54:45.923Z" },
+ { url = "https://files.pythonhosted.org/packages/09/8f/c77b1fcbfd262d422f12da02feb0d218fa228d52485b77b953832105bb90/httptools-0.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6babce6cfa2a99545c60bfef8bee0cc0545413cb0018f617c8059a30ad985de3", size = 202889, upload-time = "2025-10-10T03:54:47.089Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/1a/22887f53602feaa066354867bc49a68fc295c2293433177ee90870a7d517/httptools-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:601b7628de7504077dd3dcb3791c6b8694bbd967148a6d1f01806509254fb1ca", size = 108180, upload-time = "2025-10-10T03:54:48.052Z" },
+ { url = "https://files.pythonhosted.org/packages/32/6a/6aaa91937f0010d288d3d124ca2946d48d60c3a5ee7ca62afe870e3ea011/httptools-0.7.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04c6c0e6c5fb0739c5b8a9eb046d298650a0ff38cf42537fc372b28dc7e4472c", size = 478596, upload-time = "2025-10-10T03:54:48.919Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/70/023d7ce117993107be88d2cbca566a7c1323ccbaf0af7eabf2064fe356f6/httptools-0.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69d4f9705c405ae3ee83d6a12283dc9feba8cc6aaec671b412917e644ab4fa66", size = 473268, upload-time = "2025-10-10T03:54:49.993Z" },
+ { url = "https://files.pythonhosted.org/packages/32/4d/9dd616c38da088e3f436e9a616e1d0cc66544b8cdac405cc4e81c8679fc7/httptools-0.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44c8f4347d4b31269c8a9205d8a5ee2df5322b09bbbd30f8f862185bb6b05346", size = 455517, upload-time = "2025-10-10T03:54:51.066Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/3a/a6c595c310b7df958e739aae88724e24f9246a514d909547778d776799be/httptools-0.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:465275d76db4d554918aba40bf1cbebe324670f3dfc979eaffaa5d108e2ed650", size = 458337, upload-time = "2025-10-10T03:54:52.196Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/82/88e8d6d2c51edc1cc391b6e044c6c435b6aebe97b1abc33db1b0b24cd582/httptools-0.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:322d00c2068d125bd570f7bf78b2d367dad02b919d8581d7476d8b75b294e3e6", size = 85743, upload-time = "2025-10-10T03:54:53.448Z" },
+ { url = "https://files.pythonhosted.org/packages/34/50/9d095fcbb6de2d523e027a2f304d4551855c2f46e0b82befd718b8b20056/httptools-0.7.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c08fe65728b8d70b6923ce31e3956f859d5e1e8548e6f22ec520a962c6757270", size = 203619, upload-time = "2025-10-10T03:54:54.321Z" },
+ { url = "https://files.pythonhosted.org/packages/07/f0/89720dc5139ae54b03f861b5e2c55a37dba9a5da7d51e1e824a1f343627f/httptools-0.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7aea2e3c3953521c3c51106ee11487a910d45586e351202474d45472db7d72d3", size = 108714, upload-time = "2025-10-10T03:54:55.163Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/cb/eea88506f191fb552c11787c23f9a405f4c7b0c5799bf73f2249cd4f5228/httptools-0.7.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0e68b8582f4ea9166be62926077a3334064d422cf08ab87d8b74664f8e9058e1", size = 472909, upload-time = "2025-10-10T03:54:56.056Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/4a/a548bdfae6369c0d078bab5769f7b66f17f1bfaa6fa28f81d6be6959066b/httptools-0.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df091cf961a3be783d6aebae963cc9b71e00d57fa6f149025075217bc6a55a7b", size = 470831, upload-time = "2025-10-10T03:54:57.219Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/31/14df99e1c43bd132eec921c2e7e11cda7852f65619bc0fc5bdc2d0cb126c/httptools-0.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f084813239e1eb403ddacd06a30de3d3e09a9b76e7894dcda2b22f8a726e9c60", size = 452631, upload-time = "2025-10-10T03:54:58.219Z" },
+ { url = "https://files.pythonhosted.org/packages/22/d2/b7e131f7be8d854d48cb6d048113c30f9a46dca0c9a8b08fcb3fcd588cdc/httptools-0.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7347714368fb2b335e9063bc2b96f2f87a9ceffcd9758ac295f8bbcd3ffbc0ca", size = 452910, upload-time = "2025-10-10T03:54:59.366Z" },
+ { url = "https://files.pythonhosted.org/packages/53/cf/878f3b91e4e6e011eff6d1fa9ca39f7eb17d19c9d7971b04873734112f30/httptools-0.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:cfabda2a5bb85aa2a904ce06d974a3f30fb36cc63d7feaddec05d2050acede96", size = 88205, upload-time = "2025-10-10T03:55:00.389Z" },
+]
+
+[[package]]
+name = "httpx"
+version = "0.26.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "anyio" },
+ { name = "certifi" },
+ { name = "httpcore" },
+ { name = "idna" },
+ { name = "sniffio" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/bd/26/2dc654950920f499bd062a211071925533f821ccdca04fa0c2fd914d5d06/httpx-0.26.0.tar.gz", hash = "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf", size = 125671, upload-time = "2023-12-20T11:02:58.032Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/39/9b/4937d841aee9c2c8102d9a4eeb800c7dad25386caabb4a1bf5010df81a57/httpx-0.26.0-py3-none-any.whl", hash = "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd", size = 75862, upload-time = "2023-12-20T11:02:55.395Z" },
+]
+
+[[package]]
+name = "idna"
+version = "3.11"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" },
+]
+
+[[package]]
+name = "jinja2"
+version = "3.1.6"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markupsafe" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" },
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "4.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mdurl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" },
+]
+
+[[package]]
+name = "markupsafe"
+version = "3.0.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" },
+ { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" },
+ { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" },
+ { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" },
+ { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" },
+ { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" },
+ { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" },
+ { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" },
+ { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" },
+ { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" },
+ { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" },
+ { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" },
+ { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" },
+ { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" },
+ { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" },
+ { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" },
+ { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" },
+ { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" },
+ { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" },
+ { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" },
+ { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" },
+ { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" },
+ { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" },
+ { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" },
+ { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" },
+ { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" },
+ { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" },
+ { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" },
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.4.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/10/8b/c265f4823726ab832de836cdd184d0986dcf94480f81e8739692a7ac7af2/numpy-2.4.3.tar.gz", hash = "sha256:483a201202b73495f00dbc83796c6ae63137a9bdade074f7648b3e32613412dd", size = 20727743, upload-time = "2026-03-09T07:58:53.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:33b3bf58ee84b172c067f56aeadc7ee9ab6de69c5e800ab5b10295d54c581adb", size = 16957183, upload-time = "2026-03-09T07:55:57.774Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ba7b51e71c05aa1f9bc3641463cd82308eab40ce0d5c7e1fd4038cbf9938147", size = 14968734, upload-time = "2026-03-09T07:56:00.494Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a1988292870c7cb9d0ebb4cc96b4d447513a9644801de54606dc7aabf2b7d920", size = 5475288, upload-time = "2026-03-09T07:56:02.857Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:23b46bb6d8ecb68b58c09944483c135ae5f0e9b8d8858ece5e4ead783771d2a9", size = 6805253, upload-time = "2026-03-09T07:56:04.53Z" },
+ { url = "https://files.pythonhosted.org/packages/21/bc/e7aa3f6817e40c3f517d407742337cbb8e6fc4b83ce0b55ab780c829243b/numpy-2.4.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a016db5c5dba78fa8fe9f5d80d6708f9c42ab087a739803c0ac83a43d686a470", size = 15969479, upload-time = "2026-03-09T07:56:06.638Z" },
+ { url = "https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:715de7f82e192e8cae5a507a347d97ad17598f8e026152ca97233e3666daaa71", size = 16901035, upload-time = "2026-03-09T07:56:09.405Z" },
+ { url = "https://files.pythonhosted.org/packages/64/6e/b221dd847d7181bc5ee4857bfb026182ef69499f9305eb1371cbb1aea626/numpy-2.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2ddb7919366ee468342b91dea2352824c25b55814a987847b6c52003a7c97f15", size = 17325657, upload-time = "2026-03-09T07:56:12.067Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/b8/8f3fd2da596e1063964b758b5e3c970aed1949a05200d7e3d46a9d46d643/numpy-2.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a315e5234d88067f2d97e1f2ef670a7569df445d55400f1e33d117418d008d52", size = 18635512, upload-time = "2026-03-09T07:56:14.629Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/24/2993b775c37e39d2f8ab4125b44337ab0b2ba106c100980b7c274a22bee7/numpy-2.4.3-cp311-cp311-win32.whl", hash = "sha256:2b3f8d2c4589b1a2028d2a770b0fc4d1f332fb5e01521f4de3199a896d158ddd", size = 6238100, upload-time = "2026-03-09T07:56:17.243Z" },
+ { url = "https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:77e76d932c49a75617c6d13464e41203cd410956614d0a0e999b25e9e8d27eec", size = 12609816, upload-time = "2026-03-09T07:56:19.089Z" },
+ { url = "https://files.pythonhosted.org/packages/92/82/190b99153480076c8dce85f4cfe7d53ea84444145ffa54cb58dcd460d66b/numpy-2.4.3-cp311-cp311-win_arm64.whl", hash = "sha256:eb610595dd91560905c132c709412b512135a60f1851ccbd2c959e136431ff67", size = 10485757, upload-time = "2026-03-09T07:56:21.753Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/ed/6388632536f9788cea23a3a1b629f25b43eaacd7d7377e5d6bc7b9deb69b/numpy-2.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:61b0cbabbb6126c8df63b9a3a0c4b1f44ebca5e12ff6997b80fcf267fb3150ef", size = 16669628, upload-time = "2026-03-09T07:56:24.252Z" },
+ { url = "https://files.pythonhosted.org/packages/74/1b/ee2abfc68e1ce728b2958b6ba831d65c62e1b13ce3017c13943f8f9b5b2e/numpy-2.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7395e69ff32526710748f92cd8c9849b361830968ea3e24a676f272653e8983e", size = 14696872, upload-time = "2026-03-09T07:56:26.991Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/d1/780400e915ff5638166f11ca9dc2c5815189f3d7cf6f8759a1685e586413/numpy-2.4.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:abdce0f71dcb4a00e4e77f3faf05e4616ceccfe72ccaa07f47ee79cda3b7b0f4", size = 5203489, upload-time = "2026-03-09T07:56:29.414Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/bb/baffa907e9da4cc34a6e556d6d90e032f6d7a75ea47968ea92b4858826c4/numpy-2.4.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:48da3a4ee1336454b07497ff7ec83903efa5505792c4e6d9bf83d99dc07a1e18", size = 6550814, upload-time = "2026-03-09T07:56:32.225Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/12/8c9f0c6c95f76aeb20fc4a699c33e9f827fa0d0f857747c73bb7b17af945/numpy-2.4.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32e3bef222ad6b052280311d1d60db8e259e4947052c3ae7dd6817451fc8a4c5", size = 15666601, upload-time = "2026-03-09T07:56:34.461Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/79/cc665495e4d57d0aa6fbcc0aa57aa82671dfc78fbf95fe733ed86d98f52a/numpy-2.4.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7dd01a46700b1967487141a66ac1a3cf0dd8ebf1f08db37d46389401512ca97", size = 16621358, upload-time = "2026-03-09T07:56:36.852Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/40/b4ecb7224af1065c3539f5ecfff879d090de09608ad1008f02c05c770cb3/numpy-2.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:76f0f283506c28b12bba319c0fab98217e9f9b54e6160e9c79e9f7348ba32e9c", size = 17016135, upload-time = "2026-03-09T07:56:39.337Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/b1/6a88e888052eed951afed7a142dcdf3b149a030ca59b4c71eef085858e43/numpy-2.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737f630a337364665aba3b5a77e56a68cc42d350edd010c345d65a3efa3addcc", size = 18345816, upload-time = "2026-03-09T07:56:42.31Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/8f/103a60c5f8c3d7fc678c19cd7b2476110da689ccb80bc18050efbaeae183/numpy-2.4.3-cp312-cp312-win32.whl", hash = "sha256:26952e18d82a1dbbc2f008d402021baa8d6fc8e84347a2072a25e08b46d698b9", size = 5960132, upload-time = "2026-03-09T07:56:44.851Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/7c/f5ee1bf6ed888494978046a809df2882aad35d414b622893322df7286879/numpy-2.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:65f3c2455188f09678355f5cae1f959a06b778bc66d535da07bf2ef20cd319d5", size = 12316144, upload-time = "2026-03-09T07:56:47.057Z" },
+ { url = "https://files.pythonhosted.org/packages/71/46/8d1cb3f7a00f2fb6394140e7e6623696e54c6318a9d9691bb4904672cf42/numpy-2.4.3-cp312-cp312-win_arm64.whl", hash = "sha256:2abad5c7fef172b3377502bde47892439bae394a71bc329f31df0fd829b41a9e", size = 10220364, upload-time = "2026-03-09T07:56:49.849Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/d0/1fe47a98ce0df229238b77611340aff92d52691bcbc10583303181abf7fc/numpy-2.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b346845443716c8e542d54112966383b448f4a3ba5c66409771b8c0889485dd3", size = 16665297, upload-time = "2026-03-09T07:56:52.296Z" },
+ { url = "https://files.pythonhosted.org/packages/27/d9/4e7c3f0e68dfa91f21c6fb6cf839bc829ec920688b1ce7ec722b1a6202fb/numpy-2.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2629289168f4897a3c4e23dc98d6f1731f0fc0fe52fb9db19f974041e4cc12b9", size = 14691853, upload-time = "2026-03-09T07:56:54.992Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/66/bd096b13a87549683812b53ab211e6d413497f84e794fb3c39191948da97/numpy-2.4.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:bb2e3cf95854233799013779216c57e153c1ee67a0bf92138acca0e429aefaee", size = 5198435, upload-time = "2026-03-09T07:56:57.184Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/2f/687722910b5a5601de2135c891108f51dfc873d8e43c8ed9f4ebb440b4a2/numpy-2.4.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:7f3408ff897f8ab07a07fbe2823d7aee6ff644c097cc1f90382511fe982f647f", size = 6546347, upload-time = "2026-03-09T07:56:59.531Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/ec/7971c4e98d86c564750393fab8d7d83d0a9432a9d78bb8a163a6dc59967a/numpy-2.4.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:decb0eb8a53c3b009b0962378065589685d66b23467ef5dac16cbe818afde27f", size = 15664626, upload-time = "2026-03-09T07:57:01.385Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/eb/7daecbea84ec935b7fc732e18f532073064a3816f0932a40a17f3349185f/numpy-2.4.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5f51900414fc9204a0e0da158ba2ac52b75656e7dce7e77fb9f84bfa343b4cc", size = 16608916, upload-time = "2026-03-09T07:57:04.008Z" },
+ { url = "https://files.pythonhosted.org/packages/df/58/2a2b4a817ffd7472dca4421d9f0776898b364154e30c95f42195041dc03b/numpy-2.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6bd06731541f89cdc01b261ba2c9e037f1543df7472517836b78dfb15bd6e476", size = 17015824, upload-time = "2026-03-09T07:57:06.347Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/ca/627a828d44e78a418c55f82dd4caea8ea4a8ef24e5144d9e71016e52fb40/numpy-2.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:22654fe6be0e5206f553a9250762c653d3698e46686eee53b399ab90da59bd92", size = 18334581, upload-time = "2026-03-09T07:57:09.114Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/c0/76f93962fc79955fcba30a429b62304332345f22d4daec1cb33653425643/numpy-2.4.3-cp313-cp313-win32.whl", hash = "sha256:d71e379452a2f670ccb689ec801b1218cd3983e253105d6e83780967e899d687", size = 5958618, upload-time = "2026-03-09T07:57:11.432Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/3c/88af0040119209b9b5cb59485fa48b76f372c73068dbf9254784b975ac53/numpy-2.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:0a60e17a14d640f49146cb38e3f105f571318db7826d9b6fef7e4dce758faecd", size = 12312824, upload-time = "2026-03-09T07:57:13.586Z" },
+ { url = "https://files.pythonhosted.org/packages/58/ce/3d07743aced3d173f877c3ef6a454c2174ba42b584ab0b7e6d99374f51ed/numpy-2.4.3-cp313-cp313-win_arm64.whl", hash = "sha256:c9619741e9da2059cd9c3f206110b97583c7152c1dc9f8aafd4beb450ac1c89d", size = 10221218, upload-time = "2026-03-09T07:57:16.183Z" },
+ { url = "https://files.pythonhosted.org/packages/62/09/d96b02a91d09e9d97862f4fc8bfebf5400f567d8eb1fe4b0cc4795679c15/numpy-2.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7aa4e54f6469300ebca1d9eb80acd5253cdfa36f2c03d79a35883687da430875", size = 14819570, upload-time = "2026-03-09T07:57:18.564Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/ca/0b1aba3905fdfa3373d523b2b15b19029f4f3031c87f4066bd9d20ef6c6b/numpy-2.4.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d1b90d840b25874cf5cd20c219af10bac3667db3876d9a495609273ebe679070", size = 5326113, upload-time = "2026-03-09T07:57:21.052Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/63/406e0fd32fcaeb94180fd6a4c41e55736d676c54346b7efbce548b94a914/numpy-2.4.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a749547700de0a20a6718293396ec237bb38218049cfce788e08fcb716e8cf73", size = 6646370, upload-time = "2026-03-09T07:57:22.804Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/d0/10f7dc157d4b37af92720a196be6f54f889e90dcd30dce9dc657ed92c257/numpy-2.4.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94f3c4a151a2e529adf49c1d54f0f57ff8f9b233ee4d44af623a81553ab86368", size = 15723499, upload-time = "2026-03-09T07:57:24.693Z" },
+ { url = "https://files.pythonhosted.org/packages/66/f1/d1c2bf1161396629701bc284d958dc1efa3a5a542aab83cf11ee6eb4cba5/numpy-2.4.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22c31dc07025123aedf7f2db9e91783df13f1776dc52c6b22c620870dc0fab22", size = 16657164, upload-time = "2026-03-09T07:57:27.676Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/be/cca19230b740af199ac47331a21c71e7a3d0ba59661350483c1600d28c37/numpy-2.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:148d59127ac95979d6f07e4d460f934ebdd6eed641db9c0db6c73026f2b2101a", size = 17081544, upload-time = "2026-03-09T07:57:30.664Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/c5/9602b0cbb703a0936fb40f8a95407e8171935b15846de2f0776e08af04c7/numpy-2.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a97cbf7e905c435865c2d939af3d93f99d18eaaa3cabe4256f4304fb51604349", size = 18380290, upload-time = "2026-03-09T07:57:33.763Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/81/9f24708953cd30be9ee36ec4778f4b112b45165812f2ada4cc5ea1c1f254/numpy-2.4.3-cp313-cp313t-win32.whl", hash = "sha256:be3b8487d725a77acccc9924f65fd8bce9af7fac8c9820df1049424a2115af6c", size = 6082814, upload-time = "2026-03-09T07:57:36.491Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/9e/52f6eaa13e1a799f0ab79066c17f7016a4a8ae0c1aefa58c82b4dab690b4/numpy-2.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1ec84fd7c8e652b0f4aaaf2e6e9cc8eaa9b1b80a537e06b2e3a2fb176eedcb26", size = 12452673, upload-time = "2026-03-09T07:57:38.281Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/04/b8cece6ead0b30c9fbd99bb835ad7ea0112ac5f39f069788c5558e3b1ab2/numpy-2.4.3-cp313-cp313t-win_arm64.whl", hash = "sha256:120df8c0a81ebbf5b9020c91439fccd85f5e018a927a39f624845be194a2be02", size = 10290907, upload-time = "2026-03-09T07:57:40.747Z" },
+ { url = "https://files.pythonhosted.org/packages/70/ae/3936f79adebf8caf81bd7a599b90a561334a658be4dcc7b6329ebf4ee8de/numpy-2.4.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:5884ce5c7acfae1e4e1b6fde43797d10aa506074d25b531b4f54bde33c0c31d4", size = 16664563, upload-time = "2026-03-09T07:57:43.817Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/62/760f2b55866b496bb1fa7da2a6db076bef908110e568b02fcfc1422e2a3a/numpy-2.4.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:297837823f5bc572c5f9379b0c9f3a3365f08492cbdc33bcc3af174372ebb168", size = 14702161, upload-time = "2026-03-09T07:57:46.169Z" },
+ { url = "https://files.pythonhosted.org/packages/32/af/a7a39464e2c0a21526fb4fb76e346fb172ebc92f6d1c7a07c2c139cc17b1/numpy-2.4.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:a111698b4a3f8dcbe54c64a7708f049355abd603e619013c346553c1fd4ca90b", size = 5208738, upload-time = "2026-03-09T07:57:48.506Z" },
+ { url = "https://files.pythonhosted.org/packages/29/8c/2a0cf86a59558fa078d83805589c2de490f29ed4fb336c14313a161d358a/numpy-2.4.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:4bd4741a6a676770e0e97fe9ab2e51de01183df3dcbcec591d26d331a40de950", size = 6543618, upload-time = "2026-03-09T07:57:50.591Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/b8/612ce010c0728b1c363fa4ea3aa4c22fe1c5da1de008486f8c2f5cb92fae/numpy-2.4.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:54f29b877279d51e210e0c80709ee14ccbbad647810e8f3d375561c45ef613dd", size = 15680676, upload-time = "2026-03-09T07:57:52.34Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/7e/4f120ecc54ba26ddf3dc348eeb9eb063f421de65c05fc961941798feea18/numpy-2.4.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:679f2a834bae9020f81534671c56fd0cc76dd7e5182f57131478e23d0dc59e24", size = 16613492, upload-time = "2026-03-09T07:57:54.91Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/86/1b6020db73be330c4b45d5c6ee4295d59cfeef0e3ea323959d053e5a6909/numpy-2.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d84f0f881cb2225c2dfd7f78a10a5645d487a496c6668d6cc39f0f114164f3d0", size = 17031789, upload-time = "2026-03-09T07:57:57.641Z" },
+ { url = "https://files.pythonhosted.org/packages/07/3a/3b90463bf41ebc21d1b7e06079f03070334374208c0f9a1f05e4ae8455e7/numpy-2.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d213c7e6e8d211888cc359bab7199670a00f5b82c0978b9d1c75baf1eddbeac0", size = 18339941, upload-time = "2026-03-09T07:58:00.577Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/74/6d736c4cd962259fd8bae9be27363eb4883a2f9069763747347544c2a487/numpy-2.4.3-cp314-cp314-win32.whl", hash = "sha256:52077feedeff7c76ed7c9f1a0428558e50825347b7545bbb8523da2cd55c547a", size = 6007503, upload-time = "2026-03-09T07:58:03.331Z" },
+ { url = "https://files.pythonhosted.org/packages/48/39/c56ef87af669364356bb011922ef0734fc49dad51964568634c72a009488/numpy-2.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:0448e7f9caefb34b4b7dd2b77f21e8906e5d6f0365ad525f9f4f530b13df2afc", size = 12444915, upload-time = "2026-03-09T07:58:06.353Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/1f/ab8528e38d295fd349310807496fabb7cf9fe2e1f70b97bc20a483ea9d4a/numpy-2.4.3-cp314-cp314-win_arm64.whl", hash = "sha256:b44fd60341c4d9783039598efadd03617fa28d041fc37d22b62d08f2027fa0e7", size = 10494875, upload-time = "2026-03-09T07:58:08.734Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/ef/b7c35e4d5ef141b836658ab21a66d1a573e15b335b1d111d31f26c8ef80f/numpy-2.4.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0a195f4216be9305a73c0e91c9b026a35f2161237cf1c6de9b681637772ea657", size = 14822225, upload-time = "2026-03-09T07:58:11.034Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/8d/7730fa9278cf6648639946cc816e7cc89f0d891602584697923375f801ed/numpy-2.4.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:cd32fbacb9fd1bf041bf8e89e4576b6f00b895f06d00914820ae06a616bdfef7", size = 5328769, upload-time = "2026-03-09T07:58:13.67Z" },
+ { url = "https://files.pythonhosted.org/packages/47/01/d2a137317c958b074d338807c1b6a383406cdf8b8e53b075d804cc3d211d/numpy-2.4.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:2e03c05abaee1f672e9d67bc858f300b5ccba1c21397211e8d77d98350972093", size = 6649461, upload-time = "2026-03-09T07:58:15.912Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/34/812ce12bc0f00272a4b0ec0d713cd237cb390666eb6206323d1cc9cedbb2/numpy-2.4.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d1ce23cce91fcea443320a9d0ece9b9305d4368875bab09538f7a5b4131938a", size = 15725809, upload-time = "2026-03-09T07:58:17.787Z" },
+ { url = "https://files.pythonhosted.org/packages/25/c0/2aed473a4823e905e765fee3dc2cbf504bd3e68ccb1150fbdabd5c39f527/numpy-2.4.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c59020932feb24ed49ffd03704fbab89f22aa9c0d4b180ff45542fe8918f5611", size = 16655242, upload-time = "2026-03-09T07:58:20.476Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/c8/7e052b2fc87aa0e86de23f20e2c42bd261c624748aa8efd2c78f7bb8d8c6/numpy-2.4.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9684823a78a6cd6ad7511fc5e25b07947d1d5b5e2812c93fe99d7d4195130720", size = 17080660, upload-time = "2026-03-09T07:58:23.067Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/3d/0876746044db2adcb11549f214d104f2e1be00f07a67edbb4e2812094847/numpy-2.4.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0200b25c687033316fb39f0ff4e3e690e8957a2c3c8d22499891ec58c37a3eb5", size = 18380384, upload-time = "2026-03-09T07:58:25.839Z" },
+ { url = "https://files.pythonhosted.org/packages/07/12/8160bea39da3335737b10308df4f484235fd297f556745f13092aa039d3b/numpy-2.4.3-cp314-cp314t-win32.whl", hash = "sha256:5e10da9e93247e554bb1d22f8edc51847ddd7dde52d85ce31024c1b4312bfba0", size = 6154547, upload-time = "2026-03-09T07:58:28.289Z" },
+ { url = "https://files.pythonhosted.org/packages/42/f3/76534f61f80d74cc9cdf2e570d3d4eeb92c2280a27c39b0aaf471eda7b48/numpy-2.4.3-cp314-cp314t-win_amd64.whl", hash = "sha256:45f003dbdffb997a03da2d1d0cb41fbd24a87507fb41605c0420a3db5bd4667b", size = 12633645, upload-time = "2026-03-09T07:58:30.384Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/b6/7c0d4334c15983cec7f92a69e8ce9b1e6f31857e5ee3a413ac424e6bd63d/numpy-2.4.3-cp314-cp314t-win_arm64.whl", hash = "sha256:4d382735cecd7bcf090172489a525cd7d4087bc331f7df9f60ddc9a296cf208e", size = 10565454, upload-time = "2026-03-09T07:58:33.031Z" },
+ { url = "https://files.pythonhosted.org/packages/64/e4/4dab9fb43c83719c29241c535d9e07be73bea4bc0c6686c5816d8e1b6689/numpy-2.4.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c6b124bfcafb9e8d3ed09130dbee44848c20b3e758b6bbf006e641778927c028", size = 16834892, upload-time = "2026-03-09T07:58:35.334Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/29/f8b6d4af90fed3dfda84ebc0df06c9833d38880c79ce954e5b661758aa31/numpy-2.4.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:76dbb9d4e43c16cf9aa711fcd8de1e2eeb27539dcefb60a1d5e9f12fae1d1ed8", size = 14893070, upload-time = "2026-03-09T07:58:37.7Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/04/a19b3c91dbec0a49269407f15d5753673a09832daed40c45e8150e6fa558/numpy-2.4.3-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:29363fbfa6f8ee855d7569c96ce524845e3d726d6c19b29eceec7dd555dab152", size = 5399609, upload-time = "2026-03-09T07:58:39.853Z" },
+ { url = "https://files.pythonhosted.org/packages/79/34/4d73603f5420eab89ea8a67097b31364bf7c30f811d4dd84b1659c7476d9/numpy-2.4.3-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:bc71942c789ef415a37f0d4eab90341425a00d538cd0642445d30b41023d3395", size = 6714355, upload-time = "2026-03-09T07:58:42.365Z" },
+ { url = "https://files.pythonhosted.org/packages/58/ad/1100d7229bb248394939a12a8074d485b655e8ed44207d328fdd7fcebc7b/numpy-2.4.3-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e58765ad74dcebd3ef0208a5078fba32dc8ec3578fe84a604432950cd043d79", size = 15800434, upload-time = "2026-03-09T07:58:44.837Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/fd/16d710c085d28ba4feaf29ac60c936c9d662e390344f94a6beaa2ac9899b/numpy-2.4.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e236dbda4e1d319d681afcbb136c0c4a8e0f1a5c58ceec2adebb547357fe857", size = 16729409, upload-time = "2026-03-09T07:58:47.972Z" },
+ { url = "https://files.pythonhosted.org/packages/57/a7/b35835e278c18b85206834b3aa3abe68e77a98769c59233d1f6300284781/numpy-2.4.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4b42639cdde6d24e732ff823a3fa5b701d8acad89c4142bc1d0bd6dc85200ba5", size = 12504685, upload-time = "2026-03-09T07:58:50.525Z" },
+]
+
+[[package]]
+name = "packbits"
+version = "0.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1b/23/78a967c9b9961258da2bf0d0a63bf12293ccddf96ec77361ee7b44f543f1/packbits-0.6.tar.gz", hash = "sha256:bc6b370bb34e04ac8cfa835e06c0484380affc6d593adb8009dd6c0f7bfff034", size = 2167, upload-time = "2013-04-06T08:22:59.65Z" }
+
+[[package]]
+name = "pandas"
+version = "2.3.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "python-dateutil" },
+ { name = "pytz" },
+ { name = "tzdata" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" },
+ { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" },
+ { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" },
+ { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" },
+ { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" },
+ { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" },
+ { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" },
+ { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" },
+ { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" },
+ { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" },
+ { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" },
+ { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" },
+ { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" },
+ { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" },
+ { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" },
+ { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" },
+ { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" },
+ { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" },
+ { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" },
+]
+
+[[package]]
+name = "pillow"
+version = "9.5.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/00/d5/4903f310765e0ff2b8e91ffe55031ac6af77d982f0156061e20a4d1a8b2d/Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1", size = 50488147, upload-time = "2023-04-01T09:31:37.159Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/78/a8/3c2d737d856eb9cd8c18e78f6fe0ed08a2805bded74cbb0455584859023b/Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32", size = 3395792, upload-time = "2023-04-01T09:28:38.917Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/15/310cde63cb15a091de889ded26281924cf9cfa5c000b36b06bd0c7f50261/Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c", size = 3077092, upload-time = "2023-04-01T09:28:41.28Z" },
+ { url = "https://files.pythonhosted.org/packages/17/66/20db69c0361902a2f6ee2086d3e83c70133e3fb4cb31470e59a8ed37184e/Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3", size = 3112543, upload-time = "2023-04-01T09:28:43.89Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/a8/ff526cdec6b56eb20c992e7083f02c8065049ed1e62fbc159390d7a3dd5e/Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a", size = 3386654, upload-time = "2023-04-01T09:28:46.378Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/70/e9a45a2e9c58c23e023fcda5af9686f5b42c718cc9bc86194e0025cf0ec5/Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1", size = 3308566, upload-time = "2023-04-01T09:28:49.521Z" },
+ { url = "https://files.pythonhosted.org/packages/61/a5/ee306d6cc53c9a30c23ba2313b43b67fdf76c611ca5afd0cdd62922cbd3e/Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99", size = 3164027, upload-time = "2023-04-01T09:28:52.295Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/59/e6bd2c3715ace343d9739276ceed79657fe116923238d102cf731ab463dd/Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625", size = 3415610, upload-time = "2023-04-01T09:28:54.667Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/6d/9beb596ba5a5e61081c843187bcdbb42a5c9a9ef552751b554894247da7a/Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579", size = 3350704, upload-time = "2023-04-01T09:28:57.098Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/e4/de633d85be3b3c770c554a37a89e8273069bd19c34b15a419c2795600310/Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296", size = 3414604, upload-time = "2023-04-01T09:29:03.375Z" },
+ { url = "https://files.pythonhosted.org/packages/46/a0/e410f655300932308e70e883dd60c0c51e6f74bed138641ea9193e64fd7c/Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec", size = 2211929, upload-time = "2023-04-01T09:29:06.338Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/02/7729c8aecbc525b560c7eb283ffa34c6f5a6d0ed6d1339570c65a3e63088/Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4", size = 2511551, upload-time = "2023-04-01T09:29:08.636Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/8b/d38cc68796be4ac238db327682a1acfbc5deccf64a150aa44ee1efbaafae/Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089", size = 2489206, upload-time = "2023-04-01T20:01:51.312Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/38/b7bcbab3bfe1946ba9cf71c1fa03e541b498069457be49eadcdc229412ef/Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb", size = 2211914, upload-time = "2023-04-01T09:29:10.935Z" },
+ { url = "https://files.pythonhosted.org/packages/29/8a/f4cf3f32bc554f9260b645ea1151449ac13525796d3d1a42076d75945d8d/Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b", size = 2511483, upload-time = "2023-04-01T09:29:13.217Z" },
+]
+
+[[package]]
+name = "ply"
+version = "3.11"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130, upload-time = "2018-02-15T19:01:31.097Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567, upload-time = "2018-02-15T19:01:27.172Z" },
+]
+
+[[package]]
+name = "pyasn1"
+version = "0.4.8"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a4/db/fffec68299e6d7bad3d504147f9094830b704527a7fc098b721d38cc7fa7/pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba", size = 146820, upload-time = "2019-11-16T17:27:38.772Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/62/1e/a94a8d635fa3ce4cfc7f506003548d0a2447ae76fd5ca53932970fe3053f/pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d", size = 77145, upload-time = "2019-11-16T17:27:11.07Z" },
+]
+
+[[package]]
+name = "pycryptodomex"
+version = "3.23.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c9/85/e24bf90972a30b0fcd16c73009add1d7d7cd9140c2498a68252028899e41/pycryptodomex-3.23.0.tar.gz", hash = "sha256:71909758f010c82bc99b0abf4ea12012c98962fbf0583c2164f8b84533c2e4da", size = 4922157, upload-time = "2025-05-17T17:23:41.434Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2e/00/10edb04777069a42490a38c137099d4b17ba6e36a4e6e28bdc7470e9e853/pycryptodomex-3.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:7b37e08e3871efe2187bc1fd9320cc81d87caf19816c648f24443483005ff886", size = 2498764, upload-time = "2025-05-17T17:22:21.453Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/3f/2872a9c2d3a27eac094f9ceaa5a8a483b774ae69018040ea3240d5b11154/pycryptodomex-3.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:91979028227543010d7b2ba2471cf1d1e398b3f183cb105ac584df0c36dac28d", size = 1643012, upload-time = "2025-05-17T17:22:23.702Z" },
+ { url = "https://files.pythonhosted.org/packages/70/af/774c2e2b4f6570fbf6a4972161adbb183aeeaa1863bde31e8706f123bf92/pycryptodomex-3.23.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b8962204c47464d5c1c4038abeadd4514a133b28748bcd9fa5b6d62e3cec6fa", size = 2187643, upload-time = "2025-05-17T17:22:26.37Z" },
+ { url = "https://files.pythonhosted.org/packages/de/a3/71065b24cb889d537954cedc3ae5466af00a2cabcff8e29b73be047e9a19/pycryptodomex-3.23.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a33986a0066860f7fcf7c7bd2bc804fa90e434183645595ae7b33d01f3c91ed8", size = 2273762, upload-time = "2025-05-17T17:22:28.313Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/0b/ff6f43b7fbef4d302c8b981fe58467b8871902cdc3eb28896b52421422cc/pycryptodomex-3.23.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7947ab8d589e3178da3d7cdeabe14f841b391e17046954f2fbcd941705762b5", size = 2313012, upload-time = "2025-05-17T17:22:30.57Z" },
+ { url = "https://files.pythonhosted.org/packages/02/de/9d4772c0506ab6da10b41159493657105d3f8bb5c53615d19452afc6b315/pycryptodomex-3.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c25e30a20e1b426e1f0fa00131c516f16e474204eee1139d1603e132acffc314", size = 2186856, upload-time = "2025-05-17T17:22:32.819Z" },
+ { url = "https://files.pythonhosted.org/packages/28/ad/8b30efcd6341707a234e5eba5493700a17852ca1ac7a75daa7945fcf6427/pycryptodomex-3.23.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:da4fa650cef02db88c2b98acc5434461e027dce0ae8c22dd5a69013eaf510006", size = 2347523, upload-time = "2025-05-17T17:22:35.386Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/02/16868e9f655b7670dbb0ac4f2844145cbc42251f916fc35c414ad2359849/pycryptodomex-3.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:58b851b9effd0d072d4ca2e4542bf2a4abcf13c82a29fd2c93ce27ee2a2e9462", size = 2272825, upload-time = "2025-05-17T17:22:37.632Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/18/4ca89ac737230b52ac8ffaca42f9c6f1fd07c81a6cd821e91af79db60632/pycryptodomex-3.23.0-cp313-cp313t-win32.whl", hash = "sha256:a9d446e844f08299236780f2efa9898c818fe7e02f17263866b8550c7d5fb328", size = 1772078, upload-time = "2025-05-17T17:22:40Z" },
+ { url = "https://files.pythonhosted.org/packages/73/34/13e01c322db027682e00986873eca803f11c56ade9ba5bbf3225841ea2d4/pycryptodomex-3.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:bc65bdd9fc8de7a35a74cab1c898cab391a4add33a8fe740bda00f5976ca4708", size = 1803656, upload-time = "2025-05-17T17:22:42.139Z" },
+ { url = "https://files.pythonhosted.org/packages/54/68/9504c8796b1805d58f4425002bcca20f12880e6fa4dc2fc9a668705c7a08/pycryptodomex-3.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:c885da45e70139464f082018ac527fdaad26f1657a99ee13eecdce0f0ca24ab4", size = 1707172, upload-time = "2025-05-17T17:22:44.704Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/9c/1a8f35daa39784ed8adf93a694e7e5dc15c23c741bbda06e1d45f8979e9e/pycryptodomex-3.23.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:06698f957fe1ab229a99ba2defeeae1c09af185baa909a31a5d1f9d42b1aaed6", size = 2499240, upload-time = "2025-05-17T17:22:46.953Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/62/f5221a191a97157d240cf6643747558759126c76ee92f29a3f4aee3197a5/pycryptodomex-3.23.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b2c2537863eccef2d41061e82a881dcabb04944c5c06c5aa7110b577cc487545", size = 1644042, upload-time = "2025-05-17T17:22:49.098Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/fd/5a054543c8988d4ed7b612721d7e78a4b9bf36bc3c5ad45ef45c22d0060e/pycryptodomex-3.23.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43c446e2ba8df8889e0e16f02211c25b4934898384c1ec1ec04d7889c0333587", size = 2186227, upload-time = "2025-05-17T17:22:51.139Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/a9/8862616a85cf450d2822dbd4fff1fcaba90877907a6ff5bc2672cafe42f8/pycryptodomex-3.23.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f489c4765093fb60e2edafdf223397bc716491b2b69fe74367b70d6999257a5c", size = 2272578, upload-time = "2025-05-17T17:22:53.676Z" },
+ { url = "https://files.pythonhosted.org/packages/46/9f/bda9c49a7c1842820de674ab36c79f4fbeeee03f8ff0e4f3546c3889076b/pycryptodomex-3.23.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdc69d0d3d989a1029df0eed67cc5e8e5d968f3724f4519bd03e0ec68df7543c", size = 2312166, upload-time = "2025-05-17T17:22:56.585Z" },
+ { url = "https://files.pythonhosted.org/packages/03/cc/870b9bf8ca92866ca0186534801cf8d20554ad2a76ca959538041b7a7cf4/pycryptodomex-3.23.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6bbcb1dd0f646484939e142462d9e532482bc74475cecf9c4903d4e1cd21f003", size = 2185467, upload-time = "2025-05-17T17:22:59.237Z" },
+ { url = "https://files.pythonhosted.org/packages/96/e3/ce9348236d8e669fea5dd82a90e86be48b9c341210f44e25443162aba187/pycryptodomex-3.23.0-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:8a4fcd42ccb04c31268d1efeecfccfd1249612b4de6374205376b8f280321744", size = 2346104, upload-time = "2025-05-17T17:23:02.112Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/e9/e869bcee87beb89040263c416a8a50204f7f7a83ac11897646c9e71e0daf/pycryptodomex-3.23.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:55ccbe27f049743a4caf4f4221b166560d3438d0b1e5ab929e07ae1702a4d6fd", size = 2271038, upload-time = "2025-05-17T17:23:04.872Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/67/09ee8500dd22614af5fbaa51a4aee6e342b5fa8aecf0a6cb9cbf52fa6d45/pycryptodomex-3.23.0-cp37-abi3-win32.whl", hash = "sha256:189afbc87f0b9f158386bf051f720e20fa6145975f1e76369303d0f31d1a8d7c", size = 1771969, upload-time = "2025-05-17T17:23:07.115Z" },
+ { url = "https://files.pythonhosted.org/packages/69/96/11f36f71a865dd6df03716d33bd07a67e9d20f6b8d39820470b766af323c/pycryptodomex-3.23.0-cp37-abi3-win_amd64.whl", hash = "sha256:52e5ca58c3a0b0bd5e100a9fbc8015059b05cffc6c66ce9d98b4b45e023443b9", size = 1803124, upload-time = "2025-05-17T17:23:09.267Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/93/45c1cdcbeb182ccd2e144c693eaa097763b08b38cded279f0053ed53c553/pycryptodomex-3.23.0-cp37-abi3-win_arm64.whl", hash = "sha256:02d87b80778c171445d67e23d1caef279bf4b25c3597050ccd2e13970b57fd51", size = 1707161, upload-time = "2025-05-17T17:23:11.414Z" },
+]
+
+[[package]]
+name = "pydantic"
+version = "1.10.26"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/7b/da/fd89f987a376c807cd81ea0eff4589aade783bbb702637b4734ef2c743a2/pydantic-1.10.26.tar.gz", hash = "sha256:8c6aa39b494c5af092e690127c283d84f363ac36017106a9e66cb33a22ac412e", size = 357906, upload-time = "2025-12-18T15:47:46.557Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1d/c1/d521e64c8130e1ad9d22c270bed3fabcc0940c9539b076b639c88fd32a8d/pydantic-1.10.26-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:116233e53889bcc536f617e38c1b8337d7fa9c280f0fd7a4045947515a785637", size = 2428347, upload-time = "2025-12-18T15:46:39.41Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/08/f4b804a00c16e3ea994cb640a7c25c579b4f1fa674cde6a19fa0dfb0ae4f/pydantic-1.10.26-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c3cfdd361addb6eb64ccd26ac356ad6514cee06a61ab26b27e16b5ed53108f77", size = 2212605, upload-time = "2025-12-18T15:46:41.006Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/78/0df4b9efef29bbc5e39f247fcba99060d15946b4463d82a5589cf7923d71/pydantic-1.10.26-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0e4451951a9a93bf9a90576f3e25240b47ee49ab5236adccb8eff6ac943adf0f", size = 2753560, upload-time = "2025-12-18T15:46:43.215Z" },
+ { url = "https://files.pythonhosted.org/packages/68/66/6ab6c1d3a116d05d2508fce64f96e35242938fac07544d611e11d0d363a0/pydantic-1.10.26-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9858ed44c6bea5f29ffe95308db9e62060791c877766c67dd5f55d072c8612b5", size = 2859235, upload-time = "2025-12-18T15:46:45.112Z" },
+ { url = "https://files.pythonhosted.org/packages/61/4e/f1676bb0fcdf6ed2ce4670d7d1fc1d6c3a06d84497644acfbe02649503f1/pydantic-1.10.26-cp311-cp311-win_amd64.whl", hash = "sha256:ac1089f723e2106ebde434377d31239e00870a7563245072968e5af5cc4d33df", size = 2066646, upload-time = "2025-12-18T15:46:46.816Z" },
+ { url = "https://files.pythonhosted.org/packages/02/6c/cd97a5a776c4515e6ee2ae81c2f2c5be51376dda6c31f965d7746ce0019f/pydantic-1.10.26-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:468d5b9cacfcaadc76ed0a4645354ab6f263ec01a63fb6d05630ea1df6ae453f", size = 2433795, upload-time = "2025-12-18T15:46:49.321Z" },
+ { url = "https://files.pythonhosted.org/packages/47/12/de20affa30dcef728fcf9cc98e13ff4438c7a630de8d2f90eb38eba0891c/pydantic-1.10.26-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2c1b0b914be31671000ca25cf7ea17fcaaa68cfeadf6924529c5c5aa24b7ab1f", size = 2227387, upload-time = "2025-12-18T15:46:50.877Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/1d/9d65dcc5b8c17ba590f1f9f486e9306346831902318b7ee93f63516f4003/pydantic-1.10.26-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15b13b9f8ba8867095769e1156e0d7fbafa1f65b898dd40fd1c02e34430973cb", size = 2629594, upload-time = "2025-12-18T15:46:53.42Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/76/acb41409356789e23e1a7ef58f93821410c96409183ce314ddb58d97f23e/pydantic-1.10.26-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad7025ca324ae263d4313998e25078dcaec5f9ed0392c06dedb57e053cc8086b", size = 2745305, upload-time = "2025-12-18T15:46:55.987Z" },
+ { url = "https://files.pythonhosted.org/packages/22/72/a98c0c5e527a66057d969fedd61675223c7975ade61acebbca9f1abd6dc0/pydantic-1.10.26-cp312-cp312-win_amd64.whl", hash = "sha256:4482b299874dabb88a6c3759e3d85c6557c407c3b586891f7d808d8a38b66b9c", size = 1937647, upload-time = "2025-12-18T15:46:57.905Z" },
+ { url = "https://files.pythonhosted.org/packages/28/b9/17a5a5a421c23ac27486b977724a42c9d5f8b7f0f4aab054251066223900/pydantic-1.10.26-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1ae7913bb40a96c87e3d3f6fe4e918ef53bf181583de4e71824360a9b11aef1c", size = 2494599, upload-time = "2025-12-18T15:47:00.209Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/8e/6e3bd4241076cf227b443d7577245dd5d181ecf40b3182fcb908bc8c197d/pydantic-1.10.26-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8154c13f58d4de5d3a856bb6c909c7370f41fb876a5952a503af6b975265f4ba", size = 2254391, upload-time = "2025-12-18T15:47:02.268Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/30/a1c4092eda2145ecbead6c92db489b223e101e1ba0da82576d0cf73dd422/pydantic-1.10.26-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f8af0507bf6118b054a9765fb2e402f18a8b70c964f420d95b525eb711122d62", size = 2609445, upload-time = "2025-12-18T15:47:04.909Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/2a/0491f1729ee4b7b6bc859ec22f69752f0c09bee1b66ac6f5f701136f34c3/pydantic-1.10.26-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dcb5a7318fb43189fde6af6f21ac7149c4bcbcfffc54bc87b5becddc46084847", size = 2732124, upload-time = "2025-12-18T15:47:07.464Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/56/b59f3b2f84e1df2b04ae768a1bb04d9f0288ff71b67cdcbb07683757b2c0/pydantic-1.10.26-cp313-cp313-win_amd64.whl", hash = "sha256:71cde228bc0600cf8619f0ee62db050d1880dcc477eba0e90b23011b4ee0f314", size = 1939888, upload-time = "2025-12-18T15:47:09.618Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/8b/0c3dc02d4b97790b0f199bf933f677c14e7be4a8d21307c5f2daae06aa41/pydantic-1.10.26-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6b40730cc81d53d515dc0b8bb5c9b43fadb9bed46de4a3c03bd95e8571616dba", size = 2502689, upload-time = "2025-12-18T15:47:12.308Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/9d/d31aeea45542b2ae4b09ecba92b88aaba696b801c31919811aa979a1242d/pydantic-1.10.26-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c3bbb9c0eecdf599e4db9b372fa9cc55be12e80a0d9c6d307950a39050cb0e37", size = 2269494, upload-time = "2025-12-18T15:47:14.53Z" },
+ { url = "https://files.pythonhosted.org/packages/78/c1/3a4d069593283ca4dd0006039ba33644e21e432cddc09da706ac50441610/pydantic-1.10.26-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc2e3fe7bc4993626ef6b6fa855defafa1d6f8996aa1caef2deb83c5ac4d043a", size = 2620047, upload-time = "2025-12-18T15:47:17.089Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/0e/340c3d29197d99c15ab04093d43bb9c9d0fd17c2a34b80cb9d36ed732b09/pydantic-1.10.26-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:36d9e46b588aaeb1dcd2409fa4c467fe0b331f3cc9f227b03a7a00643704e962", size = 2747625, upload-time = "2025-12-18T15:47:19.21Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/58/f12ab3727339b172c830b32151919456b67787cdfe8808b2568b322fb15c/pydantic-1.10.26-cp314-cp314-win_amd64.whl", hash = "sha256:81ce3c8616d12a7be31b4aadfd3434f78f6b44b75adbfaec2fe1ad4f7f999b8c", size = 1976436, upload-time = "2025-12-18T15:47:21.384Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/98/556e82f00b98486def0b8af85da95e69d2be7e367cf2431408e108bc3095/pydantic-1.10.26-py3-none-any.whl", hash = "sha256:c43ad70dc3ce7787543d563792426a16fd7895e14be4b194b5665e36459dd917", size = 166975, upload-time = "2025-12-18T15:47:44.927Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.19.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
+]
+
+[[package]]
+name = "pysmi"
+version = "1.6.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "jinja2" },
+ { name = "ply" },
+ { name = "requests" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e0/9c/ba0465dcbcbf93bec4e408b164cde7258cd3e77be4fcde5e835796cfb39f/pysmi-1.6.3.tar.gz", hash = "sha256:5d2eeb9e98bc149dee8f9256899d13789206769aab1637e33ac5f0dacaaf51fb", size = 62800, upload-time = "2026-01-23T00:30:19.919Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/ec/b336b8fe0134077a3d07e3732c33398e7d2eed8410571e063cbd2c89d8e0/pysmi-1.6.3-py3-none-any.whl", hash = "sha256:fc2d796c252379e1b47aeea2e547ff339ca6df504cf6196cb3adad8054f41e7d", size = 87797, upload-time = "2026-01-23T00:30:18.823Z" },
+]
+
+[[package]]
+name = "pysnmp"
+version = "4.4.12"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pyasn1" },
+ { name = "pycryptodomex" },
+ { name = "pysmi" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/4e/75/72f64c451bf5884715f84f8217b69b4025da0b67628d611cd14a5b7db217/pysnmp-4.4.12.tar.gz", hash = "sha256:0c3dbef2f958caca96071fe5c19de43e9c1b0484ab02a0cf08b190bcee768ba9", size = 442270, upload-time = "2019-09-24T16:29:37.521Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/25/7e/1e17facea54dd21c6a72db6ae57a5bfdd56edd54b8c4850668b554bdddba/pysnmp-4.4.12-py2.py3-none-any.whl", hash = "sha256:d90946c5d7c55b1ddc03e065a99a2ed36e748dcf166ca04ee4126b8f25fc057a", size = 296498, upload-time = "2019-09-24T16:28:57.676Z" },
+]
+
+[[package]]
+name = "python-dateutil"
+version = "2.9.0.post0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "six" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
+]
+
+[[package]]
+name = "python-dotenv"
+version = "1.2.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" },
+]
+
+[[package]]
+name = "python-multipart"
+version = "0.0.22"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/94/01/979e98d542a70714b0cb2b6728ed0b7c46792b695e3eaec3e20711271ca3/python_multipart-0.0.22.tar.gz", hash = "sha256:7340bef99a7e0032613f56dc36027b959fd3b30a787ed62d310e951f7c3a3a58", size = 37612, upload-time = "2026-01-25T10:15:56.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1b/d0/397f9626e711ff749a95d96b7af99b9c566a9bb5129b8e4c10fc4d100304/python_multipart-0.0.22-py3-none-any.whl", hash = "sha256:2b2cd894c83d21bf49d702499531c7bafd057d730c201782048f7945d82de155", size = 24579, upload-time = "2026-01-25T10:15:54.811Z" },
+]
+
+[[package]]
+name = "python-scratchpad"
+version = "0.1.0"
+source = { editable = "." }
+dependencies = [
+ { name = "brother-ql" },
+ { name = "fastapi", extra = ["standard"] },
+ { name = "jinja2" },
+ { name = "pandas" },
+ { name = "pillow" },
+ { name = "pyasn1" },
+ { name = "pysnmp" },
+ { name = "python-dotenv" },
+ { name = "python-telegram-bot" },
+ { name = "qrcode", extra = ["pil"] },
+ { name = "requests" },
+ { name = "setuptools" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "brother-ql", git = "https://github.com/hbrylkowski/brother_ql?rev=4225d13d209e8e4a2c17e87a75f42809e0da8fda" },
+ { name = "fastapi", extras = ["standard"], specifier = ">=0.114.0" },
+ { name = "jinja2", specifier = "==3.1.6" },
+ { name = "jinja2", specifier = ">=3.1.2,<4" },
+ { name = "pandas", specifier = "==2.3.3" },
+ { name = "pillow", specifier = ">=9.5.0,<10" },
+ { name = "pyasn1", specifier = "==0.4.8,<0.5" },
+ { name = "pysnmp", specifier = ">=4.4.12,<5" },
+ { name = "python-dotenv", specifier = "==1.2.1" },
+ { name = "python-telegram-bot", specifier = ">=20.3,<21" },
+ { name = "qrcode", extras = ["pil"] },
+ { name = "requests", specifier = "==2.32.5" },
+ { name = "setuptools", specifier = "<81" },
+]
+
+[[package]]
+name = "python-telegram-bot"
+version = "20.8"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "httpx" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/38/4c/90e0cee1ad7525d4009ae300219c6ee553aedc38cce59c8deb5dffb1859d/python-telegram-bot-20.8.tar.gz", hash = "sha256:0e1e4a6dbce3f4ba606990d66467a5a2d2018368fe44756fae07410a74e960dc", size = 407744, upload-time = "2024-02-08T17:39:19.184Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6f/8e/4e4ed06986557fce0c41c3dfc60c5495b1095cf8a552bdc4c56e96aefdac/python_telegram_bot-20.8-py3-none-any.whl", hash = "sha256:a98ddf2f237d6584b03a2f8b20553e1b5e02c8d3a1ea8e17fd06cc955af78c14", size = 604866, upload-time = "2024-02-08T17:39:12.202Z" },
+]
+
+[[package]]
+name = "pytz"
+version = "2026.1.post1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/56/db/b8721d71d945e6a8ac63c0fc900b2067181dbb50805958d4d4661cf7d277/pytz-2026.1.post1.tar.gz", hash = "sha256:3378dde6a0c3d26719182142c56e60c7f9af7e968076f31aae569d72a0358ee1", size = 321088, upload-time = "2026-03-03T07:47:50.683Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl", hash = "sha256:f2fd16142fda348286a75e1a524be810bb05d444e5a081f37f7affc635035f7a", size = 510489, upload-time = "2026-03-03T07:47:49.167Z" },
+]
+
+[[package]]
+name = "pyusb"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/00/6b/ce3727395e52b7b76dfcf0c665e37d223b680b9becc60710d4bc08b7b7cb/pyusb-1.3.1.tar.gz", hash = "sha256:3af070b607467c1c164f49d5b0caabe8ac78dbed9298d703a8dbf9df4052d17e", size = 77281, upload-time = "2025-01-08T23:45:01.866Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/28/b8/27e6312e86408a44fe16bd28ee12dd98608b39f7e7e57884a24e8f29b573/pyusb-1.3.1-py3-none-any.whl", hash = "sha256:bf9b754557af4717fe80c2b07cc2b923a9151f5c08d17bdb5345dac09d6a0430", size = 58465, upload-time = "2025-01-08T23:45:00.029Z" },
+]
+
+[[package]]
+name = "pyyaml"
+version = "6.0.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" },
+ { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" },
+ { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" },
+ { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" },
+ { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" },
+ { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" },
+ { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" },
+ { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" },
+ { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" },
+ { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" },
+ { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" },
+ { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" },
+ { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" },
+ { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" },
+ { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" },
+ { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" },
+ { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" },
+ { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" },
+ { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" },
+ { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" },
+ { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" },
+ { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" },
+ { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
+]
+
+[[package]]
+name = "qrcode"
+version = "8.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/8f/b2/7fc2931bfae0af02d5f53b174e9cf701adbb35f39d69c2af63d4a39f81a9/qrcode-8.2.tar.gz", hash = "sha256:35c3f2a4172b33136ab9f6b3ef1c00260dd2f66f858f24d88418a015f446506c", size = 43317, upload-time = "2025-05-01T15:44:24.726Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/dd/b8/d2d6d731733f51684bbf76bf34dab3b70a9148e8f2cef2bb544fccec681a/qrcode-8.2-py3-none-any.whl", hash = "sha256:16e64e0716c14960108e85d853062c9e8bba5ca8252c0b4d0231b9df4060ff4f", size = 45986, upload-time = "2025-05-01T15:44:22.781Z" },
+]
+
+[package.optional-dependencies]
+pil = [
+ { name = "pillow" },
+]
+
+[[package]]
+name = "requests"
+version = "2.32.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "charset-normalizer" },
+ { name = "idna" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" },
+]
+
+[[package]]
+name = "rich"
+version = "14.3.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b3/c6/f3b320c27991c46f43ee9d856302c70dc2d0fb2dba4842ff739d5f46b393/rich-14.3.3.tar.gz", hash = "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b", size = 230582, upload-time = "2026-02-19T17:23:12.474Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d", size = 310458, upload-time = "2026-02-19T17:23:13.732Z" },
+]
+
+[[package]]
+name = "rich-toolkit"
+version = "0.19.7"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "click" },
+ { name = "rich" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/42/ba/dae9e3096651042754da419a4042bc1c75e07d615f9b15066d738838e4df/rich_toolkit-0.19.7.tar.gz", hash = "sha256:133c0915872da91d4c25d85342d5ec1dfacc69b63448af1a08a0d4b4f23ef46e", size = 195877, upload-time = "2026-02-24T16:06:20.555Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fb/3c/c923619f6d2f5fafcc96fec0aaf9550a46cd5b6481f06e0c6b66a2a4fed0/rich_toolkit-0.19.7-py3-none-any.whl", hash = "sha256:0288e9203728c47c5a4eb60fd2f0692d9df7455a65901ab6f898437a2ba5989d", size = 32963, upload-time = "2026-02-24T16:06:22.066Z" },
+]
+
+[[package]]
+name = "setuptools"
+version = "80.10.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/76/95/faf61eb8363f26aa7e1d762267a8d602a1b26d4f3a1e758e92cb3cb8b054/setuptools-80.10.2.tar.gz", hash = "sha256:8b0e9d10c784bf7d262c4e5ec5d4ec94127ce206e8738f29a437945fbc219b70", size = 1200343, upload-time = "2026-01-25T22:38:17.252Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/94/b8/f1f62a5e3c0ad2ff1d189590bfa4c46b4f3b6e49cef6f26c6ee4e575394d/setuptools-80.10.2-py3-none-any.whl", hash = "sha256:95b30ddfb717250edb492926c92b5221f7ef3fbcc2b07579bcd4a27da21d0173", size = 1064234, upload-time = "2026-01-25T22:38:15.216Z" },
+]
+
+[[package]]
+name = "shellingham"
+version = "1.5.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
+]
+
+[[package]]
+name = "six"
+version = "1.17.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
+]
+
+[[package]]
+name = "sniffio"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" },
+]
+
+[[package]]
+name = "starlette"
+version = "0.46.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "anyio" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5", size = 2580846, upload-time = "2025-04-13T13:56:17.942Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037, upload-time = "2025-04-13T13:56:16.21Z" },
+]
+
+[[package]]
+name = "typer"
+version = "0.24.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "annotated-doc" },
+ { name = "click" },
+ { name = "rich" },
+ { name = "shellingham" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/f5/24/cb09efec5cc954f7f9b930bf8279447d24618bb6758d4f6adf2574c41780/typer-0.24.1.tar.gz", hash = "sha256:e39b4732d65fbdcde189ae76cf7cd48aeae72919dea1fdfc16593be016256b45", size = 118613, upload-time = "2026-02-21T16:54:40.609Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4a/91/48db081e7a63bb37284f9fbcefda7c44c277b18b0e13fbc36ea2335b71e6/typer-0.24.1-py3-none-any.whl", hash = "sha256:112c1f0ce578bfb4cab9ffdabc68f031416ebcc216536611ba21f04e9aa84c9e", size = 56085, upload-time = "2026-02-21T16:54:41.616Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.15.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" },
+]
+
+[[package]]
+name = "tzdata"
+version = "2025.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" },
+]
+
+[[package]]
+name = "urllib3"
+version = "2.6.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" },
+]
+
+[[package]]
+name = "uvicorn"
+version = "0.41.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "click" },
+ { name = "h11" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/32/ce/eeb58ae4ac36fe09e3842eb02e0eb676bf2c53ae062b98f1b2531673efdd/uvicorn-0.41.0.tar.gz", hash = "sha256:09d11cf7008da33113824ee5a1c6422d89fbc2ff476540d69a34c87fab8b571a", size = 82633, upload-time = "2026-02-16T23:07:24.1Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/83/e4/d04a086285c20886c0daad0e026f250869201013d18f81d9ff5eada73a88/uvicorn-0.41.0-py3-none-any.whl", hash = "sha256:29e35b1d2c36a04b9e180d4007ede3bcb32a85fbdfd6c6aeb3f26839de088187", size = 68783, upload-time = "2026-02-16T23:07:22.357Z" },
+]
+
+[package.optional-dependencies]
+standard = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "httptools" },
+ { name = "python-dotenv" },
+ { name = "pyyaml" },
+ { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" },
+ { name = "watchfiles" },
+ { name = "websockets" },
+]
+
+[[package]]
+name = "uvloop"
+version = "0.22.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250, upload-time = "2025-10-16T22:17:19.342Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c7/d5/69900f7883235562f1f50d8184bb7dd84a2fb61e9ec63f3782546fdbd057/uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9", size = 1352420, upload-time = "2025-10-16T22:16:21.187Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/73/c4e271b3bce59724e291465cc936c37758886a4868787da0278b3b56b905/uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77", size = 748677, upload-time = "2025-10-16T22:16:22.558Z" },
+ { url = "https://files.pythonhosted.org/packages/86/94/9fb7fad2f824d25f8ecac0d70b94d0d48107ad5ece03769a9c543444f78a/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21", size = 3753819, upload-time = "2025-10-16T22:16:23.903Z" },
+ { url = "https://files.pythonhosted.org/packages/74/4f/256aca690709e9b008b7108bc85fba619a2bc37c6d80743d18abad16ee09/uvloop-0.22.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56a2d1fae65fd82197cb8c53c367310b3eabe1bbb9fb5a04d28e3e3520e4f702", size = 3804529, upload-time = "2025-10-16T22:16:25.246Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/74/03c05ae4737e871923d21a76fe28b6aad57f5c03b6e6bfcfa5ad616013e4/uvloop-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733", size = 3621267, upload-time = "2025-10-16T22:16:26.819Z" },
+ { url = "https://files.pythonhosted.org/packages/75/be/f8e590fe61d18b4a92070905497aec4c0e64ae1761498cad09023f3f4b3e/uvloop-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473", size = 3723105, upload-time = "2025-10-16T22:16:28.252Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/ff/7f72e8170be527b4977b033239a83a68d5c881cc4775fca255c677f7ac5d/uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42", size = 1359936, upload-time = "2025-10-16T22:16:29.436Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/c6/e5d433f88fd54d81ef4be58b2b7b0cea13c442454a1db703a1eea0db1a59/uvloop-0.22.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6", size = 752769, upload-time = "2025-10-16T22:16:30.493Z" },
+ { url = "https://files.pythonhosted.org/packages/24/68/a6ac446820273e71aa762fa21cdcc09861edd3536ff47c5cd3b7afb10eeb/uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370", size = 4317413, upload-time = "2025-10-16T22:16:31.644Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/6f/e62b4dfc7ad6518e7eff2516f680d02a0f6eb62c0c212e152ca708a0085e/uvloop-0.22.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b5b1ac819a3f946d3b2ee07f09149578ae76066d70b44df3fa990add49a82e4", size = 4426307, upload-time = "2025-10-16T22:16:32.917Z" },
+ { url = "https://files.pythonhosted.org/packages/90/60/97362554ac21e20e81bcef1150cb2a7e4ffdaf8ea1e5b2e8bf7a053caa18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e047cc068570bac9866237739607d1313b9253c3051ad84738cbb095be0537b2", size = 4131970, upload-time = "2025-10-16T22:16:34.015Z" },
+ { url = "https://files.pythonhosted.org/packages/99/39/6b3f7d234ba3964c428a6e40006340f53ba37993f46ed6e111c6e9141d18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:512fec6815e2dd45161054592441ef76c830eddaad55c8aa30952e6fe1ed07c0", size = 4296343, upload-time = "2025-10-16T22:16:35.149Z" },
+ { url = "https://files.pythonhosted.org/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705", size = 1358611, upload-time = "2025-10-16T22:16:36.833Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/14/e301ee96a6dc95224b6f1162cd3312f6d1217be3907b79173b06785f2fe7/uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8", size = 751811, upload-time = "2025-10-16T22:16:38.275Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/02/654426ce265ac19e2980bfd9ea6590ca96a56f10c76e63801a2df01c0486/uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d", size = 4288562, upload-time = "2025-10-16T22:16:39.375Z" },
+ { url = "https://files.pythonhosted.org/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e", size = 4366890, upload-time = "2025-10-16T22:16:40.547Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/53/8369e5219a5855869bcee5f4d317f6da0e2c669aecf0ef7d371e3d084449/uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e", size = 4119472, upload-time = "2025-10-16T22:16:41.694Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/ba/d69adbe699b768f6b29a5eec7b47dd610bd17a69de51b251126a801369ea/uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad", size = 4239051, upload-time = "2025-10-16T22:16:43.224Z" },
+ { url = "https://files.pythonhosted.org/packages/90/cd/b62bdeaa429758aee8de8b00ac0dd26593a9de93d302bff3d21439e9791d/uvloop-0.22.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142", size = 1362067, upload-time = "2025-10-16T22:16:44.503Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/f8/a132124dfda0777e489ca86732e85e69afcd1ff7686647000050ba670689/uvloop-0.22.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74", size = 752423, upload-time = "2025-10-16T22:16:45.968Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/94/94af78c156f88da4b3a733773ad5ba0b164393e357cc4bd0ab2e2677a7d6/uvloop-0.22.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35", size = 4272437, upload-time = "2025-10-16T22:16:47.451Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/35/60249e9fd07b32c665192cec7af29e06c7cd96fa1d08b84f012a56a0b38e/uvloop-0.22.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25", size = 4292101, upload-time = "2025-10-16T22:16:49.318Z" },
+ { url = "https://files.pythonhosted.org/packages/02/62/67d382dfcb25d0a98ce73c11ed1a6fba5037a1a1d533dcbb7cab033a2636/uvloop-0.22.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6", size = 4114158, upload-time = "2025-10-16T22:16:50.517Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/7a/f1171b4a882a5d13c8b7576f348acfe6074d72eaf52cccef752f748d4a9f/uvloop-0.22.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079", size = 4177360, upload-time = "2025-10-16T22:16:52.646Z" },
+ { url = "https://files.pythonhosted.org/packages/79/7b/b01414f31546caf0919da80ad57cbfe24c56b151d12af68cee1b04922ca8/uvloop-0.22.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289", size = 1454790, upload-time = "2025-10-16T22:16:54.355Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/31/0bb232318dd838cad3fa8fb0c68c8b40e1145b32025581975e18b11fab40/uvloop-0.22.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3", size = 796783, upload-time = "2025-10-16T22:16:55.906Z" },
+ { url = "https://files.pythonhosted.org/packages/42/38/c9b09f3271a7a723a5de69f8e237ab8e7803183131bc57c890db0b6bb872/uvloop-0.22.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c", size = 4647548, upload-time = "2025-10-16T22:16:57.008Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/37/945b4ca0ac27e3dc4952642d4c900edd030b3da6c9634875af6e13ae80e5/uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21", size = 4467065, upload-time = "2025-10-16T22:16:58.206Z" },
+ { url = "https://files.pythonhosted.org/packages/97/cc/48d232f33d60e2e2e0b42f4e73455b146b76ebe216487e862700457fbf3c/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88", size = 4328384, upload-time = "2025-10-16T22:16:59.36Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/16/c1fd27e9549f3c4baf1dc9c20c456cd2f822dbf8de9f463824b0c0357e06/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e", size = 4296730, upload-time = "2025-10-16T22:17:00.744Z" },
+]
+
+[[package]]
+name = "watchfiles"
+version = "1.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "anyio" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1f/f8/2c5f479fb531ce2f0564eda479faecf253d886b1ab3630a39b7bf7362d46/watchfiles-1.1.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f57b396167a2565a4e8b5e56a5a1c537571733992b226f4f1197d79e94cf0ae5", size = 406529, upload-time = "2025-10-14T15:04:32.899Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/cd/f515660b1f32f65df671ddf6f85bfaca621aee177712874dc30a97397977/watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741", size = 394384, upload-time = "2025-10-14T15:04:33.761Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/c3/28b7dc99733eab43fca2d10f55c86e03bd6ab11ca31b802abac26b23d161/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6", size = 448789, upload-time = "2025-10-14T15:04:34.679Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/24/33e71113b320030011c8e4316ccca04194bf0cbbaeee207f00cbc7d6b9f5/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f537afb3276d12814082a2e9b242bdcf416c2e8fd9f799a737990a1dbe906e5b", size = 460521, upload-time = "2025-10-14T15:04:35.963Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/c3/3c9a55f255aa57b91579ae9e98c88704955fa9dac3e5614fb378291155df/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2cd9e04277e756a2e2d2543d65d1e2166d6fd4c9b183f8808634fda23f17b14", size = 488722, upload-time = "2025-10-14T15:04:37.091Z" },
+ { url = "https://files.pythonhosted.org/packages/49/36/506447b73eb46c120169dc1717fe2eff07c234bb3232a7200b5f5bd816e9/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f3f58818dc0b07f7d9aa7fe9eb1037aecb9700e63e1f6acfed13e9fef648f5d", size = 596088, upload-time = "2025-10-14T15:04:38.39Z" },
+ { url = "https://files.pythonhosted.org/packages/82/ab/5f39e752a9838ec4d52e9b87c1e80f1ee3ccdbe92e183c15b6577ab9de16/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb9f66367023ae783551042d31b1d7fd422e8289eedd91f26754a66f44d5cff", size = 472923, upload-time = "2025-10-14T15:04:39.666Z" },
+ { url = "https://files.pythonhosted.org/packages/af/b9/a419292f05e302dea372fa7e6fda5178a92998411f8581b9830d28fb9edb/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606", size = 456080, upload-time = "2025-10-14T15:04:40.643Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/c3/d5932fd62bde1a30c36e10c409dc5d54506726f08cb3e1d8d0ba5e2bc8db/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701", size = 629432, upload-time = "2025-10-14T15:04:41.789Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/77/16bddd9779fafb795f1a94319dc965209c5641db5bf1edbbccace6d1b3c0/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10", size = 623046, upload-time = "2025-10-14T15:04:42.718Z" },
+ { url = "https://files.pythonhosted.org/packages/46/ef/f2ecb9a0f342b4bfad13a2787155c6ee7ce792140eac63a34676a2feeef2/watchfiles-1.1.1-cp311-cp311-win32.whl", hash = "sha256:de6da501c883f58ad50db3a32ad397b09ad29865b5f26f64c24d3e3281685849", size = 271473, upload-time = "2025-10-14T15:04:43.624Z" },
+ { url = "https://files.pythonhosted.org/packages/94/bc/f42d71125f19731ea435c3948cad148d31a64fccde3867e5ba4edee901f9/watchfiles-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:35c53bd62a0b885bf653ebf6b700d1bf05debb78ad9292cf2a942b23513dc4c4", size = 287598, upload-time = "2025-10-14T15:04:44.516Z" },
+ { url = "https://files.pythonhosted.org/packages/57/c9/a30f897351f95bbbfb6abcadafbaca711ce1162f4db95fc908c98a9165f3/watchfiles-1.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:57ca5281a8b5e27593cb7d82c2ac927ad88a96ed406aa446f6344e4328208e9e", size = 277210, upload-time = "2025-10-14T15:04:45.883Z" },
+ { url = "https://files.pythonhosted.org/packages/74/d5/f039e7e3c639d9b1d09b07ea412a6806d38123f0508e5f9b48a87b0a76cc/watchfiles-1.1.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8c89f9f2f740a6b7dcc753140dd5e1ab9215966f7a3530d0c0705c83b401bd7d", size = 404745, upload-time = "2025-10-14T15:04:46.731Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/96/a881a13aa1349827490dab2d363c8039527060cfcc2c92cc6d13d1b1049e/watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610", size = 391769, upload-time = "2025-10-14T15:04:48.003Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/5b/d3b460364aeb8da471c1989238ea0e56bec24b6042a68046adf3d9ddb01c/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af", size = 449374, upload-time = "2025-10-14T15:04:49.179Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/44/5769cb62d4ed055cb17417c0a109a92f007114a4e07f30812a73a4efdb11/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2edc3553362b1c38d9f06242416a5d8e9fe235c204a4072e988ce2e5bb1f69f6", size = 459485, upload-time = "2025-10-14T15:04:50.155Z" },
+ { url = "https://files.pythonhosted.org/packages/19/0c/286b6301ded2eccd4ffd0041a1b726afda999926cf720aab63adb68a1e36/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30f7da3fb3f2844259cba4720c3fc7138eb0f7b659c38f3bfa65084c7fc7abce", size = 488813, upload-time = "2025-10-14T15:04:51.059Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/2b/8530ed41112dd4a22f4dcfdb5ccf6a1baad1ff6eed8dc5a5f09e7e8c41c7/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8979280bdafff686ba5e4d8f97840f929a87ed9cdf133cbbd42f7766774d2aa", size = 594816, upload-time = "2025-10-14T15:04:52.031Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/d2/f5f9fb49489f184f18470d4f99f4e862a4b3e9ac2865688eb2099e3d837a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcc5c24523771db3a294c77d94771abcfcb82a0e0ee8efd910c37c59ec1b31bb", size = 475186, upload-time = "2025-10-14T15:04:53.064Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/68/5707da262a119fb06fbe214d82dd1fe4a6f4af32d2d14de368d0349eb52a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803", size = 456812, upload-time = "2025-10-14T15:04:55.174Z" },
+ { url = "https://files.pythonhosted.org/packages/66/ab/3cbb8756323e8f9b6f9acb9ef4ec26d42b2109bce830cc1f3468df20511d/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94", size = 630196, upload-time = "2025-10-14T15:04:56.22Z" },
+ { url = "https://files.pythonhosted.org/packages/78/46/7152ec29b8335f80167928944a94955015a345440f524d2dfe63fc2f437b/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43", size = 622657, upload-time = "2025-10-14T15:04:57.521Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/bf/95895e78dd75efe9a7f31733607f384b42eb5feb54bd2eb6ed57cc2e94f4/watchfiles-1.1.1-cp312-cp312-win32.whl", hash = "sha256:859e43a1951717cc8de7f4c77674a6d389b106361585951d9e69572823f311d9", size = 272042, upload-time = "2025-10-14T15:04:59.046Z" },
+ { url = "https://files.pythonhosted.org/packages/87/0a/90eb755f568de2688cb220171c4191df932232c20946966c27a59c400850/watchfiles-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:91d4c9a823a8c987cce8fa2690923b069966dabb196dd8d137ea2cede885fde9", size = 288410, upload-time = "2025-10-14T15:05:00.081Z" },
+ { url = "https://files.pythonhosted.org/packages/36/76/f322701530586922fbd6723c4f91ace21364924822a8772c549483abed13/watchfiles-1.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:a625815d4a2bdca61953dbba5a39d60164451ef34c88d751f6c368c3ea73d404", size = 278209, upload-time = "2025-10-14T15:05:01.168Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/f4/f750b29225fe77139f7ae5de89d4949f5a99f934c65a1f1c0b248f26f747/watchfiles-1.1.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:130e4876309e8686a5e37dba7d5e9bc77e6ed908266996ca26572437a5271e18", size = 404321, upload-time = "2025-10-14T15:05:02.063Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/f9/f07a295cde762644aa4c4bb0f88921d2d141af45e735b965fb2e87858328/watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a", size = 391783, upload-time = "2025-10-14T15:05:03.052Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/11/fc2502457e0bea39a5c958d86d2cb69e407a4d00b85735ca724bfa6e0d1a/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219", size = 449279, upload-time = "2025-10-14T15:05:04.004Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/1f/d66bc15ea0b728df3ed96a539c777acfcad0eb78555ad9efcaa1274688f0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f27db948078f3823a6bb3b465180db8ebecf26dd5dae6f6180bd87383b6b4428", size = 459405, upload-time = "2025-10-14T15:05:04.942Z" },
+ { url = "https://files.pythonhosted.org/packages/be/90/9f4a65c0aec3ccf032703e6db02d89a157462fbb2cf20dd415128251cac0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059098c3a429f62fc98e8ec62b982230ef2c8df68c79e826e37b895bc359a9c0", size = 488976, upload-time = "2025-10-14T15:05:05.905Z" },
+ { url = "https://files.pythonhosted.org/packages/37/57/ee347af605d867f712be7029bb94c8c071732a4b44792e3176fa3c612d39/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfb5862016acc9b869bb57284e6cb35fdf8e22fe59f7548858e2f971d045f150", size = 595506, upload-time = "2025-10-14T15:05:06.906Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/78/cc5ab0b86c122047f75e8fc471c67a04dee395daf847d3e59381996c8707/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:319b27255aacd9923b8a276bb14d21a5f7ff82564c744235fc5eae58d95422ae", size = 474936, upload-time = "2025-10-14T15:05:07.906Z" },
+ { url = "https://files.pythonhosted.org/packages/62/da/def65b170a3815af7bd40a3e7010bf6ab53089ef1b75d05dd5385b87cf08/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d", size = 456147, upload-time = "2025-10-14T15:05:09.138Z" },
+ { url = "https://files.pythonhosted.org/packages/57/99/da6573ba71166e82d288d4df0839128004c67d2778d3b566c138695f5c0b/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b", size = 630007, upload-time = "2025-10-14T15:05:10.117Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/51/7439c4dd39511368849eb1e53279cd3454b4a4dbace80bab88feeb83c6b5/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374", size = 622280, upload-time = "2025-10-14T15:05:11.146Z" },
+ { url = "https://files.pythonhosted.org/packages/95/9c/8ed97d4bba5db6fdcdb2b298d3898f2dd5c20f6b73aee04eabe56c59677e/watchfiles-1.1.1-cp313-cp313-win32.whl", hash = "sha256:bf0a91bfb5574a2f7fc223cf95eeea79abfefa404bf1ea5e339c0c1560ae99a0", size = 272056, upload-time = "2025-10-14T15:05:12.156Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/f3/c14e28429f744a260d8ceae18bf58c1d5fa56b50d006a7a9f80e1882cb0d/watchfiles-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:52e06553899e11e8074503c8e716d574adeeb7e68913115c4b3653c53f9bae42", size = 288162, upload-time = "2025-10-14T15:05:13.208Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/61/fe0e56c40d5cd29523e398d31153218718c5786b5e636d9ae8ae79453d27/watchfiles-1.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac3cc5759570cd02662b15fbcd9d917f7ecd47efe0d6b40474eafd246f91ea18", size = 277909, upload-time = "2025-10-14T15:05:14.49Z" },
+ { url = "https://files.pythonhosted.org/packages/79/42/e0a7d749626f1e28c7108a99fb9bf524b501bbbeb9b261ceecde644d5a07/watchfiles-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:563b116874a9a7ce6f96f87cd0b94f7faf92d08d0021e837796f0a14318ef8da", size = 403389, upload-time = "2025-10-14T15:05:15.777Z" },
+ { url = "https://files.pythonhosted.org/packages/15/49/08732f90ce0fbbc13913f9f215c689cfc9ced345fb1bcd8829a50007cc8d/watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051", size = 389964, upload-time = "2025-10-14T15:05:16.85Z" },
+ { url = "https://files.pythonhosted.org/packages/27/0d/7c315d4bd5f2538910491a0393c56bf70d333d51bc5b34bee8e68e8cea19/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e", size = 448114, upload-time = "2025-10-14T15:05:17.876Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/24/9e096de47a4d11bc4df41e9d1e61776393eac4cb6eb11b3e23315b78b2cc/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb467c999c2eff23a6417e58d75e5828716f42ed8289fe6b77a7e5a91036ca70", size = 460264, upload-time = "2025-10-14T15:05:18.962Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/0f/e8dea6375f1d3ba5fcb0b3583e2b493e77379834c74fd5a22d66d85d6540/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836398932192dae4146c8f6f737d74baeac8b70ce14831a239bdb1ca882fc261", size = 487877, upload-time = "2025-10-14T15:05:20.094Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/5b/df24cfc6424a12deb41503b64d42fbea6b8cb357ec62ca84a5a3476f654a/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:743185e7372b7bc7c389e1badcc606931a827112fbbd37f14c537320fca08620", size = 595176, upload-time = "2025-10-14T15:05:21.134Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/b5/853b6757f7347de4e9b37e8cc3289283fb983cba1ab4d2d7144694871d9c/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afaeff7696e0ad9f02cbb8f56365ff4686ab205fcf9c4c5b6fdfaaa16549dd04", size = 473577, upload-time = "2025-10-14T15:05:22.306Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", size = 455425, upload-time = "2025-10-14T15:05:23.348Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", size = 628826, upload-time = "2025-10-14T15:05:24.398Z" },
+ { url = "https://files.pythonhosted.org/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", size = 622208, upload-time = "2025-10-14T15:05:25.45Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/f4/0872229324ef69b2c3edec35e84bd57a1289e7d3fe74588048ed8947a323/watchfiles-1.1.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d1715143123baeeaeadec0528bb7441103979a1d5f6fd0e1f915383fea7ea6d5", size = 404315, upload-time = "2025-10-14T15:05:26.501Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/22/16d5331eaed1cb107b873f6ae1b69e9ced582fcf0c59a50cd84f403b1c32/watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:39574d6370c4579d7f5d0ad940ce5b20db0e4117444e39b6d8f99db5676c52fd", size = 390869, upload-time = "2025-10-14T15:05:27.649Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/7e/5643bfff5acb6539b18483128fdc0ef2cccc94a5b8fbda130c823e8ed636/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7365b92c2e69ee952902e8f70f3ba6360d0d596d9299d55d7d386df84b6941fb", size = 449919, upload-time = "2025-10-14T15:05:28.701Z" },
+ { url = "https://files.pythonhosted.org/packages/51/2e/c410993ba5025a9f9357c376f48976ef0e1b1aefb73b97a5ae01a5972755/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfff9740c69c0e4ed32416f013f3c45e2ae42ccedd1167ef2d805c000b6c71a5", size = 460845, upload-time = "2025-10-14T15:05:30.064Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/a4/2df3b404469122e8680f0fcd06079317e48db58a2da2950fb45020947734/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b27cf2eb1dda37b2089e3907d8ea92922b673c0c427886d4edc6b94d8dfe5db3", size = 489027, upload-time = "2025-10-14T15:05:31.064Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/84/4587ba5b1f267167ee715b7f66e6382cca6938e0a4b870adad93e44747e6/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526e86aced14a65a5b0ec50827c745597c782ff46b571dbfe46192ab9e0b3c33", size = 595615, upload-time = "2025-10-14T15:05:32.074Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/0f/c6988c91d06e93cd0bb3d4a808bcf32375ca1904609835c3031799e3ecae/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04e78dd0b6352db95507fd8cb46f39d185cf8c74e4cf1e4fbad1d3df96faf510", size = 474836, upload-time = "2025-10-14T15:05:33.209Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/36/ded8aebea91919485b7bbabbd14f5f359326cb5ec218cd67074d1e426d74/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c85794a4cfa094714fb9c08d4a218375b2b95b8ed1666e8677c349906246c05", size = 455099, upload-time = "2025-10-14T15:05:34.189Z" },
+ { url = "https://files.pythonhosted.org/packages/98/e0/8c9bdba88af756a2fce230dd365fab2baf927ba42cd47521ee7498fd5211/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:74d5012b7630714b66be7b7b7a78855ef7ad58e8650c73afc4c076a1f480a8d6", size = 630626, upload-time = "2025-10-14T15:05:35.216Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/84/a95db05354bf2d19e438520d92a8ca475e578c647f78f53197f5a2f17aaf/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8fbe85cb3201c7d380d3d0b90e63d520f15d6afe217165d7f98c9c649654db81", size = 622519, upload-time = "2025-10-14T15:05:36.259Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/ce/d8acdc8de545de995c339be67711e474c77d643555a9bb74a9334252bd55/watchfiles-1.1.1-cp314-cp314-win32.whl", hash = "sha256:3fa0b59c92278b5a7800d3ee7733da9d096d4aabcfabb9a928918bd276ef9b9b", size = 272078, upload-time = "2025-10-14T15:05:37.63Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/c9/a74487f72d0451524be827e8edec251da0cc1fcf111646a511ae752e1a3d/watchfiles-1.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:c2047d0b6cea13b3316bdbafbfa0c4228ae593d995030fda39089d36e64fc03a", size = 287664, upload-time = "2025-10-14T15:05:38.95Z" },
+ { url = "https://files.pythonhosted.org/packages/df/b8/8ac000702cdd496cdce998c6f4ee0ca1f15977bba51bdf07d872ebdfc34c/watchfiles-1.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:842178b126593addc05acf6fce960d28bc5fae7afbaa2c6c1b3a7b9460e5be02", size = 277154, upload-time = "2025-10-14T15:05:39.954Z" },
+ { url = "https://files.pythonhosted.org/packages/47/a8/e3af2184707c29f0f14b1963c0aace6529f9d1b8582d5b99f31bbf42f59e/watchfiles-1.1.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:88863fbbc1a7312972f1c511f202eb30866370ebb8493aef2812b9ff28156a21", size = 403820, upload-time = "2025-10-14T15:05:40.932Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/ec/e47e307c2f4bd75f9f9e8afbe3876679b18e1bcec449beca132a1c5ffb2d/watchfiles-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:55c7475190662e202c08c6c0f4d9e345a29367438cf8e8037f3155e10a88d5a5", size = 390510, upload-time = "2025-10-14T15:05:41.945Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/a0/ad235642118090f66e7b2f18fd5c42082418404a79205cdfca50b6309c13/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f53fa183d53a1d7a8852277c92b967ae99c2d4dcee2bfacff8868e6e30b15f7", size = 448408, upload-time = "2025-10-14T15:05:43.385Z" },
+ { url = "https://files.pythonhosted.org/packages/df/85/97fa10fd5ff3332ae17e7e40e20784e419e28521549780869f1413742e9d/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6aae418a8b323732fa89721d86f39ec8f092fc2af67f4217a2b07fd3e93c6101", size = 458968, upload-time = "2025-10-14T15:05:44.404Z" },
+ { url = "https://files.pythonhosted.org/packages/47/c2/9059c2e8966ea5ce678166617a7f75ecba6164375f3b288e50a40dc6d489/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f096076119da54a6080e8920cbdaac3dbee667eb91dcc5e5b78840b87415bd44", size = 488096, upload-time = "2025-10-14T15:05:45.398Z" },
+ { url = "https://files.pythonhosted.org/packages/94/44/d90a9ec8ac309bc26db808a13e7bfc0e4e78b6fc051078a554e132e80160/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00485f441d183717038ed2e887a7c868154f216877653121068107b227a2f64c", size = 596040, upload-time = "2025-10-14T15:05:46.502Z" },
+ { url = "https://files.pythonhosted.org/packages/95/68/4e3479b20ca305cfc561db3ed207a8a1c745ee32bf24f2026a129d0ddb6e/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a55f3e9e493158d7bfdb60a1165035f1cf7d320914e7b7ea83fe22c6023b58fc", size = 473847, upload-time = "2025-10-14T15:05:47.484Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/55/2af26693fd15165c4ff7857e38330e1b61ab8c37d15dc79118cdba115b7a/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c91ed27800188c2ae96d16e3149f199d62f86c7af5f5f4d2c61a3ed8cd3666c", size = 455072, upload-time = "2025-10-14T15:05:48.928Z" },
+ { url = "https://files.pythonhosted.org/packages/66/1d/d0d200b10c9311ec25d2273f8aad8c3ef7cc7ea11808022501811208a750/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:311ff15a0bae3714ffb603e6ba6dbfba4065ab60865d15a6ec544133bdb21099", size = 629104, upload-time = "2025-10-14T15:05:49.908Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/bd/fa9bb053192491b3867ba07d2343d9f2252e00811567d30ae8d0f78136fe/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a916a2932da8f8ab582f242c065f5c81bed3462849ca79ee357dd9551b0e9b01", size = 622112, upload-time = "2025-10-14T15:05:50.941Z" },
+ { url = "https://files.pythonhosted.org/packages/d3/8e/e500f8b0b77be4ff753ac94dc06b33d8f0d839377fee1b78e8c8d8f031bf/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db476ab59b6765134de1d4fe96a1a9c96ddf091683599be0f26147ea1b2e4b88", size = 408250, upload-time = "2025-10-14T15:06:10.264Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/95/615e72cd27b85b61eec764a5ca51bd94d40b5adea5ff47567d9ebc4d275a/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336", size = 396117, upload-time = "2025-10-14T15:06:11.28Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/81/e7fe958ce8a7fb5c73cc9fb07f5aeaf755e6aa72498c57d760af760c91f8/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24", size = 450493, upload-time = "2025-10-14T15:06:12.321Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/d4/ed38dd3b1767193de971e694aa544356e63353c33a85d948166b5ff58b9e/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49", size = 457546, upload-time = "2025-10-14T15:06:13.372Z" },
+]
+
+[[package]]
+name = "websockets"
+version = "16.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/04/24/4b2031d72e840ce4c1ccb255f693b15c334757fc50023e4db9537080b8c4/websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5", size = 179346, upload-time = "2026-01-10T09:23:47.181Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f2/db/de907251b4ff46ae804ad0409809504153b3f30984daf82a1d84a9875830/websockets-16.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:31a52addea25187bde0797a97d6fc3d2f92b6f72a9370792d65a6e84615ac8a8", size = 177340, upload-time = "2026-01-10T09:22:34.539Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/fa/abe89019d8d8815c8781e90d697dec52523fb8ebe308bf11664e8de1877e/websockets-16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:417b28978cdccab24f46400586d128366313e8a96312e4b9362a4af504f3bbad", size = 175022, upload-time = "2026-01-10T09:22:36.332Z" },
+ { url = "https://files.pythonhosted.org/packages/58/5d/88ea17ed1ded2079358b40d31d48abe90a73c9e5819dbcde1606e991e2ad/websockets-16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af80d74d4edfa3cb9ed973a0a5ba2b2a549371f8a741e0800cb07becdd20f23d", size = 175319, upload-time = "2026-01-10T09:22:37.602Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/ae/0ee92b33087a33632f37a635e11e1d99d429d3d323329675a6022312aac2/websockets-16.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:08d7af67b64d29823fed316505a89b86705f2b7981c07848fb5e3ea3020c1abe", size = 184631, upload-time = "2026-01-10T09:22:38.789Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/c5/27178df583b6c5b31b29f526ba2da5e2f864ecc79c99dae630a85d68c304/websockets-16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be95cfb0a4dae143eaed2bcba8ac23f4892d8971311f1b06f3c6b78952ee70b", size = 185870, upload-time = "2026-01-10T09:22:39.893Z" },
+ { url = "https://files.pythonhosted.org/packages/87/05/536652aa84ddc1c018dbb7e2c4cbcd0db884580bf8e95aece7593fde526f/websockets-16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6297ce39ce5c2e6feb13c1a996a2ded3b6832155fcfc920265c76f24c7cceb5", size = 185361, upload-time = "2026-01-10T09:22:41.016Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/e2/d5332c90da12b1e01f06fb1b85c50cfc489783076547415bf9f0a659ec19/websockets-16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c1b30e4f497b0b354057f3467f56244c603a79c0d1dafce1d16c283c25f6e64", size = 184615, upload-time = "2026-01-10T09:22:42.442Z" },
+ { url = "https://files.pythonhosted.org/packages/77/fb/d3f9576691cae9253b51555f841bc6600bf0a983a461c79500ace5a5b364/websockets-16.0-cp311-cp311-win32.whl", hash = "sha256:5f451484aeb5cafee1ccf789b1b66f535409d038c56966d6101740c1614b86c6", size = 178246, upload-time = "2026-01-10T09:22:43.654Z" },
+ { url = "https://files.pythonhosted.org/packages/54/67/eaff76b3dbaf18dcddabc3b8c1dba50b483761cccff67793897945b37408/websockets-16.0-cp311-cp311-win_amd64.whl", hash = "sha256:8d7f0659570eefb578dacde98e24fb60af35350193e4f56e11190787bee77dac", size = 178684, upload-time = "2026-01-10T09:22:44.941Z" },
+ { url = "https://files.pythonhosted.org/packages/84/7b/bac442e6b96c9d25092695578dda82403c77936104b5682307bd4deb1ad4/websockets-16.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:71c989cbf3254fbd5e84d3bff31e4da39c43f884e64f2551d14bb3c186230f00", size = 177365, upload-time = "2026-01-10T09:22:46.787Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/fe/136ccece61bd690d9c1f715baaeefd953bb2360134de73519d5df19d29ca/websockets-16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b6e209ffee39ff1b6d0fa7bfef6de950c60dfb91b8fcead17da4ee539121a79", size = 175038, upload-time = "2026-01-10T09:22:47.999Z" },
+ { url = "https://files.pythonhosted.org/packages/40/1e/9771421ac2286eaab95b8575b0cb701ae3663abf8b5e1f64f1fd90d0a673/websockets-16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39", size = 175328, upload-time = "2026-01-10T09:22:49.809Z" },
+ { url = "https://files.pythonhosted.org/packages/18/29/71729b4671f21e1eaa5d6573031ab810ad2936c8175f03f97f3ff164c802/websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9b5aca38b67492ef518a8ab76851862488a478602229112c4b0d58d63a7a4d5c", size = 184915, upload-time = "2026-01-10T09:22:51.071Z" },
+ { url = "https://files.pythonhosted.org/packages/97/bb/21c36b7dbbafc85d2d480cd65df02a1dc93bf76d97147605a8e27ff9409d/websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f", size = 186152, upload-time = "2026-01-10T09:22:52.224Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/34/9bf8df0c0cf88fa7bfe36678dc7b02970c9a7d5e065a3099292db87b1be2/websockets-16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1", size = 185583, upload-time = "2026-01-10T09:22:53.443Z" },
+ { url = "https://files.pythonhosted.org/packages/47/88/4dd516068e1a3d6ab3c7c183288404cd424a9a02d585efbac226cb61ff2d/websockets-16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2", size = 184880, upload-time = "2026-01-10T09:22:55.033Z" },
+ { url = "https://files.pythonhosted.org/packages/91/d6/7d4553ad4bf1c0421e1ebd4b18de5d9098383b5caa1d937b63df8d04b565/websockets-16.0-cp312-cp312-win32.whl", hash = "sha256:eaded469f5e5b7294e2bdca0ab06becb6756ea86894a47806456089298813c89", size = 178261, upload-time = "2026-01-10T09:22:56.251Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/f0/f3a17365441ed1c27f850a80b2bc680a0fa9505d733fe152fdf5e98c1c0b/websockets-16.0-cp312-cp312-win_amd64.whl", hash = "sha256:5569417dc80977fc8c2d43a86f78e0a5a22fee17565d78621b6bb264a115d4ea", size = 178693, upload-time = "2026-01-10T09:22:57.478Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/9c/baa8456050d1c1b08dd0ec7346026668cbc6f145ab4e314d707bb845bf0d/websockets-16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:878b336ac47938b474c8f982ac2f7266a540adc3fa4ad74ae96fea9823a02cc9", size = 177364, upload-time = "2026-01-10T09:22:59.333Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/0c/8811fc53e9bcff68fe7de2bcbe75116a8d959ac699a3200f4847a8925210/websockets-16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52a0fec0e6c8d9a784c2c78276a48a2bdf099e4ccc2a4cad53b27718dbfd0230", size = 175039, upload-time = "2026-01-10T09:23:01.171Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/82/39a5f910cb99ec0b59e482971238c845af9220d3ab9fa76dd9162cda9d62/websockets-16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e6578ed5b6981005df1860a56e3617f14a6c307e6a71b4fff8c48fdc50f3ed2c", size = 175323, upload-time = "2026-01-10T09:23:02.341Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/28/0a25ee5342eb5d5f297d992a77e56892ecb65e7854c7898fb7d35e9b33bd/websockets-16.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95724e638f0f9c350bb1c2b0a7ad0e83d9cc0c9259f3ea94e40d7b02a2179ae5", size = 184975, upload-time = "2026-01-10T09:23:03.756Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/66/27ea52741752f5107c2e41fda05e8395a682a1e11c4e592a809a90c6a506/websockets-16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0204dc62a89dc9d50d682412c10b3542d748260d743500a85c13cd1ee4bde82", size = 186203, upload-time = "2026-01-10T09:23:05.01Z" },
+ { url = "https://files.pythonhosted.org/packages/37/e5/8e32857371406a757816a2b471939d51c463509be73fa538216ea52b792a/websockets-16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:52ac480f44d32970d66763115edea932f1c5b1312de36df06d6b219f6741eed8", size = 185653, upload-time = "2026-01-10T09:23:06.301Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/67/f926bac29882894669368dc73f4da900fcdf47955d0a0185d60103df5737/websockets-16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6e5a82b677f8f6f59e8dfc34ec06ca6b5b48bc4fcda346acd093694cc2c24d8f", size = 184920, upload-time = "2026-01-10T09:23:07.492Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/a1/3d6ccdcd125b0a42a311bcd15a7f705d688f73b2a22d8cf1c0875d35d34a/websockets-16.0-cp313-cp313-win32.whl", hash = "sha256:abf050a199613f64c886ea10f38b47770a65154dc37181bfaff70c160f45315a", size = 178255, upload-time = "2026-01-10T09:23:09.245Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/ae/90366304d7c2ce80f9b826096a9e9048b4bb760e44d3b873bb272cba696b/websockets-16.0-cp313-cp313-win_amd64.whl", hash = "sha256:3425ac5cf448801335d6fdc7ae1eb22072055417a96cc6b31b3861f455fbc156", size = 178689, upload-time = "2026-01-10T09:23:10.483Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/1d/e88022630271f5bd349ed82417136281931e558d628dd52c4d8621b4a0b2/websockets-16.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8cc451a50f2aee53042ac52d2d053d08bf89bcb31ae799cb4487587661c038a0", size = 177406, upload-time = "2026-01-10T09:23:12.178Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/78/e63be1bf0724eeb4616efb1ae1c9044f7c3953b7957799abb5915bffd38e/websockets-16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:daa3b6ff70a9241cf6c7fc9e949d41232d9d7d26fd3522b1ad2b4d62487e9904", size = 175085, upload-time = "2026-01-10T09:23:13.511Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/f4/d3c9220d818ee955ae390cf319a7c7a467beceb24f05ee7aaaa2414345ba/websockets-16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fd3cb4adb94a2a6e2b7c0d8d05cb94e6f1c81a0cf9dc2694fb65c7e8d94c42e4", size = 175328, upload-time = "2026-01-10T09:23:14.727Z" },
+ { url = "https://files.pythonhosted.org/packages/63/bc/d3e208028de777087e6fb2b122051a6ff7bbcca0d6df9d9c2bf1dd869ae9/websockets-16.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:781caf5e8eee67f663126490c2f96f40906594cb86b408a703630f95550a8c3e", size = 185044, upload-time = "2026-01-10T09:23:15.939Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/6e/9a0927ac24bd33a0a9af834d89e0abc7cfd8e13bed17a86407a66773cc0e/websockets-16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caab51a72c51973ca21fa8a18bd8165e1a0183f1ac7066a182ff27107b71e1a4", size = 186279, upload-time = "2026-01-10T09:23:17.148Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/ca/bf1c68440d7a868180e11be653c85959502efd3a709323230314fda6e0b3/websockets-16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19c4dc84098e523fd63711e563077d39e90ec6702aff4b5d9e344a60cb3c0cb1", size = 185711, upload-time = "2026-01-10T09:23:18.372Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/f8/fdc34643a989561f217bb477cbc47a3a07212cbda91c0e4389c43c296ebf/websockets-16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a5e18a238a2b2249c9a9235466b90e96ae4795672598a58772dd806edc7ac6d3", size = 184982, upload-time = "2026-01-10T09:23:19.652Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/d1/574fa27e233764dbac9c52730d63fcf2823b16f0856b3329fc6268d6ae4f/websockets-16.0-cp314-cp314-win32.whl", hash = "sha256:a069d734c4a043182729edd3e9f247c3b2a4035415a9172fd0f1b71658a320a8", size = 177915, upload-time = "2026-01-10T09:23:21.458Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/f1/ae6b937bf3126b5134ce1f482365fde31a357c784ac51852978768b5eff4/websockets-16.0-cp314-cp314-win_amd64.whl", hash = "sha256:c0ee0e63f23914732c6d7e0cce24915c48f3f1512ec1d079ed01fc629dab269d", size = 178381, upload-time = "2026-01-10T09:23:22.715Z" },
+ { url = "https://files.pythonhosted.org/packages/06/9b/f791d1db48403e1f0a27577a6beb37afae94254a8c6f08be4a23e4930bc0/websockets-16.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a35539cacc3febb22b8f4d4a99cc79b104226a756aa7400adc722e83b0d03244", size = 177737, upload-time = "2026-01-10T09:23:24.523Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/40/53ad02341fa33b3ce489023f635367a4ac98b73570102ad2cdd770dacc9a/websockets-16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b784ca5de850f4ce93ec85d3269d24d4c82f22b7212023c974c401d4980ebc5e", size = 175268, upload-time = "2026-01-10T09:23:25.781Z" },
+ { url = "https://files.pythonhosted.org/packages/74/9b/6158d4e459b984f949dcbbb0c5d270154c7618e11c01029b9bbd1bb4c4f9/websockets-16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:569d01a4e7fba956c5ae4fc988f0d4e187900f5497ce46339c996dbf24f17641", size = 175486, upload-time = "2026-01-10T09:23:27.033Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/2d/7583b30208b639c8090206f95073646c2c9ffd66f44df967981a64f849ad/websockets-16.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50f23cdd8343b984957e4077839841146f67a3d31ab0d00e6b824e74c5b2f6e8", size = 185331, upload-time = "2026-01-10T09:23:28.259Z" },
+ { url = "https://files.pythonhosted.org/packages/45/b0/cce3784eb519b7b5ad680d14b9673a31ab8dcb7aad8b64d81709d2430aa8/websockets-16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:152284a83a00c59b759697b7f9e9cddf4e3c7861dd0d964b472b70f78f89e80e", size = 186501, upload-time = "2026-01-10T09:23:29.449Z" },
+ { url = "https://files.pythonhosted.org/packages/19/60/b8ebe4c7e89fb5f6cdf080623c9d92789a53636950f7abacfc33fe2b3135/websockets-16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bc59589ab64b0022385f429b94697348a6a234e8ce22544e3681b2e9331b5944", size = 186062, upload-time = "2026-01-10T09:23:31.368Z" },
+ { url = "https://files.pythonhosted.org/packages/88/a8/a080593f89b0138b6cba1b28f8df5673b5506f72879322288b031337c0b8/websockets-16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32da954ffa2814258030e5a57bc73a3635463238e797c7375dc8091327434206", size = 185356, upload-time = "2026-01-10T09:23:32.627Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/b6/b9afed2afadddaf5ebb2afa801abf4b0868f42f8539bfe4b071b5266c9fe/websockets-16.0-cp314-cp314t-win32.whl", hash = "sha256:5a4b4cc550cb665dd8a47f868c8d04c8230f857363ad3c9caf7a0c3bf8c61ca6", size = 178085, upload-time = "2026-01-10T09:23:33.816Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/3e/28135a24e384493fa804216b79a6a6759a38cc4ff59118787b9fb693df93/websockets-16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b14dc141ed6d2dde437cddb216004bcac6a1df0935d79656387bd41632ba0bbd", size = 178531, upload-time = "2026-01-10T09:23:35.016Z" },
+ { url = "https://files.pythonhosted.org/packages/72/07/c98a68571dcf256e74f1f816b8cc5eae6eb2d3d5cfa44d37f801619d9166/websockets-16.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:349f83cd6c9a415428ee1005cadb5c2c56f4389bc06a9af16103c3bc3dcc8b7d", size = 174947, upload-time = "2026-01-10T09:23:36.166Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/52/93e166a81e0305b33fe416338be92ae863563fe7bce446b0f687b9df5aea/websockets-16.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:4a1aba3340a8dca8db6eb5a7986157f52eb9e436b74813764241981ca4888f03", size = 175260, upload-time = "2026-01-10T09:23:37.409Z" },
+ { url = "https://files.pythonhosted.org/packages/56/0c/2dbf513bafd24889d33de2ff0368190a0e69f37bcfa19009ef819fe4d507/websockets-16.0-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f4a32d1bd841d4bcbffdcb3d2ce50c09c3909fbead375ab28d0181af89fd04da", size = 176071, upload-time = "2026-01-10T09:23:39.158Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/8f/aea9c71cc92bf9b6cc0f7f70df8f0b420636b6c96ef4feee1e16f80f75dd/websockets-16.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0298d07ee155e2e9fda5be8a9042200dd2e3bb0b8a38482156576f863a9d457c", size = 176968, upload-time = "2026-01-10T09:23:41.031Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/3f/f70e03f40ffc9a30d817eef7da1be72ee4956ba8d7255c399a01b135902a/websockets-16.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a653aea902e0324b52f1613332ddf50b00c06fdaf7e92624fbf8c77c78fa5767", size = 178735, upload-time = "2026-01-10T09:23:42.259Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" },
+]
diff --git a/zasoby.csv b/zasoby.csv
index 1ba8d0f..96cf654 100644
--- a/zasoby.csv
+++ b/zasoby.csv
@@ -1,459 +1,461 @@
-id,title,place,tags
-45,"Jak stworzyć nowy wpis do bazy zasobów Hackerspace Trójmiasto?",unknown,[]
-20,"O kategorii: Baza Wiedzy Hackerspace'u",unknown,[]
-735,"STD17NF03L",unknown,[]
-734,"Szuflada z procesorami STM32","lab",['lab']
-732,"Eksplodujące pudełko HS3","cow-work","['cow-work', 'projects']"
-731,"STM32F723",unknown,[]
-730,"NUCLEO G431RB",unknown,[]
-729,"Nucleo Expansion Board Led Driver",unknown,[]
-728,"Nucleo Expansion Board MultiSensor",unknown,[]
-285,"Konsola do gier Sony PlayStation 2 Slim + kontroler Namco GunCon","cow-work",['cow-work']
-480,"Gitara elektryczna Blond TE-1 MN BB","audiolab",['audiolab']
-481,"Gitara elektryczna Blond STR-1H MN SFG","audiolab",['audiolab']
-479,"Guitalele Ever Play GT-WBK","audiolab",['audiolab']
-456,"Wzmacniacz gitarowy Roland Micro Cube","audiolab",['audiolab']
-530,"Discman SONY","audiolab",['audiolab']
-531,"Streamer LTO-4 HP M8609A","server-room",['server-room']
-376,"Drukarka 3D HEVO (Hypercube Evolution","lab","['lab', '3d-print']"
-699,"Gra Blood Bowl z przyległościami","cow-work","['cow-work', 'audiolab', 'boardgame', 'sticker-needed']"
-720,"Płytki ewaluacyjne STEVAL-VP318L1F +?","lab",['lab']
-702,"Wózek na tacki projektowe","lab",['lab']
-719,"Pudełko projektowe ""Fala za Falą""","lab","['lab', 'sticker-needed']"
-703,"Tacki projektowe","lab","['lab', 'sticker-needed']"
-414,"Tester kabli RJ45, RJ11/12, BNC Lanberg","lab",['lab']
-718,"Zestaw nitonakrętek alu+stal G02910","lab",['lab']
-717,"Gniazdo DC 5,5/2,5mm do druku - poziome","lab","['lab', 'electronics']"
-716,"Konektor FPC 8-pin","lab","['lab', 'electronics']"
-715,"Przełącznik DIP switch 2 tory","lab","['lab', 'electronics']"
-714,"Przełącznik DIP switch 4 tory","lab","['lab', 'electronics']"
-713,"Diody LED czerwone, błękitne","lab","['lab', 'electronics']"
-712,"Złącze śrubowe ARK 3-pinowe","lab","['lab', 'electronics']"
-711,"Złącze śrubowe ARK 2-pinowe","lab","['lab', 'electronics']"
-710,"Złącze śrubowe ARK 4-pinowe","lab","['lab', 'electronics']"
-709,"ESP-32","lab","['lab', 'electronics']"
-708,"Origami LED Matrix","server-room","['projects', 'server-room']"
-704,"Tranzystor PNP bipolarny 50V","lab","['lab', 'electronics']"
-705,"Tranzystor NPN bipolarny 45V","lab","['lab', 'electronics']"
-707,"Przycisk monostabilny - tact switch","lab","['lab', 'electronics']"
-706,"Tranzystor T482 BVBR11","lab","['lab', 'electronics']"
-561,"Antena Dipol na 30m","lab",['lab']
-701,"Celestia - edukacyjna ściana nocnego nieba","server-room","['projects', 'server-room']"
-538,"Interfejs audio Line6 GX","audiolab",['audiolab']
-388,"Zasilacz 16A, 12V dc","lab",['lab']
-700,"Drukarka 3D Creality Ender do samodzielnego złożenia","lab","['lab', 'sticker-needed']"
-377,"Drukarka 3D “Elegoo Neptune 4 Pro”","lab","['lab', '3d-print']"
-514,"Pistolet do kleju na gorąco","lab",['lab']
-698,"Disco betoniarka","garage","['garage', 'projects', 'sticker-needed']"
-179,"Sprzęt komp Desktop Dr Robotomy","cow-work",['cow-work']
-585,"Ścianka narzędziowa","lab",['lab']
-584,"Stojak ze śrubokrętami","lab",['lab']
-583,"Pudełko z zapalniczkami","lab",['lab']
-582,"Konwerter ATC-1000 firmy F&F","lab",['lab']
-581,"Pojemnik z konektorami","lab",['lab']
-580,"Pudło - rurki / koszulki termokurczliwe, różne rodzaje","lab",['lab']
-579,"Uchwyt na kolbę gorącego powietrza (hot-air) z magnetycznym stolikiem naprawczym W.E.R 628","lab",['lab']
-578,"Myjka ultradźwiękowa 2","lab",['lab']
-577,"Żywiczna drukarka 3D Elegoo Mars 2 Pro","lab","['lab', '3d-print']"
-576,"Pudło z filamentami kolorowymi krótkimi","lab","['lab', '3d-print']"
-529,"Projektor Optoma","cow-work",['cow-work']
-527,"Stacja dokująca USB-C + ładowarka bezprzewodowa","cow-work",['cow-work']
-575,"Pudło z materiałami do drukarek 3D","lab",['lab']
-574,"Laminator biurowy Leitz iLAM Office Pro A3","lab",['lab']
-573,"Deska do krojenia, bambus, 53x46 cm","lab",['lab']
-572,"Farba Akrylowa Greenish","lab",['lab']
-571,"Smartphone Nexus LG","lab",['lab']
-570,"Smartphone Google","lab",['lab']
-569,"Smartphone Samsung","lab",['lab']
-568,"Redmi smartphone","lab",['lab']
-567,"iPhone","lab",['lab']
-566,"Materiały do plotera (winyl i inne) + krepa","lab",['lab']
-565,"Antena bazowa HamRadioShop 10 cm","lab",['lab']
-564,"LORA / Meshtastic","lab",['lab']
-563,"Przełącznik antenowy na 4 anteny KF ze sterownikiem","lab",['lab']
-562,"DREMEL 3000","lab",['lab']
-560,"Przełącznik antenowy z kontrolerem",unknown,[]
-304,"Monitor LG StudioWorks 560N","cow-work",['cow-work']
-554,"ArcaderOS - Śmieciowy Arcade Charytatywny dla każdego","cow-work",['cow-work']
-283,"Telewizor Funai","cow-work",['cow-work']
-478,"Gitara basowa Squier Precision Bass","audiolab",['audiolab']
-533,"Access Point Mikrotik cAP ac",unknown,[]
-546,"Kwadraty ze sklejki w drewnianych pudełkach",unknown,[]
-545,"LEGO piedestał z figurkami i jednorożcem","cow-work",['cow-work']
-541,"HAM QRP Szpej",unknown,[]
-543,"PKL, RF7, kable koncentryczne KF",unknown,[]
-542,"Antena Uda-Yagi 2m i 70 cm",unknown,[]
-370,"Infiniti mirror - części, pudło","lab",['lab']
-540,"Icom 706-mk2",unknown,[]
-537,"Płyta główna GIGABYTE GA-790XT-USB3","cow-work",['cow-work']
-536,"Płyta główna ECS L7VMM3","cow-work",['cow-work']
-535,"Płyta główna EPoX EP-8K9A7I","cow-work",['cow-work']
-92,"Drukarka 3D Creality K1 Max","lab","['lab', 'tools', '3d-print']"
-454,"Perkusja Alesis DM8","cow-work","['cow-work', 'audiolab']"
-273,"Drukarka Samsung ML-3710ND","cow-work",['cow-work']
-476,"Wieża TECHNICS EH550 - kolumny głośnikowe","audiolab",['audiolab']
-286,"Magnetowid VHS Philips VR 471","cow-work",['cow-work']
-482,"Magnetofon kasetowy Technics RS-B765","audiolab",['audiolab']
-317,"Sound Technology 1700B Distortion Measurement System","cow-work",['cow-work']
-311,"Hung Chang Oscilloscope 5504 40MHz","cow-work",['cow-work']
-279,"Komputer Apple Macintosh SE","cow-work",['cow-work']
-292,"Wieża TECHNICS EH550 - Stereo sound processor SH-EH550","cow-work",['cow-work']
-293,"Wieża TECHNICS EH550 - Stereo cassette deck RS-EH750","cow-work",['cow-work']
-294,"Wieża TECHNICS EH550 - Compact disc player SL-EH750","cow-work",['cow-work']
-291,"Wieża TECHNICS EH550 - Stereo tuner amplifier SA-EH550","cow-work",['cow-work']
-532,"Telefon komórkowy Compas CTKE08",unknown,[]
-357,"Radio samochodowe Alpine","audiolab",['audiolab']
-519,"Statyw Keyboard","cow-work","['cow-work', 'audiolab']"
-352,"Przejściówki USB-A => Power Jack","cow-work",['cow-work']
-451,"Maty lutownicze","cow-work","['cow-work', 'lab']"
-490,"Radiomagnetofon przenośny Panasonic RQ-V77","audiolab",['audiolab']
-312,"Szufladka ""Zestawy adapterów końcówek do zasilacza laptopa"" / końcówki do zasilania","cow-work",['cow-work']
-526,"Monitory",unknown,[]
-528,"Stacja dokująca USB-C z wbudowaną klawiaturą Unitek",unknown,[]
-61,"HS3 BOFH","cow-work","['cow-work', 'garage', 'events', 'bofh']"
-493,"Wkrętarka Niteo Tools","lab",['lab']
-494,"Quad Power Supply Cobrabid KB-60-01","audiolab",['audiolab']
-495,"Lenco PA-45 Portable Sound System with Bluetooth","audiolab",['audiolab']
-496,"Głośnik gitarowy DIY","audiolab",['audiolab']
-498,"Wiertarka udarowa | Bosch Professional GSB 16 RE","lab",['lab']
-497,"Drukarka DYMO Omega S0717930","lab",['lab']
-499,"Pudło ""wiercimy, wkręcamy i różne inne""","lab",['lab']
-500,"Pudło z chemią","lab",['lab']
-503,"Lutownica TS 80","lab",['lab']
-507,"ZD-939L stacja na gorące powietrze HOT-AIR","lab",['lab']
-513,"Urządzenie do wywoływania klisz polimerowych KENT Belichtungsgerät BG 250","lab",['lab']
-501,"Switch Planet FSD-803","audiolab",['audiolab']
-502,"Switch ES-3208P","audiolab",['audiolab']
-504,"Access Point TP-Link","audiolab",['audiolab']
-505,"Mikrofon T-Bone SC-300","audiolab",['audiolab']
-506,"Uchwyty biurkowe do mikrofonu/kamery","audiolab",['audiolab']
-508,"Bongosy","audiolab",['audiolab']
-509,"Dalekopis Lorenz LO133 Automatik","audiolab",['audiolab']
-515,"Zegar mA","lab",['lab']
-510,"Soundbar Dell AX510","audiolab",['audiolab']
-511,"Głośniki komputerowe Creative Inspire T3100","audiolab",['audiolab']
-516,"Głośnik CUBE","lab",['lab']
-512,"Pegasus & Co","audiolab",['audiolab']
-517,"Rozlutownica","lab",['lab']
-518,"Wałek giętki do wiertarki Dremel","lab",['lab']
-520,"Uchwyt do telewizora / monitora","cow-work",['cow-work']
-521,"Terminal MOTOROLA MC9062 (1 szt) i MC9060 (3 szt)","cow-work",['cow-work']
-522,"HUB 10Mb Hewlett Packard J3188A","cow-work",['cow-work']
-489,"Aparat fotograficzny Agat 18K","audiolab",['audiolab']
-488,"Aparat fotograficzny Nikon Coolpix L26","audiolab",['audiolab']
-487,"Aparat fotograficzny Hitachi HDC-761E","audiolab",['audiolab']
-486,"Aparat fotograficzny Konica Minolta","audiolab",['audiolab']
-485,"Odtwarzacz przenośny Philips","audiolab",['audiolab']
-484,"Komputer AiO POS CHD8700","audiolab",['audiolab']
-483,"Tuner Technics ST-600L","audiolab",['audiolab']
-491,"Odkurzacz Zelmer","lab",['lab']
-492,"Poziomica 1,50m","lab",['lab']
-455,"Wzmacniacz gitarowy Peavey Rage 258","audiolab",['audiolab']
-458,"Słuchawki Creative Aurvana Live!","audiolab",['audiolab']
-459,"Słuchawki Sennheiser HD25","audiolab",['audiolab']
-460,"Mikrofon Grundig GDM 312","audiolab",['audiolab']
-461,"Looper Ditto TC Electronic","audiolab",['audiolab']
-462,"Mikser Behringer MX400 Micromix","audiolab",['audiolab']
-463,"Korg Volca Keys","audiolab",['audiolab']
-464,"Korg Volca Sample","audiolab",['audiolab']
-465,"Korg Volca Mix","audiolab",['audiolab']
-466,"Korg Volca Bass","audiolab",['audiolab']
-467,"Korg Volca Modular","audiolab",['audiolab']
-468,"Yamaha DD-10 Drum Machine","audiolab",['audiolab']
-477,"Wzmacniacz zintegrowany Technics SU-810","audiolab",['audiolab']
-470,"Mikrofon Rode NT1-A","audiolab",['audiolab']
-473,"Obudowa komputerowa Chieftec Tower of BBL (but SMOL)","audiolab",['audiolab']
-447,"Aerograf PS-22 Verke","lab",['lab']
-475,"Głośniki LG CMS4340F","audiolab",['audiolab']
-474,"Wzmacniacz DIY 12V DC","audiolab",['audiolab']
-472,"Obudowa komputerowa Chieftec Tower of BBL","audiolab",['audiolab']
-471,"Głośniki DIY d33p w00f","audiolab",['audiolab']
-469,"A8 Wireless Sound Transmitter/Receiver","audiolab",['audiolab']
-453,"Klawiatury laptopowe","cow-work",['cow-work']
-452,"Klawiatury","cow-work",['cow-work']
-417,"Kable Audio Jack-Jack Mono","audiolab",['audiolab']
-449,"Omnifixo","cow-work","['cow-work', 'lab']"
-448,"Joystick Thrustmaster T.16000M","cow-work",['cow-work']
-206,"Club* Mate","cow-work",['cow-work']
-450,"Lutownica T12 + groty","cow-work","['cow-work', 'lab']"
-441,"Podnośnik samochodowe 2,5 ton","garage","['garage', 'tools']"
-443,"Odciąg trocin/wiórów Cormak","garage",['garage']
-439,"Mikro regały. W70xD50xH55","garage",['garage']
-405,"Home Automation Switches","cow-work","['cow-work', 'lab', 'server-room']"
-431,"Audio Mixer XENYX 302USB","cow-work",['cow-work']
-430,"Głośniki Loewe L82 A","audiolab",['audiolab']
-429,"Komputer Sun Ultra 45 Workstation 500s XVR2500 ULTRAsparc IIIi","audiolab",['audiolab']
-428,"Hodowla gryzoni (myszki et al.)","cow-work",['cow-work']
-426,"Karton ""Drukarka paragonowa + etykietki""","cow-work",['cow-work']
-415,"Multimetr, oscyloskop, generator sygnałów JT-OMS01","lab",['lab']
-375,"Termostaty","cow-work","['cow-work', 'lab', 'audiolab', 'server-room']"
-432,"Rode Wireless GO II",unknown,[]
-435,"Capture Card/Passthrough (black)",unknown,[]
-434,"Capture Card (gray)",unknown,[]
-438,"Rode Lav Mic",unknown,[]
-437,"MACROSILICON usb extscreen",unknown,[]
-436,"HDMI Extender",unknown,[]
-433,"1->4 HDMI Splitter",unknown,[]
-149,"LEDon Pink pussy","cow-work",['cow-work']
-151,"LEDon Bulb","cow-work",['cow-work']
-148,"LEDon HS3","cow-work",['cow-work']
-147,"LEDon Classy Lady","cow-work",['cow-work']
-418,"Karton ""Artykuły higieniczne""","cow-work",['cow-work']
-419,"Karton ""Akces(er)oria lutowanie""","cow-work",['cow-work']
-421,"Karton ""HS3 Narzędzia Warsztatowe""","cow-work",['cow-work']
-422,"Karton ""Taśmy samoprzylepne""","cow-work",['cow-work']
-423,"Karton ""Przedłużacze 230V""","cow-work",['cow-work']
-424,"Rzepowisko","cow-work",['cow-work']
-427,"Głośniki Creative GigaWorks T20 MultiMedia Speaker 28W MF1545","audiolab",['audiolab']
-425,"Repeater Zigbee Cow-work","cow-work",['cow-work']
-420,"Karton ""Bags""","cow-work",['cow-work']
-208,"Komputer Nixdorf XT ""All-in-One Portable""","cow-work",['cow-work']
-47,"Cricut Maker 3 ploter tnący","lab","['lab', 'tools']"
-411,"Stacja W.E.R 852D+ do prac z smd","lab",['lab']
-416,"Switch zarządzalny MikroTik CRS309-1G-8S+IN 1x1GbE 8x10GbE SFP+ RS232 PoE","server-room",['server-room']
-413,"Zasilacz regulowany","lab",['lab']
-412,"Stacja lutownicza 937D","lab",['lab']
-410,"Stacja lutownicza LF-1660SD","lab",['lab']
-409,"Stacja do rozlutowywania DS-915","lab",['lab']
-197,"Sprzęt komp laptop Oden-dono","cow-work",['cow-work']
-189,"Sprzęt komp laptop Udon-san","cow-work",['cow-work']
-200,"Sprzęt komp laptop Bogumił","cow-work",['cow-work']
-202,"Sprzęt komp laptop Amilo","cow-work",['cow-work']
-193,"Sprzęt komp laptop Victoria","cow-work",['cow-work']
-188,"Sprzęt komp laptop mały Jaś","cow-work",['cow-work']
-199,"Sprzęt komp laptop Robin","cow-work",['cow-work']
-407,"Mikser audio Phonic MM2005","cow-work","['cow-work', 'audiolab']"
-401,"Telewizor LG 37LK450-ZH","cow-work",['cow-work']
-404,"Kamera USB Savio CAK-02","cow-work",['cow-work']
-397,"Telewizor NEC E658","cow-work",['cow-work']
-406,"Klawiatura sterująca MIDI/USB AKAI MPK 61","cow-work","['cow-work', 'audiolab']"
-398,"Telewizor Samsung LE37C530","cow-work",['cow-work']
-403,"Domofon Hikvision","cow-work",['cow-work']
-400,"Chromecast 2 NC2-6A5","cow-work",['cow-work']
-399,"Klawiatura MIDI Arturia Keystep","cow-work","['cow-work', 'audiolab']"
-395,"Przyssawka do powierzchni płaskich","lab",['lab']
-394,"Rozlutownica bez regulacji temperatury","lab",['lab']
-393,"Lutownica Solomon","lab",['lab']
-392,"Myjka Ultradźwiękowa","lab",['lab']
-391,"Kamera statyw zestaw do pracy z płytkami PCB","lab",['lab']
-390,"Wyciąg stanowiska do lutowania","lab",['lab']
-384,"Pojemnik FOTO","cow-work",['cow-work']
-389,"Karton z częściami SMD","lab",['lab']
-387,"Klucze płaskooczkowe","lab",['lab']
-386,"Suwmiarka","lab",['lab']
-385,"Wiertarka Cemi statyw imadło","lab",['lab']
-383,"Obudowa robota sprzątającego","lab",['lab']
-382,"Drukarka 3D Photon żywiczna","lab",['lab']
-381,"Wiertarka statyw Dremel","lab",['lab']
-354,"Czujnik temperatury i wilgotności","lab",['lab']
-374,"Hot Plate","lab",['lab']
-379,"Drukarka 3D Creality K1MAX","lab",['lab']
-257,"Gra L game","cow-work",['cow-work']
-372,"Skrzynia skarbów","lab",['lab']
-378,"Nitownica do nitonakrętek","lab",['lab']
-380,"Mikroskop Eduko","lab",['lab']
-356,"Karton ""termostaty""","cow-work",['cow-work']
-358,"Karton ""wSchody""","cow-work",['cow-work']
-359,"Karton ""materiały plastyczne""","cow-work",['cow-work']
-360,"Pojemnik ""złącza, taśmy, słupki""","lab",['lab']
-361,"Karton Zigbee","cow-work",['cow-work']
-362,"Karton ""electro""","cow-work",['cow-work']
-363,"Instalacja Lasy Oliwskie","cow-work",['cow-work']
-371,"Uchwyt do płytek PCB","lab",['lab']
-364,"Karton Led String Light","cow-work",['cow-work']
-368,"Zgrzewarka do ogniw","lab",['lab']
-369,"Lutownica gazowa","lab",['lab']
-373,"OPSIS","lab",['lab']
-367,"Przejściówki USB-C => B, micro B, mini B, micro B 3, Lightning","cow-work",['cow-work']
-365,"Karton ""USB""","cow-work",['cow-work']
-366,"Karton ""Polish C Power""","cow-work",['cow-work']
-355,"Zasilacz regulowany USB-C Power Delivery Zasilacz 100W 5V/9V/12V/15V/20V","cow-work",['cow-work']
-351,"Przejściówki USB-C => Power Jack","cow-work",['cow-work']
-353,"Przejściówka Power Jack => USB-C","cow-work",['cow-work']
-350,"Body Fat Scale","lab",['lab']
-349,"DVD Video ""Monty Python: A teraz coś z zupełnie innej beczki""","cow-work",['cow-work']
-348,"14 in 1 Educational Solar Robot","lab",['lab']
-347,"Gra wideo ""PS3 Ridge Racer 7""","cow-work","['cow-work', 'video-game']"
-346,"Cyberdeck Ijona","cow-work",['cow-work']
-345,"Gra wideo ""PS3 Uncharted: Drake's Fortune DE""","cow-work","['cow-work', 'video-game']"
-344,"Szafka ze sprzętem telekomunikacyjnym","cow-work",['cow-work']
-340,"Kartón z wkrętami, kołkami i pudelkami","lab",['lab']
-343,"Gra wideo ""PS3 Colin McRae: Dirt 2""","cow-work","['cow-work', 'video-game']"
-341,"Gra wideo ""PS3 Ratchet & Clank Quest for Booty""","cow-work","['cow-work', 'video-game']"
-342,"Odtwarzacz Linn Sekrit DS-I + kolumny","cow-work",['cow-work']
-339,"Gra wideo ""Need for Speed: Most Wanted""","cow-work","['cow-work', 'video-game']"
-338,"Gra wideo ""Commandos 3: Kierunek Berlin""","cow-work","['cow-work', 'video-game']"
-337,"Gra wideo ""Heroes of Might and Magic V: Kuźnia Przeznaczenia""","cow-work","['cow-work', 'video-game']"
-336,"Puzzle Ptaki 500 - Politechnika Gdańska","cow-work","['cow-work', 'boardgame']"
-335,"Wiertarka PSR 1440 LI-2 + AL 1880 CV BOSCH","lab","['lab', 'tools']"
-334,"5-Port Fast Ethernet Switch Edimax 10/100Mbps","cow-work",['cow-work']
-333,"Karton ""ZASILACZE LAPTOP""","cow-work",['cow-work']
-332,"Karton ""URZĄDZENIA SIECIOWE LAN""","cow-work",['cow-work']
-331,"Karton ""VR""","cow-work",['cow-work']
-330,"Karton ""RADIO""","cow-work",['cow-work']
-326,"Lampa z lupą","lab",['lab']
-328,"Lampa z lupą niesprawna","lab",['lab']
-329,"Karton ""RÓŻNE MAŁE ZASILACZE""","cow-work",['cow-work']
-327,"Karton ""PRZEWODY ZASILAJACE""","cow-work",['cow-work']
-325,"Karton ""PRZEWODY <1MM2""","cow-work",['cow-work']
-324,"Karton ""AUDIO PRO""","cow-work",['cow-work']
-323,"Karton ""VIDEO""","cow-work",['cow-work']
-322,"Karton ""AUDIO JABRA""","cow-work",['cow-work']
-321,"Karton ""HDMI""","cow-work",['cow-work']
-320,"Karton ""RETRO AV SCART ET AL""","cow-work",['cow-work']
-319,"Karton ""LAN przewody""","cow-work",['cow-work']
-318,"Gra zręcznościowa “Wooden Blocks""","cow-work","['cow-work', 'boardgame']"
-316,"Wavetek Universal Antenna Coupler WWG MMS-4107S","cow-work",['cow-work']
-287,"Gra wideo “PC Warcraft II: Tides of Darkness”","cow-work","['cow-work', 'video-game']"
-289,"Gra wideo ""PC Fallout 1""","cow-work","['cow-work', 'video-game']"
-297,"Naklejki ""własność prywatna""","cow-work",['cow-work']
-299,"Gra Koci Cymbergaj","cow-work",['cow-work']
-300,"Multifunction Printer Canon MG3150","cow-work",['cow-work']
-302,"Skaner Plustek OpticPro ST24","cow-work",['cow-work']
-305,"Voltage, Distortion, and Noise Meter VN-1687 Unitra Elmasz","cow-work",['cow-work']
-306,"WANPTEK Programmable DC Power Supply","cow-work",['cow-work']
-307,"Oscyloskop Hantek 6022BE","cow-work",['cow-work']
-309,"Type SMG-1 Stereo Generator Radiometer Copenhagen","cow-work",['cow-work']
-313,"Karton ""Słuchawki""","cow-work",['cow-work']
-301,"Karton ""ARTYKUŁY BIUROWE""","cow-work",['cow-work']
-314,"PINTEK 20MHz oscilloscope PS-200","cow-work",['cow-work']
-315,"PAL-B System?","cow-work",['cow-work']
-296,"HUBy USB-C","cow-work",['cow-work']
-144,"Venus","cow-work",['cow-work']
-52,"Evil Submarine","cow-work","['cow-work', 'projects']"
-295,"Dmuchawa do elektroniki Appio","cow-work",['cow-work']
-288,"Gra wideo ""Warcraft II: Battle.net Edition""","cow-work","['cow-work', 'video-game']"
-290,"Projektor Barco F22 SX+ Ultra Wide VizSim","cow-work",['cow-work']
-284,"Robotarm SVI-2000 QuickShot","cow-work",['cow-work']
-282,"Komputer ZX Spectrum +2","cow-work",['cow-work']
-281,"Gra wideo “PC Mortyr 2093-1944”","cow-work","['cow-work', 'video-game']"
-280,"Komputer Commodore C=64","cow-work",['cow-work']
-278,"Philips PM5415TX color TV Pattern Generator","cow-work",['cow-work']
-277,"Joystick QuickShot II Turbo","cow-work",['cow-work']
-276,"Gra wideo “PC Dragon Dice”","cow-work","['cow-work', 'video-game']"
-275,"Joystick Quickshot","cow-work",['cow-work']
-274,"Komputer Spectravideo SVI–738","cow-work",['cow-work']
-272,"Gra wideo “PC Man Of War”","cow-work","['cow-work', 'video-game']"
-271,"Gra wideo “PC Warcraft: Orcs & Humans”","cow-work","['cow-work', 'video-game']"
-270,"Gra wideo “Nowy Teenagent”","cow-work","['cow-work', 'video-game']"
-269,"Gra wideo ""PC Requiem: Avenging Angel""","cow-work","['cow-work', 'video-game']"
-268,"Gra wideo “PC CLASH”","cow-work","['cow-work', 'video-game']"
-267,"Gra wideo ""PC Baldur’s Gate: Opowieści z Wybrzeża Mieczy""","cow-work","['cow-work', 'video-game']"
-266,"Gra wideo “PC Fallout 2 - A Post Nuclear Role Playing Game”","cow-work","['cow-work', 'video-game']"
-265,"Gra wideo “PC Might & Magic: Heroes VI - Pirates of the Savage Sea”","cow-work","['cow-work', 'video-game']"
-264,"Gra wideo “PC Konung: Legenda Północy”","cow-work","['cow-work', 'video-game']"
-263,"Gra wideo “PC End of Twilight: Zaginiona tarcza wikinga”","cow-work","['cow-work', 'video-game']"
-262,"Gra wideo “Alien Nations”","cow-work","['cow-work', 'video-game']"
-261,"Gra wideo “PC Tony Hawk's Underground 2”","cow-work","['cow-work', 'video-game']"
-259,"Gra wideo ""PC Kroniki czarnego księżyca""","cow-work","['cow-work', 'video-game']"
-260,"Gra wideo ""PC ony Hawk's Pro Skater 3""","cow-work","['cow-work', 'video-game']"
-256,"Gra wideo “PC Full Spectrum Warrior”","cow-work","['cow-work', 'video-game']"
-258,"Gra wideo ""PC Invictus: W Cieniu Olimpu""","cow-work","['cow-work', 'video-game']"
-236,"Gra planszowa ""Carcassonne. Gra o zamkach, miastach i rycerzach.”","cow-work","['cow-work', 'boardgame']"
-237,"Gra zręcznościowa ""Wieża""","cow-work","['cow-work', 'boardgame']"
-238,"Gra planszowa ""Postaw na klocka""","cow-work","['cow-work', 'boardgame']"
-239,"Gra planszowa “Tajniacy”","cow-work","['cow-work', 'boardgame']"
-240,"Gra planszowa “Story Cubes: Podróże”","cow-work","['cow-work', 'boardgame']"
-253,"Gra wideo ""PS2 Charlie and the Chocolate Factory""","cow-work","['cow-work', 'video-game']"
-254,"Gra wideo “ The Chronicles of Narnia: The Lion, The Witch and The Wardrobe”","cow-work","['cow-work', 'video-game']"
-255,"Gra wideo “PS2 Conflict: Vietnam”","cow-work","['cow-work', 'video-game']"
-248,"Komputer Amstrad 128k Colour Personal Computer","cow-work",['cow-work']
-249,"Zasilacz laboratoryjny Zhaoxin","cow-work","['cow-work', 'tools']"
-250,"Gra karciana ""Monty Python and the Holy Grail CCG Booster Pack""","cow-work","['cow-work', 'boardgame']"
-252,"Konsola do gier Doom.txt","cow-work",['cow-work']
-251,"Konsola do gier DoomGirl","cow-work","['cow-work', 'video-game']"
-212,"SUN Keyboard & Mouse Collection","cow-work",['cow-work']
-243,"Gra karciana ""List Miłosny""","cow-work","['cow-work', 'boardgame']"
-242,"Dodatek do gry “ KeyForge: Zew Archontów - Talia Archonta”","cow-work","['cow-work', 'boardgame']"
-241,"Gra planszowa “Developer Dilemmas”","cow-work","['cow-work', 'boardgame']"
-244,"Osciloscope OS-352 ZUE Unitem","cow-work",['cow-work']
-245,"Dodatek do gry “KeyForge: Czas Wstąpienia - Talia Archonta”","cow-work","['cow-work', 'boardgame']"
-246,"Gra planszowa “Dobble: collector”","cow-work","['cow-work', 'boardgame']"
-247,"Gra planszowa “Cytadela”","cow-work","['cow-work', 'boardgame']"
-91,"Drukarka 3D Creality Ender 3","lab","['lab', 'tools', '3d-print']"
-139,"Drukarka Brother PT-E550WSP","lab",['lab']
-222,"Gra planszowa “Spiskowcy""","cow-work","['cow-work', 'boardgame']"
-232,"Gra planszowa “Takie Życie - Ciekawostki""","cow-work","['cow-work', 'boardgame']"
-234,"Gra planszowa ""Załoga: Wyprawa w głębiny""","cow-work","['cow-work', 'boardgame']"
-235,"Gra planszowa ""Decrypto""","cow-work","['cow-work', 'boardgame']"
-233,"Blinkenkrate","cow-work","['cow-work', 'projects']"
-231,"Mecanorma 9,99999MHz","cow-work",['cow-work']
-230,"SECAM/PAL TV Pattern Generator Type K944","cow-work",['cow-work']
-229,"TRIO 15MHz Oscilloscope CS-1560A","cow-work",['cow-work']
-228,"Monitor Trinitron","cow-work",['cow-work']
-227,"Oscyloskop ST-315A II KABID Radiotechnika","cow-work",['cow-work']
-226,"Grundig AM/FM Generator AS4","cow-work",['cow-work']
-225,"Mera tronik Digital Voltmeter Type V530","cow-work",['cow-work']
-224,"Hewlett Packard 8640A Signal Generator","cow-work",['cow-work']
-223,"Sprzęt komp all-in-one krągły iMac *inander","cow-work",['cow-work']
-221,"Monitor Amstrad CTM644","cow-work",['cow-work']
-220,"UNITRA Unima Digital Multimeter 1331","cow-work",['cow-work']
-219,"Leader LVS-5851 A PAL Vectorscope","cow-work",['cow-work']
-218,"Zopan Signal Generator KZ 1623","cow-work",['cow-work']
-217,"UNITRA Elmasz Miernik nierównomierności ND-1481","cow-work",['cow-work']
-216,"SUN CD-ROM Caddy Loaded","cow-work",['cow-work']
-215,"Xbox 360 Plain","cow-work",['cow-work']
-214,"Xbox 360 Chrome","cow-work",['cow-work']
-213,"Xbox 360 Toothless","cow-work",['cow-work']
-211,"SUN Ultra 5 Bottom","cow-work",['cow-work']
-210,"SUN Ultra 5 Top","cow-work",['cow-work']
-209,"SUN Sparkstation 20","cow-work",['cow-work']
-203,"Multimetr TL-4",unknown,[]
-156,"Drabinka","cow-work",['cow-work']
-155,"Flipchart","cow-work",['cow-work']
-166,"Gra planszowa Oriflamme","cow-work","['cow-work', 'boardgame']"
-168,"Gra planszowa ""To ja go tnę""","cow-work","['cow-work', 'boardgame']"
-152,"Gra planszowa Dreadful Circus","cow-work","['cow-work', 'boardgame']"
-160,"Gra planszowa ""Mage Knight Dugeons""","cow-work","['cow-work', 'boardgame']"
-169,"Gra planszowa Mix Tura","cow-work","['cow-work', 'boardgame']"
-171,"Gra karciana UNO","cow-work",['cow-work']
-140,"Kamizelka projektu 'Człowiek'","cow-work",['cow-work']
-167,"Sprzęt komp Monitor Samson","cow-work",['cow-work']
-165,"Sprzęt komp Monitor mały Dellton","cow-work",['cow-work']
-163,"Sprzęt komp all-in-one krągły iMaciej","cow-work",['cow-work']
-162,"Sprzęt komp monitor Dellton","cow-work",['cow-work']
-161,"Sprzęt komp All-in-one Asuseł","cow-work",['cow-work']
-159,"Sprzęt komp monitor Optimus Prime","cow-work",['cow-work']
-158,"Sprzęt komp monitor Hehe Prince","cow-work",['cow-work']
-157,"Sprzęt komp All-in-one Lenovaldek","cow-work",['cow-work']
-154,"Sprzęt komp All-in-one Bazzite","cow-work",['cow-work']
-143,"Von Count","cow-work",['cow-work']
-142,"Kaktus","cow-work",['cow-work']
-141,"Tramwajomat","cow-work",['cow-work']
-170,"Sprzęt komp Desktop FrankenSUN","cow-work",['cow-work']
-172,"Sprzęt komp Desktop Bandzior","cow-work",['cow-work']
-173,"Sprzęt komp Desktop GOOD BOY","cow-work",['cow-work']
-174,"Sprzęt komp Desktop Unbreak My Heart","cow-work",['cow-work']
-175,"Sprzęt komp Desktop Mucha w Zupie","cow-work",['cow-work']
-178,"Sprzęt komp Desktop Roxanne","cow-work",['cow-work']
-180,"Sprzęt komp Desktop Wronisław","cow-work",['cow-work']
-194,"Sprzęt komp laptop Wonder Boy","cow-work",['cow-work']
-204,"Sprzęt komp laptop Lego Dell","cow-work",['cow-work']
-181,"Klimatyzator","cow-work",['cow-work']
-205,"Sprzęt komp laptop HackLab-0x01","cow-work",['cow-work']
-185,"Dekadowy Generator RC PW-9","cow-work",['cow-work']
-186,"Sprzęt komp laptop Vojtěch","cow-work",['cow-work']
-187,"PMZ-12 Automatic Distortion Meter","cow-work",['cow-work']
-190,"Dekadowy Generator RC PW-9 NATIONAL","cow-work",['cow-work']
-191,"Dekadowy Generator RC PW-9 TK2","cow-work",['cow-work']
-192,"Generator RC PO-20","cow-work",['cow-work']
-195,"Miernik napięć, zniekształceń i szumów VN-1064/A","cow-work",['cow-work']
-184,"Sprzęt komp All-in-one Przyczajony nieobecny Bazyl","cow-work",['cow-work']
-183,"Sprzęt komp All-in-one Przyczajony Bazyl Lewy","cow-work",['cow-work']
-182,"Sprzęt komp All-in-one Przyczajony Bazyl pierwszy","cow-work",['cow-work']
-108,"PC Engines APU2 Router Box","cow-work","['cow-work', 'networking']"
-150,"LEDon Schrödinger's pussy","cow-work",['cow-work']
-164,"Sprzęt komp Monitor Hapeusz",unknown,[]
-153,"LEDon Duck","cow-work",['cow-work']
-145,"Prince Charming","cow-work",['cow-work']
-93,"King Bob","cow-work",['cow-work']
-90,"Chciejlista",unknown,[]
-85,"Komu powinien służyć Spejs",unknown,[]
-84,"Budżet",unknown,[]
-83,"Hackerspace Dragon Dreaming",unknown,[]
-82,"Biblioteka","cow-work","['cow-work', 'books']"
-66,"Apteczki","cow-work","['cow-work', 'garage', 'bhp']"
-44,"Brayton Power","garage","['garage', 'projects']"
-50,"Infinity mirror (duże)","garage","['garage', 'projects']"
-41,"Wiertarka PSB 500 RE BOSCH","garage","['garage', 'tools']"
-46,"What the Duck","cow-work","['cow-work', 'wled']"
+id,title,place,tags
+45,"Jak stworzyć nowy wpis do bazy zasobów Hackerspace Trójmiasto?",unknown,[]
+20,"O kategorii: Baza Wiedzy Hackerspace'u",unknown,[]
+747,"Gra handheld ""Crazy Brick""","cow-work","['cow-work', 'video-game']"
+745,"Statyw na aparat",unknown,[]
+735,"STD17NF03L",unknown,[]
+734,"Szuflada z procesorami STM32","lab",['lab']
+732,"Eksplodujące pudełko HS3","cow-work","['cow-work', 'projects']"
+731,"STM32F723",unknown,[]
+730,"NUCLEO G431RB",unknown,[]
+729,"Nucleo Expansion Board Led Driver",unknown,[]
+728,"Nucleo Expansion Board MultiSensor",unknown,[]
+285,"Konsola do gier Sony PlayStation 2 Slim + kontroler Namco GunCon","cow-work",['cow-work']
+480,"Gitara elektryczna Blond TE-1 MN BB","audiolab",['audiolab']
+481,"Gitara elektryczna Blond STR-1H MN SFG","audiolab",['audiolab']
+479,"Guitalele Ever Play GT-WBK","audiolab",['audiolab']
+456,"Wzmacniacz gitarowy Roland Micro Cube","audiolab",['audiolab']
+530,"Discman SONY","audiolab",['audiolab']
+531,"Streamer LTO-4 HP M8609A","server-room",['server-room']
+376,"Drukarka 3D HEVO (Hypercube Evolution","lab","['lab', '3d-print']"
+699,"Gra Blood Bowl z przyległościami","cow-work","['cow-work', 'audiolab', 'boardgame', 'sticker-needed']"
+720,"Płytki ewaluacyjne STEVAL-VP318L1F +?","lab",['lab']
+702,"Wózek na tacki projektowe","lab",['lab']
+719,"Pudełko projektowe ""Fala za Falą""","lab","['lab', 'sticker-needed']"
+703,"Tacki projektowe","lab","['lab', 'sticker-needed']"
+414,"Tester kabli RJ45, RJ11/12, BNC Lanberg","lab",['lab']
+718,"Zestaw nitonakrętek alu+stal G02910","lab",['lab']
+717,"Gniazdo DC 5,5/2,5mm do druku - poziome","lab","['lab', 'electronics']"
+716,"Konektor FPC 8-pin","lab","['lab', 'electronics']"
+715,"Przełącznik DIP switch 2 tory","lab","['lab', 'electronics']"
+714,"Przełącznik DIP switch 4 tory","lab","['lab', 'electronics']"
+713,"Diody LED czerwone, błękitne","lab","['lab', 'electronics']"
+712,"Złącze śrubowe ARK 3-pinowe","lab","['lab', 'electronics']"
+711,"Złącze śrubowe ARK 2-pinowe","lab","['lab', 'electronics']"
+710,"Złącze śrubowe ARK 4-pinowe","lab","['lab', 'electronics']"
+709,"ESP-32","lab","['lab', 'electronics']"
+708,"Origami LED Matrix","server-room","['projects', 'server-room']"
+704,"Tranzystor PNP bipolarny 50V","lab","['lab', 'electronics']"
+705,"Tranzystor NPN bipolarny 45V","lab","['lab', 'electronics']"
+707,"Przycisk monostabilny - tact switch","lab","['lab', 'electronics']"
+706,"Tranzystor T482 BVBR11","lab","['lab', 'electronics']"
+561,"Antena Dipol na 30m","lab",['lab']
+701,"Celestia - edukacyjna ściana nocnego nieba","server-room","['projects', 'server-room']"
+538,"Interfejs audio Line6 GX","audiolab",['audiolab']
+388,"Zasilacz 16A, 12V dc","lab",['lab']
+700,"Drukarka 3D Creality Ender do samodzielnego złożenia","lab","['lab', 'sticker-needed']"
+377,"Drukarka 3D “Elegoo Neptune 4 Pro”","lab","['lab', '3d-print']"
+514,"Pistolet do kleju na gorąco","lab",['lab']
+698,"Disco betoniarka","garage","['garage', 'projects', 'sticker-needed']"
+179,"Sprzęt komp Desktop Dr Robotomy","cow-work",['cow-work']
+585,"Ścianka narzędziowa","lab",['lab']
+584,"Stojak ze śrubokrętami","lab",['lab']
+583,"Pudełko z zapalniczkami","lab",['lab']
+582,"Konwerter ATC-1000 firmy F&F","lab",['lab']
+581,"Pojemnik z konektorami","lab",['lab']
+580,"Pudło - rurki / koszulki termokurczliwe, różne rodzaje","lab",['lab']
+579,"Uchwyt na kolbę gorącego powietrza (hot-air) z magnetycznym stolikiem naprawczym W.E.R 628","lab",['lab']
+578,"Myjka ultradźwiękowa 2","lab",['lab']
+577,"Żywiczna drukarka 3D Elegoo Mars 2 Pro","lab","['lab', '3d-print']"
+576,"Pudło z filamentami kolorowymi krótkimi","lab","['lab', '3d-print']"
+529,"Projektor Optoma","cow-work",['cow-work']
+527,"Stacja dokująca USB-C + ładowarka bezprzewodowa","cow-work",['cow-work']
+575,"Pudło z materiałami do drukarek 3D","lab",['lab']
+574,"Laminator biurowy Leitz iLAM Office Pro A3","lab",['lab']
+573,"Deska do krojenia, bambus, 53x46 cm","lab",['lab']
+572,"Farba Akrylowa Greenish","lab",['lab']
+571,"Smartphone Nexus LG","lab",['lab']
+570,"Smartphone Google","lab",['lab']
+569,"Smartphone Samsung","lab",['lab']
+568,"Redmi smartphone","lab",['lab']
+567,"iPhone","lab",['lab']
+566,"Materiały do plotera (winyl i inne) + krepa","lab",['lab']
+565,"Antena bazowa HamRadioShop 10 cm","lab",['lab']
+564,"LORA / Meshtastic","lab",['lab']
+563,"Przełącznik antenowy na 4 anteny KF ze sterownikiem","lab",['lab']
+562,"DREMEL 3000","lab",['lab']
+560,"Przełącznik antenowy z kontrolerem",unknown,[]
+304,"Monitor LG StudioWorks 560N","cow-work",['cow-work']
+554,"ArcaderOS - Śmieciowy Arcade Charytatywny dla każdego","cow-work",['cow-work']
+283,"Telewizor Funai","cow-work",['cow-work']
+478,"Gitara basowa Squier Precision Bass","audiolab",['audiolab']
+533,"Access Point Mikrotik cAP ac",unknown,[]
+546,"Kwadraty ze sklejki w drewnianych pudełkach",unknown,[]
+545,"LEGO piedestał z figurkami i jednorożcem","cow-work",['cow-work']
+541,"HAM QRP Szpej",unknown,[]
+543,"PKL, RF7, kable koncentryczne KF",unknown,[]
+542,"Antena Uda-Yagi 2m i 70 cm",unknown,[]
+370,"Infiniti mirror - części, pudło","lab",['lab']
+540,"Icom 706-mk2",unknown,[]
+537,"Płyta główna GIGABYTE GA-790XT-USB3","cow-work",['cow-work']
+536,"Płyta główna ECS L7VMM3","cow-work",['cow-work']
+535,"Płyta główna EPoX EP-8K9A7I","cow-work",['cow-work']
+92,"Drukarka 3D Creality K1 Max","lab","['lab', 'tools', '3d-print']"
+454,"Perkusja Alesis DM8","cow-work","['cow-work', 'audiolab']"
+273,"Drukarka Samsung ML-3710ND","cow-work",['cow-work']
+476,"Wieża TECHNICS EH550 - kolumny głośnikowe","audiolab",['audiolab']
+286,"Magnetowid VHS Philips VR 471","cow-work",['cow-work']
+482,"Magnetofon kasetowy Technics RS-B765","audiolab",['audiolab']
+317,"Sound Technology 1700B Distortion Measurement System","cow-work",['cow-work']
+311,"Hung Chang Oscilloscope 5504 40MHz","cow-work",['cow-work']
+279,"Komputer Apple Macintosh SE","cow-work",['cow-work']
+292,"Wieża TECHNICS EH550 - Stereo sound processor SH-EH550","cow-work",['cow-work']
+293,"Wieża TECHNICS EH550 - Stereo cassette deck RS-EH750","cow-work",['cow-work']
+294,"Wieża TECHNICS EH550 - Compact disc player SL-EH750","cow-work",['cow-work']
+291,"Wieża TECHNICS EH550 - Stereo tuner amplifier SA-EH550","cow-work",['cow-work']
+532,"Telefon komórkowy Compas CTKE08",unknown,[]
+357,"Radio samochodowe Alpine","audiolab",['audiolab']
+519,"Statyw Keyboard","cow-work","['cow-work', 'audiolab']"
+352,"Przejściówki USB-A => Power Jack","cow-work",['cow-work']
+451,"Maty lutownicze","cow-work","['cow-work', 'lab']"
+490,"Radiomagnetofon przenośny Panasonic RQ-V77","audiolab",['audiolab']
+312,"Szufladka ""Zestawy adapterów końcówek do zasilacza laptopa"" / końcówki do zasilania","cow-work",['cow-work']
+526,"Monitory",unknown,[]
+528,"Stacja dokująca USB-C z wbudowaną klawiaturą Unitek",unknown,[]
+61,"HS3 BOFH","cow-work","['cow-work', 'garage', 'events', 'bofh']"
+493,"Wkrętarka Niteo Tools","lab",['lab']
+494,"Quad Power Supply Cobrabid KB-60-01","audiolab",['audiolab']
+495,"Lenco PA-45 Portable Sound System with Bluetooth","audiolab",['audiolab']
+496,"Głośnik gitarowy DIY","audiolab",['audiolab']
+498,"Wiertarka udarowa | Bosch Professional GSB 16 RE","lab",['lab']
+497,"Drukarka DYMO Omega S0717930","lab",['lab']
+499,"Pudło ""wiercimy, wkręcamy i różne inne""","lab",['lab']
+500,"Pudło z chemią","lab",['lab']
+503,"Lutownica TS 80","lab",['lab']
+507,"ZD-939L stacja na gorące powietrze HOT-AIR","lab",['lab']
+513,"Urządzenie do wywoływania klisz polimerowych KENT Belichtungsgerät BG 250","lab",['lab']
+501,"Switch Planet FSD-803","audiolab",['audiolab']
+502,"Switch ES-3208P","audiolab",['audiolab']
+504,"Access Point TP-Link","audiolab",['audiolab']
+505,"Mikrofon T-Bone SC-300","audiolab",['audiolab']
+506,"Uchwyty biurkowe do mikrofonu/kamery","audiolab",['audiolab']
+508,"Bongosy","audiolab",['audiolab']
+509,"Dalekopis Lorenz LO133 Automatik","audiolab",['audiolab']
+515,"Zegar mA","lab",['lab']
+510,"Soundbar Dell AX510","audiolab",['audiolab']
+511,"Głośniki komputerowe Creative Inspire T3100","audiolab",['audiolab']
+516,"Głośnik CUBE","lab",['lab']
+512,"Pegasus & Co","audiolab",['audiolab']
+517,"Rozlutownica","lab",['lab']
+518,"Wałek giętki do wiertarki Dremel","lab",['lab']
+520,"Uchwyt do telewizora / monitora","cow-work",['cow-work']
+521,"Terminal MOTOROLA MC9062 (1 szt) i MC9060 (3 szt)","cow-work",['cow-work']
+522,"HUB 10Mb Hewlett Packard J3188A","cow-work",['cow-work']
+489,"Aparat fotograficzny Agat 18K","audiolab",['audiolab']
+488,"Aparat fotograficzny Nikon Coolpix L26","audiolab",['audiolab']
+487,"Aparat fotograficzny Hitachi HDC-761E","audiolab",['audiolab']
+486,"Aparat fotograficzny Konica Minolta","audiolab",['audiolab']
+485,"Odtwarzacz przenośny Philips","audiolab",['audiolab']
+484,"Komputer AiO POS CHD8700","audiolab",['audiolab']
+483,"Tuner Technics ST-600L","audiolab",['audiolab']
+491,"Odkurzacz Zelmer","lab",['lab']
+492,"Poziomica 1,50m","lab",['lab']
+455,"Wzmacniacz gitarowy Peavey Rage 258","audiolab",['audiolab']
+458,"Słuchawki Creative Aurvana Live!","audiolab",['audiolab']
+459,"Słuchawki Sennheiser HD25","audiolab",['audiolab']
+460,"Mikrofon Grundig GDM 312","audiolab",['audiolab']
+461,"Looper Ditto TC Electronic","audiolab",['audiolab']
+462,"Mikser Behringer MX400 Micromix","audiolab",['audiolab']
+463,"Korg Volca Keys","audiolab",['audiolab']
+464,"Korg Volca Sample","audiolab",['audiolab']
+465,"Korg Volca Mix","audiolab",['audiolab']
+466,"Korg Volca Bass","audiolab",['audiolab']
+467,"Korg Volca Modular","audiolab",['audiolab']
+468,"Yamaha DD-10 Drum Machine","audiolab",['audiolab']
+477,"Wzmacniacz zintegrowany Technics SU-810","audiolab",['audiolab']
+470,"Mikrofon Rode NT1-A","audiolab",['audiolab']
+473,"Obudowa komputerowa Chieftec Tower of BBL (but SMOL)","audiolab",['audiolab']
+447,"Aerograf PS-22 Verke","lab",['lab']
+475,"Głośniki LG CMS4340F","audiolab",['audiolab']
+474,"Wzmacniacz DIY 12V DC","audiolab",['audiolab']
+472,"Obudowa komputerowa Chieftec Tower of BBL","audiolab",['audiolab']
+471,"Głośniki DIY d33p w00f","audiolab",['audiolab']
+469,"A8 Wireless Sound Transmitter/Receiver","audiolab",['audiolab']
+453,"Klawiatury laptopowe","cow-work",['cow-work']
+452,"Klawiatury","cow-work",['cow-work']
+417,"Kable Audio Jack-Jack Mono","audiolab",['audiolab']
+449,"Omnifixo","cow-work","['cow-work', 'lab']"
+448,"Joystick Thrustmaster T.16000M","cow-work",['cow-work']
+206,"Club* Mate","cow-work",['cow-work']
+450,"Lutownica T12 + groty","cow-work","['cow-work', 'lab']"
+441,"Podnośnik samochodowe 2,5 ton","garage","['garage', 'tools']"
+443,"Odciąg trocin/wiórów Cormak","garage",['garage']
+439,"Mikro regały. W70xD50xH55","garage",['garage']
+405,"Home Automation Switches","cow-work","['cow-work', 'lab', 'server-room']"
+431,"Audio Mixer XENYX 302USB","cow-work",['cow-work']
+430,"Głośniki Loewe L82 A","audiolab",['audiolab']
+429,"Komputer Sun Ultra 45 Workstation 500s XVR2500 ULTRAsparc IIIi","audiolab",['audiolab']
+428,"Hodowla gryzoni (myszki et al.)","cow-work",['cow-work']
+426,"Karton ""Drukarka paragonowa + etykietki""","cow-work",['cow-work']
+415,"Multimetr, oscyloskop, generator sygnałów JT-OMS01","lab",['lab']
+375,"Termostaty","cow-work","['cow-work', 'lab', 'audiolab', 'server-room']"
+432,"Rode Wireless GO II",unknown,[]
+435,"Capture Card/Passthrough (black)",unknown,[]
+434,"Capture Card (gray)",unknown,[]
+438,"Rode Lav Mic",unknown,[]
+437,"MACROSILICON usb extscreen",unknown,[]
+436,"HDMI Extender",unknown,[]
+433,"1->4 HDMI Splitter",unknown,[]
+149,"LEDon Pink pussy","cow-work",['cow-work']
+151,"LEDon Bulb","cow-work",['cow-work']
+148,"LEDon HS3","cow-work",['cow-work']
+147,"LEDon Classy Lady","cow-work",['cow-work']
+418,"Karton ""Artykuły higieniczne""","cow-work",['cow-work']
+419,"Karton ""Akces(er)oria lutowanie""","cow-work",['cow-work']
+421,"Karton ""HS3 Narzędzia Warsztatowe""","cow-work",['cow-work']
+422,"Karton ""Taśmy samoprzylepne""","cow-work",['cow-work']
+423,"Karton ""Przedłużacze 230V""","cow-work",['cow-work']
+424,"Rzepowisko","cow-work",['cow-work']
+427,"Głośniki Creative GigaWorks T20 MultiMedia Speaker 28W MF1545","audiolab",['audiolab']
+425,"Repeater Zigbee Cow-work","cow-work",['cow-work']
+420,"Karton ""Bags""","cow-work",['cow-work']
+208,"Komputer Nixdorf XT ""All-in-One Portable""","cow-work",['cow-work']
+47,"Cricut Maker 3 ploter tnący","lab","['lab', 'tools']"
+411,"Stacja W.E.R 852D+ do prac z smd","lab",['lab']
+416,"Switch zarządzalny MikroTik CRS309-1G-8S+IN 1x1GbE 8x10GbE SFP+ RS232 PoE","server-room",['server-room']
+413,"Zasilacz regulowany","lab",['lab']
+412,"Stacja lutownicza 937D","lab",['lab']
+410,"Stacja lutownicza LF-1660SD","lab",['lab']
+409,"Stacja do rozlutowywania DS-915","lab",['lab']
+197,"Sprzęt komp laptop Oden-dono","cow-work",['cow-work']
+189,"Sprzęt komp laptop Udon-san","cow-work",['cow-work']
+200,"Sprzęt komp laptop Bogumił","cow-work",['cow-work']
+202,"Sprzęt komp laptop Amilo","cow-work",['cow-work']
+193,"Sprzęt komp laptop Victoria","cow-work",['cow-work']
+188,"Sprzęt komp laptop mały Jaś","cow-work",['cow-work']
+199,"Sprzęt komp laptop Robin","cow-work",['cow-work']
+407,"Mikser audio Phonic MM2005","cow-work","['cow-work', 'audiolab']"
+401,"Telewizor LG 37LK450-ZH","cow-work",['cow-work']
+404,"Kamera USB Savio CAK-02","cow-work",['cow-work']
+397,"Telewizor NEC E658","cow-work",['cow-work']
+406,"Klawiatura sterująca MIDI/USB AKAI MPK 61","cow-work","['cow-work', 'audiolab']"
+398,"Telewizor Samsung LE37C530","cow-work",['cow-work']
+403,"Domofon Hikvision","cow-work",['cow-work']
+400,"Chromecast 2 NC2-6A5","cow-work",['cow-work']
+399,"Klawiatura MIDI Arturia Keystep","cow-work","['cow-work', 'audiolab']"
+395,"Przyssawka do powierzchni płaskich","lab",['lab']
+394,"Rozlutownica bez regulacji temperatury","lab",['lab']
+393,"Lutownica Solomon","lab",['lab']
+392,"Myjka Ultradźwiękowa","lab",['lab']
+391,"Kamera statyw zestaw do pracy z płytkami PCB","lab",['lab']
+390,"Wyciąg stanowiska do lutowania","lab",['lab']
+384,"Pojemnik FOTO","cow-work",['cow-work']
+389,"Karton z częściami SMD","lab",['lab']
+387,"Klucze płaskooczkowe","lab",['lab']
+386,"Suwmiarka","lab",['lab']
+385,"Wiertarka Cemi statyw imadło","lab",['lab']
+383,"Obudowa robota sprzątającego","lab",['lab']
+382,"Drukarka 3D Photon żywiczna","lab",['lab']
+381,"Wiertarka statyw Dremel","lab",['lab']
+354,"Czujnik temperatury i wilgotności","lab",['lab']
+374,"Hot Plate","lab",['lab']
+379,"Drukarka 3D Creality K1MAX","lab",['lab']
+257,"Gra L game","cow-work",['cow-work']
+372,"Skrzynia skarbów","lab",['lab']
+378,"Nitownica do nitonakrętek","lab",['lab']
+380,"Mikroskop Eduko","lab",['lab']
+356,"Karton ""termostaty""","cow-work",['cow-work']
+358,"Karton ""wSchody""","cow-work",['cow-work']
+359,"Karton ""materiały plastyczne""","cow-work",['cow-work']
+360,"Pojemnik ""złącza, taśmy, słupki""","lab",['lab']
+361,"Karton Zigbee","cow-work",['cow-work']
+362,"Karton ""electro""","cow-work",['cow-work']
+363,"Instalacja Lasy Oliwskie","cow-work",['cow-work']
+371,"Uchwyt do płytek PCB","lab",['lab']
+364,"Karton Led String Light","cow-work",['cow-work']
+368,"Zgrzewarka do ogniw","lab",['lab']
+369,"Lutownica gazowa","lab",['lab']
+373,"OPSIS","lab",['lab']
+367,"Przejściówki USB-C => B, micro B, mini B, micro B 3, Lightning","cow-work",['cow-work']
+365,"Karton ""USB""","cow-work",['cow-work']
+366,"Karton ""Polish C Power""","cow-work",['cow-work']
+355,"Zasilacz regulowany USB-C Power Delivery Zasilacz 100W 5V/9V/12V/15V/20V","cow-work",['cow-work']
+351,"Przejściówki USB-C => Power Jack","cow-work",['cow-work']
+353,"Przejściówka Power Jack => USB-C","cow-work",['cow-work']
+350,"Body Fat Scale","lab",['lab']
+349,"DVD Video ""Monty Python: A teraz coś z zupełnie innej beczki""","cow-work",['cow-work']
+348,"14 in 1 Educational Solar Robot","lab",['lab']
+347,"Gra wideo ""PS3 Ridge Racer 7""","cow-work","['cow-work', 'video-game']"
+346,"Cyberdeck Ijona","cow-work",['cow-work']
+345,"Gra wideo ""PS3 Uncharted: Drake's Fortune DE""","cow-work","['cow-work', 'video-game']"
+344,"Szafka ze sprzętem telekomunikacyjnym","cow-work",['cow-work']
+340,"Kartón z wkrętami, kołkami i pudelkami","lab",['lab']
+343,"Gra wideo ""PS3 Colin McRae: Dirt 2""","cow-work","['cow-work', 'video-game']"
+341,"Gra wideo ""PS3 Ratchet & Clank Quest for Booty""","cow-work","['cow-work', 'video-game']"
+342,"Odtwarzacz Linn Sekrit DS-I + kolumny","cow-work",['cow-work']
+339,"Gra wideo ""Need for Speed: Most Wanted""","cow-work","['cow-work', 'video-game']"
+338,"Gra wideo ""Commandos 3: Kierunek Berlin""","cow-work","['cow-work', 'video-game']"
+337,"Gra wideo ""Heroes of Might and Magic V: Kuźnia Przeznaczenia""","cow-work","['cow-work', 'video-game']"
+336,"Puzzle Ptaki 500 - Politechnika Gdańska","cow-work","['cow-work', 'boardgame']"
+335,"Wiertarka PSR 1440 LI-2 + AL 1880 CV BOSCH","lab","['lab', 'tools']"
+334,"5-Port Fast Ethernet Switch Edimax 10/100Mbps","cow-work",['cow-work']
+333,"Karton ""ZASILACZE LAPTOP""","cow-work",['cow-work']
+332,"Karton ""URZĄDZENIA SIECIOWE LAN""","cow-work",['cow-work']
+331,"Karton ""VR""","cow-work",['cow-work']
+330,"Karton ""RADIO""","cow-work",['cow-work']
+326,"Lampa z lupą","lab",['lab']
+328,"Lampa z lupą niesprawna","lab",['lab']
+329,"Karton ""RÓŻNE MAŁE ZASILACZE""","cow-work",['cow-work']
+327,"Karton ""PRZEWODY ZASILAJACE""","cow-work",['cow-work']
+325,"Karton ""PRZEWODY <1MM2""","cow-work",['cow-work']
+324,"Karton ""AUDIO PRO""","cow-work",['cow-work']
+323,"Karton ""VIDEO""","cow-work",['cow-work']
+322,"Karton ""AUDIO JABRA""","cow-work",['cow-work']
+321,"Karton ""HDMI""","cow-work",['cow-work']
+320,"Karton ""RETRO AV SCART ET AL""","cow-work",['cow-work']
+319,"Karton ""LAN przewody""","cow-work",['cow-work']
+318,"Gra zręcznościowa “Wooden Blocks""","cow-work","['cow-work', 'boardgame']"
+316,"Wavetek Universal Antenna Coupler WWG MMS-4107S","cow-work",['cow-work']
+287,"Gra wideo “PC Warcraft II: Tides of Darkness”","cow-work","['cow-work', 'video-game']"
+289,"Gra wideo ""PC Fallout 1""","cow-work","['cow-work', 'video-game']"
+297,"Naklejki ""własność prywatna""","cow-work",['cow-work']
+299,"Gra Koci Cymbergaj","cow-work",['cow-work']
+300,"Multifunction Printer Canon MG3150","cow-work",['cow-work']
+302,"Skaner Plustek OpticPro ST24","cow-work",['cow-work']
+305,"Voltage, Distortion, and Noise Meter VN-1687 Unitra Elmasz","cow-work",['cow-work']
+306,"WANPTEK Programmable DC Power Supply","cow-work",['cow-work']
+307,"Oscyloskop Hantek 6022BE","cow-work",['cow-work']
+309,"Type SMG-1 Stereo Generator Radiometer Copenhagen","cow-work",['cow-work']
+313,"Karton ""Słuchawki""","cow-work",['cow-work']
+301,"Karton ""ARTYKUŁY BIUROWE""","cow-work",['cow-work']
+314,"PINTEK 20MHz oscilloscope PS-200","cow-work",['cow-work']
+315,"PAL-B System?","cow-work",['cow-work']
+296,"HUBy USB-C","cow-work",['cow-work']
+144,"Venus","cow-work",['cow-work']
+52,"Evil Submarine","cow-work","['cow-work', 'projects']"
+295,"Dmuchawa do elektroniki Appio","cow-work",['cow-work']
+288,"Gra wideo ""Warcraft II: Battle.net Edition""","cow-work","['cow-work', 'video-game']"
+290,"Projektor Barco F22 SX+ Ultra Wide VizSim","cow-work",['cow-work']
+284,"Robotarm SVI-2000 QuickShot","cow-work",['cow-work']
+282,"Komputer ZX Spectrum +2","cow-work",['cow-work']
+281,"Gra wideo “PC Mortyr 2093-1944”","cow-work","['cow-work', 'video-game']"
+280,"Komputer Commodore C=64","cow-work",['cow-work']
+278,"Philips PM5415TX color TV Pattern Generator","cow-work",['cow-work']
+277,"Joystick QuickShot II Turbo","cow-work",['cow-work']
+276,"Gra wideo “PC Dragon Dice”","cow-work","['cow-work', 'video-game']"
+275,"Joystick Quickshot","cow-work",['cow-work']
+274,"Komputer Spectravideo SVI–738","cow-work",['cow-work']
+272,"Gra wideo “PC Man Of War”","cow-work","['cow-work', 'video-game']"
+271,"Gra wideo “PC Warcraft: Orcs & Humans”","cow-work","['cow-work', 'video-game']"
+270,"Gra wideo “Nowy Teenagent”","cow-work","['cow-work', 'video-game']"
+269,"Gra wideo ""PC Requiem: Avenging Angel""","cow-work","['cow-work', 'video-game']"
+268,"Gra wideo “PC CLASH”","cow-work","['cow-work', 'video-game']"
+267,"Gra wideo ""PC Baldur’s Gate: Opowieści z Wybrzeża Mieczy""","cow-work","['cow-work', 'video-game']"
+266,"Gra wideo “PC Fallout 2 - A Post Nuclear Role Playing Game”","cow-work","['cow-work', 'video-game']"
+265,"Gra wideo “PC Might & Magic: Heroes VI - Pirates of the Savage Sea”","cow-work","['cow-work', 'video-game']"
+264,"Gra wideo “PC Konung: Legenda Północy”","cow-work","['cow-work', 'video-game']"
+263,"Gra wideo “PC End of Twilight: Zaginiona tarcza wikinga”","cow-work","['cow-work', 'video-game']"
+262,"Gra wideo “Alien Nations”","cow-work","['cow-work', 'video-game']"
+261,"Gra wideo “PC Tony Hawk's Underground 2”","cow-work","['cow-work', 'video-game']"
+259,"Gra wideo ""PC Kroniki czarnego księżyca""","cow-work","['cow-work', 'video-game']"
+260,"Gra wideo ""PC ony Hawk's Pro Skater 3""","cow-work","['cow-work', 'video-game']"
+256,"Gra wideo “PC Full Spectrum Warrior”","cow-work","['cow-work', 'video-game']"
+258,"Gra wideo ""PC Invictus: W Cieniu Olimpu""","cow-work","['cow-work', 'video-game']"
+236,"Gra planszowa ""Carcassonne. Gra o zamkach, miastach i rycerzach.”","cow-work","['cow-work', 'boardgame']"
+237,"Gra zręcznościowa ""Wieża""","cow-work","['cow-work', 'boardgame']"
+238,"Gra planszowa ""Postaw na klocka""","cow-work","['cow-work', 'boardgame']"
+239,"Gra planszowa “Tajniacy”","cow-work","['cow-work', 'boardgame']"
+240,"Gra planszowa “Story Cubes: Podróże”","cow-work","['cow-work', 'boardgame']"
+253,"Gra wideo ""PS2 Charlie and the Chocolate Factory""","cow-work","['cow-work', 'video-game']"
+254,"Gra wideo “ The Chronicles of Narnia: The Lion, The Witch and The Wardrobe”","cow-work","['cow-work', 'video-game']"
+255,"Gra wideo “PS2 Conflict: Vietnam”","cow-work","['cow-work', 'video-game']"
+248,"Komputer Amstrad 128k Colour Personal Computer","cow-work",['cow-work']
+249,"Zasilacz laboratoryjny Zhaoxin","cow-work","['cow-work', 'tools']"
+250,"Gra karciana ""Monty Python and the Holy Grail CCG Booster Pack""","cow-work","['cow-work', 'boardgame']"
+252,"Konsola do gier Doom.txt","cow-work",['cow-work']
+251,"Konsola do gier DoomGirl","cow-work","['cow-work', 'video-game']"
+212,"SUN Keyboard & Mouse Collection","cow-work",['cow-work']
+243,"Gra karciana ""List Miłosny""","cow-work","['cow-work', 'boardgame']"
+242,"Dodatek do gry “ KeyForge: Zew Archontów - Talia Archonta”","cow-work","['cow-work', 'boardgame']"
+241,"Gra planszowa “Developer Dilemmas”","cow-work","['cow-work', 'boardgame']"
+244,"Osciloscope OS-352 ZUE Unitem","cow-work",['cow-work']
+245,"Dodatek do gry “KeyForge: Czas Wstąpienia - Talia Archonta”","cow-work","['cow-work', 'boardgame']"
+246,"Gra planszowa “Dobble: collector”","cow-work","['cow-work', 'boardgame']"
+247,"Gra planszowa “Cytadela”","cow-work","['cow-work', 'boardgame']"
+91,"Drukarka 3D Creality Ender 3","lab","['lab', 'tools', '3d-print']"
+139,"Drukarka Brother PT-E550WSP","lab",['lab']
+222,"Gra planszowa “Spiskowcy""","cow-work","['cow-work', 'boardgame']"
+232,"Gra planszowa “Takie Życie - Ciekawostki""","cow-work","['cow-work', 'boardgame']"
+234,"Gra planszowa ""Załoga: Wyprawa w głębiny""","cow-work","['cow-work', 'boardgame']"
+235,"Gra planszowa ""Decrypto""","cow-work","['cow-work', 'boardgame']"
+233,"Blinkenkrate","cow-work","['cow-work', 'projects']"
+231,"Mecanorma 9,99999MHz","cow-work",['cow-work']
+230,"SECAM/PAL TV Pattern Generator Type K944","cow-work",['cow-work']
+229,"TRIO 15MHz Oscilloscope CS-1560A","cow-work",['cow-work']
+228,"Monitor Trinitron","cow-work",['cow-work']
+227,"Oscyloskop ST-315A II KABID Radiotechnika","cow-work",['cow-work']
+226,"Grundig AM/FM Generator AS4","cow-work",['cow-work']
+225,"Mera tronik Digital Voltmeter Type V530","cow-work",['cow-work']
+224,"Hewlett Packard 8640A Signal Generator","cow-work",['cow-work']
+223,"Sprzęt komp all-in-one krągły iMac *inander","cow-work",['cow-work']
+221,"Monitor Amstrad CTM644","cow-work",['cow-work']
+220,"UNITRA Unima Digital Multimeter 1331","cow-work",['cow-work']
+219,"Leader LVS-5851 A PAL Vectorscope","cow-work",['cow-work']
+218,"Zopan Signal Generator KZ 1623","cow-work",['cow-work']
+217,"UNITRA Elmasz Miernik nierównomierności ND-1481","cow-work",['cow-work']
+216,"SUN CD-ROM Caddy Loaded","cow-work",['cow-work']
+215,"Xbox 360 Plain","cow-work",['cow-work']
+214,"Xbox 360 Chrome","cow-work",['cow-work']
+213,"Xbox 360 Toothless","cow-work",['cow-work']
+211,"SUN Ultra 5 Bottom","cow-work",['cow-work']
+210,"SUN Ultra 5 Top","cow-work",['cow-work']
+209,"SUN Sparkstation 20","cow-work",['cow-work']
+203,"Multimetr TL-4",unknown,[]
+156,"Drabinka","cow-work",['cow-work']
+155,"Flipchart","cow-work",['cow-work']
+166,"Gra planszowa Oriflamme","cow-work","['cow-work', 'boardgame']"
+168,"Gra planszowa ""To ja go tnę""","cow-work","['cow-work', 'boardgame']"
+152,"Gra planszowa Dreadful Circus","cow-work","['cow-work', 'boardgame']"
+160,"Gra planszowa ""Mage Knight Dugeons""","cow-work","['cow-work', 'boardgame']"
+169,"Gra planszowa Mix Tura","cow-work","['cow-work', 'boardgame']"
+171,"Gra karciana UNO","cow-work",['cow-work']
+140,"Kamizelka projektu 'Człowiek'","cow-work",['cow-work']
+167,"Sprzęt komp Monitor Samson","cow-work",['cow-work']
+165,"Sprzęt komp Monitor mały Dellton","cow-work",['cow-work']
+163,"Sprzęt komp all-in-one krągły iMaciej","cow-work",['cow-work']
+162,"Sprzęt komp monitor Dellton","cow-work",['cow-work']
+161,"Sprzęt komp All-in-one Asuseł","cow-work",['cow-work']
+159,"Sprzęt komp monitor Optimus Prime","cow-work",['cow-work']
+158,"Sprzęt komp monitor Hehe Prince","cow-work",['cow-work']
+157,"Sprzęt komp All-in-one Lenovaldek","cow-work",['cow-work']
+154,"Sprzęt komp All-in-one Bazzite","cow-work",['cow-work']
+143,"Von Count","cow-work",['cow-work']
+142,"Kaktus","cow-work",['cow-work']
+141,"Tramwajomat","cow-work",['cow-work']
+170,"Sprzęt komp Desktop FrankenSUN","cow-work",['cow-work']
+172,"Sprzęt komp Desktop Bandzior","cow-work",['cow-work']
+173,"Sprzęt komp Desktop GOOD BOY","cow-work",['cow-work']
+174,"Sprzęt komp Desktop Unbreak My Heart","cow-work",['cow-work']
+175,"Sprzęt komp Desktop Mucha w Zupie","cow-work",['cow-work']
+178,"Sprzęt komp Desktop Roxanne","cow-work",['cow-work']
+180,"Sprzęt komp Desktop Wronisław","cow-work",['cow-work']
+194,"Sprzęt komp laptop Wonder Boy","cow-work",['cow-work']
+204,"Sprzęt komp laptop Lego Dell","cow-work",['cow-work']
+181,"Klimatyzator","cow-work",['cow-work']
+205,"Sprzęt komp laptop HackLab-0x01","cow-work",['cow-work']
+185,"Dekadowy Generator RC PW-9","cow-work",['cow-work']
+186,"Sprzęt komp laptop Vojtěch","cow-work",['cow-work']
+187,"PMZ-12 Automatic Distortion Meter","cow-work",['cow-work']
+190,"Dekadowy Generator RC PW-9 NATIONAL","cow-work",['cow-work']
+191,"Dekadowy Generator RC PW-9 TK2","cow-work",['cow-work']
+192,"Generator RC PO-20","cow-work",['cow-work']
+195,"Miernik napięć, zniekształceń i szumów VN-1064/A","cow-work",['cow-work']
+184,"Sprzęt komp All-in-one Przyczajony nieobecny Bazyl","cow-work",['cow-work']
+183,"Sprzęt komp All-in-one Przyczajony Bazyl Lewy","cow-work",['cow-work']
+182,"Sprzęt komp All-in-one Przyczajony Bazyl pierwszy","cow-work",['cow-work']
+108,"PC Engines APU2 Router Box","cow-work","['cow-work', 'networking']"
+150,"LEDon Schrödinger's pussy","cow-work",['cow-work']
+164,"Sprzęt komp Monitor Hapeusz",unknown,[]
+153,"LEDon Duck","cow-work",['cow-work']
+145,"Prince Charming","cow-work",['cow-work']
+93,"King Bob","cow-work",['cow-work']
+90,"Chciejlista",unknown,[]
+85,"Komu powinien służyć Spejs",unknown,[]
+84,"Budżet",unknown,[]
+83,"Hackerspace Dragon Dreaming",unknown,[]
+82,"Biblioteka","cow-work","['cow-work', 'books']"
+66,"Apteczki","cow-work","['cow-work', 'garage', 'bhp']"
+44,"Brayton Power","garage","['garage', 'projects']"
+50,"Infinity mirror (duże)","garage","['garage', 'projects']"
+41,"Wiertarka PSB 500 RE BOSCH","garage","['garage', 'tools']"
+46,"What the Duck","cow-work","['cow-work', 'wled']"