diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index dbaae48..587d6a3 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -21,22 +21,21 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4
- # ── Python (for Nuitka sidecar) ───────────────────────────
- - name: Set up Python 3.12
- uses: actions/setup-python@v5
+ - name: Install uv
+ uses: astral-sh/setup-uv@v5
+
+ - name: Set up Python 3.14
+ uses: actions/setup-python@v6
with:
- python-version: "3.12"
+ python-version: "3.14"
architecture: "x64"
- name: Install Python dependencies
- run: |
- python -m pip install --upgrade pip wheel setuptools
- python -m pip install -r requirements_win64.txt
- python -m pip install nuitka
+ run: uv sync --frozen
# ── Bundle Python sidecar with Nuitka ─────────────────────
- name: Build Nuitka sidecar
- run: python scripts/bundle_sidecar.py
+ run: uv run scripts/bundle_sidecar.py
# ── Node.js + pnpm (for Vue frontend) ─────────────────────
- name: Set up Node.js 22
@@ -69,6 +68,19 @@ jobs:
restore-keys: ${{ runner.os }}-cargo-
# ── Build Tauri installer ─────────────────────────────────
+ - name: Inject version from Git tag
+ shell: bash
+ run: |
+ VERSION="${GITHUB_REF_NAME#v}"
+ echo "Updating app version to $VERSION"
+ node -e "
+ const fs = require('fs');
+ const file = 'src-tauri/tauri.conf.json';
+ const data = JSON.parse(fs.readFileSync(file));
+ data.version = '$VERSION';
+ fs.writeFileSync(file, JSON.stringify(data, null, 2));
+ "
+
- name: Build Tauri app
env:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
@@ -83,10 +95,17 @@ jobs:
echo "| Item | Value |" >> $GITHUB_STEP_SUMMARY
echo "|------|-------|" >> $GITHUB_STEP_SUMMARY
echo "| Tag | \`${GITHUB_REF_NAME}\` |" >> $GITHUB_STEP_SUMMARY
- echo "| Python | 3.12 (x64) |" >> $GITHUB_STEP_SUMMARY
+ echo "| Python | 3.14 (x64) |" >> $GITHUB_STEP_SUMMARY
echo "| Node | 22 |" >> $GITHUB_STEP_SUMMARY
echo "| Rust | stable |" >> $GITHUB_STEP_SUMMARY
+ - name: Rename installer
+ shell: bash
+ working-directory: src-tauri/target/release/bundle/nsis
+ run: |
+ mv *.exe RoK-Tracker-Suite-setup.exe
+ mv *.sig RoK-Tracker-Suite-setup.exe.sig
+
# ── Upload artifacts ──────────────────────────────────────
- name: Upload NSIS installer
uses: actions/upload-artifact@v4
diff --git a/.github/workflows/test_bundle.yml b/.github/workflows/test_bundle.yml
index 668dbc2..70ca08b 100644
--- a/.github/workflows/test_bundle.yml
+++ b/.github/workflows/test_bundle.yml
@@ -12,22 +12,21 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4
- # ── Python (for Nuitka sidecar) ───────────────────────────
- - name: Set up Python 3.12
- uses: actions/setup-python@v5
+ - name: Install uv
+ uses: astral-sh/setup-uv@v5
+
+ - name: Set up Python 3.14
+ uses: actions/setup-python@v6
with:
- python-version: "3.12"
+ python-version: "3.14"
architecture: "x64"
- name: Install Python dependencies
- run: |
- python -m pip install --upgrade pip wheel setuptools
- python -m pip install -r requirements_win64.txt
- python -m pip install nuitka
+ run: uv sync --frozen
# ── Bundle Python sidecar with Nuitka ─────────────────────
- name: Build Nuitka sidecar
- run: python scripts/bundle_sidecar.py
+ run: uv run scripts/bundle_sidecar.py
# ── Node.js + pnpm (for Vue frontend) ─────────────────────
- name: Set up Node.js 22
@@ -61,6 +60,9 @@ jobs:
# ── Build Tauri installer ─────────────────────────────────
- name: Build Tauri app
+ env:
+ TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
+ TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
run: ./gui_frontend/node_modules/.bin/tauri build
- name: Summarize build
@@ -70,7 +72,7 @@ jobs:
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Item | Value |" >> $GITHUB_STEP_SUMMARY
echo "|------|-------|" >> $GITHUB_STEP_SUMMARY
- echo "| Python | 3.12 (x64) |" >> $GITHUB_STEP_SUMMARY
+ echo "| Python | 3.13 (x64) |" >> $GITHUB_STEP_SUMMARY
echo "| Node | 22 |" >> $GITHUB_STEP_SUMMARY
echo "| Rust | stable |" >> $GITHUB_STEP_SUMMARY
diff --git a/.python-version b/.python-version
index 7918c7a..3767b4b 100644
--- a/.python-version
+++ b/.python-version
@@ -1 +1 @@
-3.13.1
\ No newline at end of file
+3.14
\ No newline at end of file
diff --git a/README.md b/README.md
index c42c87d..be1d6b9 100644
--- a/README.md
+++ b/README.md
@@ -1,44 +1,65 @@
# RokTracker
[](LICENSE)
-[](https://www.python.org/)
+[](https://www.python.org/)
[](https://tauri.app/)
[](#requirements)
**Open-source Rise of Kingdoms stats management tool.** Automatically scan and track the top players in your kingdom, alliance, and honor leaderboards using OCR and ADB.
-Originally based on the tool by [nikolakis1919](https://github.com/nikolakis1919/RokTracker) and [Cyrexxis](https://github.com/Cyrexxis/RokTracker), this version features a modern Tauri desktop app with Vue 3 + shadcn-vue UI.
+Originally based on the tool by [nikolakis1919](https://github.com/nikolakis1919/RokTracker) and [Cyrexxis](https://github.com/Cyrexxis/RokTracker), this version features a modern Tauri v2 desktop app with a Vue 3 + shadcn-vue interface, a Nuitka-compiled Python backend, and automatic updates — all bundled into a single Windows installer.
---
## Table of Contents
+- [App Preview](#app-preview)
+- [What's in this Version](#whats-in-this-version)
- [Features](#features)
-- [Screenshots](#screenshots)
- [Requirements](#requirements)
- [Installation](#installation)
- [Simple Installation (Installer)](#simple-installation-installer)
- - [Advanced Installation (From Source)](#advanced-installation-from-source)
+ - [Development & Architecture](#development--architecture)
- [Usage](#usage)
- [Configuration](#configuration)
- [Emulator Setup](#emulator-setup)
- [Bluestacks 5](#bluestacks-5)
- [LD Player (Experimental)](#ld-player-experimental)
- [Output Formats](#output-formats)
-- [Building from Source](#building-from-source)
-- [Architecture](#architecture)
- [Important Notes](#important-notes)
- [Troubleshooting & Support](#troubleshooting--support)
+- [Contributing](#contributing)
- [License](#license)
---
-## 🚀 What's in v1.0.0
+## App Preview
+
+### Kingdom Scanner
+
+The main scanner — configure presets, fine-tune timings, and track every governor stat in real time.
+
+
+
+
+
+Alliance Scanner | Honor Scanner | Seed Scanner
+
+
+
+
+
+
+
+
+---
+
+## What's in this Version
- **Tauri v2 desktop app** — replaced PyWebView + Bottle with a native Tauri shell for faster startup and smaller bundle
- **Modern UI** — rebuilt with Vue 3, shadcn-vue, and Tailwind CSS (dark theme, responsive layout)
- **Nuitka sidecar** — Python backend compiled with Nuitka (~99 MB, down from ~258 MB with PyInstaller)
-- **Unified installer** — single `.exe` or `.msi` installer, no Python required for end users
+- **Unified installer** — single `.exe` installer, no Python required for end users
- **All 4 scanners** — Kingdom, Alliance, Honor, and Seed in one application
- **Auto-updates** — the app automatically checks for new versions and can update itself in-place
@@ -46,7 +67,7 @@ Originally based on the tool by [nikolakis1919](https://github.com/nikolakis1919
---
-## ✨ Features
+## Features
### Kingdom Scanner
@@ -76,7 +97,7 @@ Originally based on the tool by [nikolakis1919](https://github.com/nikolakis1919
### General
-- **Multiple OCR engines** — Tesseract and EasyOCR with configurable fallback order
+- **OCR engine** — Tesseract with configurable page segmentation and engine modes
- **Multiple output formats** — XLSX, CSV, and JSONL
- **Modern GUI** — built with Vue 3, shadcn-vue, and Tailwind CSS
- **Emulator support** — Bluestacks 5 (recommended) and LD Player (experimental)
@@ -85,15 +106,7 @@ Originally based on the tool by [nikolakis1919](https://github.com/nikolakis1919
---
-## Screenshots
-
-| Kingdom Scanner | Alliance Scanner | Honor Scanner | Seed Scanner |
-| :----------------------------: | :------------------------------: | :------------------------: | :----------------------: |
-|  |  |  |  |
-
----
-
-## 📋 Requirements
+## Requirements
| Requirement | Details |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------- |
@@ -102,18 +115,18 @@ Originally based on the tool by [nikolakis1919](https://github.com/nikolakis1919
| **Tesseract Data** | [Trained models](https://github.com/tesseract-ocr/tessdata) — place in `deps/tessdata/` |
| **ADB Platform Tools** | [Download](https://dl.google.com/android/repository/platform-tools_r31.0.3-windows.zip) — place in `deps/platform-tools/` |
-> For building from source, you also need: [Python 3.12+](https://www.python.org/downloads/), [Node.js 18+](https://nodejs.org/), [Rust](https://rustup.rs/), and [pnpm](https://pnpm.io/).
+> For building from source, you also need: [Python 3.14+](https://www.python.org/downloads/), [Node.js 18+](https://nodejs.org/), [Rust](https://rustup.rs/), and [pnpm](https://pnpm.io/).
---
-## 📥 Installation
+## Installation
### Simple Installation (Installer)
No Python, Node.js, or Rust required — just install and run.
1. **Download** the latest release: **[Latest Release](https://github.com/Nexor256/RoK-Tracker/releases/latest)**
- - Choose `RoK-Tracker-Suite_1.0.0_x64-setup.exe` (NSIS)
+ - Choose `RoK-Tracker-Suite-setup.exe` (NSIS)
2. **Run the installer** — follow the setup wizard
3. **Launch the app once** — it will auto-create the `deps/` folder structure
4. **Add dependencies** to the `deps/` folder (located next to the installed app):
@@ -122,7 +135,7 @@ No Python, Node.js, or Rust required — just install and run.
5. **Configure your emulator** ([see Emulator Setup](#emulator-setup))
6. **Relaunch** the app — you're ready to scan!
-> 💡 **Future updates are automatic!** The app will notify you when a new version is available and can update itself with one click — no need redownload the app again.
+> **Tip:** Future updates are automatic! The app will notify you when a new version is available and can update itself with one click — no need to redownload.
> [!WARNING]
> **Windows Defender False Positive:** The installer bundles a custom Python executable (`scanner_sidecar.exe`) that handles the scanning engine. Because it is heavily compressed and compiled into a single file with Nuitka, **Windows Defender and other antiviruses often falsely flag it as malware** and may silently quarantine it upon installation. If the app gets stuck on the "Initializing Sidecar" loading screen, please check your **Windows Security -> Protection History**, click on the blocked threat, select **Restore / Allow on device**, and restart the app.
@@ -142,47 +155,44 @@ RoK Tracker Suite/ (install directory)
└── adb.exe ← You download this
```
-### Advanced Installation (From Source)
-
-For developers who want to run or modify the code.
-
-**Prerequisites:**
+### Development & Architecture
-- [Python 3.12+](https://www.python.org/downloads/)
-- [Node.js 18+](https://nodejs.org/) with [pnpm](https://pnpm.io/)
-- [Rust](https://rustup.rs/) (for Tauri)
-- [Microsoft C++ Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/)
-
-**Setup:**
-
-```bash
-# 1. Clone the repository
-git clone https://github.com/Nexor256/RoK-Tracker.git
-cd RokTracker
-
-# 2. Install Python dependencies
-python -m venv venv
-./venv/Scripts/activate
-pip install -r requirements_win64.txt
-
-# 3. Install frontend dependencies
-cd gui_frontend
-pnpm install
-cd ..
-
-# 4. Place ADB and OCR data in deps/ (same as simple installation)
-
-# 5. Run in development mode
-npx --prefix gui_frontend tauri dev
+```text
+┌─────────────────────────────────────┐
+│ Tauri v2 Shell │
+│ ┌───────────────────────────────┐ │
+│ │ Vue 3 + shadcn-vue Frontend │ │
+│ │ (HTML/CSS/JS in WebView) │ │
+│ └──────────────┬────────────────┘ │
+│ │ invoke / listen │
+│ ┌──────────────▼────────────────┐ │
+│ │ Rust Backend (commands.rs) │ │
+│ │ Sidecar Manager (sidecar.rs)│ │
+│ └──────────────┬────────────────┘ │
+│ │ stdin/stdout JSON │
+│ ┌──────────────▼────────────────┐ │
+│ │ Python Sidecar (Nuitka exe) │ │
+│ │ scanner_sidecar.py │ │
+│ │ └── roktracker/ (scanners) │ │
+│ └───────────────────────────────┘ │
+└─────────────────────────────────────┘
```
-This opens the app with hot-reload — changes to the Vue frontend update instantly.
+| Component | Technology | Purpose |
+| ------------------ | ---------------------------------- | --------------------------------------- |
+| **Desktop shell** | Tauri v2 (Rust) | Native window, IPC, bundling |
+| **Frontend** | Vue 3, shadcn-vue, Tailwind CSS | UI (pages, components, styling) |
+| **Backend bridge** | Rust (`commands.rs`, `sidecar.rs`) | Routes commands to Python sidecar |
+| **Scanner engine** | Python (Nuitka-compiled) | OCR, ADB, data processing |
+| **Auto-updater** | Tauri Updater Plugin | Checks GitHub Releases for new versions |
+
+> **Developers:** To build the standalone installer from source, please see the **[Building from Source](https://github.com/Nexor256/RoK-Tracker/wiki/Building-from-Source)** wiki page for full setup instructions.
---
## Usage
-**From installer:** Launch "RoK Tracker Suite" from the Start Menu.
+**From installer:** Launch "RoK Tracker Suite" from the Start Menu or desktop shortcut.
**From source (development):**
@@ -192,12 +202,23 @@ npx --prefix gui_frontend tauri dev
The app opens a native window where you can:
-- Select which scanner to run (Kingdom, Alliance, Honor, or Seed)
-- Configure scan settings and presets
-- Monitor scan progress in real time
-- View the last scanned governor data
+1. Select which scanner to run (Kingdom, Alliance, Honor, or Seed)
+2. Configure scan settings and presets on the **Settings** page
+3. Monitor scan progress in real time
+4. View the last scanned governor data
+
+Scan results are saved to the corresponding output folder:
-Scan results are saved to the corresponding `scans_*/` folder (e.g., `scans_kingdom/`, `scans_alliance/`).
+| Scanner | Output folder |
+| -------- | ----------------- |
+| Kingdom | `scans_kingdom/` |
+| Alliance | `scans_alliance/` |
+| Honor | `scans_honor/` |
+| Seed | `scans_seed/` |
+
+
+
+
---
@@ -207,22 +228,28 @@ All settings can be configured from the **Settings** page inside the application
Available settings include:
-- **Scan** — kingdom name, number of governors, resume, scroll mode, inactive tracking, power/kill validation, kill reconstruction, and output formats (XLSX, CSV, JSONL)
-- **OCR** — engine fallback order (Tesseract / EasyOCR), page segmentation mode, OCR engine mode, languages, and GPU toggle
-- **Emulator** — emulator type (Bluestacks or LD Player), instance name, config file path, and ADB port
+| Category | Settings |
+| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Scan** | Kingdom name, number of governors, resume, scroll mode, inactive tracking, power/kill validation, kill reconstruction, output formats (XLSX, CSV, JSONL) |
+| **OCR** | Page segmentation mode, OCR engine mode, languages |
+| **Emulator** | Emulator type (Bluestacks or LD Player), instance name, config file path, ADB port |
---
## Emulator Setup
-### Bluestacks 5
+Regardless of which emulator you use, the following display settings are **required**:
+
+| Setting | Value |
+| -------------- | ------------ |
+| **Resolution** | 1600 x 900 |
+| **DPI** | Custom (450) |
-Configure your Bluestacks instance with these **required** settings:
+### Bluestacks 5
-**Display Tab** ([Screenshot](images/bluestacks-display.png))
+Configure your Bluestacks instance with these settings:
-- Resolution: **1600 x 900**
-- DPI: **Custom (450)**
+**Display Tab** ([Screenshot](images/bluestacks-display.png)) — set the resolution and DPI listed above.
**Advanced Tab** ([Screenshot](images/bluestacks-advanced.png))
@@ -239,6 +266,12 @@ Configure your Bluestacks instance with these **required** settings:
Select **LD Player** as the emulator in the app's **Settings** page. LD Player support is experimental — Bluestacks 5 is recommended for the most reliable experience.
+Configure your LD Player instance with these settings:
+
+**Display Tab** ([Screenshot](images/LD%20Player-dispaly.png)) — set the resolution and DPI listed above.
+
+**Other Settings** ([Screenshot](images/LD%20Player-others.png))
+
---
## Output Formats
@@ -249,68 +282,9 @@ Select **LD Player** as the emulator in the app's **Settings** page. LD Player s
| **CSV** | `.csv` | Comma-separated values for easy import |
| **JSONL** | `.jsonl` | JSON Lines — one JSON object per line |
-Configure which formats to generate in the **Settings** page.
-
----
-
-## 🔨 Building from Source
-
-To build the standalone installer yourself:
-
-```bash
-# 1. Activate your Python virtual environment
-./venv/Scripts/activate
-
-# 2. Bundle the Python sidecar with Nuitka (~20-30 min first time)
-python scripts/bundle_sidecar.py
-
-# 3. Build the Tauri installer
-npx --prefix gui_frontend tauri build
-```
-
-The installer will be created at:
-
-- **NSIS:** `src-tauri/target/release/bundle/nsis/RoK Tracker Suite_x.x.x_x64-setup.exe`
-- **MSI:** `src-tauri/target/release/bundle/msi/RoK Tracker Suite_x.x.x_x64_en-US.msi`
-
-> **Note:** The first Nuitka build takes 20–30 minutes because it compiles Python to C code. Subsequent builds are cached and much faster.
-
----
+Configure which formats to generate in the **Settings** page. All selected formats are written simultaneously at the end of each scan.
-## 🏗️ Architecture
-
-```
-┌─────────────────────────────────────┐
-│ Tauri v2 Shell │
-│ ┌───────────────────────────────┐ │
-│ │ Vue 3 + shadcn-vue Frontend │ │
-│ │ (HTML/CSS/JS in WebView) │ │
-│ └──────────────┬────────────────┘ │
-│ │ invoke / listen │
-│ ┌──────────────▼────────────────┐ │
-│ │ Rust Backend (commands.rs) │ │
-│ │ Sidecar Manager (sidecar.rs)│ │
-│ └──────────────┬────────────────┘ │
-│ │ stdin/stdout JSON │
-│ ┌──────────────▼────────────────┐ │
-│ │ Python Sidecar (Nuitka exe) │ │
-│ │ scanner_sidecar.py │ │
-│ │ └── roktracker/ (scanners) │ │
-│ └───────────────────────────────┘ │
-└─────────────────────────────────────┘
-```
-
-| Component | Technology | Purpose |
-| ------------------ | ---------------------------------- | --------------------------------------- |
-| **Desktop shell** | Tauri v2 (Rust) | Native window, IPC, bundling |
-| **Frontend** | Vue 3, shadcn-vue, Tailwind CSS | UI (pages, components, styling) |
-| **Backend bridge** | Rust (`commands.rs`, `sidecar.rs`) | Routes commands to Python sidecar |
-| **Scanner engine** | Python (Nuitka-compiled) | OCR, ADB, data processing |
-| **Auto-updater** | Tauri Updater Plugin | Checks GitHub Releases for new versions |
-
----
-
-## ⚠️ Important Notes
+## Important Notes
### Before Scanning
@@ -333,23 +307,13 @@ The installer will be created at:
---
-## 🛠️ Troubleshooting & Support
-
-**Common Issues:**
-
-| Problem | Solution |
-| ----------------------------------- | ------------------------------------------------------------------------------------------------------------ |
-| App shows "Config file is missing" | Ensure `config.json` is next to the app exe |
-| "deps not found" or scanner fails | Create `deps/` folder with ADB and OCR data (see [Installation](#installation)) |
-| App stuck on "Initializing Sidecar" | Windows Defender likely deleted `scanner_sidecar.exe`. Restore it from Windows Security > Protection History |
-| Sidecar won't start | Check `sidecar.log` in the app directory for errors |
-| Emulator not detected | Verify ADB is in `deps/platform-tools/` and emulator has ADB enabled |
+## Troubleshooting & Support
-**Wiki:** Check the [Wiki](https://github.com/Nexor256/RoK-Tracker/wiki/) for detailed guides.
+If you encounter any issues (such as the app not starting, the sidecar failing to initialize, or OCR errors), please check the comprehensive **[Troubleshooting Guide](https://github.com/Nexor256/RoK-Tracker/wiki/Troubleshooting)** on the Wiki.
**GitHub Discussions:** Post questions in [GitHub Discussions](https://github.com/Nexor256/RoK-Tracker/discussions).
-**Discord:** `cyrexxis` — available on the official RoK Server and the Chisgule server.
+**Discord:** `Castle256_` — available on the official RoK Server
When requesting help, please include:
@@ -359,6 +323,18 @@ When requesting help, please include:
---
+## Contributing
+
+Contributions are welcome! Here's how you can help:
+
+- **Report bugs** — open an [issue](https://github.com/Nexor256/RoK-Tracker/issues) with your `sidecar.log` and a description of the problem
+- **Suggest features** — start a thread in [GitHub Discussions](https://github.com/Nexor256/RoK-Tracker/discussions)
+- **Submit a pull request** — fork the repo, create a branch, and open a PR against `main`
+
+Please see [Advanced Installation (From Source)](#advanced-installation-from-source) to set up a development environment.
+
+---
+
## License
This project is licensed under the [MIT License](LICENSE).
diff --git a/app-icon.png b/app-icon.png
deleted file mode 100644
index a43fbcb..0000000
Binary files a/app-icon.png and /dev/null differ
diff --git a/config.json b/config.json
index 4236650..b5a94f2 100644
--- a/config.json
+++ b/config.json
@@ -1,37 +1,37 @@
{
- "scan": {
- "kingdom_name": "test",
- "people_to_scan": 300,
- "resume": false,
- "advanced_scroll": true,
- "track_inactives": false,
- "validate_power": false,
- "power_threshold": 100000,
- "validate_kills": true,
- "reconstruct_kills": true,
- "check_cityhall": false,
- "ch_auto_assign_power": 25000000,
- "timings": {
- "gov_open": 2.0,
- "copy_wait": 0.2,
- "kills_open": 1.0,
- "info_open": 1.0,
- "info_close": 0.5,
- "gov_close": 1.0,
- "max_random": 0.5
+ "scan": {
+ "kingdom_name": "test",
+ "people_to_scan": 10,
+ "resume": false,
+ "advanced_scroll": true,
+ "track_inactives": false,
+ "validate_power": false,
+ "power_threshold": 100000,
+ "validate_kills": true,
+ "reconstruct_kills": true,
+ "check_cityhall": false,
+ "ch_auto_assign_power": 25000000,
+ "timings": {
+ "gov_open": 2.0,
+ "copy_wait": 0.2,
+ "kills_open": 1.0,
+ "info_open": 1.0,
+ "info_close": 0.5,
+ "gov_close": 1.0,
+ "max_random": 0.5
+ },
+ "formats": {
+ "xlsx": true,
+ "csv": true,
+ "jsonl": false
+ }
},
- "formats": {
- "xlsx": true,
- "csv": false,
- "jsonl": false
+ "general": {
+ "emulator": "ld",
+ "bluestacks": {
+ "name": "BlueStacks App Player",
+ "config": "C:\\ProgramData\\BlueStacks_nxt\\bluestacks.conf"
+ },
+ "adb_port": 5555
}
- },
- "general": {
- "emulator": "bluestacks",
- "bluestacks": {
- "name": "BlueStacks App Player",
- "config": "C:\\ProgramData\\BlueStacks_nxt\\bluestacks.conf"
- },
- "adb_port": 5555
- }
-}
+}
\ No newline at end of file
diff --git a/gui_frontend/package.json b/gui_frontend/package.json
index 50df185..36b2537 100644
--- a/gui_frontend/package.json
+++ b/gui_frontend/package.json
@@ -14,12 +14,13 @@
"build": "vue-tsc --noEmit && vite build",
"preview": "vite preview",
"generate:zod": "tsx node_scripts/generateZod.ts",
- "generate:json-schema": "..\\venv\\Scripts\\python ..\\schema_generator.py"
+ "generate:json-schema": "uv run --directory .. schema_generator.py",
+ "generate:all": "pnpm run generate:json-schema && pnpm run generate:zod"
},
"dependencies": {
- "@tauri-apps/api": "^2.10.1",
+ "@tauri-apps/api": "^2.11.0",
"@tauri-apps/plugin-process": "^2.3.1",
- "@tauri-apps/plugin-updater": "^2.10.0",
+ "@tauri-apps/plugin-updater": "^2.10.1",
"@vueuse/components": "^12.4.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
@@ -35,7 +36,7 @@
"devDependencies": {
"@eslint/js": "^9.14.0",
"@tailwindcss/vite": "^4.0.0",
- "@tauri-apps/cli": "^2.10.1",
+ "@tauri-apps/cli": "^2.11.2",
"@types/node": "^20.5.9",
"@vitejs/plugin-vue": "^5.2.0",
"@vue/eslint-config-prettier": "^10.1.0",
diff --git a/gui_frontend/pnpm-lock.yaml b/gui_frontend/pnpm-lock.yaml
index 9dd5b3b..b4b5827 100644
--- a/gui_frontend/pnpm-lock.yaml
+++ b/gui_frontend/pnpm-lock.yaml
@@ -9,14 +9,14 @@ importers:
.:
dependencies:
'@tauri-apps/api':
- specifier: ^2.10.1
- version: 2.10.1
+ specifier: ^2.11.0
+ version: 2.11.0
'@tauri-apps/plugin-process':
specifier: ^2.3.1
version: 2.3.1
'@tauri-apps/plugin-updater':
- specifier: ^2.10.0
- version: 2.10.0
+ specifier: ^2.10.1
+ version: 2.10.1
'@vueuse/components':
specifier: ^12.4.0
version: 12.8.2(typescript@5.5.4)
@@ -58,8 +58,8 @@ importers:
specifier: ^4.0.0
version: 4.2.1(vite@6.4.1(@types/node@20.19.37)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0))
'@tauri-apps/cli':
- specifier: ^2.10.1
- version: 2.10.1
+ specifier: ^2.11.2
+ version: 2.11.2
'@types/node':
specifier: ^20.5.9
version: 20.19.37
@@ -598,66 +598,79 @@ packages:
resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==}
cpu: [arm]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-arm-musleabihf@4.59.0':
resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==}
cpu: [arm]
os: [linux]
+ libc: [musl]
'@rollup/rollup-linux-arm64-gnu@4.59.0':
resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-arm64-musl@4.59.0':
resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@rollup/rollup-linux-loong64-gnu@4.59.0':
resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==}
cpu: [loong64]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-loong64-musl@4.59.0':
resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==}
cpu: [loong64]
os: [linux]
+ libc: [musl]
'@rollup/rollup-linux-ppc64-gnu@4.59.0':
resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==}
cpu: [ppc64]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-ppc64-musl@4.59.0':
resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==}
cpu: [ppc64]
os: [linux]
+ libc: [musl]
'@rollup/rollup-linux-riscv64-gnu@4.59.0':
resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==}
cpu: [riscv64]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-riscv64-musl@4.59.0':
resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==}
cpu: [riscv64]
os: [linux]
+ libc: [musl]
'@rollup/rollup-linux-s390x-gnu@4.59.0':
resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==}
cpu: [s390x]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-x64-gnu@4.59.0':
resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-x64-musl@4.59.0':
resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@rollup/rollup-openbsd-x64@4.59.0':
resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==}
@@ -730,24 +743,28 @@ packages:
engines: {node: '>= 20'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@tailwindcss/oxide-linux-arm64-musl@4.2.1':
resolution: {integrity: sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@tailwindcss/oxide-linux-x64-gnu@4.2.1':
resolution: {integrity: sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==}
engines: {node: '>= 20'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@tailwindcss/oxide-linux-x64-musl@4.2.1':
resolution: {integrity: sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==}
engines: {node: '>= 20'}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@tailwindcss/oxide-wasm32-wasi@4.2.1':
resolution: {integrity: sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==}
@@ -790,85 +807,90 @@ packages:
peerDependencies:
vue: ^2.7.0 || ^3.0.0
- '@tauri-apps/api@2.10.1':
- resolution: {integrity: sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw==}
+ '@tauri-apps/api@2.11.0':
+ resolution: {integrity: sha512-7CinYODhky9lmO23xHnUFv0Xt43fbtWMyxZcLcRBlFkcgXKuEirBvHpmtJ89YMhyeGcq20Wuc47Fa4XjyniywA==}
- '@tauri-apps/cli-darwin-arm64@2.10.1':
- resolution: {integrity: sha512-Z2OjCXiZ+fbYZy7PmP3WRnOpM9+Fy+oonKDEmUE6MwN4IGaYqgceTjwHucc/kEEYZos5GICve35f7ZiizgqEnQ==}
+ '@tauri-apps/cli-darwin-arm64@2.11.2':
+ resolution: {integrity: sha512-+4UZzLt+eOAEQCwgd+TqKgyUJMrvx+BgdXLLaqJYmPqzP+nE6YZr/hY6CWLYGQb8jFn99jEkmC6uA3tNvamA1w==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@tauri-apps/cli-darwin-x64@2.10.1':
- resolution: {integrity: sha512-V/irQVvjPMGOTQqNj55PnQPVuH4VJP8vZCN7ajnj+ZS8Kom1tEM2hR3qbbIRoS3dBKs5mbG8yg1WC+97dq17Pw==}
+ '@tauri-apps/cli-darwin-x64@2.11.2':
+ resolution: {integrity: sha512-VjYYtZUPqDMLutSfJEyxFE3Bz+DPi7c8wC3imckgvciLDZLq4qwKJxBicg0BXGhXjJsl8vKWgWRFNMPELQ+Xyg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@tauri-apps/cli-linux-arm-gnueabihf@2.10.1':
- resolution: {integrity: sha512-Hyzwsb4VnCWKGfTw+wSt15Z2pLw2f0JdFBfq2vHBOBhvg7oi6uhKiF87hmbXOBXUZaGkyRDkCHsdzJcIfoJC2w==}
+ '@tauri-apps/cli-linux-arm-gnueabihf@2.11.2':
+ resolution: {integrity: sha512-yMemD6f4i95AQriS8EazyOFzbE34yjnP16i3IOzpHGQvBoy2DjypFMFBq0NtPuITURv/cOGguRtHR5d79/9CSA==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
- '@tauri-apps/cli-linux-arm64-gnu@2.10.1':
- resolution: {integrity: sha512-OyOYs2t5GkBIvyWjA1+h4CZxTcdz1OZPCWAPz5DYEfB0cnWHERTnQ/SLayQzncrT0kwRoSfSz9KxenkyJoTelA==}
+ '@tauri-apps/cli-linux-arm64-gnu@2.11.2':
+ resolution: {integrity: sha512-cgI91D2wL8GSgoWwZXDqt+DwnuZCP2/bz03QAE4TrhgAKIsrB4hX26W/H1EONPUUNkqrsgeCD0wU6pcNjV/5kw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
- '@tauri-apps/cli-linux-arm64-musl@2.10.1':
- resolution: {integrity: sha512-MIj78PDDGjkg3NqGptDOGgfXks7SYJwhiMh8SBoZS+vfdz7yP5jN18bNaLnDhsVIPARcAhE1TlsZe/8Yxo2zqg==}
+ '@tauri-apps/cli-linux-arm64-musl@2.11.2':
+ resolution: {integrity: sha512-X1rm0BERqAAggtYTESSgXrS3sz4Sb/OiPiz54UqISlXW+GkR3vNIGnsy/lejNmoXGVqri3Q53BCfQiclOIyRPw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
- '@tauri-apps/cli-linux-riscv64-gnu@2.10.1':
- resolution: {integrity: sha512-X0lvOVUg8PCVaoEtEAnpxmnkwlE1gcMDTqfhbefICKDnOTJ5Est3qL0SrWxizDackIOKBcvtpejrSiVpuJI1kw==}
+ '@tauri-apps/cli-linux-riscv64-gnu@2.11.2':
+ resolution: {integrity: sha512-usbMLJbT3KtkOrBMDVeGYNM35aTHXx38SJSzTMSqqjeUIOQ+iVPjb2yAGNAE+KqmBbAx4FOFIyMeKXx2M/JKGQ==}
engines: {node: '>= 10'}
cpu: [riscv64]
os: [linux]
+ libc: [glibc]
- '@tauri-apps/cli-linux-x64-gnu@2.10.1':
- resolution: {integrity: sha512-2/12bEzsJS9fAKybxgicCDFxYD1WEI9kO+tlDwX5znWG2GwMBaiWcmhGlZ8fi+DMe9CXlcVarMTYc0L3REIRxw==}
+ '@tauri-apps/cli-linux-x64-gnu@2.11.2':
+ resolution: {integrity: sha512-Ru4gwJKPG0ctVGchRGpRup4Y4lW2SSfFnrbQcyHhCliKy4g8Qz97TrUgCur4CbWyAgKxvGh3SjrkA0LDYzDGiw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
- '@tauri-apps/cli-linux-x64-musl@2.10.1':
- resolution: {integrity: sha512-Y8J0ZzswPz50UcGOFuXGEMrxbjwKSPgXftx5qnkuMs2rmwQB5ssvLb6tn54wDSYxe7S6vlLob9vt0VKuNOaCIQ==}
+ '@tauri-apps/cli-linux-x64-musl@2.11.2':
+ resolution: {integrity: sha512-eUm7T6clN1MMmNSRQ9gaWsQdyehQx2Gmn5hht/QUlqZQI/qcP2OJK5dnaxqwFzCr2HdsEo9ydxaqcS1oJzMvUw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
+ libc: [musl]
- '@tauri-apps/cli-win32-arm64-msvc@2.10.1':
- resolution: {integrity: sha512-iSt5B86jHYAPJa/IlYw++SXtFPGnWtFJriHn7X0NFBVunF6zu9+/zOn8OgqIWSl8RgzhLGXQEEtGBdR4wzpVgg==}
+ '@tauri-apps/cli-win32-arm64-msvc@2.11.2':
+ resolution: {integrity: sha512-HeeZW80jU+gVTOEX4X/hC6NVSAdDVXajwP5fxIZ/3z9WvUC7qrudX2GMTilYq6Dg0e0sk0XgsAJD1hZ5wPBXUA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@tauri-apps/cli-win32-ia32-msvc@2.10.1':
- resolution: {integrity: sha512-gXyxgEzsFegmnWywYU5pEBURkcFN/Oo45EAwvZrHMh+zUSEAvO5E8TXsgPADYm31d1u7OQU3O3HsYfVBf2moHw==}
+ '@tauri-apps/cli-win32-ia32-msvc@2.11.2':
+ resolution: {integrity: sha512-YhjQNZcXfbkCLyazSv1nPnJ9iRFE1wm6kc51FDbU10/Dk09io+6PAGMLjkxnX2GdM0qMnDmTjstY8mTDVvtKeA==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
- '@tauri-apps/cli-win32-x64-msvc@2.10.1':
- resolution: {integrity: sha512-6Cn7YpPFwzChy0ERz6djKEmUehWrYlM+xTaNzGPgZocw3BD7OfwfWHKVWxXzdjEW2KfKkHddfdxK1XXTYqBRLg==}
+ '@tauri-apps/cli-win32-x64-msvc@2.11.2':
+ resolution: {integrity: sha512-d2JchlFIpZevZVReyqhQOekJmb1UH3rhZ5VX6sH3ty9ETE0TKQavpihvoScUXfKKpW6HZC0MrFGRU0ZtD+w3gA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
- '@tauri-apps/cli@2.10.1':
- resolution: {integrity: sha512-jQNGF/5quwORdZSSLtTluyKQ+o6SMa/AUICfhf4egCGFdMHqWssApVgYSbg+jmrZoc8e1DscNvjTnXtlHLS11g==}
+ '@tauri-apps/cli@2.11.2':
+ resolution: {integrity: sha512-bk3HemqvGRoy+5D/dVMUQHKMYLglD0jVnMm/0iGMH6ufZ+p8r14m6BpIixwij3PBvZdvORUp1YifTD8QxVZ1Nw==}
engines: {node: '>= 10'}
hasBin: true
'@tauri-apps/plugin-process@2.3.1':
resolution: {integrity: sha512-nCa4fGVaDL/B9ai03VyPOjfAHRHSBz5v6F/ObsB73r/dA3MHHhZtldaDMIc0V/pnUw9ehzr2iEG+XkSEyC0JJA==}
- '@tauri-apps/plugin-updater@2.10.0':
- resolution: {integrity: sha512-ljN8jPlnT0aSn8ecYhuBib84alxfMx6Hc8vJSKMJyzGbTPFZAC44T2I1QNFZssgWKrAlofvJqCC6Rr472JWfkQ==}
+ '@tauri-apps/plugin-updater@2.10.1':
+ resolution: {integrity: sha512-NFYMg+tWOZPJdzE/PpFj2qfqwAWwNS3kXrb1tm1gnBJ9mYzZ4WDRrwy8udzWoAnfGCHLuePNLY1WVCNHnh3eRA==}
'@types/esrecurse@4.3.1':
resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==}
@@ -1633,24 +1655,28 @@ packages:
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
lightningcss-linux-arm64-musl@1.31.1:
resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
lightningcss-linux-x64-gnu@1.31.1:
resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
lightningcss-linux-x64-musl@1.31.1:
resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
+ libc: [musl]
lightningcss-win32-arm64-msvc@1.31.1:
resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==}
@@ -1680,6 +1706,7 @@ packages:
lucide-vue-next@0.469.0:
resolution: {integrity: sha512-EjOap+vY3xEzCMrnaccDHO4BH3k3Lr+sOyvzRQCaayYxkxKla0w6Jr4h3cHAzA4vMSp63Dcy7vDiGeCPcCY+Gg==}
+ deprecated: Package deprecated. Please use @lucide/vue instead.
peerDependencies:
vue: '>=3.0.1'
@@ -1965,6 +1992,7 @@ packages:
theme-toggles@4.10.1:
resolution: {integrity: sha512-PCvj0cB+3JOv8gUXjvp+/7Nu7hSLAYCwmxsAjltIhUUpF6NPn3jDMo64KCu2S2HQe+lGAEM01f2hDzqlPg3bsQ==}
+ deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
tiny-invariant@1.3.3:
resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
@@ -2652,62 +2680,62 @@ snapshots:
'@tanstack/virtual-core': 3.13.22
vue: 3.5.30(typescript@5.5.4)
- '@tauri-apps/api@2.10.1': {}
+ '@tauri-apps/api@2.11.0': {}
- '@tauri-apps/cli-darwin-arm64@2.10.1':
+ '@tauri-apps/cli-darwin-arm64@2.11.2':
optional: true
- '@tauri-apps/cli-darwin-x64@2.10.1':
+ '@tauri-apps/cli-darwin-x64@2.11.2':
optional: true
- '@tauri-apps/cli-linux-arm-gnueabihf@2.10.1':
+ '@tauri-apps/cli-linux-arm-gnueabihf@2.11.2':
optional: true
- '@tauri-apps/cli-linux-arm64-gnu@2.10.1':
+ '@tauri-apps/cli-linux-arm64-gnu@2.11.2':
optional: true
- '@tauri-apps/cli-linux-arm64-musl@2.10.1':
+ '@tauri-apps/cli-linux-arm64-musl@2.11.2':
optional: true
- '@tauri-apps/cli-linux-riscv64-gnu@2.10.1':
+ '@tauri-apps/cli-linux-riscv64-gnu@2.11.2':
optional: true
- '@tauri-apps/cli-linux-x64-gnu@2.10.1':
+ '@tauri-apps/cli-linux-x64-gnu@2.11.2':
optional: true
- '@tauri-apps/cli-linux-x64-musl@2.10.1':
+ '@tauri-apps/cli-linux-x64-musl@2.11.2':
optional: true
- '@tauri-apps/cli-win32-arm64-msvc@2.10.1':
+ '@tauri-apps/cli-win32-arm64-msvc@2.11.2':
optional: true
- '@tauri-apps/cli-win32-ia32-msvc@2.10.1':
+ '@tauri-apps/cli-win32-ia32-msvc@2.11.2':
optional: true
- '@tauri-apps/cli-win32-x64-msvc@2.10.1':
+ '@tauri-apps/cli-win32-x64-msvc@2.11.2':
optional: true
- '@tauri-apps/cli@2.10.1':
+ '@tauri-apps/cli@2.11.2':
optionalDependencies:
- '@tauri-apps/cli-darwin-arm64': 2.10.1
- '@tauri-apps/cli-darwin-x64': 2.10.1
- '@tauri-apps/cli-linux-arm-gnueabihf': 2.10.1
- '@tauri-apps/cli-linux-arm64-gnu': 2.10.1
- '@tauri-apps/cli-linux-arm64-musl': 2.10.1
- '@tauri-apps/cli-linux-riscv64-gnu': 2.10.1
- '@tauri-apps/cli-linux-x64-gnu': 2.10.1
- '@tauri-apps/cli-linux-x64-musl': 2.10.1
- '@tauri-apps/cli-win32-arm64-msvc': 2.10.1
- '@tauri-apps/cli-win32-ia32-msvc': 2.10.1
- '@tauri-apps/cli-win32-x64-msvc': 2.10.1
+ '@tauri-apps/cli-darwin-arm64': 2.11.2
+ '@tauri-apps/cli-darwin-x64': 2.11.2
+ '@tauri-apps/cli-linux-arm-gnueabihf': 2.11.2
+ '@tauri-apps/cli-linux-arm64-gnu': 2.11.2
+ '@tauri-apps/cli-linux-arm64-musl': 2.11.2
+ '@tauri-apps/cli-linux-riscv64-gnu': 2.11.2
+ '@tauri-apps/cli-linux-x64-gnu': 2.11.2
+ '@tauri-apps/cli-linux-x64-musl': 2.11.2
+ '@tauri-apps/cli-win32-arm64-msvc': 2.11.2
+ '@tauri-apps/cli-win32-ia32-msvc': 2.11.2
+ '@tauri-apps/cli-win32-x64-msvc': 2.11.2
'@tauri-apps/plugin-process@2.3.1':
dependencies:
- '@tauri-apps/api': 2.10.1
+ '@tauri-apps/api': 2.11.0
- '@tauri-apps/plugin-updater@2.10.0':
+ '@tauri-apps/plugin-updater@2.10.1':
dependencies:
- '@tauri-apps/api': 2.10.1
+ '@tauri-apps/api': 2.11.0
'@types/esrecurse@4.3.1': {}
diff --git a/gui_frontend/public/favicon.ico b/gui_frontend/public/favicon.ico
index ae7bbdb..3a987bc 100644
Binary files a/gui_frontend/public/favicon.ico and b/gui_frontend/public/favicon.ico differ
diff --git a/gui_frontend/src/pages/SettingsPage.vue b/gui_frontend/src/pages/SettingsPage.vue
index 9f8f8cf..dbadc1e 100644
--- a/gui_frontend/src/pages/SettingsPage.vue
+++ b/gui_frontend/src/pages/SettingsPage.vue
@@ -18,7 +18,7 @@
BlueStacks
Nox
- LDPlayer
+ LD Player 9
MEmu
diff --git a/images/LD Player-dispaly.png b/images/LD Player-dispaly.png
new file mode 100644
index 0000000..4a5bdd7
Binary files /dev/null and b/images/LD Player-dispaly.png differ
diff --git a/images/LD Player-others.png b/images/LD Player-others.png
new file mode 100644
index 0000000..3db2d52
Binary files /dev/null and b/images/LD Player-others.png differ
diff --git a/images/bluestacks-advanced.png b/images/bluestacks-advanced.png
index fa6f4c6..fb61990 100644
Binary files a/images/bluestacks-advanced.png and b/images/bluestacks-advanced.png differ
diff --git a/images/bluestacks-display.png b/images/bluestacks-display.png
index ff59a68..bd3fe49 100644
Binary files a/images/bluestacks-display.png and b/images/bluestacks-display.png differ
diff --git a/images/excel-example.png b/images/excel-example.png
index c9de673..f4a4f25 100644
Binary files a/images/excel-example.png and b/images/excel-example.png differ
diff --git a/package.json b/package.json
deleted file mode 100644
index 650eb8b..0000000
--- a/package.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "name": "rok-tracker-suite",
- "version": "0.0.1",
- "description": "RoK Tracker Suite",
- "productName": "Rok Tracker Suite",
- "author": "Nexor256",
- "type": "module",
- "private": true,
- "scripts": {
- "lint": "cd gui_frontend && yarpm run lint",
- "format": "cd gui_frontend && yarpm run format",
- "test": "cd gui_frontend && yarpm run test",
- "dev": "cd gui_frontend && yarpm run dev",
- "build": "cd gui_frontend && yarpm run build",
- "build:app": "yarpm run build && .\\venv\\Scripts\\pyinstaller windows.spec",
- "postinstall": "cd gui_frontend && yarpm install",
- "start:app": "yarpm run build && yarpm run run:py",
- "dev:py": "concurrently --kill-others -n VITE,PYTHON -c bgGreen.bold,bgBlue.bold \"yarpm run dev\" \"dotenv -- cross-replace yarn run run:py --DEVELOPMENT 1 --DEV_SERVER_PORT $DEV_SERVER_PORT\"",
- "dev:tauri": "npx --prefix gui_frontend tauri dev",
- "build:tauri": "npx --prefix gui_frontend tauri build",
- "run:py": ".\\venv\\Scripts\\python .\\main.py",
- "generate:zod": "cd gui_frontend && yarpm run generate:zod",
- "generate:json-schema": ".\\venv\\Scripts\\python .\\schema_generator.py",
- "generate:all": "yarpm run generate:json-schema && yarpm run generate:zod"
- },
- "devDependencies": {
- "concurrently": "^9.1.0",
- "cross-replace": "^0.2.0",
- "dotenv-cli": "^8.0.0",
- "yarpm": "^1.2.0"
- },
- "engines": {
- "node": "^28 || ^26 || ^24 || ^22 || ^20 || ^18",
- "npm": ">= 6.13.4",
- "yarn": ">= 1.21.1"
- }
-}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
deleted file mode 100644
index f8d2155..0000000
--- a/pnpm-lock.yaml
+++ /dev/null
@@ -1,315 +0,0 @@
-lockfileVersion: '9.0'
-
-settings:
- autoInstallPeers: true
- excludeLinksFromLockfile: false
-
-importers:
-
- .:
- devDependencies:
- concurrently:
- specifier: ^9.1.0
- version: 9.1.2
- cross-replace:
- specifier: ^0.2.0
- version: 0.2.0
- dotenv-cli:
- specifier: ^8.0.0
- version: 8.0.0
- yarpm:
- specifier: ^1.2.0
- version: 1.2.0
-
-packages:
-
- ansi-regex@5.0.1:
- resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
- engines: {node: '>=8'}
-
- ansi-styles@4.3.0:
- resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
- engines: {node: '>=8'}
-
- chalk@4.1.2:
- resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
- engines: {node: '>=10'}
-
- cliui@8.0.1:
- resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
- engines: {node: '>=12'}
-
- color-convert@2.0.1:
- resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
- engines: {node: '>=7.0.0'}
-
- color-name@1.1.4:
- resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
-
- command-exists@1.2.9:
- resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==}
-
- concurrently@9.1.2:
- resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==}
- engines: {node: '>=18'}
- hasBin: true
-
- cross-replace@0.2.0:
- resolution: {integrity: sha512-LF8ZXUDGw5yy8YHPzw4RbOtJJG6NVxpxvEAJZwJgMyLV/wBJonG39vWBDS168nS4ImYP59mPkXj/5ezMOAuzwQ==}
- hasBin: true
-
- cross-spawn@7.0.6:
- resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
- engines: {node: '>= 8'}
-
- dotenv-cli@8.0.0:
- resolution: {integrity: sha512-aLqYbK7xKOiTMIRf1lDPbI+Y+Ip/wo5k3eyp6ePysVaSqbyxjyK3dK35BTxG+rmd7djf5q2UPs4noPNH+cj0Qw==}
- hasBin: true
-
- dotenv-expand@10.0.0:
- resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==}
- engines: {node: '>=12'}
-
- dotenv@16.4.7:
- resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==}
- engines: {node: '>=12'}
-
- emoji-regex@8.0.0:
- resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
-
- escalade@3.2.0:
- resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
- engines: {node: '>=6'}
-
- get-caller-file@2.0.5:
- resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
- engines: {node: 6.* || 8.* || >= 10.*}
-
- has-flag@4.0.0:
- resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
- engines: {node: '>=8'}
-
- is-fullwidth-code-point@3.0.0:
- resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
- engines: {node: '>=8'}
-
- isexe@2.0.0:
- resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
-
- lodash@4.17.21:
- resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
-
- minimist@1.2.8:
- resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
-
- path-key@3.1.1:
- resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
- engines: {node: '>=8'}
-
- require-directory@2.1.1:
- resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
- engines: {node: '>=0.10.0'}
-
- rxjs@7.8.1:
- resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
-
- shebang-command@2.0.0:
- resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
- engines: {node: '>=8'}
-
- shebang-regex@3.0.0:
- resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
- engines: {node: '>=8'}
-
- shell-quote@1.8.2:
- resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==}
- engines: {node: '>= 0.4'}
-
- string-width@4.2.3:
- resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
- engines: {node: '>=8'}
-
- strip-ansi@6.0.1:
- resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
- engines: {node: '>=8'}
-
- supports-color@7.2.0:
- resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
- engines: {node: '>=8'}
-
- supports-color@8.1.1:
- resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
- engines: {node: '>=10'}
-
- tree-kill@1.2.2:
- resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
- hasBin: true
-
- tslib@2.8.1:
- resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
-
- which@2.0.2:
- resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
- engines: {node: '>= 8'}
- hasBin: true
-
- wrap-ansi@7.0.0:
- resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
- engines: {node: '>=10'}
-
- y18n@5.0.8:
- resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
- engines: {node: '>=10'}
-
- yargs-parser@21.1.1:
- resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
- engines: {node: '>=12'}
-
- yargs@17.7.2:
- resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
- engines: {node: '>=12'}
-
- yarpm@1.2.0:
- resolution: {integrity: sha512-gxN4Ali09uey8EpLfbYG+bTXf1hF6TA5oAXFPpKi5Nt5aztXU9AIEksXE0lpuvC50vL4De/KIeP8JXgYOZ8KbQ==}
- hasBin: true
-
-snapshots:
-
- ansi-regex@5.0.1: {}
-
- ansi-styles@4.3.0:
- dependencies:
- color-convert: 2.0.1
-
- chalk@4.1.2:
- dependencies:
- ansi-styles: 4.3.0
- supports-color: 7.2.0
-
- cliui@8.0.1:
- dependencies:
- string-width: 4.2.3
- strip-ansi: 6.0.1
- wrap-ansi: 7.0.0
-
- color-convert@2.0.1:
- dependencies:
- color-name: 1.1.4
-
- color-name@1.1.4: {}
-
- command-exists@1.2.9: {}
-
- concurrently@9.1.2:
- dependencies:
- chalk: 4.1.2
- lodash: 4.17.21
- rxjs: 7.8.1
- shell-quote: 1.8.2
- supports-color: 8.1.1
- tree-kill: 1.2.2
- yargs: 17.7.2
-
- cross-replace@0.2.0:
- dependencies:
- cross-spawn: 7.0.6
-
- cross-spawn@7.0.6:
- dependencies:
- path-key: 3.1.1
- shebang-command: 2.0.0
- which: 2.0.2
-
- dotenv-cli@8.0.0:
- dependencies:
- cross-spawn: 7.0.6
- dotenv: 16.4.7
- dotenv-expand: 10.0.0
- minimist: 1.2.8
-
- dotenv-expand@10.0.0: {}
-
- dotenv@16.4.7: {}
-
- emoji-regex@8.0.0: {}
-
- escalade@3.2.0: {}
-
- get-caller-file@2.0.5: {}
-
- has-flag@4.0.0: {}
-
- is-fullwidth-code-point@3.0.0: {}
-
- isexe@2.0.0: {}
-
- lodash@4.17.21: {}
-
- minimist@1.2.8: {}
-
- path-key@3.1.1: {}
-
- require-directory@2.1.1: {}
-
- rxjs@7.8.1:
- dependencies:
- tslib: 2.8.1
-
- shebang-command@2.0.0:
- dependencies:
- shebang-regex: 3.0.0
-
- shebang-regex@3.0.0: {}
-
- shell-quote@1.8.2: {}
-
- string-width@4.2.3:
- dependencies:
- emoji-regex: 8.0.0
- is-fullwidth-code-point: 3.0.0
- strip-ansi: 6.0.1
-
- strip-ansi@6.0.1:
- dependencies:
- ansi-regex: 5.0.1
-
- supports-color@7.2.0:
- dependencies:
- has-flag: 4.0.0
-
- supports-color@8.1.1:
- dependencies:
- has-flag: 4.0.0
-
- tree-kill@1.2.2: {}
-
- tslib@2.8.1: {}
-
- which@2.0.2:
- dependencies:
- isexe: 2.0.0
-
- wrap-ansi@7.0.0:
- dependencies:
- ansi-styles: 4.3.0
- string-width: 4.2.3
- strip-ansi: 6.0.1
-
- y18n@5.0.8: {}
-
- yargs-parser@21.1.1: {}
-
- yargs@17.7.2:
- dependencies:
- cliui: 8.0.1
- escalade: 3.2.0
- get-caller-file: 2.0.5
- require-directory: 2.1.1
- string-width: 4.2.3
- y18n: 5.0.8
- yargs-parser: 21.1.1
-
- yarpm@1.2.0:
- dependencies:
- command-exists: 1.2.9
- cross-spawn: 7.0.6
diff --git a/pyproject.toml b/pyproject.toml
index af69c5e..aad0012 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,10 +1,62 @@
[project]
name = "roktracker"
-version = "1.0.0"
-requires-python = ">=3.10"
+requires-python = ">=3.14"
+dynamic = ["version"]
+
+dependencies = [
+ "altgraph==0.17.4",
+ "androidviewclient==24.1.0",
+ "certifi==2024.12.14",
+ "cffi==1.17.1",
+ "charset-normalizer==3.4.1",
+ "clr_loader==0.2.7.post0",
+ "contourpy==1.3.1",
+ "culebratester-client==2.0.73",
+ "cycler==0.12.1",
+ "et_xmlfile==2.0.0",
+ "fonttools==4.55.3",
+ "idna==3.10",
+ "kiwisolver==1.4.8",
+ "markdown-it-py==3.0.0",
+ "mdurl==0.1.2",
+ "nuitka>=2.6",
+ "numpy>=2.4.0",
+ "opencv-python-headless>=4.11.0",
+ "openpyxl==3.1.5",
+ "ordered-set>=4.1.0",
+ "packaging==24.2",
+ "pandas==2.2.3",
+ "pathvalidate==3.2.3",
+ "pydantic>=2.13.0",
+ "pydantic-settings>=2.14.0",
+ "pefile==2023.2.7",
+ "pillow>=12.0.0",
+ "prompt_toolkit==3.0.50",
+ "proxy_tools==0.1.0",
+ "pycparser==2.22",
+ "Pygments==2.19.1",
+ "pyparsing==3.2.1",
+ "python-dateutil==2.9.0.post0",
+ "pythonnet==3.0.5",
+ "pytz==2024.2",
+ "pywin32-ctypes==0.2.3",
+ "questionary==2.1.0",
+ "requests==2.32.3",
+ "rich==13.9.4",
+ "setuptools==75.8.0",
+ "six==1.17.0",
+ "typing_extensions>=4.14.1",
+ "tzdata==2024.2",
+ "urllib3==2.3.0",
+ "wcwidth==0.2.13",
+ "XlsxWriter==3.2.0",
+ "zstandard>=0.23.0",
+ "tesserocr @ https://github.com/simonflueckiger/tesserocr-windows_build/releases/download/tesserocr-v2.10.0-tesseract-5.5.2/tesserocr-2.10.0-cp314-cp314-win_amd64.whl ; platform_machine == 'AMD64' or platform_machine == 'x86_64'",
+ "tesserocr @ https://github.com/simonflueckiger/tesserocr-windows_build/releases/download/tesserocr-v2.10.0-tesseract-5.5.2/tesserocr-2.10.0-cp314-cp314-win32.whl ; platform_machine == 'x86' or platform_machine == 'i386'",
+]
[tool.ruff]
-target-version = "py310"
+target-version = "py314"
line-length = 100
[tool.ruff.lint]
@@ -28,3 +80,10 @@ known-first-party = ["roktracker"]
[tool.ruff.format]
quote-style = "double"
indent-style = "space"
+
+[tool.uv]
+package = false
+
+[tool.setuptools.packages.find]
+where = ["."]
+include = ["roktracker*"]
diff --git a/requirements_win32.txt b/requirements_win32.txt
deleted file mode 100644
index 41889cb..0000000
--- a/requirements_win32.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-altgraph==0.17.4
-androidviewclient==24.1.0
-certifi==2024.12.14
-cffi==1.17.1
-charset-normalizer==3.4.1
-clr_loader==0.2.7.post0
-contourpy==1.3.1
-culebratester-client==2.0.73
-cycler==0.12.1
-et_xmlfile==2.0.0
-fonttools==4.55.3
-idna==3.10
-kiwisolver==1.4.8
-markdown-it-py==3.0.0
-mdurl==0.1.2
-nuitka>=2.6
-numpy==2.2.2
-opencv-python-headless==4.11.0.86
-openpyxl==3.1.5
-ordered-set>=4.1.0
-packaging==24.2
-pandas==2.2.3
-pathvalidate==3.2.3
-pydantic==2.10.0
-pydantic-settings==2.4.0
-pefile==2023.2.7
-pillow==11.1.0
-prompt_toolkit==3.0.50
-proxy_tools==0.1.0
-pycparser==2.22
-Pygments==2.19.1
-pyparsing==3.2.1
-python-dateutil==2.9.0.post0
-pythonnet==3.0.5
-pytz==2024.2
-pywin32-ctypes==0.2.3
-questionary==2.1.0
-requests==2.32.3
-rich==13.9.4
-setuptools==75.8.0
-six==1.17.0
-tesserocr @ https://github.com/simonflueckiger/tesserocr-windows_build/releases/download/tesserocr-v2.8.0-tesseract-5.5.0/tesserocr-2.8.0-cp313-cp313-win32.whl
-typing_extensions==4.12.2
-tzdata==2024.2
-urllib3==2.3.0
-wcwidth==0.2.13
-XlsxWriter==3.2.0
-zstandard>=0.23.0
diff --git a/requirements_win64.txt b/requirements_win64.txt
deleted file mode 100644
index 4ee1bfa..0000000
--- a/requirements_win64.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-altgraph==0.17.4
-androidviewclient==24.1.0
-certifi==2024.12.14
-cffi==1.17.1
-charset-normalizer==3.4.1
-clr_loader==0.2.7.post0
-contourpy==1.3.1
-culebratester-client==2.0.73
-cycler==0.12.1
-et_xmlfile==2.0.0
-fonttools==4.55.3
-idna==3.10
-kiwisolver==1.4.8
-markdown-it-py==3.0.0
-mdurl==0.1.2
-nuitka>=2.6
-numpy==2.2.2
-opencv-python-headless==4.11.0.86
-openpyxl==3.1.5
-ordered-set>=4.1.0
-packaging==24.2
-pandas==2.2.3
-pathvalidate==3.2.3
-pydantic==2.10.0
-pydantic-settings==2.4.0
-pefile==2023.2.7
-pillow==11.1.0
-prompt_toolkit==3.0.50
-proxy_tools==0.1.0
-pycparser==2.22
-Pygments==2.19.1
-pyparsing==3.2.1
-python-dateutil==2.9.0.post0
-pythonnet==3.0.5
-pytz==2024.2
-pywin32-ctypes==0.2.3
-questionary==2.1.0
-requests==2.32.3
-rich==13.9.4
-setuptools==75.8.0
-six==1.17.0
-tesserocr @ https://github.com/simonflueckiger/tesserocr-windows_build/releases/download/tesserocr-v2.8.0-tesseract-5.5.0/tesserocr-2.8.0-cp312-cp312-win_amd64.whl
-typing_extensions==4.12.2
-tzdata==2024.2
-urllib3==2.3.0
-wcwidth==0.2.13
-XlsxWriter==3.2.0
-zstandard>=0.23.0
diff --git a/roktracker/kingdom/scanner.py b/roktracker/kingdom/scanner.py
index c1d1c7c..7fc0a32 100644
--- a/roktracker/kingdom/scanner.py
+++ b/roktracker/kingdom/scanner.py
@@ -46,6 +46,9 @@ def get_clipboard_text_ctypes() -> str:
kernel32.GlobalUnlock.argtypes = [wintypes.HANDLE]
kernel32.GlobalUnlock.restype = wintypes.BOOL
+ kernel32.GlobalSize.argtypes = [wintypes.HANDLE]
+ kernel32.GlobalSize.restype = ctypes.c_size_t
+
CF_UNICODETEXT = 13
if not user32.OpenClipboard(None):
@@ -61,7 +64,13 @@ def get_clipboard_text_ctypes() -> str:
raise RuntimeError("Failed to lock clipboard data")
try:
- val = ctypes.c_wchar_p(ptr).value
+ size = kernel32.GlobalSize(handle)
+ if size > 0:
+ raw_bytes = ctypes.string_at(ptr, size)
+ val = raw_bytes.decode('utf-16-le', errors='ignore')
+ else:
+ val = ctypes.c_wchar_p(ptr).value
+
if not val:
raise RuntimeError("Clipboard is empty")
return val
@@ -70,6 +79,14 @@ def get_clipboard_text_ctypes() -> str:
finally:
user32.CloseClipboard()
+def empty_clipboard():
+ user32 = ctypes.windll.user32
+ if not user32.OpenClipboard(None):
+ return
+ try:
+ user32.EmptyClipboard()
+ finally:
+ user32.CloseClipboard()
def parse_clipboard_parcel(raw: str) -> str:
"""Extract clipboard text from Android 'service call clipboard' parcel output.
@@ -284,27 +301,62 @@ def set_continue_handler(self, cb: Callable[[str], bool]):
def set_output_handler(self, cb: Callable[[str], None]):
self.output_handler = cb
+ def _get_android_api_level(self) -> int:
+ """Get the Android API level of the connected emulator (cached)."""
+ if hasattr(self, '_android_api_level'):
+ return self._android_api_level
+ try:
+ result = self.adb_client.secure_adb_shell(
+ "getprop ro.build.version.sdk"
+ )
+ level = int(result.strip())
+ self._android_api_level = level
+ logger.info(f"Detected Android API level: {level}")
+ return level
+ except Exception as e:
+ logger.debug(f"Failed to detect Android API level: {e}")
+ self._android_api_level = 0
+ return 0
+
def _read_clipboard_via_adb(self) -> str:
"""Read clipboard text directly from the Android emulator via ADB.
- Tries multiple ADB methods in order of reliability.
- This bypasses the emulator's (often broken) clipboard sync to Windows.
+ The clipboard service method number for getPrimaryClip depends on
+ the Android version:
+ - Android 5-8 (API 21-27): method 2 = getPrimaryClip
+ - Android 9+ (API 28+) : method 3 = getPrimaryClip
+ method 2 = clearPrimaryClip (destructive!)
+ We detect the API level once and use the correct method.
"""
- # Method 1: service call clipboard (Android 5+)
- try:
- raw = self.adb_client.secure_adb_shell(
- "service call clipboard 2 s16 com.android.shell"
- )
- # logger.info(f"ADB clipboard raw: {raw[:300]!r}")
- parsed = parse_clipboard_parcel(raw)
- if parsed:
- logger.info(f"ADB clipboard parsed name: {parsed!r}")
- return parsed
- else:
- logger.info("ADB clipboard parse returned empty")
- except Exception as e:
- logger.debug(f"ADB clipboard service call failed: {e}")
+ api_level = self._get_android_api_level()
+
+ if api_level >= 28:
+ # Android 9+: getPrimaryClip is method 3.
+ # Method 2 is clearPrimaryClip — must NOT be called.
+ methods = [3]
+ elif api_level > 0:
+ # Android 5-8: getPrimaryClip is method 2.
+ methods = [2]
+ else:
+ # Unknown version: try 3 first (safe read-only on all versions),
+ # then 2 as fallback.
+ methods = [3, 2]
+
+ for method_num in methods:
+ try:
+ raw = self.adb_client.secure_adb_shell(
+ f"service call clipboard {method_num} s16 com.android.shell"
+ )
+ parsed = parse_clipboard_parcel(raw)
+ if parsed:
+ logger.info(
+ f"ADB clipboard (method {method_num}) parsed name: {parsed!r}"
+ )
+ return parsed
+ except Exception as e:
+ logger.debug(f"ADB clipboard method {method_num} failed: {e}")
+ logger.info("ADB clipboard parse returned empty")
return ""
def _copy_governor_name(self, tap_positions: dict) -> str:
@@ -317,6 +369,9 @@ def _copy_governor_name(self, tap_positions: dict) -> str:
3. Fall back to reading the Windows clipboard
"""
for attempt in range(3):
+ # Clear Windows clipboard before copying so we can detect when the new value arrives
+ empty_clipboard()
+
# Tap the name-copy button
self.adb_client.secure_adb_tap(tap_positions["name_copy"])
wait_random_range(
@@ -333,7 +388,9 @@ def _copy_governor_name(self, tap_positions: dict) -> str:
try:
name = get_clipboard_text_ctypes()
if name:
- return name
+ cleaned = clean_clipboard_name(name)
+ if cleaned:
+ return cleaned
except Exception:
pass
time.sleep(0.1)
diff --git a/roktracker/utils/adb.py b/roktracker/utils/adb.py
index e37a7b6..a83edd2 100644
--- a/roktracker/utils/adb.py
+++ b/roktracker/utils/adb.py
@@ -116,16 +116,33 @@ def secure_adb_tap(self, position: Tuple[int, int]):
self.secure_adb_shell(f"input tap {position[0]} {position[1]}")
def secure_adb_screencap(self) -> Image:
+ import io
+ from PIL import Image as PILImage
+
result = NewImage(mode="RGB", size=(1, 1))
for i in range(3):
try:
- result = self.device.takeSnapshot(reconnect=True)
- except:
- console.print("[red]ADB crashed[/red]")
+ # Use subprocess to call adb exec-out screencap -p
+ # This is much more reliable across different emulators than dtmilano's takeSnapshot
+ cmd = [
+ self.adb_path,
+ "-P", str(self.server_port),
+ "-s", f"localhost:{self.client_port}",
+ "exec-out", "screencap", "-p"
+ ]
+ process = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+ if process.returncode == 0 and process.stdout:
+ result = PILImage.open(io.BytesIO(process.stdout)).convert("RGB")
+ return result
+ else:
+ # Fallback to older dtmilano takeSnapshot just in case
+ result = self.device.takeSnapshot(reconnect=True)
+ return result
+ except Exception as e:
+ console.print(f"[red]ADB screencap failed: {e}[/red]")
self.kill_adb()
self.start_adb()
- else:
- return result
return result
def adb_send_events(self, input_device_name: str, event_file: str | Path) -> None:
diff --git a/roktracker/utils/ocr.py b/roktracker/utils/ocr.py
index 05b3e4b..837bb62 100644
--- a/roktracker/utils/ocr.py
+++ b/roktracker/utils/ocr.py
@@ -37,6 +37,8 @@ def preprocessImage(
border_size: int,
invert: bool = False,
) -> MatLike:
+ if image is None or image.size == 0:
+ return np.zeros((1, 1), dtype=np.uint8)
im_big = cv2.resize(image, (0, 0), fx=scale_factor, fy=scale_factor)
im_gray = cv2.cvtColor(im_big, cv2.COLOR_BGR2GRAY)
if invert:
@@ -62,6 +64,8 @@ def preprocessImageRobust(
before binarising. Falls back to the legacy path when the input is already
single-channel.
"""
+ if image is None or image.size == 0:
+ return np.zeros((1, 1), dtype=np.uint8)
im_big = cv2.resize(image, (0, 0), fx=scale_factor, fy=scale_factor)
if len(im_big.shape) == 3 and im_big.shape[2] >= 3:
diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png
index b099d72..c41b4b9 100644
Binary files a/src-tauri/icons/128x128.png and b/src-tauri/icons/128x128.png differ
diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png
index be100b2..7be0c00 100644
Binary files a/src-tauri/icons/128x128@2x.png and b/src-tauri/icons/128x128@2x.png differ
diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png
index c7e3dc6..005c301 100644
Binary files a/src-tauri/icons/32x32.png and b/src-tauri/icons/32x32.png differ
diff --git a/src-tauri/icons/64x64.png b/src-tauri/icons/64x64.png
index cde9b20..c54f93e 100644
Binary files a/src-tauri/icons/64x64.png and b/src-tauri/icons/64x64.png differ
diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png
index 9b4abe7..d076fba 100644
Binary files a/src-tauri/icons/Square107x107Logo.png and b/src-tauri/icons/Square107x107Logo.png differ
diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png
index a2561e9..732bc28 100644
Binary files a/src-tauri/icons/Square142x142Logo.png and b/src-tauri/icons/Square142x142Logo.png differ
diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png
index ddb8969..7238157 100644
Binary files a/src-tauri/icons/Square150x150Logo.png and b/src-tauri/icons/Square150x150Logo.png differ
diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png
index e2e7dd2..e19e675 100644
Binary files a/src-tauri/icons/Square284x284Logo.png and b/src-tauri/icons/Square284x284Logo.png differ
diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png
index f2215bf..cfc6e92 100644
Binary files a/src-tauri/icons/Square30x30Logo.png and b/src-tauri/icons/Square30x30Logo.png differ
diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png
index 89cb8f9..93c05f3 100644
Binary files a/src-tauri/icons/Square310x310Logo.png and b/src-tauri/icons/Square310x310Logo.png differ
diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png
index 2f64c3d..c1c96a8 100644
Binary files a/src-tauri/icons/Square44x44Logo.png and b/src-tauri/icons/Square44x44Logo.png differ
diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png
index ef995c3..e2b17a6 100644
Binary files a/src-tauri/icons/Square71x71Logo.png and b/src-tauri/icons/Square71x71Logo.png differ
diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png
index 35b7fd0..a58508f 100644
Binary files a/src-tauri/icons/Square89x89Logo.png and b/src-tauri/icons/Square89x89Logo.png differ
diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png
index e775ceb..75ec1b6 100644
Binary files a/src-tauri/icons/StoreLogo.png and b/src-tauri/icons/StoreLogo.png differ
diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns
index df21812..c542d4b 100644
Binary files a/src-tauri/icons/icon.icns and b/src-tauri/icons/icon.icns differ
diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico
index bb83600..3a987bc 100644
Binary files a/src-tauri/icons/icon.ico and b/src-tauri/icons/icon.ico differ
diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png
index f114ea9..b40f8ba 100644
Binary files a/src-tauri/icons/icon.png and b/src-tauri/icons/icon.png differ
diff --git a/src-tauri/src/sidecar.rs b/src-tauri/src/sidecar.rs
index 99e98c7..69c4700 100644
--- a/src-tauri/src/sidecar.rs
+++ b/src-tauri/src/sidecar.rs
@@ -3,7 +3,7 @@ use std::io::{BufRead, BufReader, Write};
use std::process::{Child, Command, Stdio};
use std::sync::{Arc, Mutex};
use std::thread;
-use tauri::{AppHandle, Emitter, Manager, Runtime};
+use tauri::{AppHandle, Emitter, Runtime};
/// Manages the Python sidecar subprocess lifecycle.
pub struct SidecarManager {
diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json
index 1362b14..f3359c3 100644
--- a/src-tauri/tauri.conf.json
+++ b/src-tauri/tauri.conf.json
@@ -3,9 +3,9 @@
"version": "1.0.0",
"identifier": "com.roktracker.suite",
"build": {
- "beforeDevCommand": "cd gui_frontend && npm run dev",
+ "beforeDevCommand": "cd ../gui_frontend && pnpm run dev",
"devUrl": "http://localhost:3000",
- "beforeBuildCommand": "cd gui_frontend && npm run build",
+ "beforeBuildCommand": "cd ../gui_frontend && pnpm run build",
"frontendDist": "../gui_frontend/dist/spa"
},
"app": {
@@ -44,7 +44,7 @@
},
"plugins": {
"updater": {
- "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDQ1MzhFNTYwREMzNzUxQUYKUldTdlVUZmNZT1U0UllWMTljZkJDZnVOWUh1bkhHbkVKUnE4VTBuT3VZTE9aTys4N0ZVS2pncVgK",
+ "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDI4QjUyRDkwMjgzQ0VDN0YKUldSLzdEd29rQzIxS05FT2hVL0tZejBFUDc4ZXZ0WlpBNjRySXgyM25JMGdFeXVpWHVGR3VCTEQK",
"endpoints": [
"https://github.com/Nexor256/RoK-Tracker/releases/latest/download/latest.json"
],
diff --git a/uv.lock b/uv.lock
new file mode 100644
index 0000000..d96b614
--- /dev/null
+++ b/uv.lock
@@ -0,0 +1,793 @@
+version = 1
+requires-python = ">=3.14"
+resolution-markers = [
+ "(platform_machine == 'AMD64' and sys_platform == 'darwin') or (platform_machine == 'x86_64' and sys_platform == 'darwin')",
+ "(platform_machine == 'AMD64' and sys_platform != 'darwin') or (platform_machine == 'x86_64' and sys_platform != 'darwin')",
+ "(platform_machine == 'i386' and sys_platform == 'darwin') or (platform_machine == 'x86' and sys_platform == 'darwin')",
+ "(platform_machine == 'i386' and sys_platform != 'darwin') or (platform_machine == 'x86' and sys_platform != 'darwin')",
+ "platform_machine != 'AMD64' and platform_machine != 'i386' and platform_machine != 'x86' and platform_machine != 'x86_64' and sys_platform == 'darwin'",
+ "platform_machine == 'aarch64' and sys_platform == 'linux'",
+ "(platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'i386' and platform_machine != 'x86' and platform_machine != 'x86_64' and sys_platform == 'linux') or (platform_machine != 'AMD64' and platform_machine != 'i386' and platform_machine != 'x86' and platform_machine != 'x86_64' and sys_platform != 'darwin' and sys_platform != 'linux')",
+]
+
+[[package]]
+name = "altgraph"
+version = "0.17.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/de/a8/7145824cf0b9e3c28046520480f207df47e927df83aa9555fb47f8505922/altgraph-0.17.4.tar.gz", hash = "sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406", size = 48418 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4d/3f/3bc3f1d83f6e4a7fcb834d3720544ca597590425be5ba9db032b2bf322a2/altgraph-0.17.4-py2.py3-none-any.whl", hash = "sha256:642743b4750de17e655e6711601b077bc6598dbfa3ba5fa2b2a35ce12b508dff", size = 21212 },
+]
+
+[[package]]
+name = "androidviewclient"
+version = "24.1.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "culebratester-client" },
+ { name = "matplotlib" },
+ { name = "numpy" },
+ { name = "requests" },
+ { name = "setuptools" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c7/48/85821b41cc28329d55963ed2c76321b3ef96520856bebc2fd706c6c2d4b1/androidviewclient-24.1.0.tar.gz", hash = "sha256:0db0b4eae3fbd7f304d8c2203887f2092ba70ef2ef9926baa29f3116cde4adcd", size = 417943 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5d/76/c83664da1cb9fb8df1f183da1ba7860a8be2f83a948eac501d26c65e5be4/androidviewclient-24.1.0-py3-none-any.whl", hash = "sha256:80f9695cf0021c75e03814d7b4159b1297bf6d8af803a1368488476e1001714d", size = 425123 },
+]
+
+[[package]]
+name = "annotated-types"
+version = "0.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 },
+]
+
+[[package]]
+name = "certifi"
+version = "2024.12.14"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0f/bd/1d41ee578ce09523c81a15426705dd20969f5abf006d1afe8aeff0dd776a/certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db", size = 166010 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 },
+]
+
+[[package]]
+name = "cffi"
+version = "1.17.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pycparser" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 }
+
+[[package]]
+name = "charset-normalizer"
+version = "3.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 },
+]
+
+[[package]]
+name = "clr-loader"
+version = "0.2.7.post0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cffi" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/d5/b3/8ae917e458394e2cebdbf17bed0a8204f8d4ffc79a093a7b1141c7731d3c/clr_loader-0.2.7.post0.tar.gz", hash = "sha256:b7a8b3f8fbb1bcbbb6382d887e21d1742d4f10b5ea209e4ad95568fe97e1c7c6", size = 56701 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9c/c0/06e64a54bced4e8b885c1e7ec03ee1869e52acf69e87da40f92391a214ad/clr_loader-0.2.7.post0-py3-none-any.whl", hash = "sha256:e0b9fcc107d48347a4311a28ffe3ae78c4968edb216ffb6564cb03f7ace0bb47", size = 50649 },
+]
+
+[[package]]
+name = "contourpy"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/25/c2/fc7193cc5383637ff390a712e88e4ded0452c9fbcf84abe3de5ea3df1866/contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699", size = 13465753 }
+
+[[package]]
+name = "culebratester-client"
+version = "2.0.73"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "python-dateutil" },
+ { name = "six" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/d0/11/25d367ecef9077a7331de502b8beff1c7cf7718288c2d56093c07e3c4299/culebratester_client-2.0.73.tar.gz", hash = "sha256:fe4e66816852890718f7f8871dde13098e74cdbea8fef53e9e936f2cab99b3f5", size = 56694 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/60/71c06e66892f82446c39308ef0711f906816a5f8db189bed18ef5debb241/culebratester_client-2.0.73-py3-none-any.whl", hash = "sha256:aec63ca6f920430c7db35f3461c7eccad75540968fe4111de7625c9555c11504", size = 114172 },
+]
+
+[[package]]
+name = "cycler"
+version = "0.12.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321 },
+]
+
+[[package]]
+name = "et-xmlfile"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059 },
+]
+
+[[package]]
+name = "fonttools"
+version = "4.55.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/76/61/a300d1574dc381393424047c0396a0e213db212e28361123af9830d71a8d/fonttools-4.55.3.tar.gz", hash = "sha256:3983313c2a04d6cc1fe9251f8fc647754cf49a61dac6cb1e7249ae67afaafc45", size = 3498155 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/99/3b/406d17b1f63e04a82aa621936e6e1c53a8c05458abd66300ac85ea7f9ae9/fonttools-4.55.3-py3-none-any.whl", hash = "sha256:f412604ccbeee81b091b420272841e5ec5ef68967a9790e80bffd0e30b8e2977", size = 1111638 },
+]
+
+[[package]]
+name = "idna"
+version = "3.10"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
+]
+
+[[package]]
+name = "kiwisolver"
+version = "1.4.8"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538 }
+
+[[package]]
+name = "markdown-it-py"
+version = "3.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mdurl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 },
+]
+
+[[package]]
+name = "matplotlib"
+version = "3.10.9"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "contourpy" },
+ { name = "cycler" },
+ { name = "fonttools" },
+ { name = "kiwisolver" },
+ { name = "numpy" },
+ { name = "packaging" },
+ { name = "pillow" },
+ { name = "pyparsing" },
+ { name = "python-dateutil" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/63/1b/4be5be87d43d327a0cf4de1a56e86f7f84c89312452406cf122efe2839e6/matplotlib-3.10.9.tar.gz", hash = "sha256:fd66508e8c6877d98e586654b608a0456db8d7e8a546eb1e2600efd957302358", size = 34811233 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d6/e6/3bd8afd04949f02eabc1c17115ea5255e19cacd4d06fc5abdde4eeb0052c/matplotlib-3.10.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:172db52c9e683f5d12eaf57f0f54834190e12581fe1cc2a19595a8f5acb4e77d", size = 8321276 },
+ { url = "https://files.pythonhosted.org/packages/41/86/86231232fff41c9f8e4a1a7d7a597d349a02527109c3af7d618366122139/matplotlib-3.10.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97e35e8d39ccc85859095e01a53847432ba9a53ddf7986f7a54a11b73d0e143f", size = 8218218 },
+ { url = "https://files.pythonhosted.org/packages/85/8f/becc9722cafc64f5d2eb0b7c1bf5f585271c618a45dbd8fabeb021f898b6/matplotlib-3.10.9-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aba1615dabe83188e19d4f75a253c6a08423e04c1425e64039f800050a69de6b", size = 9608145 },
+ { url = "https://files.pythonhosted.org/packages/32/5d/f7e914f7d9325abff4057cee62c0fa70263683189f774473cbfb534cd13b/matplotlib-3.10.9-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34cf8167e023ad956c15f36302911d5406bd99a9862c1a8499ea6f7c0e015dc2", size = 9885085 },
+ { url = "https://files.pythonhosted.org/packages/a5/fd/fa69f2221534e80cc5772ac2b7d222011a2acafc2ec7216d5dd174c864ae/matplotlib-3.10.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:59476c6d29d612b8e9bb6ce8c5b631be6ba8f9e3a2421f22a02b192c7dd28716", size = 9672358 },
+ { url = "https://files.pythonhosted.org/packages/ab/1a/5a4f747a8b271cbb024946d2dd3c913ab5032ba430626f8c3528ada96b4b/matplotlib-3.10.9-cp314-cp314-win_amd64.whl", hash = "sha256:336b9acc64d309063126edcdaca00db9373af3c476bb94388fe9c5a53ad13e6f", size = 8349970 },
+ { url = "https://files.pythonhosted.org/packages/64/dc/95d60ecaefe30680a154b52ea96ab4b0dab547f1fd6aa12f5fb655e89cae/matplotlib-3.10.9-cp314-cp314-win_arm64.whl", hash = "sha256:2dc9477819ffd78ad12a20df1d9d6a6bd4fec6aaa9072681465fddca052f1456", size = 8272785 },
+ { url = "https://files.pythonhosted.org/packages/70/a0/005d68bc8b8418300ce6591f18586910a8526806e2ab663933d9f20a41e9/matplotlib-3.10.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:da4e09638420548f31c354032a6250e473c68e5a4e96899b4844cf39ddea23fe", size = 8367999 },
+ { url = "https://files.pythonhosted.org/packages/22/05/1236cc9290be70b2498af20ca348add76e3fffe7f67b477db5133a84f3ea/matplotlib-3.10.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:345f6f68ecc8da0ca56fad2ea08fde1a115eda530079eca185d50a7bc3e146c6", size = 8264543 },
+ { url = "https://files.pythonhosted.org/packages/cd/c2/071f5a5ff6c5bd63aaaf2f45c811d9bf2ced94bde188d9e1a519e21d0cba/matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4edcfbd8565339aa62f1cd4012f7180926fdbe71850f7b0d3c379c175cd6b66c", size = 9622800 },
+ { url = "https://files.pythonhosted.org/packages/95/57/da7d1f10a85624b9e7db68e069dd94e58dc41dbf9463c5921632ecbe3661/matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6be157fe17fc37cb95ac1d7374cf717ce9259616edec911a78d9d26dae8522d4", size = 9888561 },
+ { url = "https://files.pythonhosted.org/packages/67/b2/ef8d6bb59b0edb6c16c968b70f548aa13b54348972def5aa6ac85df67145/matplotlib-3.10.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4e42042d54db34fda4e95a7bd3e5789c2a995d2dad3eb8850232ee534092fbbf", size = 9680884 },
+ { url = "https://files.pythonhosted.org/packages/61/1c/d21bfeb9931881ebe96bcfcff27c7ae4b160ae0ec291a714c42641a56d75/matplotlib-3.10.9-cp314-cp314t-win_amd64.whl", hash = "sha256:c27df8b3848f32a83d1767566595e43cfaa4460380974da06f4279a7ec143c39", size = 8432333 },
+ { url = "https://files.pythonhosted.org/packages/78/23/92493c3e6e1b635ccfff146f7b99e674808787915420373ac399283764c2/matplotlib-3.10.9-cp314-cp314t-win_arm64.whl", hash = "sha256:a49f1eadc84ca85fd72fa4e89e70e61bf86452df6f971af04b12c60761a0772c", size = 8324785 },
+]
+
+[[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 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 },
+]
+
+[[package]]
+name = "nuitka"
+version = "4.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e6/2e/9ea398ca1a4fc458958fdf477ae18d3395bee8c9f8950ca6f0f039ea2585/nuitka-4.1.2.tar.gz", hash = "sha256:efc2359b171d7b63046ca8ec8dee57015c3466a9df74b68a049c2c1a7e93ecee", size = 4561050 }
+
+[[package]]
+name = "numpy"
+version = "2.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f8/91/3ab2044d05fd16d343c5ac2e69b127f1b2854040dd20b193257c78028bd3/numpy-2.4.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06ca2f61ec4385a07a6977c55ba998a4466c123642b4a32694d3128fce18c079", size = 16683458 },
+ { url = "https://files.pythonhosted.org/packages/8e/62/764ce66fa4147ae6d73071a3abf804ffe606f174618697c571acdf26a7c9/numpy-2.4.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:38efbc8de75c7a0fc1ac190162d892787f3f47b57cc291231aafee36b80982b7", size = 14704559 },
+ { url = "https://files.pythonhosted.org/packages/60/61/23f27c172f022e04025b7dc2367f4d63c1a398120607ec896228649a6f48/numpy-2.4.6-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:d581b735e177fdcdce6fed8e7e8880a3fb6ee4e3653a3ac6af01c6f4c03effc5", size = 5209716 },
+ { url = "https://files.pythonhosted.org/packages/03/71/21cf70dc6ea3e3acb95fc53a265b2fc248b981f0194ceb5b475271b8809d/numpy-2.4.6-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:0a041d3d761dc3c35cc56ce0351506a02bcbc25f7b169f652435141a17db9096", size = 6543947 },
+ { url = "https://files.pythonhosted.org/packages/d5/91/64288395ee1799bd2e0b04a305dce9666da90c961e1f3fe982a05ee1c036/numpy-2.4.6-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b", size = 15685197 },
+ { url = "https://files.pythonhosted.org/packages/f3/eb/ebffaa97dc55502df69584a8f0dcf07f69a3e0b3e2323670a2722db9aa39/numpy-2.4.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8", size = 16638245 },
+ { url = "https://files.pythonhosted.org/packages/b8/0b/54f9da33128d7e350fab89c7455902eeae70349ee52bddb448dc4a576f45/numpy-2.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402", size = 17036587 },
+ { url = "https://files.pythonhosted.org/packages/b6/f0/fdebc1052db1cc37c64beb22072d67cd6d1c71adca1299f53dec2b5e20d3/numpy-2.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb", size = 18363226 },
+ { url = "https://files.pythonhosted.org/packages/aa/b4/298628d98c72b57e57f7165ae6a481a1deaf6f3c28262a6e4c739c275930/numpy-2.4.6-cp314-cp314-win32.whl", hash = "sha256:aaf159caa35993cb1f56fb9b8e4610d35758e7ca005412eb1daa856a78c9c4b1", size = 6010196 },
+ { url = "https://files.pythonhosted.org/packages/df/ac/46de6dda46478f7942f839e094970be2d4a861e005c4b3bf07c92e291a09/numpy-2.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:b507f5c4c1d508876d1819b6bf9a49d365b96320b5d4993426b33a23ca4b8261", size = 12450334 },
+ { url = "https://files.pythonhosted.org/packages/78/92/b8b798ac784102c0da830d2257d59358e3d3d90d1e2b3f2575dad976c5cf/numpy-2.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:6f41ae150c4e32db4f3310cdaf64b1593a03dbabe29eec77fc9b50fe64061df6", size = 10495678 },
+ { url = "https://files.pythonhosted.org/packages/30/34/ec28d1aa8115971537c01469ab2011ee96827930f0a124de1000cc2a7ed7/numpy-2.4.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ece3d2cfe132e7d51f44a832b303895e6f2d499c5e74dfbdb06ee246147a304a", size = 14823672 },
+ { url = "https://files.pythonhosted.org/packages/16/bd/f6d1fede4e54e8042a7ff97bb495510f3c220f94bcd9e8b228e87c92cc0d/numpy-2.4.6-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:e3e5193ef5a3dc73bceee50f7fdc2c90dbb76c42df8d8fae3d1067a583df579e", size = 5328731 },
+ { url = "https://files.pythonhosted.org/packages/f4/f0/e105b9e2fd728a9910103884decd6951d9dd73896b914a98d9a231de02ee/numpy-2.4.6-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:17f9ade344e7d9b464a084d69bcf18fc691cb1db67c62ed80820bf4926d78f0e", size = 6649805 },
+ { url = "https://files.pythonhosted.org/packages/82/dd/1206a7ca6ab15e3f02069707ca96222e202af681bb73756da7527f3cb837/numpy-2.4.6-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43", size = 15730496 },
+ { url = "https://files.pythonhosted.org/packages/51/e7/38d3ea825dcab85a591734decb2f6c67caa7c8367d374df1a1c3842f9b07/numpy-2.4.6-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e", size = 16679616 },
+ { url = "https://files.pythonhosted.org/packages/93/b7/caabfdf53edf663e0b4eb74d7d405d83baef09eb5e83bcd32d601d72b93e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895", size = 17085145 },
+ { url = "https://files.pythonhosted.org/packages/f9/45/68d7c33a6bcf3e5aa3bdbd57a367e6f615286dfd6482f97e8ffeb734306e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4", size = 18403813 },
+ { url = "https://files.pythonhosted.org/packages/9c/50/0753655aa844c99cd9e018aacf76f130f1bd81d881bb74bc0aef5d73a8ba/numpy-2.4.6-cp314-cp314t-win32.whl", hash = "sha256:260a5d70215b61ab4fadf5c7baacd64821842975eea312125ed3c39a6391b063", size = 6156982 },
+ { url = "https://files.pythonhosted.org/packages/b2/d4/7c67becf668f973cb490cec3e98dfd799d866f9c989a54d355672cfa0db6/numpy-2.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:81a1cca95ed5bb92aa8b10dd2cdc9a0d3853a50fad926c28b5d7e8ea54389627", size = 12638908 },
+ { url = "https://files.pythonhosted.org/packages/43/bb/e1c71a4295b1b1d1393d50dbb4f2a36283c6859d9d3892e84f00ec5a91d5/numpy-2.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:0c9136e14ed34a9e343a31c533d78a9813a69a3148332bce5e9821cb2f996e66", size = 10565867 },
+]
+
+[[package]]
+name = "opencv-python-headless"
+version = "4.11.0.86"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/36/2f/5b2b3ba52c864848885ba988f24b7f105052f68da9ab0e693cc7c25b0b30/opencv-python-headless-4.11.0.86.tar.gz", hash = "sha256:996eb282ca4b43ec6a3972414de0e2331f5d9cda2b41091a49739c19fb843798", size = 95177929 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/dc/53/2c50afa0b1e05ecdb4603818e85f7d174e683d874ef63a6abe3ac92220c8/opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:48128188ade4a7e517237c8e1e11a9cdf5c282761473383e77beb875bb1e61ca", size = 37326460 },
+ { url = "https://files.pythonhosted.org/packages/3b/43/68555327df94bb9b59a1fd645f63fafb0762515344d2046698762fc19d58/opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:a66c1b286a9de872c343ee7c3553b084244299714ebb50fbdcd76f07ebbe6c81", size = 56723330 },
+ { url = "https://files.pythonhosted.org/packages/45/be/1438ce43ebe65317344a87e4b150865c5585f4c0db880a34cdae5ac46881/opencv_python_headless-4.11.0.86-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6efabcaa9df731f29e5ea9051776715b1bdd1845d7c9530065c7951d2a2899eb", size = 29487060 },
+ { url = "https://files.pythonhosted.org/packages/dd/5c/c139a7876099916879609372bfa513b7f1257f7f1a908b0bdc1c2328241b/opencv_python_headless-4.11.0.86-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e0a27c19dd1f40ddff94976cfe43066fbbe9dfbb2ec1907d66c19caef42a57b", size = 49969856 },
+ { url = "https://files.pythonhosted.org/packages/95/dd/ed1191c9dc91abcc9f752b499b7928aacabf10567bb2c2535944d848af18/opencv_python_headless-4.11.0.86-cp37-abi3-win32.whl", hash = "sha256:f447d8acbb0b6f2808da71fddd29c1cdd448d2bc98f72d9bb78a7a898fc9621b", size = 29324425 },
+ { url = "https://files.pythonhosted.org/packages/86/8a/69176a64335aed183529207ba8bc3d329c2999d852b4f3818027203f50e6/opencv_python_headless-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:6c304df9caa7a6a5710b91709dd4786bf20a74d57672b3c31f7033cc638174ca", size = 39402386 },
+]
+
+[[package]]
+name = "openpyxl"
+version = "3.1.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "et-xmlfile" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910 },
+]
+
+[[package]]
+name = "ordered-set"
+version = "4.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/4c/ca/bfac8bc689799bcca4157e0e0ced07e70ce125193fc2e166d2e685b7e2fe/ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8", size = 12826 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/33/55/af02708f230eb77084a299d7b08175cff006dea4f2721074b92cdb0296c0/ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562", size = 7634 },
+]
+
+[[package]]
+name = "packaging"
+version = "24.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
+]
+
+[[package]]
+name = "pandas"
+version = "2.2.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "python-dateutil" },
+ { name = "pytz" },
+ { name = "tzdata" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 }
+
+[[package]]
+name = "pathvalidate"
+version = "3.2.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/92/87/c7a2f51cc62df0495acb0ed2533a7c74cc895e569a1b020ee5f6e9fa4e21/pathvalidate-3.2.3.tar.gz", hash = "sha256:59b5b9278e30382d6d213497623043ebe63f10e29055be4419a9c04c721739cb", size = 61717 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/50/14/c5a0e1a947909810fc4c043b84cac472b70e438148d34f5393be1bac663f/pathvalidate-3.2.3-py3-none-any.whl", hash = "sha256:5eaf0562e345d4b6d0c0239d0f690c3bd84d2a9a3c4c73b99ea667401b27bee1", size = 24130 },
+]
+
+[[package]]
+name = "pefile"
+version = "2023.2.7"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/78/c5/3b3c62223f72e2360737fd2a57c30e5b2adecd85e70276879609a7403334/pefile-2023.2.7.tar.gz", hash = "sha256:82e6114004b3d6911c77c3953e3838654b04511b8b66e8583db70c65998017dc", size = 74854 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/55/26/d0ad8b448476d0a1e8d3ea5622dc77b916db84c6aa3cb1e1c0965af948fc/pefile-2023.2.7-py3-none-any.whl", hash = "sha256:da185cd2af68c08a6cd4481f7325ed600a88f6a813bad9dea07ab3ef73d8d8d6", size = 71791 },
+]
+
+[[package]]
+name = "pillow"
+version = "12.2.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848 },
+ { url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515 },
+ { url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159 },
+ { url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185 },
+ { url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386 },
+ { url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384 },
+ { url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599 },
+ { url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021 },
+ { url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360 },
+ { url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628 },
+ { url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321 },
+ { url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723 },
+ { url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400 },
+ { url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835 },
+ { url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225 },
+ { url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541 },
+ { url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251 },
+ { url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807 },
+ { url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935 },
+ { url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720 },
+ { url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498 },
+ { url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413 },
+ { url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084 },
+ { url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152 },
+ { url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579 },
+]
+
+[[package]]
+name = "prompt-toolkit"
+version = "3.0.50"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "wcwidth" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a1/e1/bd15cb8ffdcfeeb2bdc215de3c3cffca11408d829e4b8416dcfe71ba8854/prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab", size = 429087 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e4/ea/d836f008d33151c7a1f62caf3d8dd782e4d15f6a43897f64480c2b8de2ad/prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198", size = 387816 },
+]
+
+[[package]]
+name = "proxy-tools"
+version = "0.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f2/cf/77d3e19b7fabd03895caca7857ef51e4c409e0ca6b37ee6e9f7daa50b642/proxy_tools-0.1.0.tar.gz", hash = "sha256:ccb3751f529c047e2d8a58440d86b205303cf0fe8146f784d1cbcd94f0a28010", size = 2978 }
+
+[[package]]
+name = "pycparser"
+version = "2.22"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 },
+]
+
+[[package]]
+name = "pydantic"
+version = "2.13.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "annotated-types" },
+ { name = "pydantic-core" },
+ { name = "typing-extensions" },
+ { name = "typing-inspection" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262 },
+]
+
+[[package]]
+name = "pydantic-core"
+version = "2.46.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079 },
+ { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179 },
+ { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926 },
+ { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785 },
+ { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733 },
+ { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534 },
+ { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732 },
+ { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627 },
+ { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141 },
+ { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325 },
+ { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990 },
+ { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978 },
+ { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354 },
+ { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238 },
+ { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251 },
+ { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593 },
+ { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226 },
+ { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605 },
+ { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777 },
+ { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641 },
+ { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404 },
+ { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219 },
+ { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594 },
+ { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542 },
+ { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146 },
+ { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309 },
+ { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736 },
+ { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575 },
+ { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624 },
+ { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325 },
+ { url = "https://files.pythonhosted.org/packages/ee/a4/73995fd4ebbb46ba0ee51e6fa049b8f02c40daebb762208feda8a6b7894d/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:14d4edf427bdcf950a8a02d7cb44a08614388dd6e1bdcbf4f67504fa7887da9c", size = 2111589 },
+ { url = "https://files.pythonhosted.org/packages/fb/7f/f37d3a5e8bfcc2e403f5c57a730f2d815693fb42119e8ea48b3789335af1/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ce40cd7b21210e99342afafbd4d0f76d784eb5b1d60f3bdc566be4983c6c73b", size = 1944552 },
+ { url = "https://files.pythonhosted.org/packages/15/3c/d7eb777b3ff43e8433a4efb39a17aa8fd98a4ee8561a24a67ef5db07b2d6/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90884113d8b48f760e9587002789ddd741e76ab9f89518cd1e43b1f1a52ec44b", size = 1982984 },
+ { url = "https://files.pythonhosted.org/packages/63/87/70b9f40170a81afd55ca26c9b2acb25c20d64bcfbf888fafecb3ba077d4c/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66ce7632c22d837c95301830e111ad0128a32b8207533b60896a96c4915192ea", size = 2138417 },
+ { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527 },
+ { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024 },
+ { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696 },
+ { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590 },
+]
+
+[[package]]
+name = "pydantic-settings"
+version = "2.14.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pydantic" },
+ { name = "python-dotenv" },
+ { name = "typing-inspection" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/07/60/1d1e59c9c90d54591469ada7d268251f71c24bdb765f1a8a832cee8c6653/pydantic_settings-2.14.1.tar.gz", hash = "sha256:e874d3bec7e787b0c9958277956ed9b4dd5de6a80e162188fdaff7c5e26fd5fa", size = 235551 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl", hash = "sha256:6e3c7edfd8277687cdc598f56e5cff0e9bfff0910a3749deaa8d4401c3a2b9de", size = 60964 },
+]
+
+[[package]]
+name = "pygments"
+version = "2.19.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 },
+]
+
+[[package]]
+name = "pyparsing"
+version = "3.2.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/8b/1a/3544f4f299a47911c2ab3710f534e52fea62a633c96806995da5d25be4b2/pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a", size = 1067694 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1c/a7/c8a2d361bf89c0d9577c934ebb7421b25dc84bf3a8e3ac0a40aed9acc547/pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1", size = 107716 },
+]
+
+[[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 }
+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 },
+]
+
+[[package]]
+name = "python-dotenv"
+version = "1.2.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101 },
+]
+
+[[package]]
+name = "pythonnet"
+version = "3.0.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "clr-loader" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/9a/d6/1afd75edd932306ae9bd2c2d961d603dc2b52fcec51b04afea464f1f6646/pythonnet-3.0.5.tar.gz", hash = "sha256:48e43ca463941b3608b32b4e236db92d8d40db4c58a75ace902985f76dac21cf", size = 239212 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cd/f1/bfb6811df4745f92f14c47a29e50e89a36b1533130fcc56452d4660bd2d6/pythonnet-3.0.5-py3-none-any.whl", hash = "sha256:f6702d694d5d5b163c9f3f5cc34e0bed8d6857150237fae411fefb883a656d20", size = 297506 },
+]
+
+[[package]]
+name = "pytz"
+version = "2024.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/3a/31/3c70bf7603cc2dca0f19bdc53b4537a797747a58875b552c8c413d963a3f/pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", size = 319692 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 },
+]
+
+[[package]]
+name = "pywin32-ctypes"
+version = "0.2.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756 },
+]
+
+[[package]]
+name = "questionary"
+version = "2.1.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "prompt-toolkit" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a8/b8/d16eb579277f3de9e56e5ad25280fab52fc5774117fb70362e8c2e016559/questionary-2.1.0.tar.gz", hash = "sha256:6302cdd645b19667d8f6e6634774e9538bfcd1aad9be287e743d96cacaf95587", size = 26775 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ad/3f/11dd4cd4f39e05128bfd20138faea57bec56f9ffba6185d276e3107ba5b2/questionary-2.1.0-py3-none-any.whl", hash = "sha256:44174d237b68bc828e4878c763a9ad6790ee61990e0ae72927694ead57bab8ec", size = 36747 },
+]
+
+[[package]]
+name = "requests"
+version = "2.32.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "charset-normalizer" },
+ { name = "idna" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 },
+]
+
+[[package]]
+name = "rich"
+version = "13.9.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 },
+]
+
+[[package]]
+name = "roktracker"
+source = { virtual = "." }
+dependencies = [
+ { name = "altgraph" },
+ { name = "androidviewclient" },
+ { name = "certifi" },
+ { name = "cffi" },
+ { name = "charset-normalizer" },
+ { name = "clr-loader" },
+ { name = "contourpy" },
+ { name = "culebratester-client" },
+ { name = "cycler" },
+ { name = "et-xmlfile" },
+ { name = "fonttools" },
+ { name = "idna" },
+ { name = "kiwisolver" },
+ { name = "markdown-it-py" },
+ { name = "mdurl" },
+ { name = "nuitka" },
+ { name = "numpy" },
+ { name = "opencv-python-headless" },
+ { name = "openpyxl" },
+ { name = "ordered-set" },
+ { name = "packaging" },
+ { name = "pandas" },
+ { name = "pathvalidate" },
+ { name = "pefile" },
+ { name = "pillow" },
+ { name = "prompt-toolkit" },
+ { name = "proxy-tools" },
+ { name = "pycparser" },
+ { name = "pydantic" },
+ { name = "pydantic-settings" },
+ { name = "pygments" },
+ { name = "pyparsing" },
+ { name = "python-dateutil" },
+ { name = "pythonnet" },
+ { name = "pytz" },
+ { name = "pywin32-ctypes" },
+ { name = "questionary" },
+ { name = "requests" },
+ { name = "rich" },
+ { name = "setuptools" },
+ { name = "six" },
+ { name = "tesserocr", version = "2.10.0", source = { url = "https://github.com/simonflueckiger/tesserocr-windows_build/releases/download/tesserocr-v2.10.0-tesseract-5.5.2/tesserocr-2.10.0-cp314-cp314-win32.whl" }, marker = "platform_machine == 'i386' or platform_machine == 'x86'" },
+ { name = "tesserocr", version = "2.10.0", source = { url = "https://github.com/simonflueckiger/tesserocr-windows_build/releases/download/tesserocr-v2.10.0-tesseract-5.5.2/tesserocr-2.10.0-cp314-cp314-win_amd64.whl" }, marker = "platform_machine == 'AMD64' or platform_machine == 'x86_64'" },
+ { name = "typing-extensions" },
+ { name = "tzdata" },
+ { name = "urllib3" },
+ { name = "wcwidth" },
+ { name = "xlsxwriter" },
+ { name = "zstandard" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "altgraph", specifier = "==0.17.4" },
+ { name = "androidviewclient", specifier = "==24.1.0" },
+ { name = "certifi", specifier = "==2024.12.14" },
+ { name = "cffi", specifier = "==1.17.1" },
+ { name = "charset-normalizer", specifier = "==3.4.1" },
+ { name = "clr-loader", specifier = "==0.2.7.post0" },
+ { name = "contourpy", specifier = "==1.3.1" },
+ { name = "culebratester-client", specifier = "==2.0.73" },
+ { name = "cycler", specifier = "==0.12.1" },
+ { name = "et-xmlfile", specifier = "==2.0.0" },
+ { name = "fonttools", specifier = "==4.55.3" },
+ { name = "idna", specifier = "==3.10" },
+ { name = "kiwisolver", specifier = "==1.4.8" },
+ { name = "markdown-it-py", specifier = "==3.0.0" },
+ { name = "mdurl", specifier = "==0.1.2" },
+ { name = "nuitka", specifier = ">=2.6" },
+ { name = "numpy", specifier = ">=2.4.0" },
+ { name = "opencv-python-headless", specifier = ">=4.11.0" },
+ { name = "openpyxl", specifier = "==3.1.5" },
+ { name = "ordered-set", specifier = ">=4.1.0" },
+ { name = "packaging", specifier = "==24.2" },
+ { name = "pandas", specifier = "==2.2.3" },
+ { name = "pathvalidate", specifier = "==3.2.3" },
+ { name = "pefile", specifier = "==2023.2.7" },
+ { name = "pillow", specifier = ">=12.0.0" },
+ { name = "prompt-toolkit", specifier = "==3.0.50" },
+ { name = "proxy-tools", specifier = "==0.1.0" },
+ { name = "pycparser", specifier = "==2.22" },
+ { name = "pydantic", specifier = ">=2.13.0" },
+ { name = "pydantic-settings", specifier = ">=2.14.0" },
+ { name = "pygments", specifier = "==2.19.1" },
+ { name = "pyparsing", specifier = "==3.2.1" },
+ { name = "python-dateutil", specifier = "==2.9.0.post0" },
+ { name = "pythonnet", specifier = "==3.0.5" },
+ { name = "pytz", specifier = "==2024.2" },
+ { name = "pywin32-ctypes", specifier = "==0.2.3" },
+ { name = "questionary", specifier = "==2.1.0" },
+ { name = "requests", specifier = "==2.32.3" },
+ { name = "rich", specifier = "==13.9.4" },
+ { name = "setuptools", specifier = "==75.8.0" },
+ { name = "six", specifier = "==1.17.0" },
+ { name = "tesserocr", marker = "platform_machine == 'AMD64' or platform_machine == 'x86_64'", url = "https://github.com/simonflueckiger/tesserocr-windows_build/releases/download/tesserocr-v2.10.0-tesseract-5.5.2/tesserocr-2.10.0-cp314-cp314-win_amd64.whl" },
+ { name = "tesserocr", marker = "platform_machine == 'i386' or platform_machine == 'x86'", url = "https://github.com/simonflueckiger/tesserocr-windows_build/releases/download/tesserocr-v2.10.0-tesseract-5.5.2/tesserocr-2.10.0-cp314-cp314-win32.whl" },
+ { name = "typing-extensions", specifier = ">=4.14.1" },
+ { name = "tzdata", specifier = "==2024.2" },
+ { name = "urllib3", specifier = "==2.3.0" },
+ { name = "wcwidth", specifier = "==0.2.13" },
+ { name = "xlsxwriter", specifier = "==3.2.0" },
+ { name = "zstandard", specifier = ">=0.23.0" },
+]
+
+[[package]]
+name = "setuptools"
+version = "75.8.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/92/ec/089608b791d210aec4e7f97488e67ab0d33add3efccb83a056cbafe3a2a6/setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6", size = 1343222 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/69/8a/b9dc7678803429e4a3bc9ba462fa3dd9066824d3c607490235c6a796be5a/setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3", size = 1228782 },
+]
+
+[[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 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 },
+]
+
+[[package]]
+name = "tesserocr"
+version = "2.10.0"
+source = { url = "https://github.com/simonflueckiger/tesserocr-windows_build/releases/download/tesserocr-v2.10.0-tesseract-5.5.2/tesserocr-2.10.0-cp314-cp314-win32.whl" }
+resolution-markers = [
+ "(platform_machine == 'i386' and sys_platform == 'darwin') or (platform_machine == 'x86' and sys_platform == 'darwin')",
+ "(platform_machine == 'i386' and sys_platform != 'darwin') or (platform_machine == 'x86' and sys_platform != 'darwin')",
+]
+wheels = [
+ { url = "https://github.com/simonflueckiger/tesserocr-windows_build/releases/download/tesserocr-v2.10.0-tesseract-5.5.2/tesserocr-2.10.0-cp314-cp314-win32.whl", hash = "sha256:95558e7f4e9e4ff5e88aa2cfaa641bccd8be0baa11fc598f97b15d66bb8b4635" },
+]
+
+[[package]]
+name = "tesserocr"
+version = "2.10.0"
+source = { url = "https://github.com/simonflueckiger/tesserocr-windows_build/releases/download/tesserocr-v2.10.0-tesseract-5.5.2/tesserocr-2.10.0-cp314-cp314-win_amd64.whl" }
+resolution-markers = [
+ "(platform_machine == 'AMD64' and sys_platform == 'darwin') or (platform_machine == 'x86_64' and sys_platform == 'darwin')",
+ "(platform_machine == 'AMD64' and sys_platform != 'darwin') or (platform_machine == 'x86_64' and sys_platform != 'darwin')",
+]
+wheels = [
+ { url = "https://github.com/simonflueckiger/tesserocr-windows_build/releases/download/tesserocr-v2.10.0-tesseract-5.5.2/tesserocr-2.10.0-cp314-cp314-win_amd64.whl", hash = "sha256:e7abf40539b852bd25cceadad7a1a3bba9c223556bafa908e2dbf91407080af5" },
+]
+
+[[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 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614 },
+]
+
+[[package]]
+name = "typing-inspection"
+version = "0.4.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611 },
+]
+
+[[package]]
+name = "tzdata"
+version = "2024.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e1/34/943888654477a574a86a98e9896bae89c7aa15078ec29f490fef2f1e5384/tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc", size = 193282 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a6/ab/7e5f53c3b9d14972843a647d8d7a853969a58aecc7559cb3267302c94774/tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd", size = 346586 },
+]
+
+[[package]]
+name = "urllib3"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 },
+]
+
+[[package]]
+name = "wcwidth"
+version = "0.2.13"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 },
+]
+
+[[package]]
+name = "xlsxwriter"
+version = "3.2.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a6/c3/b36fa44a0610a0f65d2e65ba6a262cbe2554b819f1449731971f7c16ea3c/XlsxWriter-3.2.0.tar.gz", hash = "sha256:9977d0c661a72866a61f9f7a809e25ebbb0fb7036baa3b9fe74afcfca6b3cb8c", size = 198732 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a7/ea/53d1fe468e63e092cf16e2c18d16f50c29851242f9dd12d6a66e0d7f0d02/XlsxWriter-3.2.0-py3-none-any.whl", hash = "sha256:ecfd5405b3e0e228219bcaf24c2ca0915e012ca9464a14048021d21a995d490e", size = 159925 },
+]
+
+[[package]]
+name = "zstandard"
+version = "0.25.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/fd/aa/3e0508d5a5dd96529cdc5a97011299056e14c6505b678fd58938792794b1/zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b", size = 711513 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3d/5c/f8923b595b55fe49e30612987ad8bf053aef555c14f05bb659dd5dbe3e8a/zstandard-0.25.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e29f0cf06974c899b2c188ef7f783607dbef36da4c242eb6c82dcd8b512855e3", size = 795887 },
+ { url = "https://files.pythonhosted.org/packages/8d/09/d0a2a14fc3439c5f874042dca72a79c70a532090b7ba0003be73fee37ae2/zstandard-0.25.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:05df5136bc5a011f33cd25bc9f506e7426c0c9b3f9954f056831ce68f3b6689f", size = 640658 },
+ { url = "https://files.pythonhosted.org/packages/5d/7c/8b6b71b1ddd517f68ffb55e10834388d4f793c49c6b83effaaa05785b0b4/zstandard-0.25.0-cp314-cp314-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:f604efd28f239cc21b3adb53eb061e2a205dc164be408e553b41ba2ffe0ca15c", size = 5379849 },
+ { url = "https://files.pythonhosted.org/packages/a4/86/a48e56320d0a17189ab7a42645387334fba2200e904ee47fc5a26c1fd8ca/zstandard-0.25.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223415140608d0f0da010499eaa8ccdb9af210a543fac54bce15babbcfc78439", size = 5058095 },
+ { url = "https://files.pythonhosted.org/packages/f8/ad/eb659984ee2c0a779f9d06dbfe45e2dc39d99ff40a319895df2d3d9a48e5/zstandard-0.25.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e54296a283f3ab5a26fc9b8b5d4978ea0532f37b231644f367aa588930aa043", size = 5551751 },
+ { url = "https://files.pythonhosted.org/packages/61/b3/b637faea43677eb7bd42ab204dfb7053bd5c4582bfe6b1baefa80ac0c47b/zstandard-0.25.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca54090275939dc8ec5dea2d2afb400e0f83444b2fc24e07df7fdef677110859", size = 6364818 },
+ { url = "https://files.pythonhosted.org/packages/31/dc/cc50210e11e465c975462439a492516a73300ab8caa8f5e0902544fd748b/zstandard-0.25.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e09bb6252b6476d8d56100e8147b803befa9a12cea144bbe629dd508800d1ad0", size = 5560402 },
+ { url = "https://files.pythonhosted.org/packages/c9/ae/56523ae9c142f0c08efd5e868a6da613ae76614eca1305259c3bf6a0ed43/zstandard-0.25.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a9ec8c642d1ec73287ae3e726792dd86c96f5681eb8df274a757bf62b750eae7", size = 4955108 },
+ { url = "https://files.pythonhosted.org/packages/98/cf/c899f2d6df0840d5e384cf4c4121458c72802e8bda19691f3b16619f51e9/zstandard-0.25.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a4089a10e598eae6393756b036e0f419e8c1d60f44a831520f9af41c14216cf2", size = 5269248 },
+ { url = "https://files.pythonhosted.org/packages/1b/c0/59e912a531d91e1c192d3085fc0f6fb2852753c301a812d856d857ea03c6/zstandard-0.25.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f67e8f1a324a900e75b5e28ffb152bcac9fbed1cc7b43f99cd90f395c4375344", size = 5430330 },
+ { url = "https://files.pythonhosted.org/packages/a0/1d/7e31db1240de2df22a58e2ea9a93fc6e38cc29353e660c0272b6735d6669/zstandard-0.25.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:9654dbc012d8b06fc3d19cc825af3f7bf8ae242226df5f83936cb39f5fdc846c", size = 5811123 },
+ { url = "https://files.pythonhosted.org/packages/f6/49/fac46df5ad353d50535e118d6983069df68ca5908d4d65b8c466150a4ff1/zstandard-0.25.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4203ce3b31aec23012d3a4cf4a2ed64d12fea5269c49aed5e4c3611b938e4088", size = 5359591 },
+ { url = "https://files.pythonhosted.org/packages/c2/38/f249a2050ad1eea0bb364046153942e34abba95dd5520af199aed86fbb49/zstandard-0.25.0-cp314-cp314-win32.whl", hash = "sha256:da469dc041701583e34de852d8634703550348d5822e66a0c827d39b05365b12", size = 444513 },
+ { url = "https://files.pythonhosted.org/packages/3a/43/241f9615bcf8ba8903b3f0432da069e857fc4fd1783bd26183db53c4804b/zstandard-0.25.0-cp314-cp314-win_amd64.whl", hash = "sha256:c19bcdd826e95671065f8692b5a4aa95c52dc7a02a4c5a0cac46deb879a017a2", size = 516118 },
+ { url = "https://files.pythonhosted.org/packages/f0/ef/da163ce2450ed4febf6467d77ccb4cd52c4c30ab45624bad26ca0a27260c/zstandard-0.25.0-cp314-cp314-win_arm64.whl", hash = "sha256:d7541afd73985c630bafcd6338d2518ae96060075f9463d7dc14cfb33514383d", size = 476940 },
+]