From b54c0a6a7083d0d054994c9a48fcde1172fa4cb5 Mon Sep 17 00:00:00 2001 From: PeterWaIIace Date: Mon, 25 May 2026 14:31:00 +0200 Subject: [PATCH 01/14] adding rust engine and js --- .gitignore | 3 +- Makefile | 31 +- engine/Cargo.lock | 291 +++++++++ engine/Cargo.toml | 20 + engine/src/calibrator.rs | 177 ++++++ engine/src/eyegestures.rs | 145 +++++ engine/src/fixation.rs | 25 + engine/src/lib.rs | 32 + engine/src/python.rs | 56 ++ engine/src/wasm.rs | 41 ++ examples/simple_example_v4.py | 81 +++ eyeGestures/Legacy/Fixation.py | 23 + eyeGestures/Legacy/__init__.py | 471 +++++++++++++++ eyeGestures/{ => Legacy}/calibration_v1.py | 0 eyeGestures/{ => Legacy}/calibration_v2.py | 0 eyeGestures/Legacy/eye.py | 188 ++++++ eyeGestures/Legacy/face.py | 106 ++++ eyeGestures/{ => Legacy}/gazeEstimator.py | 0 eyeGestures/{ => Legacy}/gaze_contexter.py | 0 eyeGestures/Legacy/gevent.py | 57 ++ eyeGestures/Legacy/processing.py | 72 +++ eyeGestures/Legacy/requirements.txt | 7 + eyeGestures/{ => Legacy}/scalling_test.py | 0 .../{ => Legacy}/screenTracker/__init__.py | 0 .../{ => Legacy}/screenTracker/clusters.py | 0 .../{ => Legacy}/screenTracker/dataPoints.py | 0 .../{ => Legacy}/screenTracker/heatmap.py | 0 .../screenTracker/screenTracker.py | 0 .../{ => Legacy}/screenTracker_test.py | 0 eyeGestures/Legacy/utils.py | 240 ++++++++ eyeGestures/__init__.py | 407 ++----------- eyeGestures/eye.py | 22 +- eyeGestures/face.py | 65 +- pyproject.toml | 10 +- scripts/csv_reader.py | 48 -- scripts/heatmap_maker.py | 123 ---- tests/__init__.py | 0 tests/data/face_1.jpg | Bin 42883 -> 0 bytes tests/data/face_2.jpg | Bin 23980 -> 0 bytes tests/test_gestures.py | 65 -- tools/find_direction_vector.py | 125 ---- tools/pupilDetection.py | 43 -- uv.lock | 568 ++++++++++++++++++ web/License | 18 + web/Makefile | 17 + web/README.md | 140 +++++ web/demo/eyekey.html | 355 +++++++++++ web/example/EyeGesturesDark.png | Bin 0 -> 47767 bytes web/example/EyeGesturesLight.png | Bin 0 -> 39530 bytes web/example/eyegestures.css | 26 + web/example/simple.html | 90 +++ web/eyegestures.js | 2 + web/npm_test.js | 5 + web/package-lock.json | 141 +++++ web/package.json | 38 ++ web/src/eyegestures.js | 455 ++++++++++++++ web/test.js | 3 + 57 files changed, 4025 insertions(+), 807 deletions(-) create mode 100644 engine/Cargo.lock create mode 100644 engine/Cargo.toml create mode 100644 engine/src/calibrator.rs create mode 100644 engine/src/eyegestures.rs create mode 100644 engine/src/fixation.rs create mode 100644 engine/src/lib.rs create mode 100644 engine/src/python.rs create mode 100644 engine/src/wasm.rs create mode 100644 examples/simple_example_v4.py create mode 100644 eyeGestures/Legacy/Fixation.py create mode 100644 eyeGestures/Legacy/__init__.py rename eyeGestures/{ => Legacy}/calibration_v1.py (100%) rename eyeGestures/{ => Legacy}/calibration_v2.py (100%) create mode 100644 eyeGestures/Legacy/eye.py create mode 100644 eyeGestures/Legacy/face.py rename eyeGestures/{ => Legacy}/gazeEstimator.py (100%) rename eyeGestures/{ => Legacy}/gaze_contexter.py (100%) create mode 100644 eyeGestures/Legacy/gevent.py create mode 100644 eyeGestures/Legacy/processing.py create mode 100644 eyeGestures/Legacy/requirements.txt rename eyeGestures/{ => Legacy}/scalling_test.py (100%) rename eyeGestures/{ => Legacy}/screenTracker/__init__.py (100%) rename eyeGestures/{ => Legacy}/screenTracker/clusters.py (100%) rename eyeGestures/{ => Legacy}/screenTracker/dataPoints.py (100%) rename eyeGestures/{ => Legacy}/screenTracker/heatmap.py (100%) rename eyeGestures/{ => Legacy}/screenTracker/screenTracker.py (100%) rename eyeGestures/{ => Legacy}/screenTracker_test.py (100%) create mode 100644 eyeGestures/Legacy/utils.py delete mode 100644 scripts/csv_reader.py delete mode 100644 scripts/heatmap_maker.py delete mode 100644 tests/__init__.py delete mode 100644 tests/data/face_1.jpg delete mode 100644 tests/data/face_2.jpg delete mode 100644 tests/test_gestures.py delete mode 100644 tools/find_direction_vector.py delete mode 100644 tools/pupilDetection.py create mode 100644 uv.lock create mode 100644 web/License create mode 100644 web/Makefile create mode 100644 web/README.md create mode 100644 web/demo/eyekey.html create mode 100644 web/example/EyeGesturesDark.png create mode 100644 web/example/EyeGesturesLight.png create mode 100644 web/example/eyegestures.css create mode 100644 web/example/simple.html create mode 100644 web/eyegestures.js create mode 100644 web/npm_test.js create mode 100644 web/package-lock.json create mode 100644 web/package.json create mode 100644 web/src/eyegestures.js create mode 100644 web/test.js diff --git a/.gitignore b/.gitignore index bb41848..9736076 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ dist/* *.csv data/* .mypy_cache -.venvs \ No newline at end of file +.venvs +*.task \ No newline at end of file diff --git a/Makefile b/Makefile index bceca88..26ac2e5 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,5 @@ -.PHONY: format format_check test +.PHONY: format format_check test min wasm python -# Detect OS and set PYTHON command accordingly -ifeq ($(OS),Windows_NT) - PYTHON := $(shell where python3) -else - PYTHON := $(shell which python3) -endif format: isort eyeGestures @@ -20,5 +14,28 @@ check: format_check flake8 eyeGestures mypy eyeGestures +# Web build + +MINIFY = npx terser +MINIFY_FLAGS = --compress --mangle +JS_SRC = web/src/eyegestures.js +MIN = $(JS_SRC:.js=.min.js) + +min: + $(MINIFY) $(JS_SRC) $(MINIFY_FLAGS) -o engine/pkg/eyegestures.min.js + +wasm: + cd ./engine && wasm-pack build --target web + $(MINIFY) $(JS_SRC) $(MINIFY_FLAGS) -o engine/pkg/eyegestures.min.js + +# Python buil +PYTHON = uv run + +python: + cd ./engine && maturin develop --release --no-default-features --features python + +clean: + rm -f src/eyegestures.min.js + test: ${PYTHON} -m unittest tests/test_* \ No newline at end of file diff --git a/engine/Cargo.lock b/engine/Cargo.lock new file mode 100644 index 0000000..6c412bb --- /dev/null +++ b/engine/Cargo.lock @@ -0,0 +1,291 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "EyegesturesEngine" +version = "4.0.0" +dependencies = [ + "pyo3", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "indoc" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] + +[[package]] +name = "js-sys" +version = "0.3.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pyo3" +version = "0.23.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7778bffd85cf38175ac1f545509665d0b9b92a198ca7941f131f85f7a4f9a872" +dependencies = [ + "cfg-if", + "indoc", + "libc", + "memoffset", + "once_cell", + "portable-atomic", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", + "unindent", +] + +[[package]] +name = "pyo3-build-config" +version = "0.23.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f6cbe86ef3bf18998d9df6e0f3fc1050a8c5efa409bf712e661a4366e010fb" +dependencies = [ + "once_cell", + "target-lexicon", +] + +[[package]] +name = "pyo3-ffi" +version = "0.23.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f1b4c431c0bb1c8fb0a338709859eed0d030ff6daa34368d3b152a63dfdd8d" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-macros" +version = "0.23.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc2201328f63c4710f68abdf653c89d8dbc2858b88c5d88b0ff38a75288a9da" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.23.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fca6726ad0f3da9c9de093d6f116a93c1a38e417ed73bf138472cf4064f72028" +dependencies = [ + "heck", + "proc-macro2", + "pyo3-build-config", + "quote", + "syn", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unindent" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" + +[[package]] +name = "wasm-bindgen" +version = "0.2.122" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.122" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.122" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.122" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436" +dependencies = [ + "js-sys", + "wasm-bindgen", +] diff --git a/engine/Cargo.toml b/engine/Cargo.toml new file mode 100644 index 0000000..aca8b9d --- /dev/null +++ b/engine/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "EyegesturesEngine" +version = "4.0.0" +edition = "2021" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +# Wasm dependencies +wasm-bindgen = { version = "0.2", optional = true } +web-sys = { version = "0.3.99", features = ["console"], optional = true } + +# Python dependencies +pyo3 = { version = "0.23", optional = true, features = ["extension-module"] } + +[features] +default = ["wasm"] +wasm = ["wasm-bindgen", "web-sys"] +python = ["pyo3"] diff --git a/engine/src/calibrator.rs b/engine/src/calibrator.rs new file mode 100644 index 0000000..c6e7961 --- /dev/null +++ b/engine/src/calibrator.rs @@ -0,0 +1,177 @@ +use std::collections::VecDeque; + +struct LinearRegression { + x_data: Vec>, + y_data: Vec, + weights: Vec, + fitted: bool, +} + +impl LinearRegression { + fn new() -> Self { + Self { x_data: vec![], y_data: vec![], weights: vec![], fitted: false } + } + + fn add_sample(&mut self, x: Vec, y: f64) { + // Match JS MLR behavior: include a bias/intercept feature. + let mut x_with_bias = x; + x_with_bias.push(1.0); + self.x_data.push(x_with_bias); + self.y_data.push(y); + } + + fn fit(&mut self) { + let n = self.x_data.len(); + if n == 0 { + self.fitted = false; + return; + } + + let m = self.x_data[0].len(); + let mut xtx = vec![vec![0.0f64; m]; m]; + let mut xty = vec![0.0f64; m]; + + for i in 0..n { + for j in 0..m { + xty[j] += self.x_data[i][j] * self.y_data[i]; + for k in 0..m { + xtx[j][k] += self.x_data[i][j] * self.x_data[i][k]; + } + } + } + + for (i, row) in xtx.iter_mut().enumerate() { + row[i] += 1e-9; + } + + if let Some(w) = gaussian_elimination(xtx, xty) { + self.weights = w; + self.fitted = true; + } else { + self.fitted = false; + } + } + + fn predict(&self, x: &[f64]) -> f64 { + if !self.fitted { + return 0.0; + } + let weighted_sum: f64 = x.iter().zip(&self.weights).map(|(a, b)| a * b).sum(); + let bias = self.weights.get(x.len()).copied().unwrap_or(0.0); + weighted_sum + bias + } +} + +fn gaussian_elimination(mut a: Vec>, mut b: Vec) -> Option> { + let n = a.len(); + for i in 0..n { + let max_row = (i..n).max_by(|&r1, &r2| a[r1][i].abs().partial_cmp(&a[r2][i].abs()).unwrap())?; + a.swap(i, max_row); + b.swap(i, max_row); + + if a[i][i].abs() < 1e-12 { + return None; + } + + for k in i + 1..n { + let factor = a[k][i] / a[i][i]; + for j in i..n { + a[k][j] -= factor * a[i][j]; + } + b[k] -= factor * b[i]; + } + } + + let mut x = vec![0.0; n]; + for i in (0..n).rev() { + x[i] = b[i]; + for j in i + 1..n { + x[i] -= a[i][j] * x[j]; + } + x[i] /= a[i][i]; + } + Some(x) +} + +const CALIB_POINTS: [[f64; 2]; 25] = [ + [0.25, 0.25], [0.5, 0.75], [1.0, 0.5], [0.75, 0.5], [0.0, 0.75], + [0.5, 0.5], [1.0, 0.25], [0.75, 0.0], [0.25, 0.5], [0.5, 0.0], + [0.0, 0.5], [1.0, 1.0], [0.75, 1.0], [0.25, 0.0], [1.0, 0.0], + [0.0, 1.0], [0.25, 1.0], [0.75, 0.75],[0.5, 0.25], [0.0, 0.25], + [1.0, 0.5], [0.75, 0.25],[0.5, 1.0], [0.25, 0.75], [0.0, 0.0], +]; + +pub struct Calibrator { + tmp_x: VecDeque>, + stable_x: Vec>, + tmp_y: VecDeque<[f64; 2]>, + stable_y: Vec<[f64; 2]>, + reg_x: LinearRegression, + reg_y: LinearRegression, + point_index: usize, + pub fitted: bool, +} + +impl Calibrator { + pub fn new() -> Self { + Self { + tmp_x: VecDeque::new(), + stable_x: vec![], + tmp_y: VecDeque::new(), + stable_y: vec![], + reg_x: LinearRegression::new(), + reg_y: LinearRegression::new(), + point_index: 0, + fitted: false, + } + } + + pub fn add(&mut self, keypoints: Vec, target: [f64; 2]) { + self.tmp_x.push_back(keypoints); + self.tmp_y.push_back(target); + + if self.tmp_x.len() > 40 { + self.tmp_x.pop_front(); + self.tmp_y.pop_front(); + } + + let all_x: Vec> = self.tmp_x.iter().chain(self.stable_x.iter()).cloned().collect(); + let all_y: Vec<[f64; 2]> = self.tmp_y.iter().chain(self.stable_y.iter()).cloned().collect(); + + self.reg_x = LinearRegression::new(); + self.reg_y = LinearRegression::new(); + for (x, y) in all_x.into_iter().zip(all_y.into_iter()) { + self.reg_x.add_sample(x.clone(), y[0]); + self.reg_y.add_sample(x, y[1]); + } + + self.reg_x.fit(); + self.reg_y.fit(); + + self.fitted = self.reg_x.fitted && self.reg_y.fitted; + } + + pub fn predict(&self, keypoints: &[f64]) -> [f64; 2] { + if !self.fitted { + return [0.0, 0.0]; + } + [self.reg_x.predict(keypoints), self.reg_y.predict(keypoints)] + } + + pub fn current_point(&self, screen_width: f64, screen_height: f64) -> [f64; 2] { + let p = CALIB_POINTS[self.point_index]; + [p[0] * screen_width, p[1] * screen_height] + } + + pub fn next_point(&mut self) { + let all_x: Vec> = self.tmp_x.drain(..).collect(); + let all_y: Vec<[f64; 2]> = self.tmp_y.drain(..).collect(); + self.stable_x.extend(all_x); + self.stable_y.extend(all_y); + self.point_index = (self.point_index + 1) % CALIB_POINTS.len(); + } + + pub fn reset(&mut self) { + *self = Calibrator::new(); + } +} diff --git a/engine/src/eyegestures.rs b/engine/src/eyegestures.rs new file mode 100644 index 0000000..0044156 --- /dev/null +++ b/engine/src/eyegestures.rs @@ -0,0 +1,145 @@ +use crate::{Calibrator, euclidean_distance}; + +pub struct GazeResult { + pub x: f64, + pub y: f64, + pub calibrating: bool, + pub calib_point: [f64; 2], +} + +/// Shared core gaze tracking logic (wasm + python) +pub struct EyeGesturesCore { + pub calibrator: Calibrator, + pub screen_width: f64, + pub screen_height: f64, + pub calib_counter: usize, + pub calib_max: usize, + pub frames_on_point: usize, + pub prev_calib: [f64; 2], + pub eye_calib_regions: Vec<[f64; 2]>, + pub buffer: Vec<[f64; 2]>, + pub start_width: f64, + pub start_height: f64, + pub head_start: [f64; 2], + pub last_keypoints: Vec, +} + +impl EyeGesturesCore { + pub fn new(screen_width: f64, screen_height: f64) -> Self { + Self { + calibrator: Calibrator::new(), + screen_width, + screen_height, + calib_counter: 0, + calib_max: 25, + frames_on_point: 0, + prev_calib: [0.0, 0.0], + eye_calib_regions: vec![], + buffer: vec![], + start_width: 0.0, + start_height: 0.0, + head_start: [0.0, 0.0], + last_keypoints: vec![], + } + } + + pub fn process_landmarks(&mut self, landmarks: &[[f64; 2]]) -> GazeResult { + let left_indices = [33, 133, 160, 159, 158, 157, 173, 155, 154, 153, 144, 145, 153, 246, 468]; + let right_indices = [362, 263, 387, 386, 385, 384, 398, 382, 381, 380, 374, 373, 374, 466, 473]; + + let offset_x = landmarks.iter().map(|l| l[0]).fold(f64::INFINITY, f64::min); + let offset_y = landmarks.iter().map(|l| l[1]).fold(f64::INFINITY, f64::min); + let max_x = landmarks.iter().map(|l| l[0]).fold(f64::NEG_INFINITY, f64::max); + let max_y = landmarks.iter().map(|l| l[1]).fold(f64::NEG_INFINITY, f64::max); + let width = max_x - offset_x; + let height = max_y - offset_y; + + if self.start_width * self.start_height == 0.0 { + self.start_width = width; + self.start_height = height; + } + + let scale_x = width / self.start_width; + let scale_y = height / self.start_height; + + if self.head_start == [0.0, 0.0] { + self.head_start = [offset_x * scale_x, offset_y * scale_y]; + } + + let to_coords = |indices: &[usize]| -> Vec<[f64; 2]> { + indices.iter().map(|&i| { + let l = landmarks[i]; + [((l[0] - offset_x) / width) * scale_x, + ((l[1] - offset_y) / height) * scale_y] + }).collect() + }; + + let left_eye = to_coords(&left_indices); + let right_eye = to_coords(&right_indices); + + let mut keypoints: Vec = left_eye.iter().chain(right_eye.iter()) + .flat_map(|p| [p[0], p[1]]) + .collect(); + keypoints.extend([scale_x, scale_y, width, height]); + keypoints.extend([ + offset_x * scale_x - self.head_start[0], + offset_y * scale_y - self.head_start[1], + ]); + + self.last_keypoints = keypoints.clone(); + + let raw = self.calibrator.predict(&keypoints); + self.buffer.push(raw); + if self.buffer.len() > 20 { + self.buffer.remove(0); + } + let point = self.buffer.iter().fold([0.0, 0.0], |acc, p| [acc[0] + p[0], acc[1] + p[1]]); + let point = [point[0] / self.buffer.len() as f64, point[1] / self.buffer.len() as f64]; + + let calibrating = self.calib_counter < self.calib_max; + let calib_point = self.calibrator.current_point(self.screen_width, self.screen_height); + + if calibrating { + self.eye_calib_regions.push(left_eye[0]); + self.calibrator.add(keypoints, calib_point); + + let dist = euclidean_distance(&point, &calib_point); + if dist < 0.1 * self.screen_width && self.frames_on_point > 20 { + self.calibrator.next_point(); + self.frames_on_point = 0; + self.buffer.clear(); + } else if dist < 0.1 * self.screen_width { + self.frames_on_point += 1; + } + + if self.prev_calib != calib_point { + self.prev_calib = calib_point; + self.calib_counter += 1; + } + } else { + let eye_calib_radius = 0.01; + let seen = self.eye_calib_regions.iter() + .any(|r| euclidean_distance(r, &left_eye[0]) < eye_calib_radius); + + if !seen { + self.calib_max += 5; + } + } + + let x = point[0].clamp(0.0, self.screen_width); + let y = point[1].clamp(0.0, self.screen_height); + + GazeResult { x, y, calibrating, calib_point } + } + + pub fn add_calibration_point(&mut self, x: f64, y: f64) { + self.calib_counter += 1; + self.calib_max += 1; + self.calibrator.add(self.last_keypoints.clone(), [x, y]); + } + + pub fn recalibrate(&mut self) { + self.calibrator.reset(); + self.calib_counter = 0; + } +} diff --git a/engine/src/fixation.rs b/engine/src/fixation.rs new file mode 100644 index 0000000..dafdd93 --- /dev/null +++ b/engine/src/fixation.rs @@ -0,0 +1,25 @@ +pub struct Fixation { + center: [f64; 2], + radius: f64, + pub level: f64, +} + +impl Fixation { + pub fn new(x: f64, y: f64, radius: f64) -> Self { + Self { center: [x, y], radius, level: 0.0 } + } + + pub fn process(&mut self, x: f64, y: f64) -> f64 { + let dx = x - self.center[0]; + let dy = y - self.center[1]; + + if dx * dx + dy * dy < self.radius * self.radius { + self.level = (self.level + 0.02).min(1.0); + } else { + self.center = [x, y]; + self.level = 0.0; + } + + self.level + } +} diff --git a/engine/src/lib.rs b/engine/src/lib.rs new file mode 100644 index 0000000..5c88a86 --- /dev/null +++ b/engine/src/lib.rs @@ -0,0 +1,32 @@ +mod calibrator; +mod fixation; +mod eyegestures; + +#[cfg(target_arch = "wasm32")] +pub mod wasm; + +#[cfg(feature = "python")] +pub mod python; + +#[cfg(feature = "python")] +use pyo3::prelude::*; + +pub use calibrator::Calibrator; +pub use fixation::Fixation; +pub use eyegestures::EyeGesturesCore; + +#[cfg(feature = "python")] +#[pymodule] +#[pyo3(name = "EyegesturesEngine")] +fn eyegestures_engine(_py: Python<'_>, module: &Bound<'_, PyModule>) -> PyResult<()> { + module.add_class::()?; + Ok(()) +} + +pub fn euclidean_distance(a: &[f64], b: &[f64]) -> f64 { + a.iter() + .zip(b.iter()) + .map(|(x, y)| (x - y).powi(2)) + .sum::() + .sqrt() +} diff --git a/engine/src/python.rs b/engine/src/python.rs new file mode 100644 index 0000000..6676904 --- /dev/null +++ b/engine/src/python.rs @@ -0,0 +1,56 @@ +use crate::eyegestures::EyeGesturesCore; +use pyo3::prelude::*; + +#[pyclass] +pub struct EyeGesturesEnginePython{ + core: EyeGesturesCore, +} + +#[pymethods] +impl EyeGesturesEnginePython { + #[new] + pub fn new(screen_width: f64, screen_height: f64) -> Self { + Self{ + core: EyeGesturesCore::new(screen_width, screen_height), + } + } + + /// Process landmarks and return [x, y, calibrating, calib_x, calib_y] + pub fn process(&mut self, landmarks: Vec) -> Vec { + let landmarks: Vec<[f64; 2]> = landmarks + .chunks_exact(2) + .map(|pair| [pair[0], pair[1]]) + .collect(); + + let result = self.core.process_landmarks(&landmarks); + vec![ + result.x, + result.y, + if result.calibrating { 1.0 } else { 0.0 }, + result.calib_point[0], + result.calib_point[1], + ] + } + + /// Manually add a calibration point at (x, y) + pub fn add_calibration_point(&mut self, x: f64, y: f64) { + self.core.add_calibration_point(x, y); + } + + /// Reset calibration state + pub fn recalibrate(&mut self) { + self.core.recalibrate(); + } + + /// Get current calibration counter + #[getter] + pub fn calib_counter(&self) -> usize { + self.core.calib_counter + } + + /// Get current calibration max + #[getter] + pub fn calib_max(&self) -> usize { + self.core.calib_max + } +} diff --git a/engine/src/wasm.rs b/engine/src/wasm.rs new file mode 100644 index 0000000..78d76bc --- /dev/null +++ b/engine/src/wasm.rs @@ -0,0 +1,41 @@ +use crate::eyegestures::EyeGesturesCore; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +pub struct EyeGesturesEngineWasm{ + core: EyeGesturesCore, +} + +#[wasm_bindgen] +impl EyeGesturesEngineWasm { + #[wasm_bindgen(constructor)] + pub fn new(screen_width: f64, screen_height: f64) -> Self { + Self{ + core: EyeGesturesCore::new(screen_width, screen_height), + } + } + + pub fn process(&mut self, landmarks: Vec) -> Vec { + let landmarks: Vec<[f64; 2]> = landmarks + .chunks_exact(2) + .map(|pair| [pair[0], pair[1]]) + .collect(); + + let result = self.core.process_landmarks(&landmarks); + vec![ + result.x, + result.y, + if result.calibrating { 1.0 } else { 0.0 }, + result.calib_point[0], + result.calib_point[1], + ] + } + + pub fn add_calibration_point(&mut self, x: f64, y: f64) { + self.core.add_calibration_point(x, y); + } + + pub fn recalibrate(&mut self) { + self.core.recalibrate(); + } +} diff --git a/examples/simple_example_v4.py b/examples/simple_example_v4.py new file mode 100644 index 0000000..d7db1b0 --- /dev/null +++ b/examples/simple_example_v4.py @@ -0,0 +1,81 @@ +import os +import sys +import cv2 +import pygame +import numpy as np + +pygame.init() +pygame.font.init() + +# Get the display dimensions +screen_info = pygame.display.Info() +screen_width = screen_info.current_w +screen_height = screen_info.current_h + +# Set up the screen +screen = pygame.display.set_mode((screen_width, screen_height)) +pygame.display.set_caption("EyeGestures v4 example") +font_size = 48 +bold_font = pygame.font.Font(None, font_size) +bold_font.set_bold(True) # Set the font to bold + +dir_path = os.path.dirname(os.path.realpath(__file__)) +sys.path.append(f'{dir_path}/..') + +from eyeGestures.utils import VideoCapture +from eyeGestures import EyeGestures_v4 + +gestures = EyeGestures_v4() +cap = VideoCapture(0) + +# Initialize Pygame +# Set up colors +RED = (255, 0, 100) +BLUE = (100, 0, 255) +GREEN = (0, 255, 0) +BLANK = (0,0,0) +WHITE = (255, 255, 255) + +clock = pygame.time.Clock() + +# Main game loop +running = True +iterator = 0 +prev_x = 0 +prev_y = 0 +while running: + # Event handling + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + elif event.type == pygame.KEYDOWN: + if event.key == pygame.K_q and pygame.key.get_mods() & pygame.KMOD_CTRL: + running = False + + + # Generate new random position for the cursor + ret, frame = cap.read() + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + + point, calibrate, calib_point = gestures.step(frame, screen_width, screen_height - 100) + + screen.fill((0, 0, 0)) + # Display frame on Pygame + if calibrate: + if calib_point[0] != prev_x or calib_point[1] != prev_y: + iterator += 1 + prev_x = calib_point[0] + prev_y = calib_point[1] + # pygame.draw.circle(screen, GREEN, fit_point, calibration_radius) + pygame.draw.circle(screen, BLUE, calib_point, 50) + else: + pass + + pygame.draw.circle(screen, RED, point, 50) + pygame.display.flip() + + # Cap the frame rate + clock.tick(60) + +# Quit Pygame +pygame.quit() diff --git a/eyeGestures/Legacy/Fixation.py b/eyeGestures/Legacy/Fixation.py new file mode 100644 index 0000000..75fcb18 --- /dev/null +++ b/eyeGestures/Legacy/Fixation.py @@ -0,0 +1,23 @@ +"""Module providing a fixation detection.""" + + +class Fixation: + """Class performing Fixation""" + + def __init__(self, x: float, y: float, radius: int = 100) -> None: + self.radius = radius + self.fixation = 0.0 + self.x = x + self.y = y + + def process(self, x: float, y: float) -> float: + """Function processing x and y estimated points for fixation detection""" + + if (x - self.x) ** 2 + (y - self.y) ** 2 < self.radius**2: + self.fixation = min(self.fixation + 0.02, 1.0) + else: + self.x = x + self.y = y + self.fixation = 0.0 + + return self.fixation diff --git a/eyeGestures/Legacy/__init__.py b/eyeGestures/Legacy/__init__.py new file mode 100644 index 0000000..599731a --- /dev/null +++ b/eyeGestures/Legacy/__init__.py @@ -0,0 +1,471 @@ +import pickle +import time +from typing import Any, Dict, List, Optional, Tuple + +import cv2 +import numpy as np +import numpy.typing as npt + +import eyeGestures.screenTracker.dataPoints as dp +from eyeGestures.calibration_v1 import Calibrator as Calibrator_v1 +from eyeGestures.calibration_v2 import Calibrator as Calibrator_v2 +from eyeGestures.face import Face, FaceFinder +from eyeGestures.Fixation import Fixation +from eyeGestures.gazeEstimator import GazeTracker +from eyeGestures.gevent import Cevent, Gevent +from eyeGestures.utils import low_pass_filter_fourier, recoverable + +VERSION = "3.0.0" + + +class EyeGestures_v3: + """Main class for EyeGesture tracker. It configures and manages entire algorithm""" + + def __init__(self, calibration_radius: int = 1000) -> None: + self.calibration_radius = calibration_radius + + self.clb: Dict[str, Calibrator_v2] = dict() # Calibrator_v2() + self.cap = None + self.calibration: Dict[str, bool] = dict() + self.average_points: Dict[str, npt.NDArray[np.float64]] = dict() + self.filled_points: Dict[str, int] = dict() + self.enable_CN = False + self.calibrate_gestures = False + + self.finder = FaceFinder() + self.face = Face() + + # this has to be contexted + self.prev_timestamp: Dict[str, float] = dict() + self.prev_point: Dict[str, npt.NDArray[np.float64]] = dict() + self.fix: Optional[float] = None + self.velocity_max: Dict[str, int] = dict() + self.velocity_min: Dict[str, int] = dict() + self.fixationTracker: Dict[str, Fixation] = dict() + self.key_points_buffer: Dict[str, List[npt.NDArray[np.float64]]] = dict() + + self.starting_head_position = np.zeros((1, 2)) + self.starting_size = np.zeros((1, 2)) + + def saveModel(self, context: str = "main") -> Optional[bytes]: + if context in self.clb: + return pickle.dumps(self.clb[context]) + return None + + def loadModel(self, model: Any, context: str = "main") -> None: + self.clb[context] = pickle.loads(model) + + def uploadCalibrationMap(self, points: npt.NDArray[np.float64], context: str = "main") -> None: + self.addContext(context) + self.clb[context].updMatrix(np.array(points)) + + def getLandmarks(self, frame: cv2.typing.MatLike) -> Tuple[npt.NDArray[np.float64], bool, cv2.typing.MatLike]: + + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + frame = cv2.flip(frame, 1) + + # try: + self.face.process(frame, self.finder.find(frame)) + + face_landmarks = self.face.get_landmarks() + assert face_landmarks is not None + l_eye = self.face.get_left_eye() + r_eye = self.face.get_right_eye() + l_eye_landmarks = l_eye.getLandmarks() + r_eye_landmarks = r_eye.getLandmarks() + blink = l_eye.getBlink() and r_eye.getBlink() + + # get x,y offset + x_offset = np.min(face_landmarks[:, 0]) + y_offset = np.min(face_landmarks[:, 1]) + x_width = np.max(face_landmarks[:, 0]) - x_offset + y_width = np.max(face_landmarks[:, 1]) - y_offset + + # get head position + head_offset = np.zeros((1, 2)) + scale_x = 1 + scale_y = 1 + if np.array_equal(self.starting_head_position, np.zeros((1, 2))): + self.starting_head_position = np.array([[x_offset, y_offset]]) + self.starting_size = np.array([[x_width, y_width]]) + else: + head_offset = np.array([[x_offset, y_offset]]) - self.starting_head_position + scale_x = self.starting_size[0, 0] / x_width + scale_y = self.starting_size[0, 1] / y_width + + # eye_events = np.array([event.blink,event.fixation]).reshape(1, 2) + assert l_eye_landmarks is not None + assert r_eye_landmarks is not None + key_points: npt.NDArray[np.float64] = np.concatenate( + ( + l_eye_landmarks, + r_eye_landmarks, + np.array([[scale_x, scale_y]]), + head_offset, + ) + ) + key_points[:, 0] = key_points[:, 0] - head_offset[:, 0] + key_points[:, 1] = key_points[:, 1] - head_offset[:, 1] + + key_points[:, 0] = key_points[:, 0] * scale_x + key_points[:, 1] = key_points[:, 1] * scale_y + + key_points[-1, 0] = head_offset[0, 0] + key_points[-1, 1] = head_offset[0, 1] + # print(self.starting_size,x_width,y_width) + subframe = frame[ + int(y_offset) : int(y_offset + y_width), + int(x_offset) : int(x_offset + x_width), + ] + return key_points, blink, subframe + + def whichAlgorithm(self, context: str = "main") -> str: + if context in self.clb: + return self.clb[context].whichAlgorithm() + return "None" + + def reset(self, context: str = "main") -> None: + self.filled_points[context] = 0 + if context in self.clb: + self.addContext(context) + + def setFixation(self, fix: float) -> None: + self.fix = fix + + def addContext(self, context: str) -> None: + if context not in self.clb: + self.clb[context] = Calibrator_v2(self.calibration_radius) + self.average_points[context] = np.zeros((20, 2)) + self.filled_points[context] = 0 + self.calibration[context] = False + self.prev_timestamp[context] = time.time() + self.prev_point[context] = np.array((0.0, 0.0)) + self.velocity_max[context] = 0 + self.velocity_min[context] = 100000000 + self.fixationTracker[context] = Fixation(0, 0, 100) + self.key_points_buffer[context] = [] + + @recoverable(ret_error_params=(None, None)) + def step( + self, frame: cv2.typing.MatLike, calibration: bool, width: int, height: int, context: str = "main" + ) -> Tuple[Optional[Gevent], Optional[Cevent]]: + self.addContext(context) + + self.calibration[context] = calibration + + key_points, blink, sub_frame = self.getLandmarks(frame) + + self.key_points_buffer[context].append(key_points) + if len(self.key_points_buffer[context]) > 10: + self.key_points_buffer[context].pop(0) + key_points = low_pass_filter_fourier(key_points, 200) + + y_point = self.clb[context].predict(key_points) + self.average_points[context][1:, :] = self.average_points[context][ + : (self.average_points[context].shape[0] - 1), : + ] + self.average_points[context][0, :] = y_point + + if ( + self.filled_points[context] < self.average_points[context].shape[0] + and (y_point != np.array([0.0, 0.0])).any() + ): + self.filled_points[context] += 1 + if self.filled_points[context] == 0: + self.filled_points[context] = 1 + + averaged_point = np.sum(self.average_points[context][:, :], axis=0) / (self.filled_points[context]) + fixation = self.fixationTracker[context].process(averaged_point[0], averaged_point[1]) + + duration = time.time() - self.prev_timestamp[context] + velocity = abs(averaged_point - self.prev_point[context]) / duration + velocity = np.sqrt(velocity[0] ** 2 + velocity[1] ** 2) + self.prev_point[context] = averaged_point + self.prev_timestamp[context] = time.time() + + self.velocity_max[context] = max(self.velocity_max[context], velocity) + self.velocity_min[context] = min(self.velocity_min[context], velocity) + + saccades = velocity > (self.velocity_max[context]) / 4 + + if self.calibration[context] and ( + self.clb[context].insideClbRadius(averaged_point, width, height) + or self.filled_points[context] < self.average_points[context].shape[0] * 10 + ): + self.clb[context].add(key_points, self.clb[context].getCurrentPoint(width, height)) + else: + self.clb[context].post_fit() + + if self.calibration[context] and self.clb[context].insideAcptcRadius(averaged_point, width, height): + if self.clb[context].isReadyToMove(): + self.clb[context].movePoint() + + gevent = Gevent( + point=averaged_point, + blink=blink, + fixation=fixation, + saccades=saccades, + sub_frame=sub_frame, + ) + cevent = Cevent( + self.clb[context].getCurrentPoint(width, height), + self.clb[context].acceptance_radius, + self.clb[context].calibration_radius, + ) + return (gevent, cevent) + + +class EyeGestures_v2: + """Main class for EyeGesture tracker. It configures and manages entire algorithm""" + + def __init__(self, calibration_radius: int = 1000) -> None: + self.monitor_width = 1 + self.monitor_height = 1 + self.calibration_radius = calibration_radius + + self.clb: Dict[str, Calibrator_v2] = dict() # Calibrator_v2() + self.cap = None + self.gestures = EyeGestures_v1(285, 115, 200, 100) + + self.calibration: Dict[str, bool] = dict() + + self.CN: int = 5 + + self.average_points: Dict[str, npt.NDArray[np.float64]] = dict() + self.filled_points: Dict[str, int] = dict() + self.enable_CN = False + self.calibrate_gestures = False + + self.fix = 0.8 + + def saveModel(self, context: str = "main") -> Optional[bytes]: + if context in self.clb: + return pickle.dumps(self.clb[context]) + return None + + def loadModel(self, model: Any, context: str = "main") -> None: + self.clb[context] = pickle.loads(model) + + def uploadCalibrationMap(self, points: npt.NDArray[np.float64], context="main") -> None: + self.addContext(context) + self.clb[context].updMatrix(np.array(points)) + + def getLandmarks( + self, frame: cv2.typing.MatLike, calibrate: bool = False, context: str = "main" + ) -> Tuple[npt.NDArray[np.float64], npt.NDArray[np.float64], bool, bool, Optional[Cevent]]: + + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + frame = cv2.flip(frame, 1) + # frame = cv2.resize(frame, (360, 640)) + + event, cevent = self.gestures.step( + frame, + context, + calibrate, # set calibration - switch to False to stop calibration + self.monitor_width, + self.monitor_height, + 0, + 0, + self.fix, + 100, + ) + + if event is not None or cevent is not None: + cursor_x, cursor_y = event.point[0], event.point[1] + l_eye_landmarks = event.l_eye.getLandmarks() + r_eye_landmarks = event.r_eye.getLandmarks() + + cursors = np.array([cursor_x, cursor_y]).reshape(1, 2) + eye_events = np.array([event.blink, event.fixation]).reshape(1, 2) + key_points = np.concatenate((cursors, l_eye_landmarks, r_eye_landmarks, eye_events)) + return ( + np.array((cursor_x, cursor_y)), + key_points, + event.blink, + event.fixation, + cevent, + ) + return np.array((0.0, 0.0)), np.array([]), False, False, None + + def whichAlgorithm(self, context: str = "main") -> str: + if context in self.clb: + return self.clb[context].whichAlgorithm() + return "None" + + def setClassicImpact(self, impact: int) -> None: + self.CN = impact + + def reset(self, context: str = "main") -> None: + self.filled_points[context] = 0 + if context in self.clb: + self.addContext(context) + + def setFixation(self, fix: float) -> None: + self.fix = fix + + def setClassicalImpact(self, CN: int) -> None: + self.CN = CN + + def enableCNCalib(self) -> None: + self.enable_CN = True + + def disableCNCalib(self) -> None: + self.enable_CN = False + + def addContext(self, context: str) -> None: + if context not in self.clb: + self.clb[context] = Calibrator_v2(self.calibration_radius) + self.average_points[context] = np.zeros((20, 2)) + self.filled_points[context] = 0 + self.calibration[context] = False + + @recoverable(ret_error_params=(None, None)) + def step( + self, frame: cv2.typing.MatLike, calibration: bool, width: int, height: int, context: str = "main" + ) -> Tuple[Optional[Gevent], Optional[Cevent]]: + self.addContext(context) + + self.calibration[context] = calibration + self.monitor_width = width + self.monitor_height = height + + classic_point, key_points, blink, fixation, cevent = self.getLandmarks( + frame, self.calibrate_gestures and self.enable_CN, context=context + ) + + margin = 10 + if cevent is None: + raise ValueError("cevent must not be None") + if (classic_point[0] <= margin) and self.calibration[context]: + self.calibrate_gestures = cevent.calibration + elif (classic_point[0] >= width - margin) and self.calibration[context]: + self.calibrate_gestures = cevent.calibration + elif (cevent.point[1] <= margin) and self.calibration[context]: + self.calibrate_gestures = cevent.calibration + elif (classic_point[1] >= height - margin) and self.calibration[context]: + self.calibrate_gestures = cevent.calibration + else: + self.calibrate_gestures = False + + y_point = self.clb[context].predict(key_points) + self.average_points[context][1:, :] = self.average_points[context][ + : (self.average_points[context].shape[0] - 1), : + ] + if fixation <= self.fix: + self.average_points[context][0, :] = y_point + + if ( + self.filled_points[context] < self.average_points[context].shape[0] + and (y_point != np.array([0.0, 0.0])).any() + ): + self.filled_points[context] += 1 + averaged_point = (np.sum(self.average_points[context][:, :], axis=0) + (classic_point * self.CN)) / ( + self.filled_points[context] + self.CN + ) + + if self.calibration[context] and ( + self.clb[context].insideClbRadius(averaged_point, width, height) + or self.filled_points[context] < self.average_points[context].shape[0] * 10 + ): + self.clb[context].add(key_points, self.clb[context].getCurrentPoint(width, height)) + else: + self.clb[context].post_fit() + + if self.calibration[context] and self.clb[context].insideAcptcRadius(averaged_point, width, height): + if self.clb[context].isReadyToMove(): + self.clb[context].movePoint() + + gevent = Gevent(averaged_point, blink, fixation) + cevent = Cevent( + self.clb[context].getCurrentPoint(width, height), + self.clb[context].acceptance_radius, + self.clb[context].calibration_radius, + ) + return (gevent, cevent) + + +class EyeGestures_v1: + """Main class for EyeGesture tracker. It configures and manages entier algorithm""" + + def __init__(self, roi_x=225, roi_y=105, roi_width=80, roi_height=15): + + screen_width = 500 + screen_height = 500 + height = 250 + width = 250 + + roi_x = roi_x % screen_width + roi_y = roi_y % screen_height + roi_width = roi_width % screen_width + roi_height = roi_height % screen_height + + self.screen_width = screen_width + self.screen_height = screen_height + + self.screen = dp.Screen(screen_width, screen_height) + + self.gaze = GazeTracker( + screen_width, + screen_height, + width, + height, + roi_x, + roi_y, + roi_width, + roi_height, + ) + + self.calibrators = dict() + self.calibrate = False + + def getFeatures(self, image): + """[NOT RECOMMENDED] Function allowing for extraction of gaze features from image""" + + return self.gaze.getFeatures(image) + + # @timeit + # 0.011 - 0.015 s for execution + def step( + self, + image, + context, + calibration, + display_width, + display_height, + display_offset_x=0, + display_offset_y=0, + fixation_freeze=0.7, + freeze_radius=20, + offset_x=0, + offset_y=0, + ): + """Function performing estimation and returning event object""" + + display = dp.Display(display_width, display_height, display_offset_x, display_offset_y) + + # allow for random recalibration shot + event = self.gaze.estimate( + image, + display, + context, + calibration, + fixation_freeze, + freeze_radius, + offset_x, + offset_y, + ) + cevent = None + + if event is not None: + cursor_x, cursor_y = event.point[0], event.point[1] + if context in self.calibrators: + self.calibrate = self.calibrators[context].calibrate(cursor_x, cursor_y, event.fixation) + else: + self.calibrators[context] = Calibrator_v1(display_width, display_height, cursor_x, cursor_y) + self.calibrate = self.calibrators[context].calibrate(cursor_x, cursor_y, event.fixation) + + cpoint = self.calibrators[context].get_current_point() + calibration = self.calibrate and cpoint != (0, 0) + cevent = Cevent(cpoint, 100, 100, calibration) + + return (event, cevent) diff --git a/eyeGestures/calibration_v1.py b/eyeGestures/Legacy/calibration_v1.py similarity index 100% rename from eyeGestures/calibration_v1.py rename to eyeGestures/Legacy/calibration_v1.py diff --git a/eyeGestures/calibration_v2.py b/eyeGestures/Legacy/calibration_v2.py similarity index 100% rename from eyeGestures/calibration_v2.py rename to eyeGestures/Legacy/calibration_v2.py diff --git a/eyeGestures/Legacy/eye.py b/eyeGestures/Legacy/eye.py new file mode 100644 index 0000000..184c4ee --- /dev/null +++ b/eyeGestures/Legacy/eye.py @@ -0,0 +1,188 @@ +"""Module providing a extraction of eye from face object.""" + +from typing import Optional, Tuple + +import cv2 +import mediapipe as mp +import numpy as np +import numpy.typing as npt + +from eyeGestures.utils import Buffor + + +class Eye: + """Class storing data related and representing a eye""" + + LEFT_EYE_KEYPOINTS = np.array(list(mp.solutions.face_mesh.FACEMESH_LEFT_EYE))[:, 0] + RIGHT_EYE_KEYPOINTS = np.array(list(mp.solutions.face_mesh.FACEMESH_RIGHT_EYE))[:, 0] + LEFT_EYE_PUPIL_KEYPOINT = [473] + RIGHT_EYE_PUPIL_KEYPOINT = [468] + + # LEFT_EYE_KEYPOINTS = [36, 37, 38, 39, 40, 41] # keypoint indices for left eye + # RIGHT_EYE_KEYPOINTS = [42, 43, 44, 45, 46, 47] # keypoint indices for right eye + + scale = (150, 100) + + def __init__(self, side: int) -> None: + + # check if eye is left or right + if side == 1: + self.side = "right" + self.pupil_index = self.RIGHT_EYE_PUPIL_KEYPOINT + elif side == 0: + self.side = "left" + self.pupil_index = self.LEFT_EYE_PUPIL_KEYPOINT + + self.x = 0 + self.y = 0 + self.width = 0 + self.height = 0 + self.center_x = 0 + self.center_y = 0 + self.image: Optional[cv2.typing.MatLike] = None + self.pupil: Optional[npt.NDArray[np.float64]] = None + self.offset: Optional[npt.NDArray[np.float64]] = None + self.region: Optional[npt.NDArray[np.float64]] = None + self.cut_image: Optional[cv2.typing.MatLike] = None + self.landmarks: Optional[npt.NDArray[np.float64]] = None + + # self._process(self.image,self.region) + + def update( + self, image: cv2.typing.MatLike, landmarks: npt.NDArray[np.float64], offset: npt.NDArray[np.float64] + ) -> None: + """function updating data stored inside eye object""" + + self.image = image + self.offset = offset + self.landmarks = landmarks + # check if eye is left or right + if self.side == "right": + self.region = np.array(landmarks[self.RIGHT_EYE_KEYPOINTS]) + # landmarks[self.RIGHT_EYE_KEYPOINTS], dtype=np.int32) + + elif self.side == "left": + self.region = np.array(landmarks[self.LEFT_EYE_KEYPOINTS]) + # landmarks[self.LEFT_EYE_KEYPOINTS], dtype=np.int32) + + self.pupil = landmarks[self.pupil_index][0] + assert self.region is not None + self._process(self.image, self.region) + + def getCenter(self) -> Tuple[float, float]: + """function returning center of eye""" + + return (float(self.center_x), float(self.center_y)) + + def getPos(self) -> Tuple[int, int]: + """function returning position of eye in the image""" + + return (int(self.x), int(self.y)) + + def getPupil(self) -> Optional[npt.NDArray[np.float64]]: + """function returning pupil object""" + + # return self.pupil.getCoords() + return self.pupil + + def getBlink(self) -> bool: + """function returning blink event""" + # return self.pupil.getCoords() + return (self.height) <= 3 # 2x margin + + def getImage(self) -> Optional[cv2.typing.MatLike]: + """function returning image of the eye cut from the entire face image""" + + # TODO: draw additional parameters + return self.cut_image + + def getGaze(self, gaze_buffor: Buffor, y_correction: int = 0, x_correction: int = 0) -> npt.NDArray[np.float64]: + """function returning gaze position""" + + # pupilCoords = self.pupil.getCoords() + assert self.offset is not None + assert self.region is not None + assert self.pupil is not None + center = np.array((self.center_x, self.center_y)) - self.offset + + region_corrected = self.region - self.offset + pupil_corrected = self.pupil - self.offset + + vectors = region_corrected - center + pupil = pupil_corrected - center + + vectors = vectors - pupil + gaze_vector = np.zeros((2)) + + gaze_vector[1] = np.sum(vectors, axis=0)[1] * 10 - y_correction + gaze_vector[0] = -np.sum(vectors, axis=0)[0] * 10 - x_correction + + # print("gaze_vector: ",gaze_vector) + gaze_buffor.add(gaze_vector) + return gaze_buffor.getAvg() + + def getOpenness(self) -> float: + """function returning eye openness""" + + return self.height / 2 + + def getLandmarks(self) -> Optional[npt.NDArray[np.float64]]: + """function returning eye landmarks""" + + return self.region + + def getBoundingBox(self) -> Tuple[int, int, int, int]: + return (int(self.x), int(self.y), int(self.width), int(self.height)) + + def _process(self, image: cv2.typing.MatLike, region: npt.NDArray[np.float64]) -> None: + h, w, _ = image.shape + + mask = np.full((h, w), 0, dtype=np.uint8) + background = np.zeros((h, w), dtype=np.uint8) + + region_int = np.array(region, dtype=np.int32) + cv2.fillPoly(mask, [region_int], (0,)) + + masked_image = cv2.bitwise_not(background, cv2.cvtColor(image.copy(), cv2.COLOR_BGR2GRAY), mask=mask) + + margin = 2 + min_x = np.min(region_int[:, 0]) - margin + max_x = np.max(region_int[:, 0]) + margin + min_y = np.min(region_int[:, 1]) - margin + max_y = np.max(region_int[:, 1]) + margin + + self.x = min_x + self.y = min_y + + self.width = np.max(region_int[:, 0]) - np.min(region_int[:, 0]) + self.height = np.max(region_int[:, 1]) - np.min(region_int[:, 1]) + + self.center_x = (min_x + max_x) / 2 + self.center_y = (min_y + max_y) / 2 + + # HACKETY_HACK: + assert self.pupil is not None + self.pupil[1] = np.min(region[:, 1]) + + self.cut_image = masked_image[min_y:max_y, min_x:max_x] + # print(f"here: {self.cut_image.shape,min_y,max_y,min_x,max_x}") + # self.cut_image = cv2.cvtColor(self.cut_image, cv2.COLOR_GRAY2BGR) + + # for point in self.region: + # point = point - (min_x, min_y) + # cv2.circle(self.cut_image, point.astype( + # int), 1, (255, 0, 0, 150), 1) + + # pupil = self.pupil - (min_x, min_y) + + # cv2.circle(self.cut_image, pupil.astype(int), 1, (0, 255, 0, 150), 1) + + # self.cut_image = cv2.resize(self.cut_image, self.scale) + + # save cut_image to buffor and get avg from previous buffors + # self.eyeBuffer.add(self.cut_image) + # self.cut_image = np.array(self.eyeBuffer.getAvg(), dtype=np.uint8) + + # LEGACY + # org_scale = (max_x - min_x,max_y - min_y) + # self.pupil = pupil.Pupil(self.cut_image, min_x, min_y, self.scale, org_scale) diff --git a/eyeGestures/Legacy/face.py b/eyeGestures/Legacy/face.py new file mode 100644 index 0000000..42575eb --- /dev/null +++ b/eyeGestures/Legacy/face.py @@ -0,0 +1,106 @@ +"""Module providing finding and extraction of face from image.""" + +from typing import Any, NamedTuple, Optional, Tuple + +import cv2 +import mediapipe as mp +import numpy as np +import numpy.typing as npt + +from eyeGestures.eye import Eye + + +class FaceFinder: + """Class helping finding face""" + + def __init__(self) -> None: + self.mp_face_mesh = mp.solutions.face_mesh.FaceMesh( + refine_landmarks=True, + static_image_mode=False, + min_detection_confidence=0.5, + min_tracking_confidence=0.5, + ) + + def find(self, image: cv2.typing.MatLike) -> Optional[Any]: + """Find face mesh""" + + assert len(image.shape) > 2 + + try: + face_mesh = self.mp_face_mesh.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) + if face_mesh.multi_face_landmarks is None: + return None + + return face_mesh + except Exception as e: + print(f"Exception in FaceFinder: {e}") + return None + + +class Face: + """Class keeping and processing face landmarks""" + + def __init__(self) -> None: + self.eye_left = Eye(0) + self.eye_right = Eye(1) + self.landmarks: Optional[npt.NDArray[np.float64]] = None + self.image_h: Optional[int] = None + self.image_w: Optional[int] = None + self.face: Optional[NamedTuple] = None + + def get_bounding_box(self) -> Tuple[int, int, int, int]: + """Get bounding box of face""" + if self.landmarks is not None: + margin = 0 + min_x = np.min(self.landmarks[:, 0]) - margin + max_x = np.max(self.landmarks[:, 0]) + margin + min_y = np.min(self.landmarks[:, 1]) - margin + max_y = np.max(self.landmarks[:, 1]) + margin + + width = int((max_x - min_x)) + height = int((max_y - min_y)) + x = int(min_x) + y = int(min_y) + return (x, y, width, height) + return (0, 0, 0, 0) + + def get_left_eye(self) -> Eye: + """Get left eye""" + return self.eye_left + + def get_right_eye(self) -> Eye: + """Get right eye""" + return self.eye_right + + def get_landmarks(self) -> Optional[npt.NDArray[np.float64]]: + """Get landmarks""" + return self.landmarks + + def _landmarks(self, face: Any) -> npt.NDArray[np.float64]: + + __complex_landmark_points = face.multi_face_landmarks + __complex_landmarks = __complex_landmark_points[0].landmark + + __face_landmarks = [] + for landmark in __complex_landmarks: + __face_landmarks.append((landmark.x * self.image_w, landmark.y * self.image_h)) + + return np.array(__face_landmarks) + + def process(self, image: cv2.typing.MatLike, face: Optional[Any]) -> None: + """Process face landmarks on image""" + # try: + self.face = face + self.image_h, self.image_w, _ = image.shape + self.landmarks = self._landmarks(self.face) + # self.nose = nose.Nose(image,self.landmarks,self.getBoundingBox()) + + x, y, _, _ = self.get_bounding_box() + offset = np.array((x, y)) + # offset = offset - self.nose.getHeadTiltOffset() + + self.eye_left.update(image, self.landmarks, offset) + self.eye_right.update(image, self.landmarks, offset) + # except Exception as e: + # print(f"Caught exception: {e}") + # return None diff --git a/eyeGestures/gazeEstimator.py b/eyeGestures/Legacy/gazeEstimator.py similarity index 100% rename from eyeGestures/gazeEstimator.py rename to eyeGestures/Legacy/gazeEstimator.py diff --git a/eyeGestures/gaze_contexter.py b/eyeGestures/Legacy/gaze_contexter.py similarity index 100% rename from eyeGestures/gaze_contexter.py rename to eyeGestures/Legacy/gaze_contexter.py diff --git a/eyeGestures/Legacy/gevent.py b/eyeGestures/Legacy/gevent.py new file mode 100644 index 0000000..7bc0181 --- /dev/null +++ b/eyeGestures/Legacy/gevent.py @@ -0,0 +1,57 @@ +"""Module providing a Gaze Events.""" + +from typing import Any, Optional + +import cv2 +import numpy as np +import numpy.typing as npt + +from eyeGestures.eye import Eye + + +class Gevent: + """Class representing gaze event, with tracked points scaled to screen, blink and fixation.""" + + def __init__( + self, + point: npt.NDArray[np.float64], + blink: bool, + fixation: float, + l_eye: Optional[Eye] = None, + r_eye: Optional[Eye] = None, + screen_man: Optional[Any] = None, + roi: Optional[Any] = None, + edges: Optional[Any] = None, + cluster: Optional[Any] = None, + context: Optional[Any] = None, + saccades: bool = False, + sub_frame: Optional[cv2.typing.MatLike] = None, + ): + + self.point = point + self.blink = blink + self.fixation = fixation + self.saccades = saccades + + # ALL DEBUG DATA + self.roi = roi + self.edges = edges + self.l_eye = l_eye + self.r_eye = r_eye + self.cluster = cluster + self.context = context + self.screen_man = screen_man + self.sub_frame = sub_frame + + +class Cevent: + """Class representing gaze event, with tracked points scaled to screen, blink and fixation.""" + + def __init__( + self, point: npt.NDArray[np.float64], acceptance_radius: int, calibration_radius: int, calibration: bool = False + ) -> None: + + self.point = point + self.acceptance_radius = acceptance_radius + self.calibration_radius = calibration_radius + self.calibration = calibration diff --git a/eyeGestures/Legacy/processing.py b/eyeGestures/Legacy/processing.py new file mode 100644 index 0000000..9a5f8e5 --- /dev/null +++ b/eyeGestures/Legacy/processing.py @@ -0,0 +1,72 @@ +"""Module providing a processing pupil position to gaze direction.""" + +from typing import Tuple + +import numpy as np +import numpy.typing as npt + + +class EyeProcessor: + """Class providing processing for eye to obtain gaze direction.""" + + def __init__(self, scale_w=250, scale_h=250): + self.scale_w = scale_w + self.scale_h = scale_h + self.min_x = 0 + self.max_x = 0 + self.min_y = 0 + self.max_y = 0 + self.pupil = None + self.landmarks = None + + def append(self, pupil: Tuple[int, int], landmarks: npt.NDArray[np.float64], pupilBuffor): + """Function appending new pupil point to tracker.""" + + self.pupil = pupil + self.landmarks = landmarks + + # get center: + margin = 5 + self.min_x = np.min(self.landmarks[:, 0]) - margin + self.max_x = np.max(self.landmarks[:, 0]) + margin + self.min_y = np.min(self.landmarks[:, 1]) - margin + self.max_y = np.max(self.landmarks[:, 1]) + margin + + assert self.pupil[0] > self.min_x + assert self.pupil[1] > self.min_y + + width = self.max_x - self.min_x + height = (self.max_y - self.min_y) / 2 + + pupilBuffor.add( + self.__convertPoint( + self.pupil, + width=self.scale_w, + height=self.scale_h, + scale_w=width, + scale_h=height, + offset=(self.min_x, self.min_y), + ) + ) + + def __convertPoint(self, point, width=1.0, height=1.0, scale_w=1.0, scale_h=1.0, offset=(0.0, 0.0)): + (min_x, min_y) = offset + x = int(((point[0] - min_x) / scale_w) * width) + y = int(((point[1] - min_y) / scale_h) * height) + return (x, y) + + def getAvgPupil(self, width, height, pupilBuffor): + """Function returning average point based on tracked.""" + + if width is not None and height is not None: + _retPupil = self.__convertPoint( + pupilBuffor.getAvg(), + width=width, + height=height, + scale_w=self.scale_w, + scale_h=self.scale_h, + ) + else: + _retPupil = pupilBuffor.getAvg() + + return _retPupil diff --git a/eyeGestures/Legacy/requirements.txt b/eyeGestures/Legacy/requirements.txt new file mode 100644 index 0000000..4436618 --- /dev/null +++ b/eyeGestures/Legacy/requirements.txt @@ -0,0 +1,7 @@ +mediapipe==0.10.8 +numpy==1.23.4 +opencv_contrib_python==4.8.1.78 +opencv_python==4.8.1.78 +opencv_python_headless==4.8.1.78 +scikit_learn==1.5.0 +scipy==1.11.4 diff --git a/eyeGestures/scalling_test.py b/eyeGestures/Legacy/scalling_test.py similarity index 100% rename from eyeGestures/scalling_test.py rename to eyeGestures/Legacy/scalling_test.py diff --git a/eyeGestures/screenTracker/__init__.py b/eyeGestures/Legacy/screenTracker/__init__.py similarity index 100% rename from eyeGestures/screenTracker/__init__.py rename to eyeGestures/Legacy/screenTracker/__init__.py diff --git a/eyeGestures/screenTracker/clusters.py b/eyeGestures/Legacy/screenTracker/clusters.py similarity index 100% rename from eyeGestures/screenTracker/clusters.py rename to eyeGestures/Legacy/screenTracker/clusters.py diff --git a/eyeGestures/screenTracker/dataPoints.py b/eyeGestures/Legacy/screenTracker/dataPoints.py similarity index 100% rename from eyeGestures/screenTracker/dataPoints.py rename to eyeGestures/Legacy/screenTracker/dataPoints.py diff --git a/eyeGestures/screenTracker/heatmap.py b/eyeGestures/Legacy/screenTracker/heatmap.py similarity index 100% rename from eyeGestures/screenTracker/heatmap.py rename to eyeGestures/Legacy/screenTracker/heatmap.py diff --git a/eyeGestures/screenTracker/screenTracker.py b/eyeGestures/Legacy/screenTracker/screenTracker.py similarity index 100% rename from eyeGestures/screenTracker/screenTracker.py rename to eyeGestures/Legacy/screenTracker/screenTracker.py diff --git a/eyeGestures/screenTracker_test.py b/eyeGestures/Legacy/screenTracker_test.py similarity index 100% rename from eyeGestures/screenTracker_test.py rename to eyeGestures/Legacy/screenTracker_test.py diff --git a/eyeGestures/Legacy/utils.py b/eyeGestures/Legacy/utils.py new file mode 100644 index 0000000..aba78ab --- /dev/null +++ b/eyeGestures/Legacy/utils.py @@ -0,0 +1,240 @@ +import pickle +import platform +import queue +import threading +import time + +import cv2 +import numpy as np +import numpy.typing as npt + +# Make predictions for new data points + + +def recoverable(ret_error_params=()): + def decorator(func): + """ + timeit + """ + + def inner(*args, **kwargs): + """ + inner + """ + try: + return func(*args, **kwargs) + except Exception as e: + print(f"Caugh error: {e}") + return ret_error_params + + return inner + + return decorator + + +def timeit(func): + """ + timeit + """ + + def inner(*args, **kwargs): + """ + inner + """ + start = time.time() + ret = func(*args, **kwargs) + print(f"Elapsed time: {time.time() - start}") + return ret + + return inner + + +def low_pass_filter_fourier(data: npt.NDArray[np.float64], cutoff_frequency: int) -> npt.NDArray[np.float64]: + # Apply Fourier Transform-based filter column-wise + filtered_data = np.zeros_like(data, dtype=float) + for col in range(data.shape[1]): # Iterate over each column + fft_data = np.fft.fft(data[:, col]) + frequencies = np.fft.fftfreq(len(data[:, col])) + # Apply the low-pass filter + fft_data[np.abs(frequencies) > cutoff_frequency] = 0 + # Perform Inverse Fourier Transform + filtered_data[:, col] = np.fft.ifft(fft_data).real + return filtered_data + + +def shape_to_np(shape, dtype="int"): + """ + shape_to_np + """ + coords = np.zeros((68, 2), dtype=dtype) + for i in range(0, 68): + coords[i] = (shape.part(i).x, shape.part(i).y) + return coords + + +def make_image_grid(images, rows, cols): + """ + Make a grid of images. + + Parameters: + - images: list of images to form the grid (all images must be of the same size and type) + - rows, cols: number of rows and columns in the grid + + Returns: + - grid_image: image grid as a single image + """ + # Check if the list of images is not empty and that we have enough to fill the grid + assert images, "List of images is empty" + # assert len(images) >= rows * cols, "Not enough images to fill the grid" + + # Get image dimensions + img_h, img_w = images[0].shape[:2] + + if len(images[0].shape) > 2: + # Create a black canvas to draw the grid on + grid_image = np.zeros((img_h * rows, img_w * cols, images[0].shape[2]), dtype=np.uint8) + else: + grid_image = np.zeros((img_h * rows, img_w * cols), dtype=np.uint8) + + # Copy images to the grid + for i, img in enumerate(images): + if i >= rows * cols: + break # Stop if we have filled the grid + row = i // cols + col = i % cols + grid_image[row * img_h : (row + 1) * img_h, col * img_w : (col + 1) * img_w] = img + + return grid_image + + +class var: + + def __init__(self, _var): + self.__var = _var + + def set(self, _var): + self.__var = _var + + def get(self): + return self.__var + + +class Buffor: + + def __init__(self, length): + self.length = length + self.__buffor = [] + + def add(self, _var): + if len(self.__buffor) >= self.length: + self.__buffor.pop(0) + + self.__buffor.append(_var) + + def getAvg(self, lenght=0): + return np.sum(self.__buffor[-lenght:], axis=0) / len(self.__buffor[-lenght:]) + + def getBuffor(self): + return self.__buffor + + def loadBuffor(self, buffor): + self.__buffor = buffor + + def getLast(self): + return self.__buffor[0] + + def getFirst(self): + return self.__buffor[len(self.__buffor) - 1] + + def getLen(self): + return len(self.__buffor) + + def isFull(self): + return len(self.__buffor) >= self.length + + def flush(self): + tmp = self.__buffor[-1] + self.__buffor = [] + self.__buffor.append(tmp) + + def clear(self): + self.__buffor = [] + + +# Bufforless + + +class VideoCapture: + """Wrapper on openCV2 stream making it bufforless and adding camera search""" + + def __init__(self, name, bufforless=True): + self.bufforless = bufforless + self.run = True + + if isinstance(name, str): + if ".pkl" in name: + self.stream = False + else: + self.stream = True + else: + self.stream = True + + if self.stream: + self.prev_frame = None + + self.__openCam(name) + + self.q = queue.Queue() + self.t = threading.Thread(target=self.__reader) + self.t.start() + else: + self.frames = [] + with open(name, "rb") as file: + self.frames = pickle.load(file) + + def __openCam(self, name): + if isinstance(name, int): + if "Windows" in platform.system(): + self.cap = cv2.VideoCapture(name, cv2.CAP_DSHOW) + else: + self.cap = cv2.VideoCapture(name) + + if self.cap is None or not self.cap.isOpened(): + print(f"Was unable to open camera: {name}.") + print(f"Trying to open camera: {name}.") + if name + 1 < 10: + self.__openCam(name + 1) + else: + self.cap = cv2.VideoCapture(name) + + def __reader(self): + while self.run: + ret, frame = self.cap.read() + if not ret: + break + if not self.q.empty() and self.bufforless: + try: + self.q.get_nowait() + except queue.Empty: + pass + self.q.put((ret, frame)) + + self.flush() + + def flush(self): + while not self.q.empty(): + self.q.get() + + def read(self): + """Function returning latest frame""" + if self.stream: + return self.q.get() + frame = self.frames.pop(0) + self.frames.pop(0) + return ((len(self.frames) >= 1), frame) + + def close(self): + """Function closing stream""" + self.run = False + self.t.join() + self.cap.release() diff --git a/eyeGestures/__init__.py b/eyeGestures/__init__.py index 599731a..2dcd1bf 100644 --- a/eyeGestures/__init__.py +++ b/eyeGestures/__init__.py @@ -6,58 +6,40 @@ import numpy as np import numpy.typing as npt -import eyeGestures.screenTracker.dataPoints as dp -from eyeGestures.calibration_v1 import Calibrator as Calibrator_v1 -from eyeGestures.calibration_v2 import Calibrator as Calibrator_v2 from eyeGestures.face import Face, FaceFinder from eyeGestures.Fixation import Fixation -from eyeGestures.gazeEstimator import GazeTracker -from eyeGestures.gevent import Cevent, Gevent -from eyeGestures.utils import low_pass_filter_fourier, recoverable +from eyeGestures.utils import recoverable -VERSION = "3.0.0" +try: + from EyegesturesEngine import EyeGesturesEnginePython as RustEyeGesturesEngine +except ImportError: + RustEyeGesturesEngine = None +VERSION = "4.0.0" -class EyeGestures_v3: +class EyeGestures_v4: """Main class for EyeGesture tracker. It configures and manages entire algorithm""" def __init__(self, calibration_radius: int = 1000) -> None: self.calibration_radius = calibration_radius - self.clb: Dict[str, Calibrator_v2] = dict() # Calibrator_v2() - self.cap = None - self.calibration: Dict[str, bool] = dict() - self.average_points: Dict[str, npt.NDArray[np.float64]] = dict() - self.filled_points: Dict[str, int] = dict() - self.enable_CN = False - self.calibrate_gestures = False + self.average_points: npt.NDArray[np.float64] = np.zeros((1, 2)) + self.calibration: bool = False + self.filled_points: int = 0 self.finder = FaceFinder() self.face = Face() + self.engine = None - # this has to be contexted - self.prev_timestamp: Dict[str, float] = dict() - self.prev_point: Dict[str, npt.NDArray[np.float64]] = dict() self.fix: Optional[float] = None - self.velocity_max: Dict[str, int] = dict() - self.velocity_min: Dict[str, int] = dict() self.fixationTracker: Dict[str, Fixation] = dict() self.key_points_buffer: Dict[str, List[npt.NDArray[np.float64]]] = dict() self.starting_head_position = np.zeros((1, 2)) self.starting_size = np.zeros((1, 2)) - - def saveModel(self, context: str = "main") -> Optional[bytes]: - if context in self.clb: - return pickle.dumps(self.clb[context]) - return None - - def loadModel(self, model: Any, context: str = "main") -> None: - self.clb[context] = pickle.loads(model) - + def uploadCalibrationMap(self, points: npt.NDArray[np.float64], context: str = "main") -> None: - self.addContext(context) - self.clb[context].updMatrix(np.array(points)) + self.clb.updMatrix(np.array(points)) def getLandmarks(self, frame: cv2.typing.MatLike) -> Tuple[npt.NDArray[np.float64], bool, cv2.typing.MatLike]: @@ -66,7 +48,6 @@ def getLandmarks(self, frame: cv2.typing.MatLike) -> Tuple[npt.NDArray[np.float6 # try: self.face.process(frame, self.finder.find(frame)) - face_landmarks = self.face.get_landmarks() assert face_landmarks is not None l_eye = self.face.get_left_eye() @@ -120,352 +101,32 @@ def getLandmarks(self, frame: cv2.typing.MatLike) -> Tuple[npt.NDArray[np.float6 return key_points, blink, subframe def whichAlgorithm(self, context: str = "main") -> str: - if context in self.clb: - return self.clb[context].whichAlgorithm() - return "None" + return "rust engine" def reset(self, context: str = "main") -> None: - self.filled_points[context] = 0 - if context in self.clb: - self.addContext(context) + self.filled_points = 0 def setFixation(self, fix: float) -> None: self.fix = fix - def addContext(self, context: str) -> None: - if context not in self.clb: - self.clb[context] = Calibrator_v2(self.calibration_radius) - self.average_points[context] = np.zeros((20, 2)) - self.filled_points[context] = 0 - self.calibration[context] = False - self.prev_timestamp[context] = time.time() - self.prev_point[context] = np.array((0.0, 0.0)) - self.velocity_max[context] = 0 - self.velocity_min[context] = 100000000 - self.fixationTracker[context] = Fixation(0, 0, 100) - self.key_points_buffer[context] = [] - @recoverable(ret_error_params=(None, None)) + @recoverable(ret_error_params=(None, None, None)) def step( - self, frame: cv2.typing.MatLike, calibration: bool, width: int, height: int, context: str = "main" - ) -> Tuple[Optional[Gevent], Optional[Cevent]]: - self.addContext(context) - - self.calibration[context] = calibration - - key_points, blink, sub_frame = self.getLandmarks(frame) - - self.key_points_buffer[context].append(key_points) - if len(self.key_points_buffer[context]) > 10: - self.key_points_buffer[context].pop(0) - key_points = low_pass_filter_fourier(key_points, 200) - - y_point = self.clb[context].predict(key_points) - self.average_points[context][1:, :] = self.average_points[context][ - : (self.average_points[context].shape[0] - 1), : - ] - self.average_points[context][0, :] = y_point - - if ( - self.filled_points[context] < self.average_points[context].shape[0] - and (y_point != np.array([0.0, 0.0])).any() - ): - self.filled_points[context] += 1 - if self.filled_points[context] == 0: - self.filled_points[context] = 1 - - averaged_point = np.sum(self.average_points[context][:, :], axis=0) / (self.filled_points[context]) - fixation = self.fixationTracker[context].process(averaged_point[0], averaged_point[1]) - - duration = time.time() - self.prev_timestamp[context] - velocity = abs(averaged_point - self.prev_point[context]) / duration - velocity = np.sqrt(velocity[0] ** 2 + velocity[1] ** 2) - self.prev_point[context] = averaged_point - self.prev_timestamp[context] = time.time() - - self.velocity_max[context] = max(self.velocity_max[context], velocity) - self.velocity_min[context] = min(self.velocity_min[context], velocity) - - saccades = velocity > (self.velocity_max[context]) / 4 - - if self.calibration[context] and ( - self.clb[context].insideClbRadius(averaged_point, width, height) - or self.filled_points[context] < self.average_points[context].shape[0] * 10 - ): - self.clb[context].add(key_points, self.clb[context].getCurrentPoint(width, height)) - else: - self.clb[context].post_fit() - - if self.calibration[context] and self.clb[context].insideAcptcRadius(averaged_point, width, height): - if self.clb[context].isReadyToMove(): - self.clb[context].movePoint() - - gevent = Gevent( - point=averaged_point, - blink=blink, - fixation=fixation, - saccades=saccades, - sub_frame=sub_frame, - ) - cevent = Cevent( - self.clb[context].getCurrentPoint(width, height), - self.clb[context].acceptance_radius, - self.clb[context].calibration_radius, - ) - return (gevent, cevent) - - -class EyeGestures_v2: - """Main class for EyeGesture tracker. It configures and manages entire algorithm""" - - def __init__(self, calibration_radius: int = 1000) -> None: - self.monitor_width = 1 - self.monitor_height = 1 - self.calibration_radius = calibration_radius - - self.clb: Dict[str, Calibrator_v2] = dict() # Calibrator_v2() - self.cap = None - self.gestures = EyeGestures_v1(285, 115, 200, 100) - - self.calibration: Dict[str, bool] = dict() - - self.CN: int = 5 - - self.average_points: Dict[str, npt.NDArray[np.float64]] = dict() - self.filled_points: Dict[str, int] = dict() - self.enable_CN = False - self.calibrate_gestures = False - - self.fix = 0.8 - - def saveModel(self, context: str = "main") -> Optional[bytes]: - if context in self.clb: - return pickle.dumps(self.clb[context]) - return None - - def loadModel(self, model: Any, context: str = "main") -> None: - self.clb[context] = pickle.loads(model) - - def uploadCalibrationMap(self, points: npt.NDArray[np.float64], context="main") -> None: - self.addContext(context) - self.clb[context].updMatrix(np.array(points)) - - def getLandmarks( - self, frame: cv2.typing.MatLike, calibrate: bool = False, context: str = "main" - ) -> Tuple[npt.NDArray[np.float64], npt.NDArray[np.float64], bool, bool, Optional[Cevent]]: - - frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) - frame = cv2.flip(frame, 1) - # frame = cv2.resize(frame, (360, 640)) - - event, cevent = self.gestures.step( - frame, - context, - calibrate, # set calibration - switch to False to stop calibration - self.monitor_width, - self.monitor_height, - 0, - 0, - self.fix, - 100, - ) - - if event is not None or cevent is not None: - cursor_x, cursor_y = event.point[0], event.point[1] - l_eye_landmarks = event.l_eye.getLandmarks() - r_eye_landmarks = event.r_eye.getLandmarks() - - cursors = np.array([cursor_x, cursor_y]).reshape(1, 2) - eye_events = np.array([event.blink, event.fixation]).reshape(1, 2) - key_points = np.concatenate((cursors, l_eye_landmarks, r_eye_landmarks, eye_events)) - return ( - np.array((cursor_x, cursor_y)), - key_points, - event.blink, - event.fixation, - cevent, - ) - return np.array((0.0, 0.0)), np.array([]), False, False, None - - def whichAlgorithm(self, context: str = "main") -> str: - if context in self.clb: - return self.clb[context].whichAlgorithm() - return "None" - - def setClassicImpact(self, impact: int) -> None: - self.CN = impact - - def reset(self, context: str = "main") -> None: - self.filled_points[context] = 0 - if context in self.clb: - self.addContext(context) - - def setFixation(self, fix: float) -> None: - self.fix = fix - - def setClassicalImpact(self, CN: int) -> None: - self.CN = CN - - def enableCNCalib(self) -> None: - self.enable_CN = True - - def disableCNCalib(self) -> None: - self.enable_CN = False - - def addContext(self, context: str) -> None: - if context not in self.clb: - self.clb[context] = Calibrator_v2(self.calibration_radius) - self.average_points[context] = np.zeros((20, 2)) - self.filled_points[context] = 0 - self.calibration[context] = False - - @recoverable(ret_error_params=(None, None)) - def step( - self, frame: cv2.typing.MatLike, calibration: bool, width: int, height: int, context: str = "main" - ) -> Tuple[Optional[Gevent], Optional[Cevent]]: - self.addContext(context) - - self.calibration[context] = calibration - self.monitor_width = width - self.monitor_height = height - - classic_point, key_points, blink, fixation, cevent = self.getLandmarks( - frame, self.calibrate_gestures and self.enable_CN, context=context - ) - - margin = 10 - if cevent is None: - raise ValueError("cevent must not be None") - if (classic_point[0] <= margin) and self.calibration[context]: - self.calibrate_gestures = cevent.calibration - elif (classic_point[0] >= width - margin) and self.calibration[context]: - self.calibrate_gestures = cevent.calibration - elif (cevent.point[1] <= margin) and self.calibration[context]: - self.calibrate_gestures = cevent.calibration - elif (classic_point[1] >= height - margin) and self.calibration[context]: - self.calibrate_gestures = cevent.calibration - else: - self.calibrate_gestures = False - - y_point = self.clb[context].predict(key_points) - self.average_points[context][1:, :] = self.average_points[context][ - : (self.average_points[context].shape[0] - 1), : - ] - if fixation <= self.fix: - self.average_points[context][0, :] = y_point - - if ( - self.filled_points[context] < self.average_points[context].shape[0] - and (y_point != np.array([0.0, 0.0])).any() - ): - self.filled_points[context] += 1 - averaged_point = (np.sum(self.average_points[context][:, :], axis=0) + (classic_point * self.CN)) / ( - self.filled_points[context] + self.CN - ) - - if self.calibration[context] and ( - self.clb[context].insideClbRadius(averaged_point, width, height) - or self.filled_points[context] < self.average_points[context].shape[0] * 10 - ): - self.clb[context].add(key_points, self.clb[context].getCurrentPoint(width, height)) - else: - self.clb[context].post_fit() - - if self.calibration[context] and self.clb[context].insideAcptcRadius(averaged_point, width, height): - if self.clb[context].isReadyToMove(): - self.clb[context].movePoint() - - gevent = Gevent(averaged_point, blink, fixation) - cevent = Cevent( - self.clb[context].getCurrentPoint(width, height), - self.clb[context].acceptance_radius, - self.clb[context].calibration_radius, - ) - return (gevent, cevent) - - -class EyeGestures_v1: - """Main class for EyeGesture tracker. It configures and manages entier algorithm""" - - def __init__(self, roi_x=225, roi_y=105, roi_width=80, roi_height=15): - - screen_width = 500 - screen_height = 500 - height = 250 - width = 250 - - roi_x = roi_x % screen_width - roi_y = roi_y % screen_height - roi_width = roi_width % screen_width - roi_height = roi_height % screen_height - - self.screen_width = screen_width - self.screen_height = screen_height - - self.screen = dp.Screen(screen_width, screen_height) - - self.gaze = GazeTracker( - screen_width, - screen_height, - width, - height, - roi_x, - roi_y, - roi_width, - roi_height, - ) - - self.calibrators = dict() - self.calibrate = False - - def getFeatures(self, image): - """[NOT RECOMMENDED] Function allowing for extraction of gaze features from image""" - - return self.gaze.getFeatures(image) - - # @timeit - # 0.011 - 0.015 s for execution - def step( - self, - image, - context, - calibration, - display_width, - display_height, - display_offset_x=0, - display_offset_y=0, - fixation_freeze=0.7, - freeze_radius=20, - offset_x=0, - offset_y=0, - ): - """Function performing estimation and returning event object""" - - display = dp.Display(display_width, display_height, display_offset_x, display_offset_y) - - # allow for random recalibration shot - event = self.gaze.estimate( - image, - display, - context, - calibration, - fixation_freeze, - freeze_radius, - offset_x, - offset_y, - ) - cevent = None - - if event is not None: - cursor_x, cursor_y = event.point[0], event.point[1] - if context in self.calibrators: - self.calibrate = self.calibrators[context].calibrate(cursor_x, cursor_y, event.fixation) - else: - self.calibrators[context] = Calibrator_v1(display_width, display_height, cursor_x, cursor_y) - self.calibrate = self.calibrators[context].calibrate(cursor_x, cursor_y, event.fixation) - - cpoint = self.calibrators[context].get_current_point() - calibration = self.calibrate and cpoint != (0, 0) - cevent = Cevent(cpoint, 100, 100, calibration) - - return (event, cevent) + self, frame: cv2.typing.MatLike, width: int, height: int,): + + if self.engine is None: + self.engine = RustEyeGesturesEngine(width, height) + + landmarks = self.finder.find(frame).face_landmarks[0] + scaled_landmarks = [] + for landmark in landmarks: + scaled_landmarks.append((landmark.x, landmark.y)) + scaled_landmarks = np.array(scaled_landmarks) + result = self.engine.process(scaled_landmarks.flatten().tolist()) + + x, y = result[0], result[1] + is_calibrating = result[2] == 1.0 + calib_x, calib_y = result[3], result[4] + calib_x = min(max(calib_x, 0), width) + calib_y = min(max(calib_y, 0), height) + return [x, y], is_calibrating, [calib_x, calib_y] diff --git a/eyeGestures/eye.py b/eyeGestures/eye.py index 184c4ee..9775132 100644 --- a/eyeGestures/eye.py +++ b/eyeGestures/eye.py @@ -3,7 +3,7 @@ from typing import Optional, Tuple import cv2 -import mediapipe as mp +from mediapipe.tasks.python.vision.face_landmarker import FaceLandmarksConnections import numpy as np import numpy.typing as npt @@ -13,8 +13,24 @@ class Eye: """Class storing data related and representing a eye""" - LEFT_EYE_KEYPOINTS = np.array(list(mp.solutions.face_mesh.FACEMESH_LEFT_EYE))[:, 0] - RIGHT_EYE_KEYPOINTS = np.array(list(mp.solutions.face_mesh.FACEMESH_RIGHT_EYE))[:, 0] + LEFT_EYE_KEYPOINTS = np.array( + sorted( + { + index + for connection in FaceLandmarksConnections.FACE_LANDMARKS_LEFT_EYE + for index in (connection.start, connection.end) + } + ) + ) + RIGHT_EYE_KEYPOINTS = np.array( + sorted( + { + index + for connection in FaceLandmarksConnections.FACE_LANDMARKS_RIGHT_EYE + for index in (connection.start, connection.end) + } + ) + ) LEFT_EYE_PUPIL_KEYPOINT = [473] RIGHT_EYE_PUPIL_KEYPOINT = [468] diff --git a/eyeGestures/face.py b/eyeGestures/face.py index 42575eb..2496ebf 100644 --- a/eyeGestures/face.py +++ b/eyeGestures/face.py @@ -1,37 +1,70 @@ """Module providing finding and extraction of face from image.""" +import os +from pathlib import Path from typing import Any, NamedTuple, Optional, Tuple +import urllib.request import cv2 import mediapipe as mp +from mediapipe.tasks import python +from mediapipe.tasks.python import vision import numpy as np import numpy.typing as npt from eyeGestures.eye import Eye +FACE_LANDMARKER_MODEL_URL = ( + "https://storage.googleapis.com/mediapipe-models/face_landmarker/face_landmarker/float16/1/face_landmarker.task" +) + + +def _resolve_model_asset_path(model_asset_path: Optional[str]) -> str: + """Resolve the FaceLandmarker model path.""" + + if model_asset_path: + return model_asset_path + + env_model_path = os.getenv("EYEGESTURES_FACE_LANDMARKER_MODEL") + if env_model_path: + return env_model_path + + default_model_path = Path(__file__).with_name("face_landmarker_v2_with_blendshapes.task") + if default_model_path.exists(): + return str(default_model_path) + + default_model_path.parent.mkdir(parents=True, exist_ok=True) + urllib.request.urlretrieve(FACE_LANDMARKER_MODEL_URL, default_model_path) + return str(default_model_path) + class FaceFinder: """Class helping finding face""" - def __init__(self) -> None: - self.mp_face_mesh = mp.solutions.face_mesh.FaceMesh( - refine_landmarks=True, - static_image_mode=False, - min_detection_confidence=0.5, - min_tracking_confidence=0.5, + def __init__(self, model_asset_path: Optional[str] = None) -> None: + resolved_model_path = _resolve_model_asset_path(model_asset_path) + base_options = python.BaseOptions(model_asset_path=resolved_model_path) + options = vision.FaceLandmarkerOptions( + base_options=base_options, + output_face_blendshapes=True, + output_facial_transformation_matrixes=True, + num_faces=1, ) + self.face_landmarker = vision.FaceLandmarker.create_from_options(options) def find(self, image: cv2.typing.MatLike) -> Optional[Any]: - """Find face mesh""" + """Find face landmarks.""" assert len(image.shape) > 2 try: - face_mesh = self.mp_face_mesh.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) - if face_mesh.multi_face_landmarks is None: + rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) + mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=rgb_image) + detection_result = self.face_landmarker.detect(mp_image) + if not detection_result.face_landmarks: return None - return face_mesh + return detection_result except Exception as e: print(f"Exception in FaceFinder: {e}") return None @@ -77,15 +110,13 @@ def get_landmarks(self) -> Optional[npt.NDArray[np.float64]]: return self.landmarks def _landmarks(self, face: Any) -> npt.NDArray[np.float64]: + face_landmarks = face.face_landmarks[0] - __complex_landmark_points = face.multi_face_landmarks - __complex_landmarks = __complex_landmark_points[0].landmark - - __face_landmarks = [] - for landmark in __complex_landmarks: - __face_landmarks.append((landmark.x * self.image_w, landmark.y * self.image_h)) + scaled_landmarks = [] + for landmark in face_landmarks: + scaled_landmarks.append((landmark.x * self.image_w, landmark.y * self.image_h)) - return np.array(__face_landmarks) + return np.array(scaled_landmarks) def process(self, image: cv2.typing.MatLike, face: Optional[Any]) -> None: """Process face landmarks on image""" diff --git a/pyproject.toml b/pyproject.toml index db66e9f..259a4a4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -52,13 +52,19 @@ maintainers = [ description = "Package for eye tracking algorithm allowing for development of gaze controlled computer interface" readme = "README.md" license = {file = "LICENSE"} -requires-python = ">=3.8" +requires-python = ">=3.13" keywords = ["eyetracking", "eye", "gaze", "tracking", "gazetracking"] classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Operating System :: OS Independent", ] +dependencies = [ + "maturin>=1.13.3", + "mediapipe>=0.10.35", + "opencv-python>=4.13.0.92", + "pygame>=2.6.1", +] [project.urls] Homepage = "https://github.com/NativeSensors/EyeGestures" @@ -110,4 +116,4 @@ plugins = ["numpy.typing.mypy_plugin"] [[tool.mypy.overrides]] module = ["sklearn.*", "mediapipe.*"] -ignore_missing_imports = true \ No newline at end of file +ignore_missing_imports = true diff --git a/scripts/csv_reader.py b/scripts/csv_reader.py deleted file mode 100644 index 77c378d..0000000 --- a/scripts/csv_reader.py +++ /dev/null @@ -1,48 +0,0 @@ -import pickle -import csv -import ast - -def read_gaze_data_from_csv(filename): - """Reads gaze event data from a CSV file. - - Args: - filename (str): Name of the CSV file to read data from. - - Returns: - list: List of dictionaries containing gaze event data. - """ - - gaze_data = [] - - with open(filename, newline='') as csvfile: - reader = csv.reader(csvfile) - for n,row in enumerate(reader): - if n > 0: - print(n,row[6],type(row[6]),row[6][2]) - print(bytearray(f'{row[6][2:-3]}', 'latin-1')) - # Deserialize the string representation of arrays - - row_data = { - "point_x": row[0], - "point_y": row[1], - "blink": row[2], - "fixation": row[3], - "screen_x": row[4], - "screen_y": row[5], - "l_eye_landmarks": pickle.loads(bytearray(f'{row[6][2:-1]}', 'latin-1').decode('unicode_escape').encode('latin1')), # Deserialize the string representation of the array - "r_eye_landmarks": pickle.loads(bytearray(f'{row[7][2:-1]}', 'latin-1').decode('unicode_escape').encode('latin1')), # Deserialize the string representation of the array - "l_eye_pupil": pickle.loads(bytearray(f'{row[8][2:-1]}', 'latin-1').decode('unicode_escape').encode('latin1')), # Deserialize the string representation of the array - "r_eye_pupil": pickle.loads(bytearray(f'{row[9][2:-1]}', 'latin-1').decode('unicode_escape').encode('latin1')), # Deserialize the string representation of the array - "screen_width": row[10], - "screen_height": row[11], - "rois": row[12] # Deserialize the string representation of the array - } - gaze_data.append(row_data) - - return gaze_data - -# Example usage: -filename = 'collection_91675a1d.csv' -gaze_data = read_gaze_data_from_csv(filename) -for data in gaze_data: - print(data) \ No newline at end of file diff --git a/scripts/heatmap_maker.py b/scripts/heatmap_maker.py deleted file mode 100644 index 4be7384..0000000 --- a/scripts/heatmap_maker.py +++ /dev/null @@ -1,123 +0,0 @@ -import matplotlib.pyplot as plt -import numpy as np -import argparse -import pickle -import csv -import ast -import re -import os - -def read_gaze_data_from_csv(filename): - """Reads gaze event data from a CSV file. - - Args: - filename (str): Name of the CSV file to read data from. - - Returns: - list: List of dictionaries containing gaze event data. - """ - - gaze_data = [] - - with open(filename, newline='') as csvfile: - reader = csv.reader(csvfile) - for n,row in enumerate(reader): - if n > 0: - # print(n,row[6],type(row[6]),row[6][2]) - # print(bytearray(f'{row[6][2:-3]}', 'latin-1')) - # Deserialize the string representation of arrays - - row_data = { - "timestamp": row[0], - "point_x": row[1], - "point_y": row[2], - "blink": row[3], - "fixation": row[4], - "screen_x": row[5], - "screen_y": row[6], - "screen_width": row[7], - "screen_height": row[8], - "rois": row[12] # Deserialize the string representation of the array - } - gaze_data.append(row_data) - - return gaze_data - -def draw_heatmap(data_points,x_dim,y_dim,picture_path = None): - x_range = [0,x_dim] - y_range = [0,y_dim] - heatmap, xedges, yedges = np.histogram2d(data_points[:,0], data_points[:,1], bins = 50, range=[x_range, y_range]) - extent = [xedges[0], xedges[-1], yedges[-1], yedges[0]] - alpha = 1.0 - - plt.clf() - if picture_path: - map_image = plt.imread(picture_path) - map_image = np.flipud(map_image) - alpha = 0.5 - plt.imshow(map_image, extent=extent, aspect='auto') - - - # Plot the image as background - plt.imshow(heatmap.T, extent=extent, origin='lower', alpha=alpha, cmap='hot') - plt.gca().invert_yaxis() - plt.show() - -def main(gaze_data_file,background_file = False, step = None, window_size = None, start = None, stop = None): - - # Example usage: - # filename = 'data/collection_73cbc017/data.csv' - # picture = 'data/collection_73cbc017/recordings/1713258117.949606.png' - - # picture = background_file - - recordings_path = f"{os.path.dirname(gaze_data_file)}/recordings" - - filename = gaze_data_file - gaze_data = read_gaze_data_from_csv(filename) - data_points = [] - timestamps = [] - screen_w = float(gaze_data[0]["screen_width"]) - screen_h = float(gaze_data[0]["screen_height"]) - - for data in gaze_data: - timestamps.append(float(data["timestamp"])) - data_points.append([float(data["screen_x"]),float(data["screen_y"])]) - data_points = np.array(data_points) - - if start: - index = timestamps.index(start) - timestamps = timestamps[index:] - data_points = data_points[index:,:] - - if stop: - index = timestamps.index(stop) - timestamps = timestamps[:index] - data_points = data_points[:index,:] - - if window_size == None or step == None: - picture_path = None - if background_file: - picture_path = f"{recordings_path}/{timestamps[0]}.png" - draw_heatmap(data_points,screen_w,screen_h,picture_path) - else: - for i in range(0,len(timestamps),step): - picture_path = None - if background_file: - print(f"{background_file}") - picture_path = f"{recordings_path}/{timestamps[i]}.png" - data_points_range = data_points[i:i+window_size] - draw_heatmap(data_points_range,screen_w,screen_h,picture_path) - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description='Generate heatmap based on gaze data over an image.') - parser.add_argument('path_to_gaze_data', type=str, help='Path to the gaze data file') - parser.add_argument('--window', type=int, help='Window size in samples') - parser.add_argument('--step', type=int, help='Window size in samples') - parser.add_argument('--background', action='store_true', help='Path to the background file') - parser.add_argument('--start', type=float, help='Window size in samples') - parser.add_argument('--stop', type=float, help='Path to the background file') - - args = parser.parse_args() - - main(args.path_to_gaze_data,background_file = args.background, step = args.step, window_size = args.window, start = args.start, stop = args.stop) diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/data/face_1.jpg b/tests/data/face_1.jpg deleted file mode 100644 index 0d3a0e19bcc67767c2251cccd1a53c2e1f019d0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42883 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 diff --git a/tests/data/face_2.jpg b/tests/data/face_2.jpg deleted file mode 100644 index a879c025604dc6865faf31ecf6cb1fd34da88042..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23980 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

sBW_a0`qa5Z{ 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 + + + + + +

+ + + made in PL + + +EyeGestures is open source eyetracking software/library using native webcams and phone camers for achieving its goal. The aim of library is to bring accessibility of eye-tracking and eye-driven interfaces without requirement of obtaining expensive hardware. + +Our [Mission](https://github.com/NativeSensors/EyeGestures/blob/main/MISSION.md)! + +# EyeGesturesLite + +EyeGesturesLite is JavaScript implementation of [EyeGestures algoritm](https://github.com/NativeSensors/EyeGestures). If you need python version, check original repository. + +### How does it work? + +It is a gaze tracker that uses machine learning and built-in cameras (such as a webcam) to provide gaze tracking for the user. It includes a built-in calibration mode that displays 20 red circles for the user to focus on, along with a blue cursor that follows the user’s gaze. During the calibration process, the cursor will gradually start following user's gaze more and more. By the end of the 20 points, the cursor should be able to independently follow the user’s gaze. + +### ⚙️ Try: + +[EyeGesturesLite](https://eyegestures.com/tryLite) + +### 🔧 Build your own: + +#### CDN: + +0. External dependencies CDNs: + +```html + + +``` + +1. You need two CDN links: +```html + + +``` + +2. Place `video` element (which can be hidden) somewhere in the page together with status and error divs (can stay invisible): +```html + + + +``` + +3. Then javascript interface code: +```html + +``` + +#### NPM package [WiP]: + +1. Install npm package: +``` +npm install eyegestures +``` + +2. Place `video` element in your DOM (which can be hidden) somewhere in the page together with status and error divs (can stay invisible): +```html + + + +``` + +3. try to import: +```JS +import EyeGestures from 'eyegestures'; + +const gestures = new EyeGestures("video_element_id",(point,calibration)=>{/*point,calibration*/}) +// after this call: gestures.start(); +console.log(gestures); +``` +>[!Warning] +> EyeGestures needs DOM to operate and its constructor expects to receive video element/camera feed id string. +> + +### rules of using + +You can use it free of charge as long as you keep our logo. If you want to remove logo then contact: contact@eyegestures.com. + +### 📇 Find us: +- [discord](https://discord.gg/FvagCX8T4h) +- [twitter](https://twitter.com/PW4ltz) +- [daily.dev](https://dly.to/JEe1Sz6vLey) +- email: contact@eyegestures.com + +### Troubleshooting: + + +### 💻 Contributors + + + + + +### 💵 Support the project + +We will be extremely grateful for your support: it helps to keep server running + fuels our brains with coffee. + +Support project on Polar (in exchange we provide access to alphas versions!): + +Subscribe on Polar + + + + + Star History Chart + diff --git a/web/demo/eyekey.html b/web/demo/eyekey.html new file mode 100644 index 0000000..851edc1 --- /dev/null +++ b/web/demo/eyekey.html @@ -0,0 +1,355 @@ + + + + + + Eye QWERTY Keyboard · EyeGestures + + + + + + + + + + +
+
+ +
+
+ + +
+
+ Starting… +
+
+ +
+
Output
+
+
+
+ +
+
+
+

Complete calibration to unlock keyboard

+
+
+ +
+ + Look at a key and hold gaze to select + x:   y: +
+
+ + + + \ No newline at end of file diff --git a/web/example/EyeGesturesDark.png b/web/example/EyeGesturesDark.png new file mode 100644 index 0000000000000000000000000000000000000000..e47ecc5c0d6d49ebaf29444c6a02ab2b5812c689 GIT binary patch literal 47767 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 nVHg|5daD9~HpW}@_CF>a&g{frFo7ljdGP3&`0 literal 0 HcmV?d00001 diff --git a/web/example/EyeGesturesLight.png b/web/example/EyeGesturesLight.png new file mode 100644 index 0000000000000000000000000000000000000000..3efbd323129d14fb79341e6b7334877d9b639eac GIT binary patch literal 39530 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 Z{{wY^he|V*pn?DZ002ovPDHLkV1hb-C?Eg; literal 0 HcmV?d00001 diff --git a/web/example/eyegestures.css b/web/example/eyegestures.css new file mode 100644 index 0000000..146f2e3 --- /dev/null +++ b/web/example/eyegestures.css @@ -0,0 +1,26 @@ +#cursor { + position: fixed; + width: 50px; + height: 50px; + background: rgba(0, 0, 255, 0.342); + border-radius: 50%; + border: medium solid rgba(0, 0, 255, 0.171); + z-index: 1000; +} +#calib_cursor { + position: fixed; + width: 200px; + height: 200px; + background: #ff575777; + border-radius: 50%; + border: medium solid #ff5757; + z-index: 10000; +} +#logoDivEyeGestures{ +} +#logoDivEyeGestures:hover{ + transform: scale(1.01); +} +#logoDivEyeGestures:active{ + transform: scale(1.0); +} \ No newline at end of file diff --git a/web/example/simple.html b/web/example/simple.html new file mode 100644 index 0000000..85f1f17 --- /dev/null +++ b/web/example/simple.html @@ -0,0 +1,90 @@ + + + + + + EyeGesturesLite + + + + + + +
+
+

EyeGesturesLite

+
Initializing...
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/web/eyegestures.js b/web/eyegestures.js new file mode 100644 index 0000000..8558d4f --- /dev/null +++ b/web/eyegestures.js @@ -0,0 +1,2 @@ +import EyeGestures from './src/eyegestures.min.js'; +export default EyeGestures \ No newline at end of file diff --git a/web/npm_test.js b/web/npm_test.js new file mode 100644 index 0000000..afcddac --- /dev/null +++ b/web/npm_test.js @@ -0,0 +1,5 @@ +import EyeGestures from 'eyegestures'; + +const gestures = new EyeGestures("video_element_id",(point,calibration)=>{/*point,calibration*/}) +// after this call: gestures.start(); +console.log(gestures); diff --git a/web/package-lock.json b/web/package-lock.json new file mode 100644 index 0000000..abdf653 --- /dev/null +++ b/web/package-lock.json @@ -0,0 +1,141 @@ +{ + "name": "eyegestures", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "eyegestures", + "version": "1.0.0", + "license": "SEE LICENSE IN License", + "dependencies": { + "eyegestures": "^1.0.0" + }, + "devDependencies": { + "terser": "^5.48.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/eyegestures": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eyegestures/-/eyegestures-1.0.0.tgz", + "integrity": "sha512-tb+q3/TJtUMkKPUdUjx+22uGYyXnQwQiJWAG+84NlLTmnGuo3lKWOfVowphqkJ4eXrUg0u0LhtB93Ri347tFyw==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/terser": { + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", + "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + } + } +} diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..7a0d4a2 --- /dev/null +++ b/web/package.json @@ -0,0 +1,38 @@ +{ + "name": "eyegestures", + "version": "1.0.0", + "type": "module", + "description": "Gaze tracking algorithm for web.", + "main": "eyegestures.js", + "directories": { + "src": "src" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/NativeSensors/EyeGesturesLite.git" + }, + "keywords": [ + "eye", + "tracking", + "gaze", + "tracking", + "eyegestures", + "eyetracking", + "gazetracking" + ], + "author": "Piotr Walas", + "license": "SEE LICENSE IN License", + "bugs": { + "url": "https://github.com/NativeSensors/EyeGesturesLite/issues" + }, + "homepage": "https://github.com/NativeSensors/EyeGesturesLite#readme", + "dependencies": { + "eyegestures": "^1.0.0" + }, + "devDependencies": { + "terser": "^5.48.0" + } +} diff --git a/web/src/eyegestures.js b/web/src/eyegestures.js new file mode 100644 index 0000000..de9a295 --- /dev/null +++ b/web/src/eyegestures.js @@ -0,0 +1,455 @@ +const __eyeGesturesScriptUrl = (document.currentScript && document.currentScript.src) || window.location.href; +let __eyeGesturesEngineModulePromise = null; + +function __resolveEngineModuleUrl() { + if (window.EyeGesturesEngineModuleUrl) { + return window.EyeGesturesEngineModuleUrl; + } + console.log("__eyeGesturesScriptUrl: ", __eyeGesturesScriptUrl); + return new URL('EyegesturesEngine.js', __eyeGesturesScriptUrl).href; +} + +function __loadEngineModule() { + if (!__eyeGesturesEngineModulePromise) { + __eyeGesturesEngineModulePromise = import(__resolveEngineModuleUrl()); + } + return __eyeGesturesEngineModulePromise; +} + +VERSION = "4.0.0"; +class EyeGestures{ // strip export default before making cdn/web embeddable version + constructor(videoElement_ID, onGaze) + { + const cursor = document.createElement('div'); + cursor.id = "cursor"; + cursor.style.display = "None"; + document.body.appendChild(cursor); + const calib_cursor = document.createElement('div'); + calib_cursor.id = "calib_cursor"; + calib_cursor.style.display = "None"; + + const logoDiv = document.createElement('div'); + logoDiv.id = "logoDivEyeGestures"; + logoDiv.style.width = "200px"; + logoDiv.style.height = "60px"; + logoDiv.style.position = "fixed"; + logoDiv.style.bottom = "10px"; + logoDiv.style.right = "10px"; + logoDiv.style.zIndex = "9999"; + logoDiv.style.background = "black"; + logoDiv.style.borderRadius = "10px"; + logoDiv.style.display = "none"; + logoDiv.onclick = function() { + window.location.href = "https://eyegestures.com/"; + }; + const logo = document.createElement('div'); + logo.style.margin = "10px"; + logo.innerHTML = 'Logo'; + logoDiv.appendChild(logo); + const canvas = document.createElement('canvas'); + canvas.id = "output_canvas"; + canvas.width = "50"; + canvas.height = "50"; + canvas.style.margin = "5px"; + canvas.style.borderRadius = "10px"; + canvas.style.border = "none"; + canvas.style.background = "#222"; + logoDiv.appendChild(canvas); + document.body.appendChild(logoDiv); + + document.body.appendChild(calib_cursor); + + this.engine = null; + this.onGaze = onGaze; + this.run = false; + this.__invisible = false; + this.screen_width = 0; + this.screen_height = 0; + + this.updateViewportSize(); + + if (window.isSecureContext) { + this.init(videoElement_ID); + } + else { + console.error('This application requires a secure context (HTTPS or localhost)'); + } + + } + + updateViewportSize() { + this.screen_width = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0); + this.screen_height = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0); + } + + showUpCalibrationInstructions(onRead) { + // Create content container + // const content = document.createElement('div'); + // content.style.textAlign = 'center'; + // content.style.color = '#fff'; + // content.style.fontFamily = 'Arial, sans-serif'; + + // // Create instructional text + // const instructionText1 = document.createElement('h3'); + // instructionText1.textContent = 'EyeGestures Upcalibration:'; + // instructionText1.style.fontSize = '1.5rem'; + // instructionText1.style.marginBottom = '20px'; + + // const instructionText2 = document.createElement('p'); + // instructionText2.innerHTML = 'We need to improve calibration. Focus on 25 red circles.'; + // instructionText2.style.marginBottom = '20px'; + + // const instructionText3 = document.createElement('p'); + // instructionText3.innerHTML = 'The blue circle is your estimated gaze. With every calibration point, the tracker will gradually listen more and more to your gaze.'; + // instructionText3.style.marginBottom = '20px'; + + // // Append elements to content + // content.appendChild(instructionText1); + // content.appendChild(instructionText2); + // content.appendChild(instructionText3); + // content.appendChild(button); + } + + showCalibrationInstructions(onRead) { + // Create overlay + const overlay = document.createElement('div'); + overlay.id = 'calibrationOverlay'; + overlay.style.position = 'fixed'; + overlay.style.top = '0'; + overlay.style.left = '0'; + overlay.style.width = '100vw'; + overlay.style.height = '100vh'; + overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.9)'; + overlay.style.display = 'flex'; + overlay.style.justifyContent = 'center'; + overlay.style.alignItems = 'center'; + overlay.style.zIndex = '1000'; + + // Create content container + const content = document.createElement('div'); + content.style.textAlign = 'center'; + content.style.color = '#fff'; + content.style.fontFamily = 'Arial, sans-serif'; + + // Create instructional text + const instructionText1 = document.createElement('h3'); + instructionText1.textContent = 'EyeGestures Calibration:'; + instructionText1.style.fontSize = '1.5rem'; + instructionText1.style.marginBottom = '20px'; + + const instructionText2 = document.createElement('p'); + instructionText2.innerHTML = 'To calibrate properly you need to gaze on 25 red circles.'; + instructionText2.style.marginBottom = '20px'; + + const instructionText3 = document.createElement('p'); + instructionText3.innerHTML = 'The blue circle is your estimated gaze. With every calibration point, the tracker will gradually listen more and more to your gaze.'; + instructionText3.style.marginBottom = '20px'; + + // Create button + const button = document.createElement('button'); + button.textContent = 'Continue'; + button.style.padding = '10px 20px'; + button.style.fontSize = '1rem'; + button.style.border = 'none'; + button.style.borderRadius = '5px'; + button.style.backgroundColor = '#5e17eb'; + button.style.color = '#fff'; + button.style.cursor = 'pointer'; + + // Button click event to remove overlay + button.addEventListener('click', () => { + document.body.removeChild(overlay); + onRead(); + }); + // Append elements to content + content.appendChild(instructionText1); + content.appendChild(instructionText2); + content.appendChild(instructionText3); + content.appendChild(button); + + // Append content to overlay + overlay.appendChild(content); + + // Append overlay to body + document.body.appendChild(overlay); + + setTimeout(() => { + document.body.removeChild(overlay); + onRead(); + },15000) + } + + + // Status update function + updateStatus(message) { + document.getElementById('status').textContent = message; + } + + // Error display function + showError(message) { + const errorElement = document.getElementById('error'); + errorElement.textContent = message; + errorElement.style.display = 'block'; + } + + // Function to load script with promise + loadScript(url) { + return new Promise((resolve, reject) => { + const script = document.createElement('script'); + script.src = url; + script.onload = resolve; + script.onerror = reject; + document.head.appendChild(script); + }); + } + + // Main initialization + async init(videoElement_id) { + try { + this.updateViewportSize(); + this.updateStatus('Loading EyeGestures engine...'); + const engineModule = await __loadEngineModule(); + await engineModule.default(); + this.engine = new engineModule.EyeGesturesEngineWasm(this.screen_width, this.screen_height); + + this.updateStatus('Loading MediaPipe library...'); + + // Load MediaPipe library + await this.loadScript('https://cdn.jsdelivr.net/npm/@mediapipe/drawing_utils@0.3/drawing_utils.js'); + await this.loadScript('https://cdn.jsdelivr.net/npm/@mediapipe/face_mesh@0.4.1633559619/face_mesh.js'); + + this.updateStatus('MediaPipe library loaded, initializing...'); + + if (typeof FaceMesh === 'undefined') { + throw new Error('FaceMesh is not defined. Library not loaded correctly.'); + } + + await this.setupMediaPipe(videoElement_id); + } catch (error) { + console.error('Initialization error:', error); + this.showError('Initialization error: ' + error.message); + } + } + + async setupMediaPipe(videoElement_id) { + try { + // Initialize FaceMesh solution + const faceMesh = new FaceMesh({ + locateFile: (file) => { + console.log("Loading file:", file); + return `https://cdn.jsdelivr.net/npm/@mediapipe/face_mesh@0.4.1633559619/${file}`; + } + }); + + // Set options for FaceMesh + faceMesh.setOptions({ + maxNumFaces: 1, + refineLandmarks: true, + minDetectionConfidence: 0.5, + minTrackingConfidence: 0.5 + }); + + // Initialize the FaceMesh instance + await faceMesh.initialize(); + this.updateStatus('FaceMesh initialized successfully'); + + // Set callback for the results + faceMesh.onResults(this.onFaceMeshResults.bind(this)); + + // Access video stream + const stream = await navigator.mediaDevices.getUserMedia({ + video: {} + }); + + const videoElement = document.getElementById(videoElement_id); + videoElement.srcObject = stream; + + // Wait for video to be loaded + videoElement.onloadeddata = () => { + this.updateStatus('Video stream started'); + videoElement.play(); + requestAnimationFrame(processFrame); + }; + + async function processFrame() { + const videoElement = document.getElementById("video"); + if (videoElement.readyState !== videoElement.HAVE_ENOUGH_DATA) { + requestAnimationFrame(processFrame); + return; + } + + const canvas = document.getElementById("output_canvas"); + const ctx = canvas.getContext("2d"); + try { + // ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height); + ctx.save(); + ctx.scale(-1, 1); // Flip horizontally (invert x-axis) + ctx.translate(-canvas.width, 0); // Adjust translation to ensure the image is drawn correctly + faceMesh.send({ image: videoElement }); + ctx.restore(); + } catch (error) { + console.error('Error processing frame:', error); + showError('Error processing frame: ' + error.message); + } + requestAnimationFrame(processFrame); + } + + } catch (error) { + console.error('Error initializing MediaPipe:', error); + showError('Error initializing MediaPipe: ' + error.message); + } + } + + onFaceMeshResults(results) { + if ((!results.multiFaceLandmarks || !results.multiFaceLandmarks.length) || !this.run) { + return; + } + + if (!this.engine) { + return; + } + + this.updateViewportSize(); + + // Define eye keypoints before using them + const LEFT_EYE_KEYPOINTS = [ + 33, 133, 160, 159, 158, 157, 173, 155, 154, 153, 144, 145, 153, 246, 468 + ]; + const RIGHT_EYE_KEYPOINTS = [ + 362, 263, 387, 386, 385, 384, 398, 382, 381, 380, 374, 373, 374, 466, 473 + ]; + + let landmarks = results.multiFaceLandmarks[0]; + const flattened = new Float64Array(landmarks.flatMap(point => [point.x, point.y])); + const output = this.engine.process(flattened); + const x = output[0]; + const y = output[1]; + const calibrating = output[2] === 1; + const x_calib = output[3]; + const y_calib = output[4]; + + // visual layer + let l_landmarks = LEFT_EYE_KEYPOINTS.map(index => landmarks[index]); + let r_landmarks = RIGHT_EYE_KEYPOINTS.map(index => landmarks[index]); + let scale_x = 1; + let scale_y = 1; + let offset_x = 0; + let offset_y = 0; + let width = x - offset_x; + let height = y - offset_y; + const canvas = document.getElementById("output_canvas"); + const ctx = canvas.getContext("2d"); + ctx.clearRect(0, 0, canvas.width, canvas.height); + let left_eye_coordinates = []; + let right_eye_coordinates = []; + + ctx.fillStyle = '#ff5757'; + l_landmarks.forEach(landmark => { + left_eye_coordinates.push( + [ + (((landmark.x- offset_x)/width) * scale_x ), + (((landmark.y- offset_y)/height) * scale_y ) + ] + ); + ctx.beginPath(); + ctx.arc( + landmark.x * canvas.width, + landmark.y * canvas.height, + 3, // radius + 0, + 2 * Math.PI + ); + ctx.fill(); + }); + + // Draw dots for each landmark + ctx.fillStyle = '#5e17eb'; + r_landmarks.forEach(landmark => { + right_eye_coordinates.push( + [ + (((landmark.x- offset_x)/width) * scale_x ), + (((landmark.y- offset_y)/height) * scale_y ) + ] + ); + ctx.beginPath(); + ctx.arc( + landmark.x * canvas.width, + landmark.y * canvas.height, + 3, // radius + 0, + 2 * Math.PI + ); + ctx.fill(); + }); + + let cursor = document.getElementById("cursor"); + let left = Math.min(Math.max(x,0),this.screen_width) + let top = Math.min(Math.max(y,0),this.screen_height) + cursor.style.left = `${left - 25}px`; + cursor.style.top = `${top - 25}px`; + let calib_cursor = document.getElementById("calib_cursor"); + let calib_left = Math.min(Math.max(x_calib,0),this.screen_width); + let calib_top = Math.min(Math.max(y_calib,0),this.screen_height); + calib_cursor.style.left = `${calib_left - 100}px`; + calib_cursor.style.top = `${calib_top - 100}px`; + + if(!calibrating){ + calib_cursor.style.display = "none"; + }else{ + calib_cursor.style.display = "block"; + } + + this.onGaze([x, y], calibrating); + } + + __run(){ + this.run = true; + } + + start(){ + const logoDivEyeGestures = document.getElementById("logoDivEyeGestures"); + logoDivEyeGestures.style.display = "flex"; + + this.showCalibrationInstructions(this.__run.bind(this)); + + if(!this.__invisible){ + let cursor = document.getElementById("cursor"); + cursor.style.display = "block"; + } + + let calib_cursor = document.getElementById("calib_cursor"); + calib_cursor.style.display = "block"; + // this.run = true; + }; + + invisible() + { + this.__invisible = true; + let cursor = document.getElementById("cursor"); + cursor.style.display = "none"; + } + + visible() + { + this.__invisible = false; + let cursor = document.getElementById("cursor"); + cursor.style.display = "block"; + } + + stop(){ + this.run = false; + console.log("stop"); + }; + + recalibrate(){ + if (this.engine) { + this.engine.recalibrate(); + } + }; + + addPointToCalibration(x, y){ + if (this.engine) { + this.engine.add_calibration_point(x, y); + } + }; +} diff --git a/web/test.js b/web/test.js new file mode 100644 index 0000000..0b0f40c --- /dev/null +++ b/web/test.js @@ -0,0 +1,3 @@ +import EyeGestures from './eyegestures.js'; + +console.log(EyeGestures); \ No newline at end of file From 090a39102d99abcda435f9c52b22ee65df035bef Mon Sep 17 00:00:00 2001 From: W4ltz <40773550+PeterWaIIace@users.noreply.github.com> Date: Sat, 30 May 2026 18:58:07 +0200 Subject: [PATCH 02/14] For windows --- .gitignore | 3 +- engine/Cargo.lock | 4107 +++++++++++++++++++++++++++++++++++++++++++-- engine/Cargo.toml | 1 + 3 files changed, 3974 insertions(+), 137 deletions(-) diff --git a/.gitignore b/.gitignore index 9736076..1c14fc6 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,5 @@ dist/* data/* .mypy_cache .venvs -*.task \ No newline at end of file +*.task +/engine/target diff --git a/engine/Cargo.lock b/engine/Cargo.lock index 6c412bb..4f97a21 100644 --- a/engine/Cargo.lock +++ b/engine/Cargo.lock @@ -6,17 +6,181 @@ version = 4 name = "EyegesturesEngine" version = "4.0.0" dependencies = [ + "maturin", "pyo3", "wasm-bindgen", "web-sys", ] +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "ar_archive_writer" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb93bbb63b9c227414f6eb3a0adfddca591a8ce1e9b60661bb08969b87e340b" +dependencies = [ + "object 0.37.3", +] + +[[package]] +name = "arwen" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d44cbd9bd79165abe331ebabb9dd4d59a5dc93791be33ff15ebd71baaadc85ba" +dependencies = [ + "clap", + "goblin", + "object 0.38.1", + "scroll", + "thiserror 2.0.18", +] + +[[package]] +name = "arwen-codesign" +version = "0.0.1-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35d7a19757bfe3658d5a95bf25a0492f29ebb21933549bdbfa4075c895510124" +dependencies = [ + "goblin", + "scroll", + "sha2 0.10.9", + "tempfile", +] + [[package]] name = "autocfg" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "borrow-or-share" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c" + +[[package]] +name = "boxcar" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f64beae40a84da1b4b26ff2761a5b895c12adc41dc25aaee1c4f2bbfe97a6e" + +[[package]] +name = "bstr" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "bumpalo" version = "3.20.3" @@ -24,268 +188,3939 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] -name = "cfg-if" -version = "1.0.4" +name = "byteorder" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] -name = "futures-core" -version = "0.3.32" +name = "bytes" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] -name = "futures-task" -version = "0.3.32" +name = "bytesize" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "6bd91ee7b2422bcb158d90ef4d14f75ef67f340943fc4149891dcce8f8b972a3" [[package]] -name = "futures-util" -version = "0.3.32" +name = "bzip2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "f3a53fac24f34a81bc9954b5d6cfce0c21e18ec6959f44f56e8e90e4bb7c346c" dependencies = [ - "futures-core", - "futures-task", - "pin-project-lite", - "slab", + "libbz2-rs-sys", ] [[package]] -name = "heck" -version = "0.5.0" +name = "cab" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "171228650e6721d5acc0868a462cd864f49ac5f64e4a42cde270406e64e404d2" +dependencies = [ + "byteorder", + "flate2", + "lzxd", + "time", +] [[package]] -name = "indoc" -version = "2.0.7" +name = "camino" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" dependencies = [ - "rustversion", + "serde_core", ] [[package]] -name = "js-sys" -version = "0.3.99" +name = "cargo-config2" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11" +checksum = "25ada53f7339c78084fb37d7e17f34e76537541c4fbb02fa3a2baa14b8faad37" dependencies = [ - "cfg-if", - "futures-util", - "once_cell", - "wasm-bindgen", + "serde", + "serde_derive", + "toml 1.1.2+spec-1.1.0", ] [[package]] -name = "libc" -version = "0.2.186" +name = "cargo-cyclonedx" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "5d162f67705f0f5038759d73bf546a083bf30e8677c2e944b416bca48d9d69a8" +dependencies = [ + "anyhow", + "cargo-lock", + "cargo_metadata 0.18.1", + "clap", + "cyclonedx-bom", + "env_logger", + "log", + "once_cell", + "pathdiff", + "percent-encoding", + "purl", + "regex", + "serde", + "thiserror 2.0.18", + "time", + "validator", +] [[package]] -name = "memoffset" -version = "0.9.1" +name = "cargo-lock" +version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +checksum = "c06acb4f71407ba205a07cb453211e0e6a67b21904e47f6ba1f9589e38f2e454" dependencies = [ - "autocfg", + "semver", + "serde", + "toml 0.8.23", + "url", ] [[package]] -name = "once_cell" -version = "1.21.4" +name = "cargo-options" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +checksum = "f89e1d6d6f65fe04d5e21be9de19d31a074e3b7e43aa39ee5b85f4cee16c3188" +dependencies = [ + "anstyle", + "clap", +] [[package]] -name = "pin-project-lite" -version = "0.2.17" +name = "cargo-platform" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] [[package]] -name = "portable-atomic" -version = "1.13.1" +name = "cargo-platform" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +checksum = "dd0061da739915fae12ea00e16397555ed4371a6bb285431aab930f61b0aa4ba" +dependencies = [ + "serde", + "serde_core", +] [[package]] -name = "proc-macro2" -version = "1.0.106" +name = "cargo-xwin" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "c010a0e90e1dc09a90428c8768808bb4ad8cd7523e4df38719418e14579a9e37" dependencies = [ - "unicode-ident", + "anyhow", + "cargo-config2", + "cargo-options", + "clap", + "dirs", + "fs-err", + "humantime", + "indicatif", + "paste", + "path-slash", + "serde", + "tar", + "tracing-subscriber", + "ureq", + "which", + "xwin", + "xz2", ] [[package]] -name = "pyo3" -version = "0.23.5" +name = "cargo-zigbuild" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7778bffd85cf38175ac1f545509665d0b9b92a198ca7941f131f85f7a4f9a872" +checksum = "418b19ee36a550c7c34a0bfd04e0b31d0dfb2c92f54aa36189ea3f2f85764845" dependencies = [ - "cfg-if", - "indoc", - "libc", - "memoffset", - "once_cell", - "portable-atomic", - "pyo3-build-config", - "pyo3-ffi", - "pyo3-macros", - "unindent", + "anyhow", + "cargo-config2", + "cargo-options", + "cargo_metadata 0.23.1", + "clap", + "crc", + "dirs", + "fs-err", + "goblin", + "path-slash", + "rustc_version", + "rustflags", + "scroll", + "semver", + "serde", + "serde_json", + "shell-words", + "target-lexicon 0.13.5", + "which", ] [[package]] -name = "pyo3-build-config" -version = "0.23.5" +name = "cargo_metadata" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f6cbe86ef3bf18998d9df6e0f3fc1050a8c5efa409bf712e661a4366e010fb" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ - "once_cell", - "target-lexicon", + "camino", + "cargo-platform 0.1.9", + "semver", + "serde", + "serde_json", + "thiserror 1.0.69", ] [[package]] -name = "pyo3-ffi" -version = "0.23.5" +name = "cargo_metadata" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f1b4c431c0bb1c8fb0a338709859eed0d030ff6daa34368d3b152a63dfdd8d" +checksum = "ef987d17b0a113becdd19d3d0022d04d7ef41f9efe4f3fb63ac44ba61df3ade9" dependencies = [ - "libc", - "pyo3-build-config", + "camino", + "cargo-platform 0.3.3", + "semver", + "serde", + "serde_json", + "thiserror 2.0.18", ] [[package]] -name = "pyo3-macros" -version = "0.23.5" +name = "cbindgen" +version = "0.29.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc2201328f63c4710f68abdf653c89d8dbc2858b88c5d88b0ff38a75288a9da" +checksum = "c95537b45400390270fae69ac098d057c8f5399001cde9d04f700c105ddfff2d" dependencies = [ + "heck", + "indexmap", + "log", "proc-macro2", - "pyo3-macros-backend", "quote", + "serde", + "serde_json", "syn", + "tempfile", + "toml 0.9.12+spec-1.1.0", ] [[package]] -name = "pyo3-macros-backend" -version = "0.23.5" +name = "cc" +version = "1.2.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fca6726ad0f3da9c9de093d6f116a93c1a38e417ed73bf138472cf4064f72028" +checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f" dependencies = [ - "heck", - "proc-macro2", - "pyo3-build-config", - "quote", - "syn", + "find-msvc-tools", + "jobserver", + "libc", + "shlex", ] [[package]] -name = "quote" -version = "1.0.45" +name = "cesu8" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a347dcabdae9c31b0825fd6a8bed285ec9c2acb89c47827126d52fa4f59cece3" dependencies = [ - "proc-macro2", + "fnv", + "uuid", + "web-time", ] [[package]] -name = "rustversion" -version = "1.0.22" +name = "cfg-if" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] -name = "slab" -version = "0.4.12" +name = "charset" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" +checksum = "f1f927b07c74ba84c7e5fe4db2baeb3e996ab2688992e39ac68ce3220a677c7e" +dependencies = [ + "base64", + "encoding_rs", +] [[package]] -name = "syn" -version = "2.0.117" +name = "chumsky" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +checksum = "e0d2bfadce76f963d776feff99db6dc33783829539258314776383b33e2a00f8" dependencies = [ - "proc-macro2", - "quote", + "hashbrown 0.15.5", + "regex-automata", + "serde", + "stacker", "unicode-ident", + "unicode-segmentation", ] [[package]] -name = "target-lexicon" -version = "0.12.16" +name = "clap" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +dependencies = [ + "clap_builder", + "clap_derive", +] [[package]] -name = "unicode-ident" -version = "1.0.24" +name = "clap_builder" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", + "terminal_size", +] [[package]] -name = "unindent" -version = "0.2.4" +name = "clap_complete" +version = "4.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" +checksum = "e0a7a9bfdb35811f9e59832f0f05975114d2251b415fb534108e6f34060fd772" +dependencies = [ + "clap", +] [[package]] -name = "wasm-bindgen" -version = "0.2.122" +name = "clap_complete_command" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" +checksum = "da8e198c052315686d36371e8a3c5778b7852fc75cc313e4e11eeb7a644a1b62" dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", + "clap", + "clap_complete", + "clap_complete_nushell", ] [[package]] -name = "wasm-bindgen-macro" -version = "0.2.122" +name = "clap_complete_nushell" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" +checksum = "fbb9e9715d29a754b468591be588f6b926f5b0a1eb6a8b62acabeb66ff84d897" dependencies = [ - "quote", - "wasm-bindgen-macro-support", + "clap", + "clap_complete", ] [[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.122" +name = "clap_derive" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ - "bumpalo", + "heck", "proc-macro2", "quote", "syn", - "wasm-bindgen-shared", ] [[package]] -name = "wasm-bindgen-shared" -version = "0.2.122" +name = "clap_lex" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "cli-table" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14da8d951cef7cc4f13ccc9b744d736963d57863c7e6fc33c070ea274546082c" dependencies = [ - "unicode-ident", + "termcolor", + "unicode-width", ] [[package]] -name = "web-sys" -version = "0.3.99" +name = "colorchoice" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ - "js-sys", - "wasm-bindgen", + "bytes", + "memchr", +] + +[[package]] +name = "configparser" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57e3272f0190c3f1584272d613719ba5fc7df7f4942fe542e63d949cf3a649b" + +[[package]] +name = "console" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" +dependencies = [ + "encode_unicode", + "libc", + "unicode-width", + "windows-sys 0.61.2", +] + +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "cookie_store" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b2c103cf610ec6cae3da84a766285b42fd16aad564758459e6ecf128c75206" +dependencies = [ + "cookie", + "document-features", + "idna", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "time", + "url", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "cyclonedx-bom" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3132b69ba8c13808bd2fa5748ac5b9816eb4f4e1f0bff6b7f9254a5940dcdeef" +dependencies = [ + "base64", + "cyclonedx-bom-macros", + "fluent-uri", + "indexmap", + "once_cell", + "ordered-float", + "purl", + "regex", + "serde", + "serde_json", + "spdx", + "strum", + "thiserror 2.0.18", + "time", + "uuid", + "xml-rs", +] + +[[package]] +name = "cyclonedx-bom-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50341f21df64b412b4f917e34b7aa786c092d64f3f905f478cb76950c7e980c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "data-encoding" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "dialoguer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f104b501bf2364e78d0d3974cbc774f738f5865306ed128e1e0d7499c0ad96" +dependencies = [ + "console", + "shell-words", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common 0.1.7", +] + +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.0", + "const-oid", + "crypto-common 0.2.2", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "displaydoc" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "fat-macho" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bed3960cfd332df43d86b2ae31bfed07a7b727a6170ae65dddc342775e810ca7" +dependencies = [ + "goblin", +] + +[[package]] +name = "filetime" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" +dependencies = [ + "cfg-if", + "libc", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", + "zlib-rs", +] + +[[package]] +name = "fluent-uri" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc74ac4d8359ae70623506d512209619e5cf8f347124910440dbc221714b328e" +dependencies = [ + "borrow-or-share", + "ref-cast", + "serde", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs-err" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fde052dbfc920003cfd2c8e2c6e6d4cc7c1091538c3a24226cec0665ab08c0" +dependencies = [ + "autocfg", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "globset" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "goblin" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17582616a7718cca54cec18e534a76c7c4aec11a8b9a85695712f262fd15a4c8" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash 0.2.0", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "http" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be7462df143984c4598a256ef469b251d7d7f9e271135073e78fc535414f3d0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "humantime" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" + +[[package]] +name = "hybrid-array" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" +dependencies = [ + "typenum", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "ignore" +version = "0.4.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata", + "same-file", + "walkdir", + "winapi-util", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "indicatif" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" +dependencies = [ + "console", + "portable-atomic", + "unicode-width", + "unit-prefix", + "web-time", +] + +[[package]] +name = "indoc" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] + +[[package]] +name = "is-terminal" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lddtree" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39f71c5bd42adf4ee8e6b24da58c1f00a2817d27f618b169399f5adbf9e74492" +dependencies = [ + "fs-err", + "glob", + "goblin", + "memmap2", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libbz2-rs-sys" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b357333733e8260735ba5894eb928c02ecc69c78715f01a8019e7fa7f2db4c" + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libmimalloc-sys" +version = "0.1.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a45a52f43e1c16f667ccfe4dd8c85b7f7c204fd5e3bf46c5b0db9a5c3c0b8e9" +dependencies = [ + "cc", +] + +[[package]] +name = "libredox" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" +dependencies = [ + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5" + +[[package]] +name = "lzma-rust2" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e9ceaec84b54518262de7cf06b8b43e83c808349960f1610b21b0bfc9640f20" +dependencies = [ + "sha2 0.11.0", +] + +[[package]] +name = "lzma-sys" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "lzxd" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b29dffab797218e12e4df08ef5d15ab9efca2504038b1b32b9b32fc844b39c9" + +[[package]] +name = "mailparse" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60819a97ddcb831a5614eb3b0174f3620e793e97e09195a395bfa948fd68ed2f" +dependencies = [ + "charset", + "data-encoding", + "quoted_printable", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "maturin" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4e123c32db7b76ff7ad0d3b5c9795ef9d4f013cb75bc0baaa5c17a70995ed3" +dependencies = [ + "anyhow", + "arwen", + "arwen-codesign", + "base64", + "bytesize", + "cargo-config2", + "cargo-cyclonedx", + "cargo-options", + "cargo-xwin", + "cargo-zigbuild", + "cargo_metadata 0.23.1", + "cbindgen", + "cc", + "clap", + "clap_complete_command", + "configparser", + "console", + "dialoguer", + "dirs", + "dunce", + "fat-macho", + "flate2", + "fs-err", + "glob", + "goblin", + "ignore", + "indexmap", + "itertools 0.14.0", + "lddtree", + "memmap2", + "minijinja", + "normpath", + "once_cell", + "path-slash", + "pep440_rs", + "pep508_rs", + "platform-info", + "pyo3-introspection", + "pyproject-toml", + "python-pkginfo", + "reflink-copy", + "regex", + "rustc_version", + "rustflags", + "rustls", + "rustls-pki-types", + "same-file", + "semver", + "serde", + "serde_json", + "sha2 0.11.0", + "tar", + "target-lexicon 0.13.5", + "tempfile", + "textwrap", + "thiserror 2.0.18", + "time", + "toml 1.1.2+spec-1.1.0", + "toml_edit 0.25.12+spec-1.1.0", + "tracing", + "tracing-subscriber", + "unicode-xid", + "ureq", + "url", + "walkdir", + "which", + "wild", + "xz2", + "zip 8.6.0", +] + +[[package]] +name = "memchr" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" + +[[package]] +name = "memmap2" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" +dependencies = [ + "libc", +] + +[[package]] +name = "memo-map" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d1115007560874e373613744c6fba374c17688327a71c1476d1a5954cc857b" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mimalloc" +version = "0.1.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d4139bb28d14ad1facf21d5eb8825051b326e172d216b39f6d31df53cc97862" +dependencies = [ + "libmimalloc-sys", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minijinja" +version = "2.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2929e494b2280e1e18959bb2e121da03347ae896896fdfaceaab43c88a02803f" +dependencies = [ + "memo-map", + "serde", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "msi" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0325f8473ef1f5c38ee42345e2cd1678299cbbfa169d1776654a2a682867420" +dependencies = [ + "byteorder", + "cfb", + "encoding_rs", + "uuid", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "normpath" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9985ef7269fa99f3b12437bb698381da2428743ab90f20393f399fa14cab21a" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "object" +version = "0.38.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271638cd5fa9cca89c4c304675ca658efc4e64a66c716b7cfe1afb4b9611dbbc" +dependencies = [ + "crc32fast", + "flate2", + "hashbrown 0.16.1", + "indexmap", + "memchr", + "ruzstd", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-float" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" +dependencies = [ + "num-traits", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "path-slash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" +dependencies = [ + "camino", +] + +[[package]] +name = "pep440_rs" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31095ca1f396e3de32745f42b20deef7bc09077f918b085307e8eab6ddd8fb9c" +dependencies = [ + "once_cell", + "serde", + "tracing", + "unicode-width", + "unscanny", + "version-ranges", +] + +[[package]] +name = "pep508_rs" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faee7227064121fcadcd2ff788ea26f0d8f2bd23a0574da11eca23bc935bcc05" +dependencies = [ + "boxcar", + "indexmap", + "itertools 0.13.0", + "once_cell", + "pep440_rs", + "regex", + "rustc-hash", + "serde", + "smallvec", + "thiserror 1.0.69", + "tracing", + "unicode-width", + "url", + "urlencoding", + "version-ranges", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn", + "unicase", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", + "unicase", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "platform-info" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9368d62437c8cbb7c31ee37fd8c08a7d390e09a3ff75698a674953f46705ffcb" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "psm" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645dbe486e346d9b5de3ef16ede18c26e6c70ad97418f4874b8b1889d6e761ea" +dependencies = [ + "ar_archive_writer", + "cc", +] + +[[package]] +name = "purl" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60ebe4262ae91ddd28c8721111a0a6e9e58860e211fc92116c4bb85c98fd96ad" +dependencies = [ + "hex", + "percent-encoding", + "phf", + "thiserror 2.0.18", + "unicase", +] + +[[package]] +name = "pyo3" +version = "0.23.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7778bffd85cf38175ac1f545509665d0b9b92a198ca7941f131f85f7a4f9a872" +dependencies = [ + "cfg-if", + "indoc", + "libc", + "memoffset", + "once_cell", + "portable-atomic", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", + "unindent", +] + +[[package]] +name = "pyo3-build-config" +version = "0.23.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f6cbe86ef3bf18998d9df6e0f3fc1050a8c5efa409bf712e661a4366e010fb" +dependencies = [ + "once_cell", + "target-lexicon 0.12.16", +] + +[[package]] +name = "pyo3-ffi" +version = "0.23.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f1b4c431c0bb1c8fb0a338709859eed0d030ff6daa34368d3b152a63dfdd8d" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-introspection" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96040524552ac54e645ce08146b24023d720ceb0e788fff758c0beb9fe841736" +dependencies = [ + "anyhow", + "goblin", + "serde", + "serde_json", +] + +[[package]] +name = "pyo3-macros" +version = "0.23.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc2201328f63c4710f68abdf653c89d8dbc2858b88c5d88b0ff38a75288a9da" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.23.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fca6726ad0f3da9c9de093d6f116a93c1a38e417ed73bf138472cf4064f72028" +dependencies = [ + "heck", + "proc-macro2", + "pyo3-build-config", + "quote", + "syn", +] + +[[package]] +name = "pyproject-toml" +version = "0.13.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6d755483ad14b49e76713b52285235461a5b4f73f17612353e11a5de36a5fd2" +dependencies = [ + "glob", + "indexmap", + "pep440_rs", + "pep508_rs", + "serde", + "thiserror 2.0.18", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "python-pkginfo" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229fe47647d6602b9b0934b21fab8aece1c5a5aeb0a934196a14355fec656623" +dependencies = [ + "flate2", + "fs-err", + "mailparse", + "rfc2047-decoder", + "tar", + "thiserror 2.0.18", + "zip 8.6.0", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "quoted_printable" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478e0585659a122aa407eb7e3c0e1fa51b1d8a870038bd29f0cf4a8551eea972" + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "reflink-copy" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13362233b147e57674c37b802d216b7c5e3dcccbed8967c84f0d8d223868ae27" +dependencies = [ + "cfg-if", + "libc", + "rustix", + "windows", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "rfc2047-decoder" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b36447d5e70933adee73cefff22b0851edbc162f2b3951918de43717a22d92de" +dependencies = [ + "base64", + "charset", + "chumsky", + "memchr", + "quoted_printable", + "thiserror 2.0.18", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustflags" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a39e0e9135d7a7208ee80aa4e3e4b88f0f5ad7be92153ed70686c38a03db2e63" + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ruzstd" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7c1c839d570d835527c9a5e4db7cb2198683a988cb9d7293fc8674e6bd58fc8" +dependencies = [ + "twox-hash", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scroll" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1257cd4248b4132760d6524d6dda4e053bc648c9070b960929bf50cfb1e7add" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed76efe62313ab6610570951494bdaa81568026e0318eaa55f167de70eeea67d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shell-words" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "smawk" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" + +[[package]] +name = "socks" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c3dbbd9ae980613c6dd8e28a9407b50509d3803b57624d5dfe8315218cd58b" +dependencies = [ + "byteorder", + "libc", + "winapi", +] + +[[package]] +name = "spdx" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8da593e30beb790fc9424502eb898320b44e5eb30367dbda1c1edde8e2f32d7" +dependencies = [ + "smallvec", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "stacker" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "640c8cdd92b6b12f5bcb1803ca3bbf5ab96e5e6b6b96b9ab77dabe9e880b3190" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.61.2", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tar" +version = "0.4.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "target-lexicon" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "terminal_size" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874" +dependencies = [ + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "smawk", + "unicode-linebreak", + "unicode-width", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "js-sys", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.3", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.15", +] + +[[package]] +name = "toml_edit" +version = "0.25.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" +dependencies = [ + "indexmap", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.3", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow 1.0.3", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "toml_writer" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "twox-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" + +[[package]] +name = "typed-path" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + +[[package]] +name = "unicode-segmentation" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "unindent" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" + +[[package]] +name = "unit-prefix" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" + +[[package]] +name = "unscanny" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9df2af067a7953e9c3831320f35c1cc0600c30d44d9f7a12b01db1cd88d6b47" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "ureq" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" +dependencies = [ + "base64", + "cookie_store", + "flate2", + "getrandom 0.4.2", + "log", + "mime_guess", + "percent-encoding", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "serde", + "serde_json", + "socks", + "ureq-proto", + "utf8-zero", + "webpki-roots", +] + +[[package]] +name = "ureq-proto" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" +dependencies = [ + "base64", + "http", + "httparse", + "log", +] + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "utf8-zero" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d258b83ceec21034727ecee8c382cfa6c3e133699b0742c64571814fb420c9f7" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "validator" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0b4a29d8709210980a09379f27ee31549b73292c87ab9899beee1c0d3be6303" +dependencies = [ + "idna", + "once_cell", + "regex", + "serde", + "serde_derive", + "serde_json", + "url", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version-ranges" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e9bd4e9c9ff6a2a9b5969462ba26216af3e010df0377dad8320ab515262ef8" +dependencies = [ + "smallvec", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "versions" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80a7e511ce1795821207a837b7b1c8d8aca0c648810966ad200446ae58f6667f" +dependencies = [ + "itertools 0.14.0", + "nom", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.3+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +dependencies = [ + "wit-bindgen 0.57.1", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.122" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.122" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.122" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.122" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31141ce3fc3e300ae89b78c0dd67f9708061d1d2eda54b8209346fd6be9a92c" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webpki-roots" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "which" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81995fafaaaf6ae47a7d0cc83c67caf92aeb7e5331650ae6ff856f7c0c60c459" +dependencies = [ + "libc", +] + +[[package]] +name = "wild" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3131afc8c575281e1e80f36ed6a092aa502c08b18ed7524e86fbbb12bb410e1" +dependencies = [ + "glob", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections", + "windows-core", + "windows-future", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core", + "windows-link", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix", +] + +[[package]] +name = "xml-rs" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" + +[[package]] +name = "xwin" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c337699251ad0c38cf87ee63944de38c2201d017cfbb768e5a3897ae835aacc7" +dependencies = [ + "anyhow", + "bytes", + "cab", + "camino", + "clap", + "cli-table", + "crossbeam-channel", + "indicatif", + "memchr", + "mimalloc", + "msi", + "parking_lot", + "rayon", + "regex", + "serde", + "serde_json", + "sha2 0.11.0", + "tempfile", + "toml 1.1.2+spec-1.1.0", + "tracing", + "tracing-subscriber", + "twox-hash", + "ureq", + "versions", + "walkdir", + "zip 7.2.0", +] + +[[package]] +name = "xz2" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" +dependencies = [ + "lzma-sys", +] + +[[package]] +name = "yoke" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zip" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42e33efc22a0650c311c2ef19115ce232583abbe80850bc8b66509ebef02de0" +dependencies = [ + "crc32fast", + "flate2", + "indexmap", + "memchr", + "typed-path", +] + +[[package]] +name = "zip" +version = "8.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d04a6b5381502aa6087c94c669499eb1602eb9c5e8198e534de571f7154809b" +dependencies = [ + "bzip2", + "crc32fast", + "flate2", + "indexmap", + "lzma-rust2", + "memchr", + "time", + "typed-path", + "zopfli", + "zstd", +] + +[[package]] +name = "zlib-rs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513" + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", ] diff --git a/engine/Cargo.toml b/engine/Cargo.toml index aca8b9d..e252bec 100644 --- a/engine/Cargo.toml +++ b/engine/Cargo.toml @@ -13,6 +13,7 @@ web-sys = { version = "0.3.99", features = ["console"], optional = true } # Python dependencies pyo3 = { version = "0.23", optional = true, features = ["extension-module"] } +maturin = "1.13.3" [features] default = ["wasm"] From af39ab047a04e7622aef6fe8652e825158ec171b Mon Sep 17 00:00:00 2001 From: W4ltz <40773550+PeterWaIIace@users.noreply.github.com> Date: Sat, 30 May 2026 22:52:46 +0200 Subject: [PATCH 03/14] updating for multibuilds --- Makefile | 33 +++++++++++++++++++--- engine/Cargo.lock | 71 +++++++++++++++-------------------------------- engine/Cargo.toml | 4 ++- 3 files changed, 55 insertions(+), 53 deletions(-) diff --git a/Makefile b/Makefile index 26ac2e5..4188bdb 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,4 @@ -.PHONY: format format_check test min wasm python - +.PHONY: format format_check test min wasm python python-help format: isort eyeGestures @@ -28,11 +27,37 @@ wasm: cd ./engine && wasm-pack build --target web $(MINIFY) $(JS_SRC) $(MINIFY_FLAGS) -o engine/pkg/eyegestures.min.js -# Python buil +# Python build PYTHON = uv run +MATURIN_PYTHON_FLAGS = --release --no-default-features --features python +# Space-separated interpreters used by `make python`. +# Example single: `make python PYTHON_INTERPRETERS="python3.13"` +# Example multi: `make python PYTHON_INTERPRETERS="python3.12 python3.13"` +# Default: use whichever `python` is in PATH. +PYTHON_INTERPRETERS ?= python +# Set to 1 to allow builds for newer CPython versions than PyO3 officially supports. +PYO3_USE_ABI3_FORWARD_COMPATIBILITY ?= 1 + +ifeq ($(OS),Windows_NT) +PYO3_FORWARD_ENV = set PYO3_USE_ABI3_FORWARD_COMPATIBILITY=$(PYO3_USE_ABI3_FORWARD_COMPATIBILITY) && +else +PYO3_FORWARD_ENV = PYO3_USE_ABI3_FORWARD_COMPATIBILITY=$(PYO3_USE_ABI3_FORWARD_COMPATIBILITY) +endif python: - cd ./engine && maturin develop --release --no-default-features --features python + cd ./engine && $(PYO3_FORWARD_ENV) maturin build $(MATURIN_PYTHON_FLAGS) --interpreter $(PYTHON_INTERPRETERS) + +python-help: + @echo "make python" + @echo " - builds wheel using default interpreter: python" + @echo "make python PYTHON_INTERPRETERS=\"python3.13\"" + @echo " - builds wheel for one interpreter" + @echo "make python PYTHON_INTERPRETERS=\"python3.12 python3.13\"" + @echo " - builds wheel files in engine/target/wheels" + @echo "make python PYO3_USE_ABI3_FORWARD_COMPATIBILITY=0" + @echo " - enforces PyO3 max supported Python version" + @echo "Tip (Windows): prefer explicit paths if discovery fails, e.g." + @echo " make python PYTHON_INTERPRETERS=\"C:/Python313/python.exe C:/Python314/python.exe\"" clean: rm -f src/eyegestures.min.js diff --git a/engine/Cargo.lock b/engine/Cargo.lock index 4f97a21..2a6d276 100644 --- a/engine/Cargo.lock +++ b/engine/Cargo.lock @@ -359,7 +359,7 @@ dependencies = [ "serde", "serde_json", "shell-words", - "target-lexicon 0.13.5", + "target-lexicon", "which", ] @@ -1322,15 +1322,6 @@ dependencies = [ "web-time", ] -[[package]] -name = "indoc" -version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" -dependencies = [ - "rustversion", -] - [[package]] name = "is-terminal" version = "0.4.17" @@ -1629,7 +1620,7 @@ dependencies = [ "serde_json", "sha2 0.11.0", "tar", - "target-lexicon 0.13.5", + "target-lexicon", "tempfile", "textwrap", "thiserror 2.0.18", @@ -1669,15 +1660,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38d1115007560874e373613744c6fba374c17688327a71c1476d1a5954cc857b" -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - [[package]] name = "mimalloc" version = "0.1.52" @@ -2057,37 +2039,33 @@ dependencies = [ [[package]] name = "pyo3" -version = "0.23.5" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7778bffd85cf38175ac1f545509665d0b9b92a198ca7941f131f85f7a4f9a872" +checksum = "91fd8e38a3b50ed1167fb981cd6fd60147e091784c427b8f7183a7ee32c31c12" dependencies = [ - "cfg-if", - "indoc", "libc", - "memoffset", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", - "unindent", ] [[package]] name = "pyo3-build-config" -version = "0.23.5" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f6cbe86ef3bf18998d9df6e0f3fc1050a8c5efa409bf712e661a4366e010fb" +checksum = "e368e7ddfdeb98c9bca7f8383be1648fd84ab466bf2bc015e94008db6d35611e" dependencies = [ - "once_cell", - "target-lexicon 0.12.16", + "python3-dll-a", + "target-lexicon", ] [[package]] name = "pyo3-ffi" -version = "0.23.5" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f1b4c431c0bb1c8fb0a338709859eed0d030ff6daa34368d3b152a63dfdd8d" +checksum = "7f29e10af80b1f7ccaf7f69eace800a03ecd13e883acfacc1e5d0988605f651e" dependencies = [ "libc", "pyo3-build-config", @@ -2107,9 +2085,9 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.23.5" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc2201328f63c4710f68abdf653c89d8dbc2858b88c5d88b0ff38a75288a9da" +checksum = "df6e520eff47c45997d2fc7dd8214b25dd1310918bbb2642156ef66a67f29813" dependencies = [ "proc-macro2", "pyo3-macros-backend", @@ -2119,9 +2097,9 @@ dependencies = [ [[package]] name = "pyo3-macros-backend" -version = "0.23.5" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fca6726ad0f3da9c9de093d6f116a93c1a38e417ed73bf138472cf4064f72028" +checksum = "c4cdc218d835738f81c2338f822078af45b4afdf8b2e33cbb5916f108b813acb" dependencies = [ "heck", "proc-macro2", @@ -2160,6 +2138,15 @@ dependencies = [ "zip 8.6.0", ] +[[package]] +name = "python3-dll-a" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d80ba7540edb18890d444c5aa8e1f1f99b1bdf26fb26ae383135325f4a36042b" +dependencies = [ + "cc", +] + [[package]] name = "quote" version = "1.0.45" @@ -2770,12 +2757,6 @@ dependencies = [ "xattr", ] -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - [[package]] name = "target-lexicon" version = "0.13.5" @@ -3161,12 +3142,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "unindent" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" - [[package]] name = "unit-prefix" version = "0.5.2" diff --git a/engine/Cargo.toml b/engine/Cargo.toml index e252bec..94bfb07 100644 --- a/engine/Cargo.toml +++ b/engine/Cargo.toml @@ -12,7 +12,9 @@ wasm-bindgen = { version = "0.2", optional = true } web-sys = { version = "0.3.99", features = ["console"], optional = true } # Python dependencies -pyo3 = { version = "0.23", optional = true, features = ["extension-module"] } +# `generate-import-lib` allows Windows builds when maturin uses bundled sysconfig +# for discovered interpreters. +pyo3 = { version = "0.28.2", optional = true, features = ["extension-module", "generate-import-lib"] } maturin = "1.13.3" [features] From b60a14c01996678d4a1f71fb7510f783e1274cd1 Mon Sep 17 00:00:00 2001 From: W4ltz <40773550+PeterWaIIace@users.noreply.github.com> Date: Sat, 30 May 2026 23:21:55 +0200 Subject: [PATCH 04/14] for twine builds --- eyeGestures/__init__.py | 7 ++++-- pybuild.bat | 3 ++- pyproject.toml | 52 ++++++++--------------------------------- uv.lock | 25 +------------------- 4 files changed, 18 insertions(+), 69 deletions(-) diff --git a/eyeGestures/__init__.py b/eyeGestures/__init__.py index 2dcd1bf..30317b7 100644 --- a/eyeGestures/__init__.py +++ b/eyeGestures/__init__.py @@ -11,9 +11,12 @@ from eyeGestures.utils import recoverable try: - from EyegesturesEngine import EyeGesturesEnginePython as RustEyeGesturesEngine + from .EyegesturesEngine import EyeGesturesEnginePython as RustEyeGesturesEngine except ImportError: - RustEyeGesturesEngine = None + try: + from EyegesturesEngine import EyeGesturesEnginePython as RustEyeGesturesEngine + except ImportError: + RustEyeGesturesEngine = None VERSION = "4.0.0" diff --git a/pybuild.bat b/pybuild.bat index 5e8a7c6..f247dd6 100644 --- a/pybuild.bat +++ b/pybuild.bat @@ -2,4 +2,5 @@ @REM pyinstaller ./apps/app_win.spec @REM deactivate; -python -m build +uv run --no-sync --python 3.13 --with build python -m build --wheel +uv run --no-sync --python 3.14 --with build python -m build --wheel \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 259a4a4..bf1c544 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,48 +1,10 @@ [build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[tool.hatch.build.targets.sdist] - -dependencies = [ - "beautifulsoup4>=4.12.3", - "keyboard>=0.13.5", - "matplotlib>=3.8.2", - "mediapipe>=0.10.8", - "numpy>=1.26.4", - "Pillow>=10.3.0", - "PyAutoGUI>=0.9.54", - "pycocotools>=2.0.7", - "pygame>=2.5.2", - "pynput>=1.7.6", - "pytest>=7.4.2", - "scikit_learn>=1.3.2", - "scipy>=1.12.0", - "screeninfo>=0.8.1", - "setuptools>=70.0.0", - "scipy>=1.12.0", - "opencv-contrib-python>=4.9.0.80", - "xlwt>=1.3.0" -] - -include = [ - "eyeGestures/*.py", - "eyeGestures/screenTracker/*.py", - "eyeGestures/eyegestures.py" -] - -exclude = [ - "*.json", - "lab/*", - "app.py", - "test_app.py", - "test.py", - "tools/*" -] +requires = ["maturin>=1.13,<2.0"] +build-backend = "maturin" [project] name = "eyeGestures" -version = "3.2.4" +version = "4.0.0" authors = [ { name="Piotr Walas", email="piotr.walas@eyegestures.com" }, ] @@ -60,12 +22,18 @@ classifiers = [ "Operating System :: OS Independent", ] dependencies = [ - "maturin>=1.13.3", "mediapipe>=0.10.35", "opencv-python>=4.13.0.92", "pygame>=2.6.1", ] +[tool.maturin] +manifest-path = "engine/Cargo.toml" +features = ["python"] +no-default-features = true +python-source = "." +module-name = "eyeGestures.EyegesturesEngine" + [project.urls] Homepage = "https://github.com/NativeSensors/EyeGestures" Issues = "https://github.com/NativeSensors/EyeGestures/Issues" diff --git a/uv.lock b/uv.lock index a4ae09d..9e29743 100644 --- a/uv.lock +++ b/uv.lock @@ -131,10 +131,9 @@ wheels = [ [[package]] name = "eyegestures" -version = "3.2.4" +version = "4.0.0" source = { editable = "." } dependencies = [ - { name = "maturin" }, { name = "mediapipe" }, { name = "opencv-python" }, { name = "pygame" }, @@ -142,7 +141,6 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "maturin", specifier = ">=1.13.3" }, { name = "mediapipe", specifier = ">=0.10.35" }, { name = "opencv-python", specifier = ">=4.13.0.92" }, { name = "pygame", specifier = ">=2.6.1" }, @@ -303,27 +301,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/78/23/92493c3e6e1b635ccfff146f7b99e674808787915420373ac399283764c2/matplotlib-3.10.9-cp314-cp314t-win_arm64.whl", hash = "sha256:a49f1eadc84ca85fd72fa4e89e70e61bf86452df6f971af04b12c60761a0772c", size = 8324785, upload-time = "2026-04-24T00:13:53.633Z" }, ] -[[package]] -name = "maturin" -version = "1.13.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9c/1c/612d23d33ec21b9ae7ece7b3f0dd5f9dfd57b4009e9d2938165869ebd6ae/maturin-1.13.3.tar.gz", hash = "sha256:771e1e9e71a278e56db01552e0d1acfd1464259f9575b6e72842f893cd299079", size = 357934, upload-time = "2026-05-11T07:43:39.027Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/71/66/18c2aaac0b2a5dea9f1db5984ce83b905ad205cfc7c02d0091e707c0c2e7/maturin-1.13.3-py3-none-linux_armv6l.whl", hash = "sha256:3cc13929ca82aefa4adbf0f2c35419369796213c6fb0eb24e914945f50ef5d8c", size = 10190971, upload-time = "2026-05-11T07:43:10.431Z" }, - { url = "https://files.pythonhosted.org/packages/bc/71/26a988d092e4fd6a9523d46d44400a46cad7cdf3fd206ce702240c748aee/maturin-1.13.3-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:53b08bd075649ce96513ad9abf241a43cb685ed6e9e7790f8dbc2d66e95d8323", size = 19716714, upload-time = "2026-05-11T07:43:36.911Z" }, - { url = "https://files.pythonhosted.org/packages/82/5c/f3fd0e184255d9fc7e272c62af3dfa84c617b2577ef83af9ce615f5279cc/maturin-1.13.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:4cd478e6e4c56251e48ed079b8efd55b30bc5c09cf695a1bdafaeb582ee735a0", size = 10194726, upload-time = "2026-05-11T07:43:07.05Z" }, - { url = "https://files.pythonhosted.org/packages/a9/e1/f4edb69fb647b77c4769a9bfd4d6fb62961e653d164bc277ecdffac3ab61/maturin-1.13.3-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:a2675e25f313034ae6f57388cf14818f87d8961c4a96795287f3e155f59beb11", size = 10172781, upload-time = "2026-05-11T07:43:40.796Z" }, - { url = "https://files.pythonhosted.org/packages/c7/7d/a1be934690cdcc3c6609769ceaad322ab7501c2ee5bafcac1b14d609e403/maturin-1.13.3-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:4667ef609ab446c1b5e0bfe4f9fb99699ab6d8548433f8d1a684256e0b67217f", size = 10682670, upload-time = "2026-05-11T07:43:13.132Z" }, - { url = "https://files.pythonhosted.org/packages/18/f5/372ae19b72ce8f6e37e5864ae4dc5b252ee9fce0619ccc3aa366aa3a7f97/maturin-1.13.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:3db93337ed97e60ffc878aa8b493cd7ae44d3a5e1a37256db3a4491f57565018", size = 10060363, upload-time = "2026-05-11T07:43:21.107Z" }, - { url = "https://files.pythonhosted.org/packages/cb/5b/c68340cca09368af0df80965dfabed4234205a492a93da00793c7b9aae20/maturin-1.13.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:1cc0a110b224ca90406b668a3e3c1f5a515062e59e26292f6dbaf5fd4909c6f3", size = 10017551, upload-time = "2026-05-11T07:43:33.916Z" }, - { url = "https://files.pythonhosted.org/packages/28/1e/f90fb2b000bad9e6d850cd5afb88b2f1e2a279cfb4de02ea40078484690e/maturin-1.13.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:c00ea6428dea17bf616fe93770837634454b28c2de1a876e42ef8036c616079a", size = 13301712, upload-time = "2026-05-11T07:43:26.492Z" }, - { url = "https://files.pythonhosted.org/packages/be/58/1670f68a8f04ccd7b90df11047bd9a046585310e84e1967cc9849cd1c5a3/maturin-1.13.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49fd6ab08da28098ccf37afca24cdba72376ba9c1eedf9dd25ff82ed771961ff", size = 10946765, upload-time = "2026-05-11T07:43:16.135Z" }, - { url = "https://files.pythonhosted.org/packages/4b/ac/00c955c2ef134817b1a7bdaa76b0309e9c5291eb17d9ff88069eecd08bc2/maturin-1.13.3-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:b6741d7bf4af97da937528fd1e523c6ab54f53d9a21870fa735d6e67fd88e273", size = 10388661, upload-time = "2026-05-11T07:43:18.727Z" }, - { url = "https://files.pythonhosted.org/packages/97/c6/cbf8a51dde19c19aeba0d9b075095a2effb9b31fd312b1aae3ac79f8aea2/maturin-1.13.3-py3-none-win32.whl", hash = "sha256:0ef257e692cc756c87af5bea95ddfe7d3ac49d3376a7a87f728d63f06e7b6f8b", size = 8901838, upload-time = "2026-05-11T07:43:23.76Z" }, - { url = "https://files.pythonhosted.org/packages/a1/ff/c6a50a59dc8313097d43ac5f4d74df6a500c8cb62b0dc9e054f53e203a48/maturin-1.13.3-py3-none-win_amd64.whl", hash = "sha256:def4a435ea9d2ee93b18ba579dc8c9cf898889a66f312cd379b5e374ec3e3ad6", size = 10340801, upload-time = "2026-05-11T07:43:29.239Z" }, - { url = "https://files.pythonhosted.org/packages/6c/93/e32e79333f0902ba292b996f504f5f06be59587f7d02ab8d5ed1e3066445/maturin-1.13.3-py3-none-win_arm64.whl", hash = "sha256:2389fe92d017cea9d94e521fa0175314a4c52f79a1057b901fbc9f8686ef7d0b", size = 9706562, upload-time = "2026-05-11T07:43:31.743Z" }, -] - [[package]] name = "mediapipe" version = "0.10.35" From 6c702cd52bcd6e080dfa6cd5111b87885c64307a Mon Sep 17 00:00:00 2001 From: W4ltz <40773550+PeterWaIIace@users.noreply.github.com> Date: Sat, 30 May 2026 23:27:04 +0200 Subject: [PATCH 05/14] format --- .github/workflows/code_quality.yml | 3 +- Makefile | 17 ++- .../EyegesturesEngine.cp314-win_amd64.pyd | Bin 0 -> 301056 bytes eyeGestures/Legacy/processing.py | 2 +- .../Legacy/screenTracker/screenTracker.py | 12 +- eyeGestures/__init__.py | 14 +- eyeGestures/eye.py | 2 +- eyeGestures/face.py | 6 +- eyeGestures/processing.py | 2 +- pyproject.toml | 3 +- uv.lock | 127 +++++++++++++++--- 11 files changed, 145 insertions(+), 43 deletions(-) create mode 100644 eyeGestures/EyegesturesEngine.cp314-win_amd64.pyd diff --git a/.github/workflows/code_quality.yml b/.github/workflows/code_quality.yml index 4dcb718..4432d3c 100644 --- a/.github/workflows/code_quality.yml +++ b/.github/workflows/code_quality.yml @@ -16,8 +16,7 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | - python -m pip install --upgrade pip - pip install -r requirements_dev.txt + uv run sync - name: Analysing code with checkers run: | make check diff --git a/Makefile b/Makefile index 4188bdb..4fe0de2 100644 --- a/Makefile +++ b/Makefile @@ -1,17 +1,20 @@ +# Python build +FORMAT_TOOLS = uv run --with isort --with black +CHECK_TOOLS = uv run --with pylint --with flake8 --with mypy --with isort --with black .PHONY: format format_check test min wasm python python-help format: - isort eyeGestures - black eyeGestures + $(FORMAT_TOOLS) python -m isort eyeGestures + $(FORMAT_TOOLS) python -m black eyeGestures format_check: - isort eyeGestures --check - black eyeGestures --check + $(CHECK_TOOLS) python -m isort eyeGestures --check + $(CHECK_TOOLS) python -m black eyeGestures --check check: format_check - pylint eyeGestures - flake8 eyeGestures - mypy eyeGestures + $(CHECK_TOOLS) python -m pylint eyeGestures + $(CHECK_TOOLS) python -m flake8 eyeGestures + $(CHECK_TOOLS) python -m mypy eyeGestures # Web build diff --git a/eyeGestures/EyegesturesEngine.cp314-win_amd64.pyd b/eyeGestures/EyegesturesEngine.cp314-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..9101aa684436643268644941c0035b5f72e6329d GIT binary patch literal 301056 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
V3E{K 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�tE!@QB3kbm>d)WA za%EGznl^ddOkdf0%pCQJc>u=bo#+*@K*bVD-2V^m1_Op2 z2;YBE-b}6LS>Af}{+AOVOAKoxM><0Pj=!s3PRt4D-lM+Aq3o)Y1knhRb$AGZdE_uw z`H4}27Qt)y&Bf6EUe}1wdD@EJ?&xMWWAA40LCaI-_YEIr7_{v&C`x78G!?-yy)fXi#M8Je${CdftFF5Ge3oi0S8uPuS2Njz8 zqF*Pl&-yx0x|VE{^_&yOhVReKpBdacMbA0ON3oHP1EEhz;fo%YP#>y5!tSf^;*}-w zEDBa6Bhz08t$cJ_ve<{Ltd>+(45dL4WdWKdY~}vIC#A1c9y(HhBCV+AR(ea2MUP!U z*0d~2fufyZ$87O2C(Cs;M`p;X2kQj;G)NeF#iA=$SvQ+s#iOY}_yCk)4*$&^qa~LX z!QcwcyIvR){uJw_ZuEuqe(Yd)Z$`Dm5-nN0{}+mXxvC=e5BU-(I~KYVgZFFRl@hm#?O2cU4|2V4WG}o@{+95h4 z@92!lgC>j5R-Fl5kSxBQs#7L9CNQW31lCuoEVXhm0xu_%Qt{u-iW4pm0`xs{u5F@N z`TzT!V0v?ww``kMLtL|@_KIfKwfIn&;;MENcy7JP8Mqf8a^&&qoyCo2%ZZTKuvnrX zp$dPr0j%>#3lcAQlN;k_fl#t}6hGCx`7Yj@8vwVM3p*<77*VVZ7y_|^J8Z0jtx>y) zSDWh3AeU8BD9*T7ePK<%N4}^{79$$7wMePG*{4aHA<6Wk8gvN_!7_Gdnd>Mplf@H& z84(N>KaZXvcowWpGE|x@?girzU8COHZdZv)NJB$nqE~bR4$=N5u4uOSe>S)TIhT=( z8VZxe4{$eHgv$`Ze~1Ai0wYdx`1I4cP>b=PQfe<=Cyi8S0aC1hlOnfwR1POB131ha zwH3X>hZ;0JO0v3wEIi_Jjy2Sc&0!s(|4!r;$oVDA-cUpN@OCW{Bb{1{Xy|Xfi<1IQ z6R23WamtFA_Ut#}dnBxl!MQ_h)U^W>t>%3)Dx0`bs$yxau|_3xaQLoF09Z2Q6;Dy( zbTN}KA)^;>qzUm$1eY-RH zDb(VdS91QkR_mfBiV&sw+9Q-2ZB#YM;n%hQ6vUAr7^vvHWm~lx%mOe0ab@ih-W76z zcDxm?*)St@{t+n)E9MowDs=Z1c6-mDy_n8iq&>7qp`GiET~5b%ZAFgLkKtV8c3#$< z&@?W`8CMQndf}yH0MvJKSrwui#?hrxEC~Coe2L;?g@gvq8Yd|fHCay35p8H=}))@t=U9bwltnIh-lVee9Yds1dS30eepsSwt&UA}#hE5yAs;=6B&$ z^v`&a-pJNzWD!vaOT4l9Makm0Xq&A-8|W96?zso9S}I&y^8`o^9c-Rpop~~$pL&k= zh`AOZ0B2~P3s4a(_DW(H%_?>#qUxbpys#h*-gYnh5$IdJ?bfzr0~RsDcq=21N-aipo%|~Lh7|Iu<5cJm4DA7x&l{bI%8ey+ zsK7!koj?h5QMV#F*k>H6QZWN>Ol$%aU|f>!!bZt;|ulq}x%Gsvcu(#~hr;QEo7Pte9$Qx3&BY3L0 zn4$udD!sAg^4hrOi(~0siOySgrf6zy72GHrIX9xiu(l;P5-i4-Y?`Fs@5s`gXz;!& zxW?ZiZ`r%rF9=f~)Q0UeSs!CEYYGz$+5S8n!+g>AjNa7xn#={YqM@-hR)2mBZQniCZZ8UH5xLsl1_T=`@=4}DDPn);BxLwXI zA_O~@4Mq62_L%>q$m~<4rr`bJ>>Bi{x`KBp57?1Bn#Psxk?I%_5&tRUG@wM68l@>0S1N85T5r^CUV-Zztc(=jmOZ|MH>zUD>1DX5*nE zZg_>80k-Z2{>L=21j3K2ef|ZqIWs|g!!yB%+xbl zrH3ZljZDF<8C}x0CU(PIp`kf4HixI;PWEngnei(jiSmEBW`(;jcUJoq$mK&9& z0?w^HJxNMT@63Y!_&_a+o8ZS`>HG4>rnLwzpgs(=nzX_2W#qE)v>S7j&b+m?~!s#b(ig?Q&cUJ-fSyG37Z-KH1iD7eRH4NGdMZrL_+3 z$or;wStdn9e?3<|4^rQVC9yzW##A1%)~TmnxO6HE}fP5sGAVdxJwqdMj8Fs8#4F&`airRW=E}FrTz62ToQTc|ImFP z`6Dn{g^T%%zFeNvmd0b00Ws8SwzA;(qU-37d}Fv~G}lUz@<&T6x#h(98S*Wv-^eAb z21Cv;W>(ySq+ipb)v^xL{MRHOeU>YE%_h~Vv5VFUL&-Pk8{ZntC+Rv*E#{MSpC_~1 zCSY;OFuw_~_}0b~t}F%@wMhgsfTsyl;?V}!uH3y)>F^t>9a?Q2tqH#&6*_{Pnr9dI zgp|}=`?S30kHt#$4p31jLY{mSFv=2=!F!bONC$MuF3v5)=(>C@)zztS^v2W&Z_?cl z+ox0Gi%6WgpB{cgjdqC8CJSd+6{rHuYSnE_4Ug>P4HeD@#^2LmPJEg%T$13MAMFT4 z_auuyWNl{51P6qXI!VrcsqMi!=`CA0L#zFctpck`A|%8V)?=+M#_BsIUY@>yURY~3 zZfAe__pzjM`;vKR($ra|b7NRd9|yZv7Q%~@sdBBjy;bJL3>sk0i_jBRJ;M%2t7z8F zMUNBXY(Q8&9Y??GwYiAc^0_i5gz|&VXEe>|OS^<~^>%90_vxe4<<+V&me8MF^V$q< zC;kJ*RA6rLA82pHTr5@=h|SOAq^zPq*^095Ouz6El|c;0&98RC4Q`fE@L)2 zKlVju7x~H#RKt%?fIGw5Nb&weeZ_F;FV711pu2Xl&m%7|u_dkc2vcaCl48sivRk}s zrEkwz4{50DSLrgy{e3H7%D&0$oAfDG=9S}FXBT-1OkdV8e~_$W1VEpHwtj~!PdC6k zbDWQto+xFPEng|c6BC@RKKX?Pse^`zgwt*We@yRLOei+-vJG6W$FuK@IVB)^WC5o+ zT`%@kobM=H9l+}F>fU~aml>zFP?$wUg4Kf*9CZoKL6XP=a4`bU4&#Pr6gMU&T^M;{ zG7cqEp}WMW6Di|i_Hd2TdxSIWgnt?K`4pJMXqxQ^ve^42ncq`on@KYICbwO-RzN)* zS->F0Iiz$CD)#CY`pPjGa_|IaWbFKaY4gT;z%kJ$gMU!8_!-_>@dW`c6MdhNgT*Sn zZxf4q<=fKN4lh`vPT5f51<$AbEVlPZyawV6-s^QzXY+C63%*5s!9vyo<^=)13j0Eu{n(?>ehkCbJPP5-TCZ6IoGI03(dhI*j-3l|iuK+im~o z_HwT>%ri$3NOzj(88Ej3-ln)bI{Bz0y`~ z$wQQ5#eDqZ_r!c;O!gTMJtc*=Czhz;U|h~tgH1hIRsH!1oh+7#Dpq7JQ6j}8aw=IQ zC{;%F>xr!l(DOh_4Uh_Nb+MWy?=Yw%op+xK4~32c?t*`EoFLQf zs=WA^HMC!%$tw;^g@OI>H5CRnHA0#Cbo66RwrY+Lw4SX3RCKMp=^4DYW*X}mx%cvj`y)C{Ul7jm5HdktxcPD5B>AV4Ux>8WtD4~v zkk=hXxLPJfrwYYi&Lq_`mgXt)7pv2unHqZGtbfRu`O${x#h+0qhL#-B0F%PoMq|<6 zgmAKy2=Oa!;(O|wdK>{Bx${xC%D>TG)L@7H1t;R{K&7R-b z*+N0KMFKKf*aVPfCtOSW}^SC{q18nfuuNLf}WT{v&bl>4zrC49R@R7HabBeLFzY4}u zAwii!V*}35{biq41>ki2rJsiC6QH<=kZOQ!H~aWa^Q3+-7DER?it(z9U`}e;=#*Sy zZ2pwm%%k~awfIBOo)~Ht5Hp0Z*jUrv$$oQZfOMWODpqZwS2!bUlFa1ZoFt;3l1Xyi zUs98VqHMcTyHsCvy;^zWk0L_wlKCzUs<)XaVy)|n{PZ^Isb1(4SmZ_vl(<{|tE3b|(WO<3DLXfU{3BjuP z`?RmZjdo*;(v3AH&{UyQvdVX!9`9t#M`j9cr>tBMzT($mE2Qj7v~X~GQwMr^xzl>d zEGWL%x(6RQ7(iIn@_ZR_Zc0v&8@>1ml7MQz;$j9#5_CxXwbML3?);K{wbN4Ef;tV1 z6)mT_M7AsrByQtJ6tdms!CLPs_KM`Mhxg3=etp7Fl_7IJdSc#IPpq;n;N0hl&1ere zw*;JTdtyTa&Rr7lkKOWeLaU(zq6ueV29QG(SN0vSXE)`kidatXfb40mDIzRhs9l99 zx*FEL)mPRue-T@?IsVvvgpB(laZNY=eFwm0*5N7EX1p|8(1J%&XV41?Xhfh@Nim_6 z=-o~X749qYMc(3+(J!?c7k!%;n>r+Kd~Dzl>h_m*_{-X=mUARmXkB7c_Zr11%}Z7B zACi;#RWC}pjK41MA0+dxL~(3K8N}m^K@S0GL!zP!sHZ4UH!SnSt^~f<0^c>B*xkT) zSHQW|6LSWfOi+Pu<9~v00q{k~n})AHR$b&TZ5Pq$0f8@8sfh{Qdx{I7Qc83fGj0Iy z*h3{Bb64QGPogs%JXhdJjG1cSxej>l4W0%p&jpsFFxv!{?MU-gzxQCq*^+o)vD=;b z;_j7FqYjQx^`#}(2Msq5Z0=7nE4j~zO z;aAP(%MysiOC+#^GBp~vz?KNb;*c-9XXdp_{|H)Fv|5_D_;8rts{Ueq%7Zc_(6~CB zj@61?i|l5QoW9a_7=1Qp=NHQwXXdINeIgOv?nk}f-+~Exk9t!u=`5n%LAA=oIZ6MVacVnW!^dq0& z#~psV%~RK(R8t*JNt%^7(;fbpq;H2CKRYqJpyK=CzY+>)*!pVX zW=Ms`FE^*P+{pXZR`gtHbA}5YrsJoW%ILeVwA$UK+DZGZcDHwH_Z4Ql+l+t1l|mal zV1q|YY}>@dR`&K(q^2`Cgb2|EPv7*(v}T#+$+X5fH1XAb6mLo(+cudJ$m!lFHfVEM zLxq_yHsG=7`dpE%={~Icb_pF}3M7)-_-c;YLCB>4roJxi^?m!?wsvhr-F96?lI7SB3cDR=p|K^C^_heYkIw4wIgxW4@(=`oazl=`g5U!e`8g)p z1I5)xU$kBhzt~P>d{$ZHT&?!6jA7H*;ZFD8om4)5DJ{+l-oTFUX2fAELK^5V-?JqA zXYK!z*!}k`X?)cteqF)0`OVd8heKfkxHG*j@pQFXIBkdfHNlSX6&Hs77(b8OjPWF; zRx_7(ESf4X?}eS^1LDc%&J1#pGcnE9hV~@}sn2Qo0b`OrrZwP5Wes?#mGV=%hAAE^ zb!hNQJrh5)<-^H04_xhY9`&)Eocx5Icf_46{H8^zuvNrQ=IE%?Udrd{44qG#iQ@W= z`*q>nu($m%(N9}(2C$yv41ay0JNykndp~3-!(ZpKqDwGPbUj7X9T5GBZ2J41(8r7X z(Xn~qBZO3aSjzc()=NDxiHtvvUR-LZ)wxlHx+6!iEai8mR=a?gb*Cs^qk@8bSbB(H ztIBF}_K1H5cPzu@$A5!`V#>|^SHZ5ilc;>xBqmxpx?eeHax@x_Q)Ve&_Dwr_cw^{ZnC06DKI+ z^#lee9`u6*VP0D`M;-bCDqaVz7(3J(b(d&GV|!~w6VKFo`+94=-Oh@-d|)=nAH8yD z{4{BlGdF&cY7>0%DQjd2CFJ)9z|%PERuRE?eG#w4tZTDTWWVacD|lyY1dO9l43%tc zBSs#84L=W1%lO28|0wShds8zuML(@YIaAk;|2cd~KhC*&rjwydPNP3oUrEto!^RP2 z*|4^ui8#cXXAANn*$^F$~4(5w5p_dzA)}4`|MHw)?feUAl*FVsA^> z5h*FS!txxQRG`(Ot^fuXH;+T}K;|eRp-iXcw$wVL7q|Xitu}2e!ea4XDiVbF>v)Ws z_3U(l)zC;{y>K+@;KZr&EUw;$Q6EEz%Fun#Ky7|E?3uNje`o3ZXj8KI zw|A<=FY(Jv`J=Nv2aFGzSd8aP?{owEF46m@>H4zcrKdl}H_^@s?Ey!>6Q7YmvX%Zr z&bYd=NCf)91zi*%o%sL7pATXf?ET<571| z@=4;lz1mW|b?VE2TO zB;WOx9htW~{wewut#%K;N*ANjcAz34?PCq`TV(@GnL81G&}8&P{l6T<3@@z59AqDT zVDHdS)`+obMLvD3SSRvM{O>Vnt?^PcIJO<5X?B-3X_1h6F$)ix&`PkhB@lfNHlv@f zblsd~gs9KS^J>qot#;~ z%6F+xTDpw~=<=xC2_r`31-E#!1Mn}OCjJ~=xB-~G$Vx}I>4T|RB4t3_Jj^a*Nv=i8 zD48Y9iBah#+{VA+2P@4v+MWErv0=Y9x4|(-n~P8LipH)lJ1UeSGX&Tdu7o*i;Gi+8 z$ACc}H^$4pYGg12?bmN!guHL}XQG~S@z-OuyK*l3dc1bmk1i{c%hbzCU)J%k2 zBz_D*ss~X)eZyA?gfQKcMVpOFcv+Fxk@zX^p$e(@{jK*8^L}W?`yBIq zMr~D(V0|r$5qzaIL|$pYZ3L6}5fB^zMqQ@pvjC@u0-^~e0a!PnoHDFI3YHSip)ZKb z%|-04uT3DyrMj_X3QMJ#s_Fx=%sPKszpojDzU?wT{vrF0SF~1hKqyRP4Rl`hG1_F5 zQBZkad;CNBlAcG^tQWIdnR;ptF@Z3ZTa*mw1BaXJmap^(Q4Fq72BIAO={%M=i$LYr zufvjTf&$6JU}6zeMl65@+wbFBdj9QT#zfZ>@~B6kY-{zv$@(Rl4>RD%pGgI}UXUBm z?{;D)I$^{G1(1Z``-vBQdXC1V?iYyeuj2gWE3DiIxC_r@$I~p$?k;wt*vQT;Bv$3OykEL z`DlRn+Blt&y<+-T2Xo9G32mAVlV` z_2hq$DB@MFJAZ#dzH!1i&i``gNa%me&1JVGK$nRC3dSS1w z$UkZQhQ&$+)Ik+Wvzw03^95Cd;f8TP3yI0Bw8N}mFDd7;DZPf=O0b-EBadZ-X=}dK z3*FLe-Sr3;ld;%7Q!y49=PA+%h=gJtQh{yOEU`F(PAU^~eYZ>*%1yl^9<-_&`&RW_c9i6}gjzN6LMXxN&J zVt2Tut)kBJORlLDx7WEZLFM8KC} zmm-@;$I}X0JCS?50&VP3R%QSw1)rV21U`2@+Z{gOGJ6XdRvZd1Mf+?6>V&#!M@`*D zVs3ZD?5z;+(&Zv150DV^%I7S>!Yb%!! zSGMuY%nZvJ)-NxlkDyRJcMGz?lV@7b7#3Qh`m)io-6&b4QmPn6?U~jyUID9KSjl#; zk(egrvx`2*)|ZvTPEybJ+Rw;$L$w9loa5Thq{idECm4@izwI_23{-nN-lll4O(_Q-u3*eLeo%PoK4!)tmGh#VC*{o2KYAHX@3IBW>M=UJf<@ajcj}!fe+Ftl z39j}>_sT{JtnV`Beekr3SWXXAXhqV_FX?cPj)Z2xLvy*?rJp=0LFx%y9V8Dpg55LH;KG6KGvs4pmbAJvEAe720z*cNH)v# z2KrsKfIbH+t=?fsSGH#UJ*BPD9$x1)dGWz8*T=E!!P-iz-G+Witb3ln5C1Va$pgja z`+oon-sFR7*GqDv7cPgZV8MNr%c?0f)wos7L3AkCZ%;gUd@N&ME%7Ok`4Dbbbj9XbeRHM? z(Gn2+m;BM-$H*@H(ac}}Xa2~zrxSm4=A&x3s<@c^(aNj;8~*4SN>Qqn&iqj~eok?6 zVwM*pf^|cXJ@ie$%vC{c~C#ElFNg!Xz+cSIPvf!Z3laNuN=WnQl8YM);KtKg~k?$O>J8G7@{1v20$9 z#h-|oM=y$4Zp2E@)UqpkrNT{rXSq3w@P)&ikyFP+O4$oq?H_9Nzseq18^6s@v=2#E z>)f_3QQG)WVa~%O(F+HYQavBl<+(VnE`?iT z*6ZHtd&5Jn7T(a=5YxG$l;?NUGl(>-r)ueO;1g{TD>On35#v>@8w_EQkUUlThCP`UjTahF5PoN5MS#7`jSaKbYv~ zG{gqTSTId^E<{zv<8#rz!&!JrkYHqXHhG~G0|BulYq+-DeM zL>Oy879;wg`jGfB@ovQcAb2Cg@>M-^OqM$UXByXhPK-r6#gL^;2fg@jBqHsvxYRUw zHO~eVKwiBM0?nEt<8{)T=NyI5jN5HcC!#2kN0qwvzv<cDEji?YI@5Y^8<%q_7Zy|Kx( zb#h*HPXU`&a~tV>k*}OpgY0n}pg@O7pW#yt)@p}JnUO1?2an1O7K_pS?)qxu2mM92 zZQzK{K7mRR44Gez`}m}`Bea?~74BIR)*>Qu>Xod0Y|-sAUhxSewA%F~v>S1XIevQK zI7ZuO_}WZ?MJv_s1A5ajl9N2kd6O7u=Q_OR6}VhPbiJ^IOAWE1JS`~AY|4{3f9WiiT9cM>0&VI8%u5m-ANdR}H5`EHS#K1p zDua1uOA>vpjsLnE@)Ed;6DDr5m~{E0s2LO?Olzf%k80CxR2xCtx}n;*??JVnv6~61 zVMegSC>yBmGZ1an{~w5U2ATvA&2);m1q>U!kfCBuOyGiZZx=i>1c%t{{(%k2Q*3k9 z8$e8B7rP@ep3Em1VPncA>QI83-^epYjS|+6b(wpV-6N;xX%Ug@2}UzltCgKwaodbe zFG7wu*{bM#rcb)%Y<1=W=16FVoD_ z)Mc48)f!$bh!CV^VeECOk1CHtuw=$7f_0AF`_nCgwa<70Ww^p31uu1Y$CMNzdLVfI z&^gv5v^X9|Um;-~j?hH46$i}s4;6I|Y1Oc(32P3^$7kEa@@a{J?IfF|Tni7$9=18V z6P~5B4%tl`0&Us(M+LfdT)NQ~WAB$zlnup#G!$*%DbZZ%7-4PFEISlFc29}7*-cYq z=iZnDzB1$4Fn*v!m{X--(_MR|atT|+;QfSqXx7(%k_$%!j3%dX3l<_-*`J96v?!HeCCk2#3#s?|)A9Fb!Mi$+Np zpDVe|H-&fZdWNpVHNRu#o$)Y*v0khK%aI?LW^UGs-U5&MIE;mqP#Emb@3|a+N>H#+ zKb3K2VxqbZjM@!u%;&aH@sI@~K3*M}3QsXW0% zuDYI!@WZ|Yb*;cHN_!>Xn1hEnA{q>Iz^GummK~fn_F%rOh#tloDLg-yortMt!!aK+ zd^8!DPxd9(1p9!2NeI|?X+PbKoZC^u$?}{oB!=_sIlubp)8K@I+y^uVXoE_j9?#7eT*}7Zw7vz z4}OkRMiGSrxpc?R@t-r)uQ1d|gQf|atYqn_2U_(Zqsy74B)Rp&aDn9|W z@46x+nG8;S@#ibmK)f(8EY~RUNAne5vkcgHV^>qeIB^B2J`tW^8kAgkf^kLe70yJq z$UA%)rnrUk@oz#0GmdSm*6JCuc{(n1C0bVwS0}kzkFi>O50E78;B*45W(XBXlz3Ah z>Ccd?lp*OsGmKlX(Y0v#FQgrqtdEW#Q&b(F1XJJemm+B(M{}?i4CfPZUOT`Nt>zv{ z7g)N-F<2VZfZFakrA@jAX6GJ4{N00) z<}Tqn$h&ejx#T}@hBmo}JLfdJ%VBG-WM&I9Q*#94GL1unL9F)9L%@S5n+b z_Mp2IKY&s`2cpNM+I6Imvw|>5LV`q9jGSpzA+4>G&rg>xUC3F<<|qt<9yC6s=)s@3 zl-F>?t*3>!n$5P{VQipUYiNYo^)?GfDaRJ(#W!$cmn7qPD@CZYGK}TvOwH*`P2=($ zap9a)FFC=OJUc~84HS8YKQ`GQmwD8uBAwcWvolrr4@oF>8^i6wLwAZ~G4bnUk_^Nb znQf<+`CcdK83u=ur%DaEM4Rz7{sQa7>D(Ph?n@3aTsb0 zzH;)M6VorCTs*9xg_2c|PsgcdADP%DzGj@o5v@ zouc<)rfp=Wrh0Th??22}wndBdWs>;y8=UT?{V#Km=#NCcEBLQKX*}TEk;wKr8`bLI zO`6qK{V_gR>ZLpaIYlm%$tI?DjauXj=J{m3Prk2gvle-e2hY;}y|6SZ3clyh4h*Gp z!xJk20D&(T3J@fg;$O?jAH!ZAC1x-oIuHW(1Xjj(SrCagbm?@xdX}T>rct68#!YME zet1CtadL`2u-_DY)ETPld>BgiH&hRkh#MPx5=@qE4qA79|z_}3ds<#`}a)`>0h5-6(jl(b;*|uZl#aI zZ-%*YMQf1twM$CK&L|fRF%MG69E8AY(XI%Jxmt*xJigGPS z;>CTIn0EUEPGh2;b3X1$9P3WUJxlx1x3_E7FK}VIotP8dfGH1e=87dx_|WcoBj8gj z#gd2R3u~SI%9iIMQh2kmSG5~uQ;#mD^p(M^d$ z9*Q`lAS<$O@|^s};N@1y^qb&+mVl@-`fd4%@Z$0%f29T#8o9- z$RPskHM|Cy`mrp;KXM7;F37@)E5Fsv$q{{&txWu4((pdJu?-_GnC(y8kt3c^L7)`r z^^WrRuK>?$Jq7xawXJ;0*B)YbOqOjdrVoCsg*`lZqW|(c4Q)vo_W>wEji?IUOD|^~ z+gh_(@U%H`oA@Y2J{~|1uW<@yh7a$aCj{!6EQOCBfsdQZ!^hgIE|w(O*a*UZeT;S4 z$0sU)2rh5N@~k4dIYD6SX0m;p>&f3z5&a->0?*kz7gX?FzfKz3Q(Gbex#AK8d$8?` z^54TP_CAJcW|Vu+QW=6Rb~A5;*WA;&k(YI8q?%7e-?kbV+0&zOPev2n`5UB(Crc9> z_vA9mq8k#pM>Je`q%Tm zJHHhJj1rD=*%Zjf@qlxeiB#^(Zw!>RRL>f_G{>2&rkFhp=7s{*EBx#{LJO;NIxx<83bH8+<9O83W(Ho*^gR46e_cBq!9}R#G zeMZeyvRWvbQ_j;>%JB1}G1g)+nhe)r_xW#T-@i@N7Q4?ap8SM+@exzE^CETmh>V^% zgJ0(2zcB{=))P%6dhyI${5Ny)GmuoJD&0=%T{L{T}E~1tP_>YDA*6KoE*@obSo~5V8&jK6}q{Ynh zqgA~UpDIVc_+p?mtN{cxF)|+H+5B?5eWz&JOr98;C>CV4QtTS+2jI?jVf2GiY>KHA zs~jd=qhfh%gV0&a5vML-!+8`pINKyjxbMe3$G0Uolwt>d3Vzde^dgmFy`ig8s4tF% zl&a6PJrllyDWAB2Pj5b+!V+Q|f56}-#_{^ybPiBK@mo|`%9mMo+btV4IS2SA`<;|5 z!8~>t8;3{__$KFvS#>k#9f_Bf-zNO!PtXa9*N!?LI!QCsMwlHSs?nIb2UtZ87tQOz z+TAE4fsuyT;E0j|gV|x5K`2B%Op9UT6F>G~ehvZU~kh6K(bA zm8&Ulw>z??r$_ff^gCdE#%;i@uBiGf996^+s{;F&fDcnt`&j(ZJIbc zbTQ0~oPY(boZnl>8Nxwp^?8spN5jIif!B9pXQPZ0kfi4#1ZXEv2tp||5x5kDcKVWU z`=h=6(QA=0!~@gzJnyEr#-L>6*u3iViMUZQJjWUOf$A@BRe+j9#!sMjVK%SNTG@{R)K(a2?|bvVkPC{oxa$`EETyqt)qHY-(-D90%hN?!TqYRLy~IX*rok* z!)t+S{(PXO3h^D>GnZ6b7}lym348)1VJ|AmogM07r4buKXJb`=o}=B0-lVxRR$*o^vWbBDr6;R z2coT^IL0GHyDyUJotuJJaK2gf5XwDq^`eX7zoQ^8zI0$3=v^e^$h99ANBk}(j1u7! zlO(Xy{elq}A&68LQuv9^)erQ-buqzITkDG)MlB1148)4cLJ*8ph?d%zxB`^)6RJ)u zfA=F-DwZstqP>DASkgoZ%*sL^mm|%fRevKaxJj2qJlt&LpKlVe!g}?=55*FN)Ec3Z zAEmZS%{iegB8k#g1sdV|2MIhI-Z(tc8Ol>=lt*imY?=`3r>wpDq}Y^x$;QQpzMTwX@iaZQ^8_^j~E^_PTtKGV{HhgHWaF`C_SgXI@tiEG62~#!dRL;d)LwIKBH?GRF zSW4WBKgFE`22?5J{m~=AA#iST^l5`vpW47MxHkQi@ze`Hkc(E)VjN-%)avR@sCR4? z_XBzHN*-zQSgoe7G&IsN&OA|zJD*m&MA{VHhvick(qNS^fGjnc`^nU_Y8gCiil0y1u{KQHjVyS5Ce)MsY-A%3LEWXCqNCzVwGlFCIy;iIFUvk*R z$nYJEQ4Cs9hjDhgPr8(3B9P!x{62X$X_{p)vG1@@HfPAYbk;trI8&qAd9(F-N~e-X zxR_Q2@f;e3jkvP4y7&VH10_jH!#|k)5gGaQ`Nj8rNkz)6AH&YND_!6 z{s3-PvdiN*%gsUDy;Z*AvWGFkReY!Mz)u8tp&_bhiQYVGje5c9WE7o8e}t1Jtighnv;Zpf-y(4qRz2CF2%T2*2Vrkj*S9Hrt%kzx5MzcfNFjE8 zoQ28syP5m>egemGUZZa!@k4%mW zp3d*pp^NR56G?fOq?9?4Al8dHRW9cBmGT;O7UwHaKmu{ML!!o7rcJ$-N0!-st@dug z5Wp(=1+<}AEU8+}b~;W;CrL?+u*2B8(FCbmrJr7cH*34%y8oh5iobTVnPNa17Fx|R zvz#-TGw~|!RpIxUFaII5N)>*ORrn_|L}oL!nrUXit;W!SX2GI@lV--RqlRv)EK6t^ z8$m(Tuk(oMI4`eyBFxa`oGcHo$_lx|_^1!q0KagD4XbHL(P_v{puc+_w3?J=6XPHL zGfh-v*Wocqqe$!;zNl#sD$F3S*5BO z&8zSccj$6Evk=!Yl37iiFW)hNJ)C6ZATvg7i>X`as|dMPHm&A5vq8I}cD*l=H7@Sb zcFEGL^ykO;Y_(x0%?Tf=)M|y)rwTm4136xl0tE(fIqcLf3y!()r>UyE>9T&NaK_vN zTq-447ED^?exAakdiVi@yjP64&C3h%`SpIG^U$7RK4;SU&Wqm5kZUUcH5bd2Zo}KD zp2(3*HoI^`UR+}I+AWse$89=bJf6<;FQJAE%I~%-5VN+|ZcqgBurp*EFlaSLgs|#` z&!tM3N(nLuze!Urjv+Er{l&&x<3du!)zUx>+n7QY$Zt#M3d)F2lXBH^dXzmoDR;cp ztiSf6gpia=3Fp6umgg4xVHXcGc*yKxUaFv%D9Ebqu*_Yu-@H53fKTO>WiYpx(Y42^ zdOn&df9USi_$Ve>#^<|sSw0~BH>x3K1(gNvWAfVdOGj4L(h-o(VO(r=WT9EP7^J^> z0)2U2azy9B(aTB9Tfdv-RXUN3|D=eyl++mA+I_mesw} z_?Fp*Z&Kj@D_I4Yhgc!QN3IHg)1KEtmD&36t_1 z*A&I86deh=OW1lKYHrnMQ7l!lRX<)_si#GSxFygE^) zxV4(c7;^5$YPE=WOcX%D7(L#KGPx0U&an8a>%S7L6O(GK<|HYOLnc`Nwu^6K^vXQr zAZY3Q@hu+ZZp=9&0RV3?Fia zPL8%->e%jZFl=8XM?3PqN@|gFx-|TzMYKjut)DfediRagom%YJ4&u2hSl&n>%k*@{ z*GQO&Q8lSV!_tW!m(qdwdtd~879tywSA@aJAhJSB0qnR`317Ws&fja&b(qH`lgh^g zk(0K%wesXt_Ik2ggC~nh3fMP6%7iR9qzTI2J9u@<{_`9aFvT>|jC5SB)r=)oq+_a9 zldo>3X*Gj0F|k?5paiS#QmTs@BG?fPNLg`@_?3*s6 zPtqA*txI)aYPwE^eSK1iHl!1wr&M5;O;UQBSk$%XBSKYF(T}BbvBTSG1b>-IbXPi& zk|!9!2REihurZyFBawtk>V-F?@?K0{0rHcis@bX4Hj*F(k(bTXPY5Qe=D0{5f0VZw zw#74$^4_{%E%$%n(oM?iWO2_)z?l~Jx|wgD1=08nM!8ouw@r0dT7Rh;% zo*{A=y;ORwcAgL{@_2!+OpZC}8nl{+PzR7}oa6!p9r33@u9SKy<;`xHbIwE+lrrcv z;&EvzJMagD(Ow7|1`M@J!#h>C` zY5-qR2@1#DXZ0MERwk!nzZoCCMmRV-aZs#Bzq?nB<6bV^#?iAI9szd z!O3)fl37!4XcY=|vl`2K)b*dl&Gi%B%4=6B0-; zxDyPB6eZYL8LwhVFvc-j3Na^1;tNI)z2%L0dL@hNs!GjmbTLNw6&$Jwzjn` z)lWba$OKFRcu4>?fJy+B83rMMk`R!b-+JFYlLT$Q|LJ+2^Bgp@_kQo!^{%zvby>w^ zp&uJx#1Q%-m#KUF>xg2AYh1_bnZdIppXAFS%4c2Xv*vM;Sk6_!gh6x% zm^-0J`X#gf%2~897T$eI3ta@0S2`52EzEN>@+4D(Fr8BhPDw)_e3g;VBG#(H=!{iZ zH^YK2b=*N6?9P8Hh25Ew!iI|{(zPWX5h$Os zCzBYqP8Nt(JQIR*J6u|QWb`3MO=ED9?PszMH<3x#q8T-*46=z=> z4B%TI+LE#Gwj5hbyhl5La<(k}a(1y*m;8XDmjYZ;cbyiS6g=|3)Wfq+yY;-YFugf? z2$4q~7Kjm;>=nJ#&9v^d6iARgcZoDg$%TJcK+u)$$m7HP&bEpvB-}CE?!F|A1uj@U;>?#4x!x(t)AJL{0k!}CiU&hV~!>JvO^7r+)#*K;oUvZEQGM)j8M4!I;~6` zZl6q-Rbzh&UqCG(qgs-r8Y<`L_0nH;j@EHT$>s**6i7-Rr;{!5&u$q6W&dHoUUKoJ z`cRWR>hSA^`G&e>nnR{rB$F&07M!|wOH3nkPe#)8RI_AX7f1$0x?P&8B{;GRw{|3l zbx-{hffs^S#2x9>sWVDn^T{N>0Ibm)3BMcX-a;Nty$8mm7Nsb-Iy`}EQe_vYk&zp& zKXXsRQu&*dBg8u(yEge-JDpLbZ`Jx;Q;`~*M@gU9LqdDa390wrtjyC+Mm@iwM_n0# zJ{UsN2qIT&wIj_?l_0@fQp2a4TOV*`g?Tw%2mT_w&UaAJ+z^^qnjudFQ0<9NLvkz&_x3vLy$&ML>}yHx1YG_%@I{N* ziGWi_e0_lc%uwvNq2uSwITv$;+EIfW2xdkQu#NW16&y8^m9rin6{n5u-L?!e3=i?< zg_i{7k;l_W*;gQcymY-aBg?3&&Sg~!m3(GjforFH(MKKbMMF(2(P66>1yUpyM8=1^ z{1qpXQ$6@y5A7Clw&R$k3tW;G@wsH8vBGzW774|OQ|@6U!ZuVT>J{GCC$(uWbfEMM0nl_*EfP4RD8=<5;v+A(4dKnreETq04|}WeHhbZZoHkF z62kuUSAT|O5`qz&xP%mocy%qh%p3mF5gg3v{WezO!pBD#RY$6Yhfj6Huw}Go$ zBpMJoMtb*>Q9BU@9D$)=ul0eq?E_JibvFCBK@PVUAiE_Dh7VXDcry{ln>ZOiD_n;_ z5z>i;)QFs4$U;dx3$R-2E!h^t=vRm7tQU0gdLMFNcOnVg+ZB4^dx+cKp6EpuDG6JL z-jdG)TURsM8D`s_MTOrrLRZi{EINm48^axajqodcT3bY08@Y|9gi{*tJmkYNts{=` zB&H|9M(Pt@8s{rHWK{o&1m5V7-af3gQ}NlMD;Sj*2{f&b$mq2&tsF}lD(zAoEX72x zcbHd*FYz{`dcU*=yTXyl`5bnkjA2Lc_DC3WaJNwnZYxUs|op2ZzramK0!@G3>J-Ji}Vh+7aLV48NG1( zCBbjY3Ppc|Y13DCc124$A>*qisfwzWa26#*;|OSW2?7@oCnED+wF2;tw6lAWSXpdD zk`(K-E=Tf*Vy8;WLS4_Q*AlOn8!N6?!^1ZMuSyW=yClzI(648NwIEb?fmbC>`VErU zqEJnUG$k?Y>{6mo?%Yk`j^e-oq`kb(jebYW2ZhmrETH)3P%PYKbWvb)_!V9d;ye$* z;N`p~uAte{?ErGk^BgS8sdNqNu$X|o6)~cZ{dlf(wjg`{%^r{&2f4-QaP)xO1^+A- zz&-BH9)KI8=UJi+kaxZx%bz02at1>#w5QjxO=(N+tN3N&5z@$L+h%vKxlYgO>jZP` z2vv$((w=E9wA1{8V1e`j=@u(LK##EDpS<7h(Bpi&7Tw@5R@8zCSobiyLVt;P?*uHd zw~QOR%UJMt85RN<&K5C#>CUYQb+j7uFO#)kthgb|7Vsq!0m<6jO;%%KsBCX5Zd7N= z7&_nZI_eUf*%^y^jinjmX_i0wXr|vf;CG&!&Bh#iRn6Qp61S7ssJ?|?zoSj|thSiI zTV`O466L&)6*e|#RNu){g0)F>dXtGk+>59nAue5&RB;UJp1+{!<&{_b03P*#m)R15 zhxsa#uXi8h>khsqPv9#iUsL(=ftU~Yn|w{=YodHTCtoEJC;9#;Un3-+e7$i$U*}4L zwnCLA0xYS}72}Brk<6(6v5cHPrkTI^kNu>Pi++)FZjfD7(qq$plT7jZNF-R$Pinn`R>TOvKJT_MtpV$&2QiV0{;D0x_sTHK2~>}C(L>Bz&1)S}3y zf8?@`xT0ls;db#E3JCna;OcjPH7VwIbs8dMD3S zUjn;ENSsl11>xa#PSNl1GHT;kj?9?Xx!H8QjW>bZ3O6!R%40x?egm<@eCnC*==Ev2 z$*8L_e4M_HuLU_Xo;o1IgVdxew?;$}OEw3tPHtAHhRzywt#gxw4%1T7i!NEXWmmYS zZ|L~<-NtzO)Si!0k}76T7IK^v<3T8`WOHz>ND#S>)c|IziT7Dpt&0~~vC6~3(5{RL zM;pcnEbUo$S8WO0X?cMElIDWIH0_@pE1aEPoHUS)dWOwH@Xi0RoQ&~u02-^R>KxjY zn6Dc3QCFkHWdzOoNlmOJ$INyxQet{f-^DAqgB#%Z)~lrmN{fqZw^0>12KC>^wy+uT zWPv2!-JRTrT+RLm>W+%4R&1*MN&s(r{H83y43|4BPgb%nRNFWTc+$5J*}~L_8VMd{SwREc{SIOHcQNl=waKtZ%O@dowrxPug_Li#OHX^^uc4I`C&JstCOw;0vi zSfU>}Dfjhm<)Rk})}Oqe;0tJd5?TA~{~}CMk<5NVpUYV+>JP?vJDM>$(nT~ji0DuMHfSZi@BL(b43cwEVKB8{C6b!E( zO*qga(-WP>#@ma)^7_6A+bMx%w%&TR^&C1;nZp%*XkGZzUEw-}ny0BWY%K7l6KpKO zd2867IqM$*u6rz&^0uw4$%jAWd#`t zctZLOOtQw9|1h6=X!vfKHAJgM@!mQMS1*8P!8qZI32sZ}*wUQVSzb?YU1=r^r5PvD zI0Rkuv|bw>;$bG3$|n4CWdc90j*jk+m+{P53-ntZUbAw=`v*|=(Node)-fs!N^}mi z#`lf!M^Okco|1+Ve^aMBTEVz|%DC0_jXvHOJ|O_>RJfA?*-V>3El=5-|Ra#_HN77<^+ zNr|t64u4lLGY!x|008$K2A7gL3)iEZ2Q5ghi&7RUb%HxIfLgK$_kP4FMQ=*iQVs9+CDq^^n1nbs>ce0wAA z;(QZl^1Lq^CBneN*)Z9uAl zu9aC+o?V7GJv2e!;>5jd0B@wQ*st0SrBJy+#-;lalDN$+r!q#8s%0E}ku}m~pQD`) zF6Rx@`&rp`d^YpB>UHw--pIRatx1IIb*X*rV16)w+F9>Xa=W8y))f;1e1_`vIghwt zhEl9Ce!pP*-tfDEc!?zML5v3t@LjP+>N2Y4O0kQOQRfcDYK~6&ZKz}Lto-Pt#!v@j z^=-sv?YC+fuPr{7aNBMpbPZvg$Hx3JUT`!q=ls=DF{g#kYJh$=LQYA6qF}hb7#sEX z%OT^48T0!~`sfb;kqw|bZAaj=81uiBtX7L41x9r%A8xDV^toyw7nw3%4w$?gf#(2%v*U}CS=z6BET*^!b&(wCGl);czrREH(o_Itk|5r$=)dP z%0za?T#JU5MY9CK$%tkFOKQF~YD>ARtrgugab9SK)l_EL%5!Qi{npmRICXLjxb?q; z$pkwBib(ARf!rl!Ow21{d}XpPqE^1h;a^OY8Cfd(A$~R~h(;Q5z?rH90vVjc@l!4p zF<7Tnt4pu7_{SI9f2FEb-I z7ID1-oAPk{i&7!|mg71gaBXsi&Ub`z?R@WPFe~{0Rn75%6TxfeHamjnz)Zc2f|JC! zRuxK1DD6*_MufP-Eua>JASaHI@E;Mr1VmA>+-X@Knv=S9(U82~bVd~{uygh0lodbN zAp>EGPvKl+1=jlqJa;$ok*rN{9AmtC?96tvi(93BBV^3cC>kl2Zk6BHA_eoJ1H}Ik!*IE3O+U(}&v9Rg9%39hcDo`U zBjr+pEFv1zDxR(SUrY`zr8wly?L9+^3Svd|5F9$B6YCXfh%@-+_##Hb?0nmHc>QY- zaA|P*>WS+#@nE-;#jBB{#690X?ZgWon5Kp&{C#K}F0z@xvf)_Go#YbX8B{H5jH*)t zyCbtqw997NN>(WApoxPG0u}Yx7_?TVnUR}WvyXvTPR1+92Y%-^#Se4TV&0$y!wpCm z<6z96+h z)|cXE$Zxne;Y-O^va8|;7&I8;#cNskL7L)=qMyBJ$W>T@80WLz4}9qBHMQAiO&;!p z_a6R|E9#%oDTqnL>@$)N>qbo;E@cMpC0GKIH%m%f|G2n9W&{j3+T=`&Sc`yEgK9^` z4983&wnKVob1FZZkMUTGDEt19fmn-BHXW!HlgD<=Qegnq;;YBNAoNGCQ3xg@IKK}E zOCp0#t0sM-hduPzV0aV@2z4)-j8<>sXve}bENOrjMar0mt0xH-erK z8|+X@8^}fr&tbEtYNKH-BgSLl{co@Gz>=Za^cZgV9&?7TPGz}4vFQc%en1?vWTY7n zicc?yW&`Y37p&u{n$>U==6}*F`d>&;vUE5YV->md>&$iYvXaFC&h=O@DGcsfpE03P z&nLSV9c%6WCV3l2T(U(N6{2nl1>R5k#~+p|cP3prmEbAp{HUXK)_Lj_<4d`A$(I)< zK~V~3xEVyIMzBydN|fTW&e6(k)4Jn8>xE@m(tyrv1AzO~P3%)^BR&?R*|qu|cXr8s zd~Q~sO~PipLd}W5laXrQ|Nqpp!2cloDxd`G*rM?#KySeP;8BTHrCnYFq!(c1_Z1ga zZ48Ridw4^U(oB8-4gp!&LqN}01M@QC=eMatvwM2X{4tZYb{=v4R~tXTv1TaK>0&+` zf2ZB-)1+mI>OCSm%?4f19)K!pfh?5mW4#~$)r?bG=TEK{ujNBswu}=P1$k$m$?Y_V z))n6dVicVkPoA6hFX3KzG5(QHkQNQQecS~}vC-=?jg@DE0`0HdlR;kiWt{54J6vdN z@1(g;{ee`zlHEqtFL@!|C|C69j3Q!IZe&pjwlF^=1&K|F%1=7s`?)GVm4`R>$zWIP z(|mvKK~sSmQh}4c?YF-0#y-nWmUyg#5>HJbVk&IISO{ZqQY61qzJv%_y%qgj>*%7G zRwW#K2@~9hMe-8UFAkUT`0K^vuUKA%LFC-Q;D|%Dr7gm9dG{?UaVGZIPOssp2G0aI_y?>16a@5Bg_xn7s0i6RfD*OE9))OhNf#9-tQv$)tH${Wj#wBRMb_$y6!>;hkD_c~#VpUN~AoFfI*xyNR%DR?d06UX3j>f&C^=v9z$#Dv&M8aCb@_~ zW#x2;pNnfgQ)_T;d-9LAtsNZ~|4uq$73FZe;w)JVx{Hpj*!hyF>#=~OP^dG8rVT#z z50 zU$+E()BgPu?6Lk*h#|9`g13NJ4RRX;Me$21OpBg~!qkoSqH+U>WKs3jONL#_LcObn zLgF+kqYgjXW^~AH+RB{kSe*k0xYifRf!d!}$u6VnBbEtJ^iozwrrSzX?iQen;gL50 zrUH2Hy;6f+p`1*~@GV}9mH2F_&x9c#%P5l1H0aG&u?;rlt=ydgys_Q+zTAXf>Ld|! z5OTuD;`#Q8ocz`j`|ZjQ@fH2u3-3SaS|e$d*&6(1SusjczQHyDGa=fE6MM+O%&E%v z&l&;C$!RJ7BN|?Mv6}_FRL*v~;HBr}!l}v`(;7|&?187?C2;)w(8kt zW&!2-?Ee+BmmCeu@kQYC)@5A=l~qT; z>??&TyOJX|&Hh)`N)E>}s1C4-vYaIc(2QoFPTcOrk@&Zz_sLoKB25nLo-_XHlvCQw z3(|QE!b}+iW!>XeIplqCGl2{>M2ba}u?eBOe$#LktT= zrZ(1j+8ps$NsTv?ulVywnXWG4q?&2-+8H((!}vushs-h`MRrsEeg4qgwhW}0<*<$5 zBWg>aP`{fw_B1sA!1nE87neHg;rXd+hGplxehg6M7Sn` zyI>vuN49d%mMVGaUy<8baTb)35&#h1@7yxY;%PGedhag^!61MMo1H$>dKEuJSe=OrFCr%SBoBlf$gsK&A0NaWJqV&W^H?7;)Z*%g+0$A4$c~!?AiBJ4gTHdw5H238J zdhJ@JI8r0N-9wAip+-8MQU7HY*-iP*JC?d^2Sqn}92Piv0=L6u*-y_+>e zQ5m)~R73khRn&zEb>WLRyiV2ve3JS(=$N~5bgqh#u7!nYx-m`2U@H^s3~YP6b+2%? zkFb-(qH0(AS=je$VzonzYz%2r#wjO|hKrNcLusCcz6?atT%4x_k!q_emP~noEOdo7 zw|Eu~A=Q)&ha}Au*M?%vX|wHhQ(EL%I9+0=WMoPbJg2sa0bfnSra;wcAH1XJJ5VC5Db^tJe6@Ju+QKl!M6ir>~ds zH_CcBg8@sNxTxoPNplT=AcG)%TiIZLS|}qcgbyBJFcB2Z?neRem|Np{qu5#+KB`L6 zl>E`DQ1S;y_9$Gf$8Pj?<$-3fj1>Lhw%#r`jd=~i_lxZx%_U@p7q4CNZ)k>hSd+O< zy?4Up9#-!~SXln$a|={B6v4JVoqb@VHEEeLhiON*KIygUyu&^c^Q_gKz`}aB)ma*9 z>jk_jHCA-GM2ret(7g|br5+yKlAVMh+D}vs?il+T1O|xW!OnfIe`Y4HH=|?wL&KEp zK=3kkXq0lEc;5F#Z*h2xm0Mg+q+M#?L}SVoI_yXeb^Q~op(>)X_ANWq<|p-X{S(q; z>2h!}v%XsF70N#HS z=5qi56LpY>*DyC|=xccQV0g@DcslrNp^QvS;E}VuzPgb@Gc(FX*Xc13NV2{rC2)~O z1kGtt@hWMYS83PZT6s}ANM`g|$)D&&&K|80Fho&z|C?6ew0nzLUjyr>Q%QZBhS}&h z)*bN~|2P6ipoS|WBP^PR++~Wn8)$jCBNLd#wFK!19fN*$F5u8+pZ zBdSvCiwaB?4=0R!twelesg$@r@j2h=F{S_aaQO5bN@<8qt>`wh9@QKrgbiwUM%UTZ z8R}(M(1zT^S=1xP=-|u^oHX$OuZCzB+kHZ#p*_V_(TAO|=I$iAA&Q-+v{A zEK_}?Mbs4etmkF4eAXH@TGq2N#H?&njong-i)WuBU;>Mldba2 zwIt_XK6wkpT<%^4O18+!z^(rOTTt>I(s?#00gSwqnVh7-h*@&vD`3QoRtOl`>2mIL zRj$`ywZ;o_zdr1UH5jW zTUkMhPHkjcuXDXxpjv-C9vx2=;kh{Bz6!ih>YoW-*otkQNy+iLku)tnrK@Rb>#4Dl zd(lxlRX>vtgK07k-HVS8yNR+R1V^S$115N8nhMCIc09(a<5!K9b$%Sis2UHd3Y}I} z@+<-$=oTnlQ#Y~}%5Bz+Y0_jS>~1Qb6hAmXZwpztdRug1mio-r{1SV8kEF2F`gU8J zPd_b9akR=mylfA9ug4PaIxUelwogl+;eH$W4O!v#2CxrH?9`riSjtH$q(ryF@|b;C zevV&&oQGtEk6vjyPIZ3D0>2is;JIQbaC<2SuJ=_s$G=i$*n=ai+w6m~!#*fOEbt+$ z??K&;Ny6+?GV>)^0nACg2cRm0KVv4#d+OZ_r`{`z`!2P%C&;+KwTvBq#jl{u3KsZw!dC{pkL^q4< z*?@hFo?MZVDlVzG?b1t_!G*Qx$xy^Y@?l*beS7|TwS`o%vV|0qKI)hnNhK7?272hU z-nC4X{^({`Ya?O(X3SKe`x73khfz-amJbDVle1Y+9@^ILOO<56=RB%*`VCJLVV|n7 zb3fui2$b+fU=Jc!zlr&cYj@CkkFl->1E-yeY;rr-yA0os^7>4fG|ZD)SLc`4mkn}o zwB9^8c}}WV1GY?(UQJE+%Cyv6AXxPa+CrmhIJcI`t5yAi3Rx=i5ubnrfE-`40lV!} zj;7adQ~f)ahOQneNgw|}`j~5QnAVjtl4DJecn7M|{(Z-6Wr*p|hpD-Z6b- zLiCrz9n*t-<#T!>i%-ZOhRFD7jay`Q&!%qJ1#)@ue*AkS^3j1%g+y@ylz~&?28Y{N zgG^295Zu~ldZVSM>foZ&dF}%>nIleMny$qOjIlzzz)U@^gY!A(j8s^M4%1Fx>~tq| zn05kVhn>`62!?g#{ZgF3Nc_U7)ZIC^ysX}x{rU7@S)Duk7+zqeo+`)A2>_OBq=JO> zNP7D~LYXsctH~fB0Bm(kzc3+3hrG>79H)2k7DyR)5*pNr1{K|*M#oswpgrW6;vvU#P=*FBxR4C71VfX(!moxVk2@v* zAsx)n?3STXVXZohq3H@ctiu?ZuCOCIjG^fYJ8BP2=EA9;*Ll7W_c;Cbi+h}Y2V`JA zr^)5k4Kg+dOl#mveUk;!XH>pja=2!^gvR$mSKh+w`$24#iuF_bd{90+^!j2LmODa^ z=41rN;)fa0gN#t(2wx(q65Cm?7LPW0Ez4CuF!!hv=5=3lLjrsaF1OF zbLbGeo=&+3@`$nk=kkCr7$)J=Xzpv=x-Tv5v!ScVtt8T{ljL91yWuPMtu{~0dK-SR zv^+4xy>NC;-Gp3NlX6AYlVdCL7?Jw{jprR3-#>&-N^WqL*Ftck9^nDRT3dUuBd=7g z8}MBo3X^FPw6?D0?xKjSOWUhO$NZ zc@Yc>5h3xTMrl_v5i-j0(f=(K8P%V0q|>f@sYQ}$5u5lxJN6wF%N?V2T$(2tUYDSh z8|>(S%gCrR(IJ;rm-sdD-RI*52>#)UcZIxePUuk<4aeAW2Wv>FE*~pp0Sz=Gtjtnb zKqt}#$^uG-euAu{o^7gODKCVntc^%_t4m&c-2YS_h%=rkjE4G*8*3P#k^B|$m(QP^ zg@WF-@Yl$n#4qQMd8}MUW;FPWaK3=XaJ$n8{})q-UgHALoN8iGEi_q4{z*KUM!(5z z{I6j@daa|QI=xogbxew=1Se4cuVSyssmCUH`rXKPmC1)0aYwCZ?bR@DZ(Qk z!gZep{}M5!A>RTYDMkEa)Xr3XxXiyfGF;i&zFqiJwtxNnpO}a*mPe=0>m03f6 zCy1)ov6�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 diff --git a/eyeGestures/Legacy/Fixation.py b/eyeGestures/Legacy/Fixation.py deleted file mode 100644 index 75fcb18..0000000 --- a/eyeGestures/Legacy/Fixation.py +++ /dev/null @@ -1,23 +0,0 @@ -"""Module providing a fixation detection.""" - - -class Fixation: - """Class performing Fixation""" - - def __init__(self, x: float, y: float, radius: int = 100) -> None: - self.radius = radius - self.fixation = 0.0 - self.x = x - self.y = y - - def process(self, x: float, y: float) -> float: - """Function processing x and y estimated points for fixation detection""" - - if (x - self.x) ** 2 + (y - self.y) ** 2 < self.radius**2: - self.fixation = min(self.fixation + 0.02, 1.0) - else: - self.x = x - self.y = y - self.fixation = 0.0 - - return self.fixation diff --git a/eyeGestures/Legacy/__init__.py b/eyeGestures/Legacy/__init__.py deleted file mode 100644 index 599731a..0000000 --- a/eyeGestures/Legacy/__init__.py +++ /dev/null @@ -1,471 +0,0 @@ -import pickle -import time -from typing import Any, Dict, List, Optional, Tuple - -import cv2 -import numpy as np -import numpy.typing as npt - -import eyeGestures.screenTracker.dataPoints as dp -from eyeGestures.calibration_v1 import Calibrator as Calibrator_v1 -from eyeGestures.calibration_v2 import Calibrator as Calibrator_v2 -from eyeGestures.face import Face, FaceFinder -from eyeGestures.Fixation import Fixation -from eyeGestures.gazeEstimator import GazeTracker -from eyeGestures.gevent import Cevent, Gevent -from eyeGestures.utils import low_pass_filter_fourier, recoverable - -VERSION = "3.0.0" - - -class EyeGestures_v3: - """Main class for EyeGesture tracker. It configures and manages entire algorithm""" - - def __init__(self, calibration_radius: int = 1000) -> None: - self.calibration_radius = calibration_radius - - self.clb: Dict[str, Calibrator_v2] = dict() # Calibrator_v2() - self.cap = None - self.calibration: Dict[str, bool] = dict() - self.average_points: Dict[str, npt.NDArray[np.float64]] = dict() - self.filled_points: Dict[str, int] = dict() - self.enable_CN = False - self.calibrate_gestures = False - - self.finder = FaceFinder() - self.face = Face() - - # this has to be contexted - self.prev_timestamp: Dict[str, float] = dict() - self.prev_point: Dict[str, npt.NDArray[np.float64]] = dict() - self.fix: Optional[float] = None - self.velocity_max: Dict[str, int] = dict() - self.velocity_min: Dict[str, int] = dict() - self.fixationTracker: Dict[str, Fixation] = dict() - self.key_points_buffer: Dict[str, List[npt.NDArray[np.float64]]] = dict() - - self.starting_head_position = np.zeros((1, 2)) - self.starting_size = np.zeros((1, 2)) - - def saveModel(self, context: str = "main") -> Optional[bytes]: - if context in self.clb: - return pickle.dumps(self.clb[context]) - return None - - def loadModel(self, model: Any, context: str = "main") -> None: - self.clb[context] = pickle.loads(model) - - def uploadCalibrationMap(self, points: npt.NDArray[np.float64], context: str = "main") -> None: - self.addContext(context) - self.clb[context].updMatrix(np.array(points)) - - def getLandmarks(self, frame: cv2.typing.MatLike) -> Tuple[npt.NDArray[np.float64], bool, cv2.typing.MatLike]: - - frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) - frame = cv2.flip(frame, 1) - - # try: - self.face.process(frame, self.finder.find(frame)) - - face_landmarks = self.face.get_landmarks() - assert face_landmarks is not None - l_eye = self.face.get_left_eye() - r_eye = self.face.get_right_eye() - l_eye_landmarks = l_eye.getLandmarks() - r_eye_landmarks = r_eye.getLandmarks() - blink = l_eye.getBlink() and r_eye.getBlink() - - # get x,y offset - x_offset = np.min(face_landmarks[:, 0]) - y_offset = np.min(face_landmarks[:, 1]) - x_width = np.max(face_landmarks[:, 0]) - x_offset - y_width = np.max(face_landmarks[:, 1]) - y_offset - - # get head position - head_offset = np.zeros((1, 2)) - scale_x = 1 - scale_y = 1 - if np.array_equal(self.starting_head_position, np.zeros((1, 2))): - self.starting_head_position = np.array([[x_offset, y_offset]]) - self.starting_size = np.array([[x_width, y_width]]) - else: - head_offset = np.array([[x_offset, y_offset]]) - self.starting_head_position - scale_x = self.starting_size[0, 0] / x_width - scale_y = self.starting_size[0, 1] / y_width - - # eye_events = np.array([event.blink,event.fixation]).reshape(1, 2) - assert l_eye_landmarks is not None - assert r_eye_landmarks is not None - key_points: npt.NDArray[np.float64] = np.concatenate( - ( - l_eye_landmarks, - r_eye_landmarks, - np.array([[scale_x, scale_y]]), - head_offset, - ) - ) - key_points[:, 0] = key_points[:, 0] - head_offset[:, 0] - key_points[:, 1] = key_points[:, 1] - head_offset[:, 1] - - key_points[:, 0] = key_points[:, 0] * scale_x - key_points[:, 1] = key_points[:, 1] * scale_y - - key_points[-1, 0] = head_offset[0, 0] - key_points[-1, 1] = head_offset[0, 1] - # print(self.starting_size,x_width,y_width) - subframe = frame[ - int(y_offset) : int(y_offset + y_width), - int(x_offset) : int(x_offset + x_width), - ] - return key_points, blink, subframe - - def whichAlgorithm(self, context: str = "main") -> str: - if context in self.clb: - return self.clb[context].whichAlgorithm() - return "None" - - def reset(self, context: str = "main") -> None: - self.filled_points[context] = 0 - if context in self.clb: - self.addContext(context) - - def setFixation(self, fix: float) -> None: - self.fix = fix - - def addContext(self, context: str) -> None: - if context not in self.clb: - self.clb[context] = Calibrator_v2(self.calibration_radius) - self.average_points[context] = np.zeros((20, 2)) - self.filled_points[context] = 0 - self.calibration[context] = False - self.prev_timestamp[context] = time.time() - self.prev_point[context] = np.array((0.0, 0.0)) - self.velocity_max[context] = 0 - self.velocity_min[context] = 100000000 - self.fixationTracker[context] = Fixation(0, 0, 100) - self.key_points_buffer[context] = [] - - @recoverable(ret_error_params=(None, None)) - def step( - self, frame: cv2.typing.MatLike, calibration: bool, width: int, height: int, context: str = "main" - ) -> Tuple[Optional[Gevent], Optional[Cevent]]: - self.addContext(context) - - self.calibration[context] = calibration - - key_points, blink, sub_frame = self.getLandmarks(frame) - - self.key_points_buffer[context].append(key_points) - if len(self.key_points_buffer[context]) > 10: - self.key_points_buffer[context].pop(0) - key_points = low_pass_filter_fourier(key_points, 200) - - y_point = self.clb[context].predict(key_points) - self.average_points[context][1:, :] = self.average_points[context][ - : (self.average_points[context].shape[0] - 1), : - ] - self.average_points[context][0, :] = y_point - - if ( - self.filled_points[context] < self.average_points[context].shape[0] - and (y_point != np.array([0.0, 0.0])).any() - ): - self.filled_points[context] += 1 - if self.filled_points[context] == 0: - self.filled_points[context] = 1 - - averaged_point = np.sum(self.average_points[context][:, :], axis=0) / (self.filled_points[context]) - fixation = self.fixationTracker[context].process(averaged_point[0], averaged_point[1]) - - duration = time.time() - self.prev_timestamp[context] - velocity = abs(averaged_point - self.prev_point[context]) / duration - velocity = np.sqrt(velocity[0] ** 2 + velocity[1] ** 2) - self.prev_point[context] = averaged_point - self.prev_timestamp[context] = time.time() - - self.velocity_max[context] = max(self.velocity_max[context], velocity) - self.velocity_min[context] = min(self.velocity_min[context], velocity) - - saccades = velocity > (self.velocity_max[context]) / 4 - - if self.calibration[context] and ( - self.clb[context].insideClbRadius(averaged_point, width, height) - or self.filled_points[context] < self.average_points[context].shape[0] * 10 - ): - self.clb[context].add(key_points, self.clb[context].getCurrentPoint(width, height)) - else: - self.clb[context].post_fit() - - if self.calibration[context] and self.clb[context].insideAcptcRadius(averaged_point, width, height): - if self.clb[context].isReadyToMove(): - self.clb[context].movePoint() - - gevent = Gevent( - point=averaged_point, - blink=blink, - fixation=fixation, - saccades=saccades, - sub_frame=sub_frame, - ) - cevent = Cevent( - self.clb[context].getCurrentPoint(width, height), - self.clb[context].acceptance_radius, - self.clb[context].calibration_radius, - ) - return (gevent, cevent) - - -class EyeGestures_v2: - """Main class for EyeGesture tracker. It configures and manages entire algorithm""" - - def __init__(self, calibration_radius: int = 1000) -> None: - self.monitor_width = 1 - self.monitor_height = 1 - self.calibration_radius = calibration_radius - - self.clb: Dict[str, Calibrator_v2] = dict() # Calibrator_v2() - self.cap = None - self.gestures = EyeGestures_v1(285, 115, 200, 100) - - self.calibration: Dict[str, bool] = dict() - - self.CN: int = 5 - - self.average_points: Dict[str, npt.NDArray[np.float64]] = dict() - self.filled_points: Dict[str, int] = dict() - self.enable_CN = False - self.calibrate_gestures = False - - self.fix = 0.8 - - def saveModel(self, context: str = "main") -> Optional[bytes]: - if context in self.clb: - return pickle.dumps(self.clb[context]) - return None - - def loadModel(self, model: Any, context: str = "main") -> None: - self.clb[context] = pickle.loads(model) - - def uploadCalibrationMap(self, points: npt.NDArray[np.float64], context="main") -> None: - self.addContext(context) - self.clb[context].updMatrix(np.array(points)) - - def getLandmarks( - self, frame: cv2.typing.MatLike, calibrate: bool = False, context: str = "main" - ) -> Tuple[npt.NDArray[np.float64], npt.NDArray[np.float64], bool, bool, Optional[Cevent]]: - - frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) - frame = cv2.flip(frame, 1) - # frame = cv2.resize(frame, (360, 640)) - - event, cevent = self.gestures.step( - frame, - context, - calibrate, # set calibration - switch to False to stop calibration - self.monitor_width, - self.monitor_height, - 0, - 0, - self.fix, - 100, - ) - - if event is not None or cevent is not None: - cursor_x, cursor_y = event.point[0], event.point[1] - l_eye_landmarks = event.l_eye.getLandmarks() - r_eye_landmarks = event.r_eye.getLandmarks() - - cursors = np.array([cursor_x, cursor_y]).reshape(1, 2) - eye_events = np.array([event.blink, event.fixation]).reshape(1, 2) - key_points = np.concatenate((cursors, l_eye_landmarks, r_eye_landmarks, eye_events)) - return ( - np.array((cursor_x, cursor_y)), - key_points, - event.blink, - event.fixation, - cevent, - ) - return np.array((0.0, 0.0)), np.array([]), False, False, None - - def whichAlgorithm(self, context: str = "main") -> str: - if context in self.clb: - return self.clb[context].whichAlgorithm() - return "None" - - def setClassicImpact(self, impact: int) -> None: - self.CN = impact - - def reset(self, context: str = "main") -> None: - self.filled_points[context] = 0 - if context in self.clb: - self.addContext(context) - - def setFixation(self, fix: float) -> None: - self.fix = fix - - def setClassicalImpact(self, CN: int) -> None: - self.CN = CN - - def enableCNCalib(self) -> None: - self.enable_CN = True - - def disableCNCalib(self) -> None: - self.enable_CN = False - - def addContext(self, context: str) -> None: - if context not in self.clb: - self.clb[context] = Calibrator_v2(self.calibration_radius) - self.average_points[context] = np.zeros((20, 2)) - self.filled_points[context] = 0 - self.calibration[context] = False - - @recoverable(ret_error_params=(None, None)) - def step( - self, frame: cv2.typing.MatLike, calibration: bool, width: int, height: int, context: str = "main" - ) -> Tuple[Optional[Gevent], Optional[Cevent]]: - self.addContext(context) - - self.calibration[context] = calibration - self.monitor_width = width - self.monitor_height = height - - classic_point, key_points, blink, fixation, cevent = self.getLandmarks( - frame, self.calibrate_gestures and self.enable_CN, context=context - ) - - margin = 10 - if cevent is None: - raise ValueError("cevent must not be None") - if (classic_point[0] <= margin) and self.calibration[context]: - self.calibrate_gestures = cevent.calibration - elif (classic_point[0] >= width - margin) and self.calibration[context]: - self.calibrate_gestures = cevent.calibration - elif (cevent.point[1] <= margin) and self.calibration[context]: - self.calibrate_gestures = cevent.calibration - elif (classic_point[1] >= height - margin) and self.calibration[context]: - self.calibrate_gestures = cevent.calibration - else: - self.calibrate_gestures = False - - y_point = self.clb[context].predict(key_points) - self.average_points[context][1:, :] = self.average_points[context][ - : (self.average_points[context].shape[0] - 1), : - ] - if fixation <= self.fix: - self.average_points[context][0, :] = y_point - - if ( - self.filled_points[context] < self.average_points[context].shape[0] - and (y_point != np.array([0.0, 0.0])).any() - ): - self.filled_points[context] += 1 - averaged_point = (np.sum(self.average_points[context][:, :], axis=0) + (classic_point * self.CN)) / ( - self.filled_points[context] + self.CN - ) - - if self.calibration[context] and ( - self.clb[context].insideClbRadius(averaged_point, width, height) - or self.filled_points[context] < self.average_points[context].shape[0] * 10 - ): - self.clb[context].add(key_points, self.clb[context].getCurrentPoint(width, height)) - else: - self.clb[context].post_fit() - - if self.calibration[context] and self.clb[context].insideAcptcRadius(averaged_point, width, height): - if self.clb[context].isReadyToMove(): - self.clb[context].movePoint() - - gevent = Gevent(averaged_point, blink, fixation) - cevent = Cevent( - self.clb[context].getCurrentPoint(width, height), - self.clb[context].acceptance_radius, - self.clb[context].calibration_radius, - ) - return (gevent, cevent) - - -class EyeGestures_v1: - """Main class for EyeGesture tracker. It configures and manages entier algorithm""" - - def __init__(self, roi_x=225, roi_y=105, roi_width=80, roi_height=15): - - screen_width = 500 - screen_height = 500 - height = 250 - width = 250 - - roi_x = roi_x % screen_width - roi_y = roi_y % screen_height - roi_width = roi_width % screen_width - roi_height = roi_height % screen_height - - self.screen_width = screen_width - self.screen_height = screen_height - - self.screen = dp.Screen(screen_width, screen_height) - - self.gaze = GazeTracker( - screen_width, - screen_height, - width, - height, - roi_x, - roi_y, - roi_width, - roi_height, - ) - - self.calibrators = dict() - self.calibrate = False - - def getFeatures(self, image): - """[NOT RECOMMENDED] Function allowing for extraction of gaze features from image""" - - return self.gaze.getFeatures(image) - - # @timeit - # 0.011 - 0.015 s for execution - def step( - self, - image, - context, - calibration, - display_width, - display_height, - display_offset_x=0, - display_offset_y=0, - fixation_freeze=0.7, - freeze_radius=20, - offset_x=0, - offset_y=0, - ): - """Function performing estimation and returning event object""" - - display = dp.Display(display_width, display_height, display_offset_x, display_offset_y) - - # allow for random recalibration shot - event = self.gaze.estimate( - image, - display, - context, - calibration, - fixation_freeze, - freeze_radius, - offset_x, - offset_y, - ) - cevent = None - - if event is not None: - cursor_x, cursor_y = event.point[0], event.point[1] - if context in self.calibrators: - self.calibrate = self.calibrators[context].calibrate(cursor_x, cursor_y, event.fixation) - else: - self.calibrators[context] = Calibrator_v1(display_width, display_height, cursor_x, cursor_y) - self.calibrate = self.calibrators[context].calibrate(cursor_x, cursor_y, event.fixation) - - cpoint = self.calibrators[context].get_current_point() - calibration = self.calibrate and cpoint != (0, 0) - cevent = Cevent(cpoint, 100, 100, calibration) - - return (event, cevent) diff --git a/eyeGestures/Legacy/calibration_v1.py b/eyeGestures/Legacy/calibration_v1.py deleted file mode 100644 index 12d037a..0000000 --- a/eyeGestures/Legacy/calibration_v1.py +++ /dev/null @@ -1,165 +0,0 @@ -import time - - -class CalibrationPositions: - LEFT = "left" - RIGHT = "right" - TOP = "top" - BOTTOM = "bottom" - - -class Calibrator: - - def __init__(self, width, height, start_x, start_y): - self.width = width - self.height = height - self.start_x = start_x - self.start_y = start_y - - self.prev_x = 0 - self.prev_y = 0 - - self.calibration_margin = 200 - self.calibration_steps = [] - self.__set_order() - - self.calibrate_left = False - self.calibrate_right = False - self.calibrate_top = False - self.calibrate_bottom = False - - self.calibration = False - self.drawn = False - self.prev_point = None - self.last_calib = time.time() - - def __add_left(self): - self.calibration_steps.append(CalibrationPositions.LEFT) - return self - - def __add_right(self): - self.calibration_steps.append(CalibrationPositions.RIGHT) - return self - - def __add_top(self): - self.calibration_steps.append(CalibrationPositions.TOP) - return self - - def __add_bottom(self): - self.calibration_steps.append(CalibrationPositions.BOTTOM) - return self - - def __set_order(self): - if self.start_x < self.width / 2 and CalibrationPositions.LEFT not in self.calibration_steps: - self.__add_left().__add_right() - elif self.start_x > self.width / 2 and CalibrationPositions.RIGHT not in self.calibration_steps: - self.__add_right().__add_left() - - if self.start_y < self.height / 2 and CalibrationPositions.TOP not in self.calibration_steps: - self.__add_top().__add_bottom() - elif self.start_y > self.height / 2 and CalibrationPositions.BOTTOM not in self.calibration_steps: - self.__add_bottom().__add_top() - - def add_recalibrate(self, recalibrate_step): - - if recalibrate_step not in self.calibration_steps: - self.calibration_steps.append(recalibrate_step) - - def get_current_point(self): - if len(self.calibration_steps) > 0: - if CalibrationPositions.LEFT == self.calibration_steps[0]: - return (self.calibration_margin, int(self.height / 2)) - if CalibrationPositions.RIGHT == self.calibration_steps[0]: - return (self.width - self.calibration_margin, int(self.height / 2)) - if CalibrationPositions.TOP == self.calibration_steps[0]: - return (int(self.width / 2), self.calibration_margin) - if CalibrationPositions.BOTTOM == self.calibration_steps[0]: - return (int(self.width / 2), self.height - self.calibration_margin) - return (0, 0) - - def calibrate(self, x, y, fix): - - if abs(x - self.width / 2) > 150 and self.prev_point in [ - CalibrationPositions.TOP, - CalibrationPositions.BOTTOM, - ]: - if x - self.width / 2 < 0: - self.add_recalibrate(CalibrationPositions.LEFT) - else: - self.add_recalibrate(CalibrationPositions.RIGHT) - - if abs(y - self.height / 2) > 150 and self.prev_point in [ - CalibrationPositions.LEFT, - CalibrationPositions.RIGHT, - ]: - if y - self.height / 2 < 0: - self.add_recalibrate(CalibrationPositions.TOP) - else: - self.add_recalibrate(CalibrationPositions.BOTTOM) - - self.prev_y = y - self.prev_x = x - if len(self.calibration_steps) <= 0: - self.prev_point = None - return False - - fixation_thresh = 0.3 - if fix > fixation_thresh and (time.time() - self.last_calib) > 5.0: - if CalibrationPositions.LEFT == self.calibration_steps[0] and x < self.calibration_margin: - if CalibrationPositions.LEFT in self.calibration_steps: - self.calibration_steps.remove(CalibrationPositions.LEFT) - self.prev_point = CalibrationPositions.LEFT - self.drawn = False - self.last_calib = time.time() - return True - if CalibrationPositions.RIGHT == self.calibration_steps[0] and x > self.width - self.calibration_margin: - if CalibrationPositions.RIGHT in self.calibration_steps: - self.calibration_steps.remove(CalibrationPositions.RIGHT) - self.prev_point = CalibrationPositions.RIGHT - self.drawn = False - self.last_calib = time.time() - return True - if CalibrationPositions.TOP == self.calibration_steps[0] and y < self.calibration_margin: - if CalibrationPositions.TOP in self.calibration_steps: - self.calibration_steps.remove(CalibrationPositions.TOP) - self.prev_point = CalibrationPositions.TOP - self.drawn = False - self.last_calib = time.time() - return True - if CalibrationPositions.BOTTOM == self.calibration_steps[0] and y > self.height - self.calibration_margin: - if CalibrationPositions.BOTTOM in self.calibration_steps: - self.calibration_steps.remove(CalibrationPositions.BOTTOM) - self.prev_point = CalibrationPositions.BOTTOM - self.drawn = False - self.last_calib = time.time() - return True - # TODO: somewhere here is bug breaking entire program - self.last_calib = time.time() - self.drawn = False - self.prev_point = None - - if self.calibration_steps[0] in [ - CalibrationPositions.RIGHT, - CalibrationPositions.LEFT, - ]: - if x < self.width / 2: - if CalibrationPositions.RIGHT in self.calibration_steps: - self.calibration_steps.remove(CalibrationPositions.RIGHT) - self.calibration_steps.insert(0, CalibrationPositions.RIGHT) - else: - if CalibrationPositions.LEFT in self.calibration_steps: - self.calibration_steps.remove(CalibrationPositions.LEFT) - self.calibration_steps.insert(0, CalibrationPositions.LEFT) - return True - - if self.calibration_steps[0] is CalibrationPositions.TOP: - self.calibration_steps.insert(0, CalibrationPositions.BOTTOM) - return True - self.calibration_steps.insert(0, CalibrationPositions.TOP) - return True - - self.prev_point = None - return False - - def calibrated(self): - return len(self.calibration_steps) <= 0 diff --git a/eyeGestures/Legacy/calibration_v2.py b/eyeGestures/Legacy/calibration_v2.py deleted file mode 100644 index e5ec973..0000000 --- a/eyeGestures/Legacy/calibration_v2.py +++ /dev/null @@ -1,201 +0,0 @@ -import threading -from typing import List - -import numpy as np -import numpy.typing as npt -import sklearn.linear_model as scireg - - -def euclidean_distance(point1: npt.NDArray[np.float64], point2: npt.NDArray[np.float64]) -> np.float64: - return np.linalg.norm(point1 - point2) - - -class Calibrator: - - PRECISION_LIMIT = 50 - PRECISION_STEP = 10 - ACCEPTANCE_RADIUS = 500 - CALIBRATION_RADIUS = 1000 - - def __init__(self, calibration_radius: int = 1000) -> None: - self.X: List[npt.NDArray[np.float64]] = [] - self.Y_y: List[npt.NDArray[np.float64]] = [] - self.Y_x: List[npt.NDArray[np.float64]] = [] - self.__tmp_X: List[npt.NDArray[np.float64]] = [] - self.__tmp_Y_y: List[npt.NDArray[np.float64]] = [] - self.__tmp_Y_x: List[npt.NDArray[np.float64]] = [] - self.reg = None - self.reg_x = scireg.Ridge(alpha=0.5) - self.reg_y = scireg.Ridge(alpha=0.5) - self.current_algorithm = "Ridge" - self.fitted = False - self.cv_not_set = True - self.fixations_x = None - self.fixations_y = None - - self.matrix = CalibrationMatrix() - - self.precision_limit = self.PRECISION_LIMIT - self.precision_step = self.PRECISION_STEP - self.acceptance_radius = int(calibration_radius / 2) - self.calibration_radius = int(calibration_radius) - - self.lock = threading.Lock() - self.calcualtion_coroutine = threading.Thread(target=self.__async_post_fit) - self.fit_coroutines: List[threading.Thread] = [] - - def __launch_fit(self) -> None: - coroutine = threading.Thread(target=self.__async_fit) - self.fit_coroutines.append(coroutine) - coroutine.start() - self.__join_finished() - - def __join_finished(self) -> None: - for coroutine in self.fit_coroutines: - if not coroutine.is_alive(): - coroutine.join() - - def add(self, x: npt.NDArray[np.float64], y: npt.NDArray[np.float64]) -> None: - with self.lock: - self.__tmp_X.append(x.flatten()) - self.__tmp_Y_y.append(y[1]) - self.__tmp_Y_x.append(y[0]) - self.__launch_fit() - - # This coroutine helps to asynchronously recalculate results - def __async_fit(self) -> None: - try: - with self.lock: - __fit_tmp_X = np.array(self.__tmp_X + self.X, dtype=object) - __fit_tmp_Y_y = np.array(self.__tmp_Y_y + self.Y_y) - __fit_tmp_Y_x = np.array(self.__tmp_Y_x + self.Y_x) - self.reg_x.fit(__fit_tmp_X, __fit_tmp_Y_x) - self.reg_y.fit(__fit_tmp_X, __fit_tmp_Y_y) - self.fitted = True - except Exception as e: - print(f"Exception as {e}") - - # This coroutine helps to asynchronously recalculate results - def __async_post_fit(self) -> None: - try: - tmp_fixations_x = scireg.LassoCV(cv=50, max_iter=10000) - tmp_fixations_y = scireg.LassoCV(cv=50, max_iter=10000) - - __tmp_X = np.array(self.X) - __tmp_Y_y = np.array(self.Y_y) - __tmp_Y_x = np.array(self.Y_x) - - tmp_fixations_x.fit(__tmp_X, __tmp_Y_x) - tmp_fixations_y.fit(__tmp_X, __tmp_Y_y) - - with self.lock: - self.fixations_x = tmp_fixations_x - self.fixations_y = tmp_fixations_y - self.fitted = True - self.current_algorithm = "LassoCV" - except Exception as e: - print(f"Exception as {e}") - self.cv_not_set = True - - def post_fit(self) -> None: - if self.cv_not_set: - # self.calcualtion_coroutine.start() - self.cv_not_set = False - - def whichAlgorithm(self) -> str: - with self.lock: - return self.current_algorithm - - def predict(self, x: npt.NDArray[np.float64]) -> npt.NDArray[np.float64]: - with self.lock: - if self.fitted: - x = x.flatten() - x = x.reshape(1, -1) - y_x = self.reg_x.predict(x)[0] - y_y = self.reg_y.predict(x)[0] - return np.array([y_x, y_y]) - return np.array([0.0, 0.0]) - - def movePoint(self) -> None: - with self.lock: - self.X = self.X + self.__tmp_X - self.Y_y = self.Y_y + self.__tmp_Y_y - self.Y_x = self.Y_x + self.__tmp_Y_x - self.matrix.movePoint() - self.__tmp_X = [] - self.__tmp_Y_y = [] - self.__tmp_Y_x = [] - - def isReadyToMove(self) -> int: - return len(self.__tmp_X) > 30 # magic number - collect 30 points - - def getCurrentPoint(self, width: int, heigth: int) -> npt.NDArray[np.float64]: - return self.matrix.getCurrentPoint(width, heigth) - - def updMatrix(self, points: npt.NDArray[np.float64]) -> None: - self.matrix.updMatrix(points) - - def unfit(self) -> None: - self.acceptance_radius = self.ACCEPTANCE_RADIUS - self.calibration_radius = self.CALIBRATION_RADIUS - self.fitted = False - - def increase_precision(self) -> None: - if self.acceptance_radius > self.precision_limit: - self.acceptance_radius -= self.precision_step - if self.calibration_radius > self.precision_limit and self.acceptance_radius < self.calibration_radius: - self.calibration_radius -= self.precision_step - - def insideClbRadius(self, point: npt.NDArray[np.float64], width: int, height: int) -> np.bool_: - return euclidean_distance(point, self.getCurrentPoint(width, height)) < self.calibration_radius - - def insideAcptcRadius(self, point: npt.NDArray[np.float64], width: int, height: int) -> np.bool_: - return euclidean_distance(point, self.getCurrentPoint(width, height)) < self.acceptance_radius - - -class CalibrationMatrix: - - def __init__(self) -> None: - - self.iterator = 0 - self.points: npt.NDArray[np.float64] = np.array( - [ - [1, 0.5], - [0.75, 0.5], - [0.5, 0.5], - [0.25, 0.5], - [0.0, 0.5], - [1.0, 1.0], - [0.75, 1.0], - [0.5, 1.0], - [0.25, 1.0], - [0.0, 1.0], - [1.0, 0.0], - [0.75, 0.0], - [0.5, 0.0], - [0.25, 0.0], - [0.0, 0.0], - [0.0, 0.75], - [0.75, 0.75], - [0.5, 0.75], - [0.25, 0.75], - [0.0, 0.75], - [1.0, 0.25], - [0.75, 0.25], - [0.5, 0.25], - [0.25, 0.25], - [0.0, 0.25], - ] - ) - - def updMatrix(self, points: npt.NDArray[np.float64]) -> None: - self.points = points - self.iterator = 0 - - def movePoint(self) -> None: - self.iterator += 1 - self.iterator %= len(self.points) - - def getCurrentPoint(self, width: int = 1, height: int = 1) -> npt.NDArray[np.float64]: - it = self.iterator - return np.array([self.points[it, 0] * width, self.points[it, 1] * height]) diff --git a/eyeGestures/Legacy/eye.py b/eyeGestures/Legacy/eye.py deleted file mode 100644 index 184c4ee..0000000 --- a/eyeGestures/Legacy/eye.py +++ /dev/null @@ -1,188 +0,0 @@ -"""Module providing a extraction of eye from face object.""" - -from typing import Optional, Tuple - -import cv2 -import mediapipe as mp -import numpy as np -import numpy.typing as npt - -from eyeGestures.utils import Buffor - - -class Eye: - """Class storing data related and representing a eye""" - - LEFT_EYE_KEYPOINTS = np.array(list(mp.solutions.face_mesh.FACEMESH_LEFT_EYE))[:, 0] - RIGHT_EYE_KEYPOINTS = np.array(list(mp.solutions.face_mesh.FACEMESH_RIGHT_EYE))[:, 0] - LEFT_EYE_PUPIL_KEYPOINT = [473] - RIGHT_EYE_PUPIL_KEYPOINT = [468] - - # LEFT_EYE_KEYPOINTS = [36, 37, 38, 39, 40, 41] # keypoint indices for left eye - # RIGHT_EYE_KEYPOINTS = [42, 43, 44, 45, 46, 47] # keypoint indices for right eye - - scale = (150, 100) - - def __init__(self, side: int) -> None: - - # check if eye is left or right - if side == 1: - self.side = "right" - self.pupil_index = self.RIGHT_EYE_PUPIL_KEYPOINT - elif side == 0: - self.side = "left" - self.pupil_index = self.LEFT_EYE_PUPIL_KEYPOINT - - self.x = 0 - self.y = 0 - self.width = 0 - self.height = 0 - self.center_x = 0 - self.center_y = 0 - self.image: Optional[cv2.typing.MatLike] = None - self.pupil: Optional[npt.NDArray[np.float64]] = None - self.offset: Optional[npt.NDArray[np.float64]] = None - self.region: Optional[npt.NDArray[np.float64]] = None - self.cut_image: Optional[cv2.typing.MatLike] = None - self.landmarks: Optional[npt.NDArray[np.float64]] = None - - # self._process(self.image,self.region) - - def update( - self, image: cv2.typing.MatLike, landmarks: npt.NDArray[np.float64], offset: npt.NDArray[np.float64] - ) -> None: - """function updating data stored inside eye object""" - - self.image = image - self.offset = offset - self.landmarks = landmarks - # check if eye is left or right - if self.side == "right": - self.region = np.array(landmarks[self.RIGHT_EYE_KEYPOINTS]) - # landmarks[self.RIGHT_EYE_KEYPOINTS], dtype=np.int32) - - elif self.side == "left": - self.region = np.array(landmarks[self.LEFT_EYE_KEYPOINTS]) - # landmarks[self.LEFT_EYE_KEYPOINTS], dtype=np.int32) - - self.pupil = landmarks[self.pupil_index][0] - assert self.region is not None - self._process(self.image, self.region) - - def getCenter(self) -> Tuple[float, float]: - """function returning center of eye""" - - return (float(self.center_x), float(self.center_y)) - - def getPos(self) -> Tuple[int, int]: - """function returning position of eye in the image""" - - return (int(self.x), int(self.y)) - - def getPupil(self) -> Optional[npt.NDArray[np.float64]]: - """function returning pupil object""" - - # return self.pupil.getCoords() - return self.pupil - - def getBlink(self) -> bool: - """function returning blink event""" - # return self.pupil.getCoords() - return (self.height) <= 3 # 2x margin - - def getImage(self) -> Optional[cv2.typing.MatLike]: - """function returning image of the eye cut from the entire face image""" - - # TODO: draw additional parameters - return self.cut_image - - def getGaze(self, gaze_buffor: Buffor, y_correction: int = 0, x_correction: int = 0) -> npt.NDArray[np.float64]: - """function returning gaze position""" - - # pupilCoords = self.pupil.getCoords() - assert self.offset is not None - assert self.region is not None - assert self.pupil is not None - center = np.array((self.center_x, self.center_y)) - self.offset - - region_corrected = self.region - self.offset - pupil_corrected = self.pupil - self.offset - - vectors = region_corrected - center - pupil = pupil_corrected - center - - vectors = vectors - pupil - gaze_vector = np.zeros((2)) - - gaze_vector[1] = np.sum(vectors, axis=0)[1] * 10 - y_correction - gaze_vector[0] = -np.sum(vectors, axis=0)[0] * 10 - x_correction - - # print("gaze_vector: ",gaze_vector) - gaze_buffor.add(gaze_vector) - return gaze_buffor.getAvg() - - def getOpenness(self) -> float: - """function returning eye openness""" - - return self.height / 2 - - def getLandmarks(self) -> Optional[npt.NDArray[np.float64]]: - """function returning eye landmarks""" - - return self.region - - def getBoundingBox(self) -> Tuple[int, int, int, int]: - return (int(self.x), int(self.y), int(self.width), int(self.height)) - - def _process(self, image: cv2.typing.MatLike, region: npt.NDArray[np.float64]) -> None: - h, w, _ = image.shape - - mask = np.full((h, w), 0, dtype=np.uint8) - background = np.zeros((h, w), dtype=np.uint8) - - region_int = np.array(region, dtype=np.int32) - cv2.fillPoly(mask, [region_int], (0,)) - - masked_image = cv2.bitwise_not(background, cv2.cvtColor(image.copy(), cv2.COLOR_BGR2GRAY), mask=mask) - - margin = 2 - min_x = np.min(region_int[:, 0]) - margin - max_x = np.max(region_int[:, 0]) + margin - min_y = np.min(region_int[:, 1]) - margin - max_y = np.max(region_int[:, 1]) + margin - - self.x = min_x - self.y = min_y - - self.width = np.max(region_int[:, 0]) - np.min(region_int[:, 0]) - self.height = np.max(region_int[:, 1]) - np.min(region_int[:, 1]) - - self.center_x = (min_x + max_x) / 2 - self.center_y = (min_y + max_y) / 2 - - # HACKETY_HACK: - assert self.pupil is not None - self.pupil[1] = np.min(region[:, 1]) - - self.cut_image = masked_image[min_y:max_y, min_x:max_x] - # print(f"here: {self.cut_image.shape,min_y,max_y,min_x,max_x}") - # self.cut_image = cv2.cvtColor(self.cut_image, cv2.COLOR_GRAY2BGR) - - # for point in self.region: - # point = point - (min_x, min_y) - # cv2.circle(self.cut_image, point.astype( - # int), 1, (255, 0, 0, 150), 1) - - # pupil = self.pupil - (min_x, min_y) - - # cv2.circle(self.cut_image, pupil.astype(int), 1, (0, 255, 0, 150), 1) - - # self.cut_image = cv2.resize(self.cut_image, self.scale) - - # save cut_image to buffor and get avg from previous buffors - # self.eyeBuffer.add(self.cut_image) - # self.cut_image = np.array(self.eyeBuffer.getAvg(), dtype=np.uint8) - - # LEGACY - # org_scale = (max_x - min_x,max_y - min_y) - # self.pupil = pupil.Pupil(self.cut_image, min_x, min_y, self.scale, org_scale) diff --git a/eyeGestures/Legacy/face.py b/eyeGestures/Legacy/face.py deleted file mode 100644 index 42575eb..0000000 --- a/eyeGestures/Legacy/face.py +++ /dev/null @@ -1,106 +0,0 @@ -"""Module providing finding and extraction of face from image.""" - -from typing import Any, NamedTuple, Optional, Tuple - -import cv2 -import mediapipe as mp -import numpy as np -import numpy.typing as npt - -from eyeGestures.eye import Eye - - -class FaceFinder: - """Class helping finding face""" - - def __init__(self) -> None: - self.mp_face_mesh = mp.solutions.face_mesh.FaceMesh( - refine_landmarks=True, - static_image_mode=False, - min_detection_confidence=0.5, - min_tracking_confidence=0.5, - ) - - def find(self, image: cv2.typing.MatLike) -> Optional[Any]: - """Find face mesh""" - - assert len(image.shape) > 2 - - try: - face_mesh = self.mp_face_mesh.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) - if face_mesh.multi_face_landmarks is None: - return None - - return face_mesh - except Exception as e: - print(f"Exception in FaceFinder: {e}") - return None - - -class Face: - """Class keeping and processing face landmarks""" - - def __init__(self) -> None: - self.eye_left = Eye(0) - self.eye_right = Eye(1) - self.landmarks: Optional[npt.NDArray[np.float64]] = None - self.image_h: Optional[int] = None - self.image_w: Optional[int] = None - self.face: Optional[NamedTuple] = None - - def get_bounding_box(self) -> Tuple[int, int, int, int]: - """Get bounding box of face""" - if self.landmarks is not None: - margin = 0 - min_x = np.min(self.landmarks[:, 0]) - margin - max_x = np.max(self.landmarks[:, 0]) + margin - min_y = np.min(self.landmarks[:, 1]) - margin - max_y = np.max(self.landmarks[:, 1]) + margin - - width = int((max_x - min_x)) - height = int((max_y - min_y)) - x = int(min_x) - y = int(min_y) - return (x, y, width, height) - return (0, 0, 0, 0) - - def get_left_eye(self) -> Eye: - """Get left eye""" - return self.eye_left - - def get_right_eye(self) -> Eye: - """Get right eye""" - return self.eye_right - - def get_landmarks(self) -> Optional[npt.NDArray[np.float64]]: - """Get landmarks""" - return self.landmarks - - def _landmarks(self, face: Any) -> npt.NDArray[np.float64]: - - __complex_landmark_points = face.multi_face_landmarks - __complex_landmarks = __complex_landmark_points[0].landmark - - __face_landmarks = [] - for landmark in __complex_landmarks: - __face_landmarks.append((landmark.x * self.image_w, landmark.y * self.image_h)) - - return np.array(__face_landmarks) - - def process(self, image: cv2.typing.MatLike, face: Optional[Any]) -> None: - """Process face landmarks on image""" - # try: - self.face = face - self.image_h, self.image_w, _ = image.shape - self.landmarks = self._landmarks(self.face) - # self.nose = nose.Nose(image,self.landmarks,self.getBoundingBox()) - - x, y, _, _ = self.get_bounding_box() - offset = np.array((x, y)) - # offset = offset - self.nose.getHeadTiltOffset() - - self.eye_left.update(image, self.landmarks, offset) - self.eye_right.update(image, self.landmarks, offset) - # except Exception as e: - # print(f"Caught exception: {e}") - # return None diff --git a/eyeGestures/Legacy/gazeEstimator.py b/eyeGestures/Legacy/gazeEstimator.py deleted file mode 100644 index fb31df9..0000000 --- a/eyeGestures/Legacy/gazeEstimator.py +++ /dev/null @@ -1,273 +0,0 @@ -import numpy as np - -import eyeGestures.screenTracker.dataPoints as dp -from eyeGestures.face import Face, FaceFinder -from eyeGestures.Fixation import Fixation -from eyeGestures.gaze_contexter import GazeContext -from eyeGestures.gevent import Gevent -from eyeGestures.processing import EyeProcessor -from eyeGestures.screenTracker.screenTracker import ScreenManager -from eyeGestures.utils import Buffor - - -def isInside(circle_x, circle_y, r, x, y): - """Function checking if points are inside the circle""" - - # Compare radius of circle - # with distance of its center - # from given point - if (x - circle_x) * (x - circle_x) + (y - circle_y) * (y - circle_y) <= r * r: - return True - return False - - -class GazeTracker: - """Class processing images and returning gaze tracker""" - - N_FEATURES = 16 - - def __init__( - self, - screen_width, - screen_heigth, - eye_screen_w, - eye_screen_h, - roi_x, - roi_y, - roi_width, - roi_height, - ): - self.screen = dp.Screen(screen_width, screen_heigth) - - self.offset_x = 0 - self.offset_y = 0 - - self.roi_x = roi_x - self.roi_y = roi_y - self.roi_width = roi_width - self.roi_height = roi_height - - self.eye_screen_w = eye_screen_w - self.eye_screen_h = eye_screen_h - - self.eyeProcessorLeft = EyeProcessor(eye_screen_w, eye_screen_h) - self.eyeProcessorRight = EyeProcessor(eye_screen_w, eye_screen_h) - - self.screen_man = ScreenManager() - - self.finder = FaceFinder() - self.face = Face() - - # those are used for analysis - - self.point_screen = [0.0, 0.0] - self.freezed_point = [0.0, 0.0] - - self.GContext = GazeContext() - - # self.calibration = False - - def __gaze_intersection(self, l_eye, r_eye, l_buff, r_buff): - l_pupil = l_eye.getPupil() - l_gaze = l_eye.getGaze(l_buff) - - r_pupil = r_eye.getPupil() - r_gaze = r_eye.getGaze(r_buff) - - l_end = l_gaze + l_pupil - r_end = r_gaze + r_pupil - - l_m = (l_end[1] - l_pupil[1]) / (l_end[0] - l_pupil[0]) - r_m = (r_end[1] - r_pupil[1]) / (r_end[0] - r_pupil[0]) - - l_b = l_end[1] - l_m * l_end[0] - r_b = r_end[1] - r_m * r_end[0] - - i_x = (r_b - l_b) / (l_m - r_m) - i_y = r_m * i_x + r_b - return (i_x, i_y) - - def __pupil(self, eye, eyeProcessor, intersection_x, buffor): - eyeProcessor.append(eye.getPupil(), eye.getLandmarks(), buffor) - point = eyeProcessor.getAvgPupil(self.eye_screen_w, self.eye_screen_h, buffor) - point = np.array((int(intersection_x), point[1])) - - return point, buffor - - def estimate( - self, - image, - display, - context_id, - calibration, - fixation_freeze=0.7, - freeze_radius=20, - offset_x=0, - offset_y=0, - ): - """Function estimating gaze and returning gaze event based on image""" - - event = None - face_mesh = self.getFeatures(image) - if not face_mesh: - return None - - if face_mesh.multi_face_landmarks: - self.face.process(image, face_mesh) - - context = self.GContext.get( - context_id, - display, - face=None, - roi=dp.ScreenROI(self.roi_x, self.roi_y, self.roi_width, self.roi_height), - edges=dp.ScreenROI(285, 105, 80, 15), - cluster_boundaries=dp.ScreenROI(225, 125, 20, 20), - buffor=Buffor(200), - l_pupil=Buffor(20), - r_pupil=Buffor(20), - l_eye_buff=Buffor(20), - r_eye_buff=Buffor(20), - fixation=Fixation(0, 0, 100), - ) - context.calibration = calibration - - if self.face is not None: - if self.face.landmarks is None: - return event - - if context.face is None: - x, y, w, h = self.face.get_bounding_box() - i_w = self.face.image_w - i_h = self.face.image_h - context.face = (x, y, w, h, i_w, i_h) - - l_eye = self.face.get_left_eye() - r_eye = self.face.get_right_eye() - - # TODO: check what happens here before with l_pupil - intersection_x, _ = self.__gaze_intersection(l_eye, r_eye, context.l_eye_buff, context.r_eye_buff) - l_point, l_buffor = self.__pupil(l_eye, self.eyeProcessorLeft, intersection_x, context.l_pupil) - r_point, r_buffor = self.__pupil(r_eye, self.eyeProcessorRight, intersection_x, context.r_pupil) - - context.l_pupil = l_buffor - context.r_pupil = r_buffor - - compound_point = np.array(((l_point + r_point) / 2), dtype=np.uint32) - - blink = l_eye.getBlink() or r_eye.getBlink() - if blink != True: - context.gaze_buffor.add(compound_point) - # current face radius - _, _, face_w, face_h = self.face.get_bounding_box() - image_w = self.face.image_w - image_h = self.face.image_h - - face_w_perc = face_w / image_w - face_h_perc = face_h / image_h - - # # prev current face radius - _, _, c_face_w, c_face_h, c_image_w, c_image_h = context.face - - c_face_w_perc = c_face_w / c_image_w - c_face_h_perc = c_face_h / c_image_h - - x, y, w, h = self.face.get_bounding_box() - i_w = self.face.image_w - i_h = self.face.image_h - context.face = (x, y, w, h, i_w, i_h) - - # roi update - - # context.roi.x -= diff_face_x * 500 # current size of virtual display - # context.roi.y -= diff_face_y * 500 # current size of virtual display - if abs(face_w_perc / c_face_w_perc - 1.0) > 0.02: - context.roi.width = context.roi.width * abs(face_w_perc / c_face_w_perc) - # context.edges.width= context.edges.width * abs(face_w_perc/c_face_w_perc) - context.gaze_buffor.flush() - # context.calibration = True - if abs(face_h_perc / c_face_h_perc - 1.0) > 0.02: - context.roi.height = context.roi.height * abs(face_h_perc / c_face_h_perc) - # context.edges.height= context.edges.height * abs(face_w_perc/c_face_w_perc) - context.gaze_buffor.flush() - # context.calibration = True - - self.point_screen, roi, cluster = self.screen_man.process( - context.gaze_buffor, - context.roi, - context.edges, - self.screen, - context.display, - context.calibration, - (offset_x, offset_y), - ) - - context.roi = roi - if cluster: - x, y, width, height = cluster.getBoundaries() - context.cluster_boundaries.x = x - context.cluster_boundaries.y = y - context.cluster_boundaries.width = width - context.cluster_boundaries.height = height - - self.GContext.update(context_id, context) - - ########################################################### - - fix = context.fixation.process(self.point_screen[0], self.point_screen[1]) - # this should prevent of sudden movement down when blinking - not perfect yet - - if fix > fixation_freeze: - r = freeze_radius - if not isInside( - self.freezed_point[0], - self.freezed_point[1], - r, - self.point_screen[0], - self.point_screen[1], - ): - self.freezed_point = self.point_screen - - event = Gevent( - self.freezed_point, - blink, - fix, - l_eye, - r_eye, - display, - context.roi, - context.edges, - context.cluster_boundaries, - context_id, - ) - else: - self.freezed_point = self.point_screen - event = Gevent( - self.point_screen, - blink, - fix, - l_eye, - r_eye, - display, - context.roi, - context.edges, - context.cluster_boundaries, - context_id, - ) - - return event - - # def get_contextes(self): - # """Function returning contextes""" - - # return self.GContext.get_contextes() - - # def add_offset(self,x,y): - # """Function adding offsets to tracker""" - - # self.screen_man.push_window(x,y) - - def getFeatures(self, image): - """Function returning face landmarks""" - - face_mesh = self.finder.find(image) - return face_mesh diff --git a/eyeGestures/Legacy/gaze_contexter.py b/eyeGestures/Legacy/gaze_contexter.py deleted file mode 100644 index 312c78c..0000000 --- a/eyeGestures/Legacy/gaze_contexter.py +++ /dev/null @@ -1,124 +0,0 @@ -"""Module providing a core tracking features.""" - -import eyeGestures.screenTracker.dataPoints as dp -from eyeGestures.Fixation import Fixation -from eyeGestures.utils import Buffor - - -class Contexter: - """Class storing contextes""" - - def __init__(self): - self.context = {} - - def add_context(self, context_id, context): - """Function allowing to add new context to contexter""" - - if context_id not in self.context: - self.context[context_id] = context - return True - return False - - def remove_context(self, context_id): - """Function removing context""" - return self.context.pop(context_id, None) is not None - - def get_context(self, context_id): - """Function returning context based on id""" - return self.context.get(context_id, None) - - def update_context(self, context_id, data): - """Function updating context with new data""" - - if context_id in self.context: - self.context[context_id] = data - else: - self.add_context(context_id, data) - return True - - def get_number_contexts(self): - """Function returning number of contexts""" - - return len(self.context) - - -class Gcontext: - """Helper class for Gcontext""" - - def __init__( - self, - display, - face, - roi, - edges, - cluster_boundaries, - gaze_buffor, - l_pupil, - r_pupil, - l_eye_buff, - r_eye_buff, - fixation, - calibration, - ): - - self.roi = roi - self.face = face - self.edges = edges - self.cluster_boundaries = cluster_boundaries - self.gaze_buffor = gaze_buffor - self.l_pupil = l_pupil - self.r_pupil = r_pupil - self.l_eye_buff = l_eye_buff - self.r_eye_buff = r_eye_buff - self.display = display - self.fixation = fixation - self.calibration = calibration - - -class GazeContext: - """Context wrapper for gaze tracker application""" - - def __init__(self): - self.contexter = Contexter() - - def get( - self, - context_id, - display, - face=None, - roi=dp.ScreenROI(285, 105, 80, 15), - edges=dp.ScreenROI(285, 105, 80, 15), - cluster_boundaries=dp.ScreenROI(225, 125, 20, 20), - buffor=Buffor(200), - l_pupil=Buffor(20), - r_pupil=Buffor(20), - l_eye_buff=Buffor(20), - r_eye_buff=Buffor(20), - fixation=Fixation(0, 0, 100), - calibration=False, - ): - """Function creating new context or returning if id already exists""" - - context = Gcontext( - display=display, - face=face, - roi=roi, - edges=edges, - cluster_boundaries=cluster_boundaries, - gaze_buffor=buffor, - l_pupil=l_pupil, - r_pupil=r_pupil, - l_eye_buff=l_eye_buff, - r_eye_buff=r_eye_buff, - fixation=fixation, - calibration=calibration, - ) - - if self.contexter.add_context(context_id, context): - return context - return self.contexter.get_context(context_id) - - def update(self, context_id, context): - """Function updating existing context""" - - self.contexter.update_context(context_id, context) diff --git a/eyeGestures/Legacy/gevent.py b/eyeGestures/Legacy/gevent.py deleted file mode 100644 index 7bc0181..0000000 --- a/eyeGestures/Legacy/gevent.py +++ /dev/null @@ -1,57 +0,0 @@ -"""Module providing a Gaze Events.""" - -from typing import Any, Optional - -import cv2 -import numpy as np -import numpy.typing as npt - -from eyeGestures.eye import Eye - - -class Gevent: - """Class representing gaze event, with tracked points scaled to screen, blink and fixation.""" - - def __init__( - self, - point: npt.NDArray[np.float64], - blink: bool, - fixation: float, - l_eye: Optional[Eye] = None, - r_eye: Optional[Eye] = None, - screen_man: Optional[Any] = None, - roi: Optional[Any] = None, - edges: Optional[Any] = None, - cluster: Optional[Any] = None, - context: Optional[Any] = None, - saccades: bool = False, - sub_frame: Optional[cv2.typing.MatLike] = None, - ): - - self.point = point - self.blink = blink - self.fixation = fixation - self.saccades = saccades - - # ALL DEBUG DATA - self.roi = roi - self.edges = edges - self.l_eye = l_eye - self.r_eye = r_eye - self.cluster = cluster - self.context = context - self.screen_man = screen_man - self.sub_frame = sub_frame - - -class Cevent: - """Class representing gaze event, with tracked points scaled to screen, blink and fixation.""" - - def __init__( - self, point: npt.NDArray[np.float64], acceptance_radius: int, calibration_radius: int, calibration: bool = False - ) -> None: - - self.point = point - self.acceptance_radius = acceptance_radius - self.calibration_radius = calibration_radius - self.calibration = calibration diff --git a/eyeGestures/Legacy/processing.py b/eyeGestures/Legacy/processing.py deleted file mode 100644 index 4c1bc69..0000000 --- a/eyeGestures/Legacy/processing.py +++ /dev/null @@ -1,72 +0,0 @@ -"""Module providing a processing pupil position to gaze direction.""" - -from typing import Tuple - -import numpy as np -import numpy.typing as npt - - -class EyeProcessor: - """Class providing processing for eye to obtain gaze direction.""" - - def __init__(self, scale_w=250, scale_h=250): - self.scale_w = scale_w - self.scale_h = scale_h - self.min_x = 0 - self.max_x = 0 - self.min_y = 0 - self.max_y = 0 - self.pupil = None - self.landmarks = None - - def append(self, pupil: Tuple[int, int], landmarks: npt.NDArray[np.float64], pupilBuffor): - """Function appending new pupil point to tracker.""" - - self.pupil = pupil - self.landmarks = landmarks - - # get center: - margin = 5 - self.min_x = np.min(self.landmarks[:, 0]) - margin - self.max_x = np.max(self.landmarks[:, 0]) + margin - self.min_y = np.min(self.landmarks[:, 1]) - margin - self.max_y = np.max(self.landmarks[:, 1]) + margin - - assert self.pupil[0] > self.min_x - assert self.pupil[1] > self.min_y - - width = self.max_x - self.min_x - height = (self.max_y - self.min_y) / 2 - - pupilBuffor.add( - self.__convertPoint( - self.pupil, - width=self.scale_w, - height=self.scale_h, - scale_w=width, - scale_h=height, - offset=(self.min_x, self.min_y), - ) - ) - - def __convertPoint(self, point, width=1.0, height=1.0, scale_w=1.0, scale_h=1.0, offset=(0.0, 0.0)): - min_x, min_y = offset - x = int(((point[0] - min_x) / scale_w) * width) - y = int(((point[1] - min_y) / scale_h) * height) - return (x, y) - - def getAvgPupil(self, width, height, pupilBuffor): - """Function returning average point based on tracked.""" - - if width is not None and height is not None: - _retPupil = self.__convertPoint( - pupilBuffor.getAvg(), - width=width, - height=height, - scale_w=self.scale_w, - scale_h=self.scale_h, - ) - else: - _retPupil = pupilBuffor.getAvg() - - return _retPupil diff --git a/eyeGestures/Legacy/requirements.txt b/eyeGestures/Legacy/requirements.txt deleted file mode 100644 index 4436618..0000000 --- a/eyeGestures/Legacy/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -mediapipe==0.10.8 -numpy==1.23.4 -opencv_contrib_python==4.8.1.78 -opencv_python==4.8.1.78 -opencv_python_headless==4.8.1.78 -scikit_learn==1.5.0 -scipy==1.11.4 diff --git a/eyeGestures/Legacy/scalling_test.py b/eyeGestures/Legacy/scalling_test.py deleted file mode 100644 index b39cdf3..0000000 --- a/eyeGestures/Legacy/scalling_test.py +++ /dev/null @@ -1,60 +0,0 @@ -import eyeGestures.screenTracker.dataPoints as dp -import eyeGestures.screenTracker.screenTracker as scrtr - -# region of interest inside the virtual screen -ROI_WIDTH = 30 -ROI_HEIGHT = 20 - -####################### screen 2 display Tests ################################# - - -def test_scaleUpTest(): - pos = (50, 50) - BIGGER = 10 - - roi = dp.ScreenROI(pos[0], pos[1], ROI_WIDTH, ROI_HEIGHT) - roi2 = dp.ScreenROI(pos[0], pos[1], ROI_WIDTH + BIGGER, ROI_HEIGHT + BIGGER) - - bigger_roi = scrtr.scaleUp(roi, roi2, 0.1) - - assert bigger_roi.width > roi.width - assert bigger_roi.height > roi.height - - -def test_scaleUpTest_known(): - pos = (50, 50) - BIGGER = 10 - - roi = dp.ScreenROI(pos[0], pos[1], ROI_WIDTH, ROI_HEIGHT) - roi2 = dp.ScreenROI(pos[0], pos[1], ROI_WIDTH + BIGGER, ROI_HEIGHT + BIGGER) - - bigger_roi = scrtr.scaleUp(roi, roi2, 0.1) - - assert int(bigger_roi.width) == int(ROI_WIDTH * 1.1) - assert int(bigger_roi.height) == int(ROI_HEIGHT * 1.1) - - -def test_scaleDownTest(): - pos = (50, 50) - SMALLER = 10 - - roi = dp.ScreenROI(pos[0], pos[1], ROI_WIDTH, ROI_HEIGHT) - roi2 = dp.ScreenROI(pos[0], pos[1], ROI_WIDTH - SMALLER, ROI_HEIGHT - SMALLER) - - smaller_roi = scrtr.scaleDown(roi, roi2, -0.1) - - assert smaller_roi.width < roi.width - assert smaller_roi.height < roi.height - - -def test_scaleDownTest_known(): - pos = (50, 50) - SMALLER = 10 - - roi = dp.ScreenROI(pos[0], pos[1], ROI_WIDTH, ROI_HEIGHT) - roi2 = dp.ScreenROI(pos[0], pos[1], ROI_WIDTH - SMALLER, ROI_HEIGHT - SMALLER) - - smaller_roi = scrtr.scaleDown(roi, roi2, -0.1) - - assert int(smaller_roi.width) == int(ROI_WIDTH * 0.9) - assert int(smaller_roi.height) == int(ROI_HEIGHT * 0.9) diff --git a/eyeGestures/Legacy/screenTracker/__init__.py b/eyeGestures/Legacy/screenTracker/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/eyeGestures/Legacy/screenTracker/clusters.py b/eyeGestures/Legacy/screenTracker/clusters.py deleted file mode 100644 index 38d4d53..0000000 --- a/eyeGestures/Legacy/screenTracker/clusters.py +++ /dev/null @@ -1,91 +0,0 @@ -import numpy as np -from sklearn.cluster import DBSCAN - - -class Cluster: - """Class representing one ROI cluster""" - - def __init__(self, label, points): - - self.label = label - self.points = np.array(points) - self.weight = len(self.points) - self.__centroid = self.centroid(points) - - x, y, w, h = self.boundaries(points) - - self.x = x - self.y = y - self.w = w - self.h = h - - def centroid(self, points): - """Function calculating and returning center of ROI""" - - x, y, w, h = self.boundaries(points) - - c_x, c_y = (x + w / 2, y + h / 2) - - x, y = sum(points) / len(points) - - c_x, c_y = (c_x + x) / 2, (c_y + y) / 2 - return (c_x, c_y) - - def boundaries(self, points): - """Function calculating and returning boundaries of cluster""" - - x = np.min(points[:, 0]) - width = abs(np.max(points[:, 0]) - x) - - y = np.min(points[:, 1]) - height = abs(np.max(points[:, 1]) - y) - - return (x, y, width, height) - - def getBoundaries(self): - """Function returning boundaries of cluster""" - return (self.x, self.y, self.w, self.h) - - def getCenter(self): - """Function returning center of ROI""" - return self.__centroid - - -class Clusters: - """Algorithm dividing tracked points into clusters so it can be estimated were is center of ROI""" - - def __init__(self, buffer): - buffer = np.array(buffer) - - self.head = len(buffer) - 1 - self.main_cluster = None - self.clusters = [] - - dbScan = DBSCAN(eps=12, min_samples=3) - clustering = dbScan.fit(buffer) - - labels = clustering.labels_ - unique_labels = set(labels) - {-1} - - for u_label in unique_labels: - core_sample_indices = clustering.core_sample_indices_ - cluster_points = buffer[core_sample_indices][labels[clustering.core_sample_indices_] == u_label] - self.clusters.append(Cluster(u_label, cluster_points)) - - # return sorted(self.clusters, key=lambda cluster: cluster.weight)[-1] - if len(self.clusters) > 0: - self.main_cluster = self.clusters[labels[self.head]] - else: - self.main_cluster = None - - def clearPoints(self): - """[Possibly dead code] Function reseting cluster""" - self.head = 0 - - def getClusters(self): - """Function returning all clusters""" - return self.clusters - - def getMainCluster(self): - """Function returning main clusters""" - return self.main_cluster diff --git a/eyeGestures/Legacy/screenTracker/dataPoints.py b/eyeGestures/Legacy/screenTracker/dataPoints.py deleted file mode 100644 index fe1c296..0000000 --- a/eyeGestures/Legacy/screenTracker/dataPoints.py +++ /dev/null @@ -1,61 +0,0 @@ -class Center: - """Helper representing Center of object with x,y,width,height""" - - def __init__(self, x, y, width, height): - self.x = (x + width) / 2 - self.y = (y + height) / 2 - - -class Screen: - """Helper representing screen by making box of width,height""" - - def __init__(self, width, height): - self.x = 0 - self.y = 0 - self.width = width - self.height = height - - def getCenter(self): - """Function returnig center of the screen""" - return Center(self.x, self.y, self.width, self.height) - - -class ScreenROI: - """Helper representing ROI by making box of width,height with x and y offset""" - - def __init__(self, x, y, width, height): - self.x = x - self.y = y - self.width = width - self.height = height - - def setCenter(self, x, y): - """Function allowing to move ROI by changing its center""" - self.x = x - self.width / 2 - self.y = y - self.height / 2 - - def getCenter(self): - """Function returnig center of the ROI""" - return Center(self.x, self.y, self.width, self.height) - - def getBoundaries(self): - """Function returnig boundaries of the ROI""" - return (self.x, self.y, self.width, self.height) - - -class Display: - """Helper representing Display by making box of width,height with x and y offset""" - - def __init__(self, width, height, offset_x, offset_y): - self.width = width - self.height = height - self.offset_x = offset_x - self.offset_y = offset_y - - # self.buffor = Buffor(20) - - def getCenter(self): - """Function returnig center of the Display""" - center_x = (self.offset_x + self.width) / 2 - center_y = (self.offset_y + self.height) / 2 - return (center_x, center_y) diff --git a/eyeGestures/Legacy/screenTracker/heatmap.py b/eyeGestures/Legacy/screenTracker/heatmap.py deleted file mode 100644 index 7a6a87a..0000000 --- a/eyeGestures/Legacy/screenTracker/heatmap.py +++ /dev/null @@ -1,68 +0,0 @@ -import numpy as np - - -class Heatmap: - """Helper representing Heatmap of tracked points""" - - def __init__(self, width, height, buffor): - self.inc_step = 10 - self.step = 10 - bars = self.step - - self.width = width - self.height = height - - bars_x = int(width / self.step) - bars_y = int(height / self.step) - - self.axis_x = np.zeros((bars_x)) - self.axis_y = np.zeros((bars_y)) - - for point in buffor: - x = point[0] - y = point[1] - - self.axis_x[min(abs(int(x / bars)), bars_x - 1)] += self.inc_step - self.axis_y[min(abs(int(y / bars)), bars_x - 1)] += self.inc_step - - self.min_x = self.__getParam((self.axis_x > self.inc_step * 4), last=False) - self.max_x = self.__getParam((self.axis_x > self.inc_step * 4), last=True) - self.min_y = self.__getParam((self.axis_y > self.inc_step * 4), last=False) - self.max_y = self.__getParam((self.axis_y > self.inc_step * 4), last=True) - - def __getParam(self, param, last: bool = False): - ret = 0 - retArray = np.where(param) - - if len(retArray[0]) > 0: - ret = retArray[0][-int(last)] * self.step - - if not ret == np.nan: - ret = int(ret) - - return ret - - def getBoundaries(self): - """Function returning boundaries of heatmap""" - x = self.min_x - y = self.min_y - w = self.max_x - self.min_x - h = self.max_y - self.min_y - return (x, y, w, h) - - def getCenter(self): - """Function returning center of heatmap""" - center_x = int((self.max_x - self.min_x) / 2 + self.min_x) - center_y = int((self.max_y - self.min_y) / 2 + self.min_y) - return (center_x, center_y) - - def getPeak(self): - """Function returning peak of heatmap""" - x = int(np.argmax(self.axis_x) * self.inc_step) - y = int(np.argmax(self.axis_y) * self.inc_step) - return (x, y) - - def getHist(self): - """Function returning histogram of the heatmap. - This heatmap is simply 2d histogram, so this function returns values for each axis.""" - return (self.axis_x / self.inc_step, self.axis_y / self.inc_step) diff --git a/eyeGestures/Legacy/screenTracker/screenTracker.py b/eyeGestures/Legacy/screenTracker/screenTracker.py deleted file mode 100644 index a759ec2..0000000 --- a/eyeGestures/Legacy/screenTracker/screenTracker.py +++ /dev/null @@ -1,221 +0,0 @@ -import eyeGestures.screenTracker.dataPoints as dp -from eyeGestures.screenTracker.clusters import Clusters -from eyeGestures.screenTracker.heatmap import Heatmap - -# THIS FILE IS SLOWLY BECOMING BLACK MAGIC - - -def detect_if_inside(point, rect): - px = point[0] - py = point[1] - x, y, width, height = rect.getBoundaries() - - x_in = x < px < x + width - y_in = y < py < y + height - - return x_in and y_in - - -def detect_edges(roi, display, point_on_screen, point_on_display): - """Function performing edge detection based on point, screen and display sizes""" - s_x, s_y = point_on_screen - d_x, d_y = point_on_display - - x, y, width, height = roi.getBoundaries() - new_roi = dp.ScreenROI(x, y, width, height) - - # new_w = screen.width - # margin = 5 - # TODO: fix this to estimate w and h - if d_x <= 0: - new_roi.width = new_roi.width + abs(new_roi.x - s_x) - new_roi.x = s_x - - if d_x >= display.width: - new_roi.width = abs(new_roi.x - s_x) - - if d_y <= 0: - new_roi.height = new_roi.height + abs(new_roi.y - s_y) - new_roi.y = s_y - - if d_y >= display.height: - new_roi.height = abs(new_roi.y - s_y) - - return new_roi - - -def rescale_h(roi, scale_h, change=0.5): - """change size on height""" - scale_diff_h = abs(1.0 - scale_h) - - ret_heigth = roi.height - - if scale_diff_h > change: - ret_heigth = roi.height / 1.0 * scale_h - - return ret_heigth - - -def rescale_w(roi, scale_w, change=0.5): - """change size on width""" - scale_diff_w = abs(1.0 - scale_w) - - ret_width = roi.width - - if scale_diff_w > change: - ret_width = roi.width / 1.0 * scale_w - - return ret_width - - -def scaleDown(roi, edge, scale): - """Function scalling down one roi till edges are met""" - - _, _, cluster_w, cluster_h = edge.getBoundaries() - - new_roi = dp.ScreenROI(roi.x, roi.y, roi.width, roi.height) - if cluster_w < roi.width: - new_scale_w = 1.0 + scale - new_w = rescale_w(roi, new_scale_w, scale) - new_roi.width = new_w - - if cluster_h < roi.height: - new_scale_h = 1.0 + scale - new_h = rescale_h(roi, new_scale_h, scale) - new_roi.height = new_h - - return new_roi - - -def scaleUp(roi, roi2, scale): - """Function scalling up one roi into another roi, - second roi is for limiting scaling operation and scale is telling how much you can scale""" - - _, _, roi2_w, roi2_h = roi2.getBoundaries() - - new_roi = dp.ScreenROI(roi.x, roi.y, roi.width, roi.height) - - if roi2_w > roi.width: - new_scale_w = 1.0 + scale - new_w = rescale_w(roi, new_scale_w, scale) - new_roi.width = new_w - - if roi2_h > roi.height: - new_scale_h = 1.0 + scale - new_h = rescale_h(roi, new_scale_h, scale) - new_roi.height = new_h - - return new_roi - - -class ScreenProcessor: - """Class for doing tracking and converting screen to display and display to screen""" - - def __init__(self): - pass - - # RUN FEATURE - def process(self, point, point_offset, buffor_length, roi, edges, screen, display, heatmap): - """Function performing main processing for screen processor. Tons of parameters doing brrrr""" - - s_point_offset = self.display2screen(point_offset, screen, display) - p_on_display = self.screen2display([point[0] + s_point_offset[0], point[1] + s_point_offset[1]], roi, display) - # p_on_display = self.screen2display(point,roi,display) - - if buffor_length > 20: - new_edges = detect_edges(roi, display, point, p_on_display) - edges.x = new_edges.x - edges.y = new_edges.y - edges.width = new_edges.width - edges.height = new_edges.height - - p_on_display = ( - p_on_display[0] + display.offset_x, - p_on_display[1] + display.offset_y, - ) - - # return how close that is hist region - _, _, roi_w, roi_h = heatmap.getBoundaries() - closeness_percentage = (roi_w * roi_h) / (screen.width * screen.height) - return (p_on_display, closeness_percentage) - - # CALIBRATION FEATURE - # it should not affect objects but produce new ones - def update(self, roi, edges, cluster, heatmap): - """Function to update screen processor with new clusters and heatmaps""" - - x, y = heatmap.getCenter() - # ===================================== - # ---------histogram obtained---------- - # ===================================== - new_roi = dp.ScreenROI(roi.x, roi.y, roi.width, roi.height) - - new_roi.setCenter(x, y) - edges.setCenter(x, y) - # self.eyeScreen.setCenter(x,y) - new_roi = scaleUp(new_roi, edges, scale=0.1) - - # ===================================== - # if screen is bigger than edges make it smaller - # ===================================== - new_roi = scaleDown(new_roi, cluster, scale=-0.1) - return new_roi - - def screen2display(self, screen_point, screen, display): - """Function converting screen points to display points""" - - s_x, s_y = screen_point[0], screen_point[1] - - d_x = int((s_x - screen.x) / screen.width * display.width) - d_y = int((s_y - screen.y) / screen.height * display.height) - - d_x = max(d_x, 0) - d_y = max(d_y, 0) - d_x = min(d_x, display.width) - d_y = min(d_y, display.height) - - return (d_x, d_y) - - def display2screen(self, display_point, screen, display): - """Function converting display points to screen points""" - - d_x, d_y = display_point[0], display_point[1] - - s_x = int((d_x) / display.width * screen.width) - s_y = int((d_y) / display.height * screen.height) - - return (s_x, s_y) - - -class ScreenManager: - """Class performing most of tracking after estimating position of gaze""" - - def __init__( - self, - ): - self.screen_processor = ScreenProcessor() - - def process(self, buffor, roi, edges, screen, display, calibration, offset): - """Function doing processing and tracking and calibration of tracker""" - - heatmap = Heatmap(screen.width, screen.height, buffor.getBuffor()) - cluster = Clusters(buffor.getBuffor()).getMainCluster() - - if cluster is not None: - - if calibration: - roi = self.screen_processor.update(roi, edges, cluster, heatmap) - - p, _ = self.screen_processor.process( - buffor.getAvg(20), - (offset[0], offset[1]), - len(buffor.getBuffor()), - roi, - edges, - screen, - display, - heatmap, - ) - - return (p, roi, cluster) - return ([0, 0], roi, cluster) diff --git a/eyeGestures/Legacy/screenTracker_test.py b/eyeGestures/Legacy/screenTracker_test.py deleted file mode 100644 index 6030ae2..0000000 --- a/eyeGestures/Legacy/screenTracker_test.py +++ /dev/null @@ -1,116 +0,0 @@ -import eyeGestures.screenTracker.dataPoints as dp -import eyeGestures.screenTracker.screenTracker as scrtr - -# virtual tracking ScreenProcessor -SCREEN_WIDTH = 500 -SCREEN_HEIGHT = 500 - -# region of interest inside the virtual ScreenProcessor -ROI_WIDTH = 50 -ROI_HEIGHT = 50 - -# size of real display -DISPLAY_WIDTH = 1200 -DISPLAY_HEIGHT = 1800 - -####################### ScreenProcessor 2 display Tests ################################# - - -def test_screen2display_1_1(): - """[TEST]""" - point = (1, 1) - - roi = dp.ScreenROI(0, 0, ROI_WIDTH, ROI_HEIGHT) - display = dp.Display(DISPLAY_WIDTH, DISPLAY_HEIGHT, 0, 0) - - tracker = scrtr.ScreenProcessor() - p = tracker.screen2display(point, roi, display) - - assert p == ( - point[0] / ROI_WIDTH * DISPLAY_WIDTH, - point[1] / ROI_HEIGHT * DISPLAY_HEIGHT, - ) - - -def test_screen2display_55_1(): - """[TEST]""" - point = (55, 1) - - roi = dp.ScreenROI(0, 0, ROI_WIDTH, ROI_HEIGHT) - display = dp.Display(DISPLAY_WIDTH, DISPLAY_HEIGHT, 0, 0) - - tracker = scrtr.ScreenProcessor() - p = tracker.screen2display(point, roi, display) - - assert p == (DISPLAY_WIDTH, point[1] / ROI_HEIGHT * DISPLAY_HEIGHT) - - -def test_screen2display_55_55(): - """[TEST]""" - point = (55, 55) - - roi = dp.ScreenROI(0, 0, ROI_WIDTH, ROI_HEIGHT) - display = dp.Display(DISPLAY_WIDTH, DISPLAY_HEIGHT, 0, 0) - - tracker = scrtr.ScreenProcessor() - p = tracker.screen2display(point, roi, display) - - assert p == (DISPLAY_WIDTH, DISPLAY_HEIGHT) - - -def test_screen2display_0_0(): - """[TEST]""" - point = (0, 0) - - roi = dp.ScreenROI(0, 0, ROI_WIDTH, ROI_HEIGHT) - display = dp.Display(DISPLAY_WIDTH, DISPLAY_HEIGHT, 0, 0) - - tracker = scrtr.ScreenProcessor() - p = tracker.screen2display(point, roi, display) - - assert p == (0, 0) - - -def test_screen2display_1_1_pos_50_50(): - """[TEST]""" - point = (51, 51) - pos = (50, 50) - - roi = dp.ScreenROI(pos[0], pos[1], ROI_WIDTH, ROI_HEIGHT) - display = dp.Display(DISPLAY_WIDTH, DISPLAY_HEIGHT, 0, 0) - - tracker = scrtr.ScreenProcessor() - p = tracker.screen2display(point, roi, display) - - assert p == ( - (point[0] - pos[0]) / ROI_WIDTH * DISPLAY_WIDTH, - (point[1] - pos[1]) / ROI_HEIGHT * DISPLAY_HEIGHT, - ) - - -def test_screen2display_55_55_pos_50_50(): - """[TEST]""" - point = (105, 105) - pos = (50, 50) - - roi = dp.ScreenROI(pos[0], pos[1], ROI_WIDTH, ROI_HEIGHT) - display = dp.Display(DISPLAY_WIDTH, DISPLAY_HEIGHT, 0, 0) - - tracker = scrtr.ScreenProcessor() - p = tracker.screen2display(point, roi, display) - - assert p == (DISPLAY_WIDTH, DISPLAY_HEIGHT) - - -def test_screen2display_0_0_pos_50_50(): - """[TEST]""" - point = (0, 0) - pos = (50, 50) - - roi = dp.ScreenROI(pos[0], pos[1], ROI_WIDTH, ROI_HEIGHT) - display = dp.Display(DISPLAY_WIDTH, DISPLAY_HEIGHT, 0, 0) - - tracker = scrtr.ScreenProcessor() - p = tracker.screen2display(point, roi, display) - - assert p == (0, 0) diff --git a/eyeGestures/Legacy/utils.py b/eyeGestures/Legacy/utils.py deleted file mode 100644 index aba78ab..0000000 --- a/eyeGestures/Legacy/utils.py +++ /dev/null @@ -1,240 +0,0 @@ -import pickle -import platform -import queue -import threading -import time - -import cv2 -import numpy as np -import numpy.typing as npt - -# Make predictions for new data points - - -def recoverable(ret_error_params=()): - def decorator(func): - """ - timeit - """ - - def inner(*args, **kwargs): - """ - inner - """ - try: - return func(*args, **kwargs) - except Exception as e: - print(f"Caugh error: {e}") - return ret_error_params - - return inner - - return decorator - - -def timeit(func): - """ - timeit - """ - - def inner(*args, **kwargs): - """ - inner - """ - start = time.time() - ret = func(*args, **kwargs) - print(f"Elapsed time: {time.time() - start}") - return ret - - return inner - - -def low_pass_filter_fourier(data: npt.NDArray[np.float64], cutoff_frequency: int) -> npt.NDArray[np.float64]: - # Apply Fourier Transform-based filter column-wise - filtered_data = np.zeros_like(data, dtype=float) - for col in range(data.shape[1]): # Iterate over each column - fft_data = np.fft.fft(data[:, col]) - frequencies = np.fft.fftfreq(len(data[:, col])) - # Apply the low-pass filter - fft_data[np.abs(frequencies) > cutoff_frequency] = 0 - # Perform Inverse Fourier Transform - filtered_data[:, col] = np.fft.ifft(fft_data).real - return filtered_data - - -def shape_to_np(shape, dtype="int"): - """ - shape_to_np - """ - coords = np.zeros((68, 2), dtype=dtype) - for i in range(0, 68): - coords[i] = (shape.part(i).x, shape.part(i).y) - return coords - - -def make_image_grid(images, rows, cols): - """ - Make a grid of images. - - Parameters: - - images: list of images to form the grid (all images must be of the same size and type) - - rows, cols: number of rows and columns in the grid - - Returns: - - grid_image: image grid as a single image - """ - # Check if the list of images is not empty and that we have enough to fill the grid - assert images, "List of images is empty" - # assert len(images) >= rows * cols, "Not enough images to fill the grid" - - # Get image dimensions - img_h, img_w = images[0].shape[:2] - - if len(images[0].shape) > 2: - # Create a black canvas to draw the grid on - grid_image = np.zeros((img_h * rows, img_w * cols, images[0].shape[2]), dtype=np.uint8) - else: - grid_image = np.zeros((img_h * rows, img_w * cols), dtype=np.uint8) - - # Copy images to the grid - for i, img in enumerate(images): - if i >= rows * cols: - break # Stop if we have filled the grid - row = i // cols - col = i % cols - grid_image[row * img_h : (row + 1) * img_h, col * img_w : (col + 1) * img_w] = img - - return grid_image - - -class var: - - def __init__(self, _var): - self.__var = _var - - def set(self, _var): - self.__var = _var - - def get(self): - return self.__var - - -class Buffor: - - def __init__(self, length): - self.length = length - self.__buffor = [] - - def add(self, _var): - if len(self.__buffor) >= self.length: - self.__buffor.pop(0) - - self.__buffor.append(_var) - - def getAvg(self, lenght=0): - return np.sum(self.__buffor[-lenght:], axis=0) / len(self.__buffor[-lenght:]) - - def getBuffor(self): - return self.__buffor - - def loadBuffor(self, buffor): - self.__buffor = buffor - - def getLast(self): - return self.__buffor[0] - - def getFirst(self): - return self.__buffor[len(self.__buffor) - 1] - - def getLen(self): - return len(self.__buffor) - - def isFull(self): - return len(self.__buffor) >= self.length - - def flush(self): - tmp = self.__buffor[-1] - self.__buffor = [] - self.__buffor.append(tmp) - - def clear(self): - self.__buffor = [] - - -# Bufforless - - -class VideoCapture: - """Wrapper on openCV2 stream making it bufforless and adding camera search""" - - def __init__(self, name, bufforless=True): - self.bufforless = bufforless - self.run = True - - if isinstance(name, str): - if ".pkl" in name: - self.stream = False - else: - self.stream = True - else: - self.stream = True - - if self.stream: - self.prev_frame = None - - self.__openCam(name) - - self.q = queue.Queue() - self.t = threading.Thread(target=self.__reader) - self.t.start() - else: - self.frames = [] - with open(name, "rb") as file: - self.frames = pickle.load(file) - - def __openCam(self, name): - if isinstance(name, int): - if "Windows" in platform.system(): - self.cap = cv2.VideoCapture(name, cv2.CAP_DSHOW) - else: - self.cap = cv2.VideoCapture(name) - - if self.cap is None or not self.cap.isOpened(): - print(f"Was unable to open camera: {name}.") - print(f"Trying to open camera: {name}.") - if name + 1 < 10: - self.__openCam(name + 1) - else: - self.cap = cv2.VideoCapture(name) - - def __reader(self): - while self.run: - ret, frame = self.cap.read() - if not ret: - break - if not self.q.empty() and self.bufforless: - try: - self.q.get_nowait() - except queue.Empty: - pass - self.q.put((ret, frame)) - - self.flush() - - def flush(self): - while not self.q.empty(): - self.q.get() - - def read(self): - """Function returning latest frame""" - if self.stream: - return self.q.get() - frame = self.frames.pop(0) - self.frames.pop(0) - return ((len(self.frames) >= 1), frame) - - def close(self): - """Function closing stream""" - self.run = False - self.t.join() - self.cap.release() diff --git a/eyeGestures/__init__.py b/eyeGestures/__init__.py index a1cc674..e657c9f 100644 --- a/eyeGestures/__init__.py +++ b/eyeGestures/__init__.py @@ -42,9 +42,6 @@ def __init__(self, calibration_radius: int = 1000) -> None: self.starting_head_position = np.zeros((1, 2)) self.starting_size = np.zeros((1, 2)) - def uploadCalibrationMap(self, points: npt.NDArray[np.float64], context: str = "main") -> None: - self.clb.updMatrix(np.array(points)) - def getLandmarks(self, frame: cv2.typing.MatLike) -> Tuple[npt.NDArray[np.float64], bool, cv2.typing.MatLike]: frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) @@ -104,10 +101,10 @@ def getLandmarks(self, frame: cv2.typing.MatLike) -> Tuple[npt.NDArray[np.float6 ] return key_points, blink, subframe - def whichAlgorithm(self, context: str = "main") -> str: + def whichAlgorithm(self) -> str: return "rust engine" - def reset(self, context: str = "main") -> None: + def reset(self) -> None: self.filled_points = 0 def setFixation(self, fix: float) -> None: From f248a20d4d694af3d3e935ab18300db0118e1ebb Mon Sep 17 00:00:00 2001 From: PeterWaIIace Date: Mon, 8 Jun 2026 22:48:27 +0200 Subject: [PATCH 07/14] updating makefile --- Makefile | 32 ++++++++------------------------ 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/Makefile b/Makefile index 4fe0de2..a582296 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,12 @@ # Python build FORMAT_TOOLS = uv run --with isort --with black CHECK_TOOLS = uv run --with pylint --with flake8 --with mypy --with isort --with black + +MINIFY = npx terser +MINIFY_FLAGS = --compress --mangle +JS_SRC = web/src/eyegestures.js +MIN = $(JS_SRC:.js=.min.js) + .PHONY: format format_check test min wasm python python-help format: @@ -17,12 +23,6 @@ check: format_check $(CHECK_TOOLS) python -m mypy eyeGestures # Web build - -MINIFY = npx terser -MINIFY_FLAGS = --compress --mangle -JS_SRC = web/src/eyegestures.js -MIN = $(JS_SRC:.js=.min.js) - min: $(MINIFY) $(JS_SRC) $(MINIFY_FLAGS) -o engine/pkg/eyegestures.min.js @@ -33,13 +33,9 @@ wasm: # Python build PYTHON = uv run MATURIN_PYTHON_FLAGS = --release --no-default-features --features python -# Space-separated interpreters used by `make python`. -# Example single: `make python PYTHON_INTERPRETERS="python3.13"` -# Example multi: `make python PYTHON_INTERPRETERS="python3.12 python3.13"` -# Default: use whichever `python` is in PATH. -PYTHON_INTERPRETERS ?= python # Set to 1 to allow builds for newer CPython versions than PyO3 officially supports. PYO3_USE_ABI3_FORWARD_COMPATIBILITY ?= 1 +PYTHON_INTERPRETERS=python3.12 python3.13 ifeq ($(OS),Windows_NT) PYO3_FORWARD_ENV = set PYO3_USE_ABI3_FORWARD_COMPATIBILITY=$(PYO3_USE_ABI3_FORWARD_COMPATIBILITY) && @@ -48,19 +44,7 @@ PYO3_FORWARD_ENV = PYO3_USE_ABI3_FORWARD_COMPATIBILITY=$(PYO3_USE_ABI3_FORWARD_C endif python: - cd ./engine && $(PYO3_FORWARD_ENV) maturin build $(MATURIN_PYTHON_FLAGS) --interpreter $(PYTHON_INTERPRETERS) - -python-help: - @echo "make python" - @echo " - builds wheel using default interpreter: python" - @echo "make python PYTHON_INTERPRETERS=\"python3.13\"" - @echo " - builds wheel for one interpreter" - @echo "make python PYTHON_INTERPRETERS=\"python3.12 python3.13\"" - @echo " - builds wheel files in engine/target/wheels" - @echo "make python PYO3_USE_ABI3_FORWARD_COMPATIBILITY=0" - @echo " - enforces PyO3 max supported Python version" - @echo "Tip (Windows): prefer explicit paths if discovery fails, e.g." - @echo " make python PYTHON_INTERPRETERS=\"C:/Python313/python.exe C:/Python314/python.exe\"" + $(PYO3_FORWARD_ENV) maturin build $(MATURIN_PYTHON_FLAGS) --interpreter $(PYTHON_INTERPRETERS) clean: rm -f src/eyegestures.min.js From 63be0227d2eff6a71583d57629adcf26cf913c88 Mon Sep 17 00:00:00 2001 From: W4ltz <40773550+PeterWaIIace@users.noreply.github.com> Date: Mon, 8 Jun 2026 23:22:10 +0200 Subject: [PATCH 08/14] Adding windows builds for 64 and 32 bit systems --- Makefile | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Makefile b/Makefile index a582296..2f69530 100644 --- a/Makefile +++ b/Makefile @@ -33,6 +33,7 @@ wasm: # Python build PYTHON = uv run MATURIN_PYTHON_FLAGS = --release --no-default-features --features python + # Set to 1 to allow builds for newer CPython versions than PyO3 officially supports. PYO3_USE_ABI3_FORWARD_COMPATIBILITY ?= 1 PYTHON_INTERPRETERS=python3.12 python3.13 @@ -43,8 +44,14 @@ else PYO3_FORWARD_ENV = PYO3_USE_ABI3_FORWARD_COMPATIBILITY=$(PYO3_USE_ABI3_FORWARD_COMPATIBILITY) endif +ifeq ($(OS),Windows_NT) +python: + $(PYO3_FORWARD_ENV) maturin build $(MATURIN_PYTHON_FLAGS) --target i686-pc-windows-msvc --interpreter $(PYTHON_INTERPRETERS) + $(PYO3_FORWARD_ENV) maturin build $(MATURIN_PYTHON_FLAGS) --target x86_64-pc-windows-msvc --interpreter $(PYTHON_INTERPRETERS) +else python: $(PYO3_FORWARD_ENV) maturin build $(MATURIN_PYTHON_FLAGS) --interpreter $(PYTHON_INTERPRETERS) +endif clean: rm -f src/eyegestures.min.js From 60d2c6386f02aa9d96f7e12942c503dedb295c7f Mon Sep 17 00:00:00 2001 From: PeterWaIIace Date: Mon, 8 Jun 2026 23:38:57 +0200 Subject: [PATCH 09/14] updating format and lint --- .flake8 | 3 +++ Makefile | 4 ++-- ...uresEngine.cpython-313-x86_64-linux-gnu.so | Bin 0 -> 680840 bytes eyeGestures/__init__.py | 20 +++++++++--------- eyeGestures/eye.py | 20 +++++++++--------- 5 files changed, 25 insertions(+), 22 deletions(-) create mode 100644 .flake8 create mode 100755 eyeGestures/EyegesturesEngine.cpython-313-x86_64-linux-gnu.so diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..e658540 --- /dev/null +++ b/.flake8 @@ -0,0 +1,3 @@ +[flake8] +max-line-length = 120 +extend-ignore = E203, E266, E712, W503 diff --git a/Makefile b/Makefile index 2f69530..e772576 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,5 @@ +.PHONY: format format_check test min wasm python python-help + # Python build FORMAT_TOOLS = uv run --with isort --with black CHECK_TOOLS = uv run --with pylint --with flake8 --with mypy --with isort --with black @@ -7,8 +9,6 @@ MINIFY_FLAGS = --compress --mangle JS_SRC = web/src/eyegestures.js MIN = $(JS_SRC:.js=.min.js) -.PHONY: format format_check test min wasm python python-help - format: $(FORMAT_TOOLS) python -m isort eyeGestures $(FORMAT_TOOLS) python -m black eyeGestures diff --git a/eyeGestures/EyegesturesEngine.cpython-313-x86_64-linux-gnu.so b/eyeGestures/EyegesturesEngine.cpython-313-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..a54fd1366521b70406b624df567a404496aaf4a6 GIT binary patch literal 680840 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 ZGXP!FQ$g#aM0zQ> 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

?z$Fk6LBrX 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 z�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 E0#r(34gdfE literal 0 HcmV?d00001 diff --git a/eyeGestures/__init__.py b/eyeGestures/__init__.py index e657c9f..1745e40 100644 --- a/eyeGestures/__init__.py +++ b/eyeGestures/__init__.py @@ -1,5 +1,3 @@ -import pickle -import time from typing import Any, Dict, List, Optional, Tuple import cv2 @@ -11,10 +9,10 @@ from eyeGestures.utils import recoverable try: - from .EyegesturesEngine import EyeGesturesEnginePython as RustEyeGesturesEngine + from .EyegesturesEngine import EyeGesturesEnginePython as RustEyeGesturesEngine # type: ignore[import-untyped] except ImportError: try: - from EyegesturesEngine import EyeGesturesEnginePython as RustEyeGesturesEngine + from EyegesturesEngine import EyeGesturesEnginePython as RustEyeGesturesEngine # type: ignore[import-untyped] except ImportError: RustEyeGesturesEngine = None @@ -33,7 +31,7 @@ def __init__(self, calibration_radius: int = 1000) -> None: self.finder = FaceFinder() self.face = Face() - self.engine = None + self.engine: Optional[Any] = None self.fix: Optional[float] = None self.fixationTracker: Dict[str, Fixation] = dict() @@ -121,11 +119,13 @@ def step( if self.engine is None: self.engine = RustEyeGesturesEngine(width, height) - landmarks = self.finder.find(frame).face_landmarks[0] - scaled_landmarks = [] - for landmark in landmarks: - scaled_landmarks.append((landmark.x, landmark.y)) - scaled_landmarks = np.array(scaled_landmarks) + find_result = self.finder.find(frame) + if find_result is None or not find_result.face_landmarks: + raise ValueError("No face landmarks detected") + + landmarks = find_result.face_landmarks[0] + scaled_landmarks = np.array([(landmark.x, landmark.y) for landmark in landmarks], dtype=np.float64) + assert self.engine is not None result = self.engine.process(scaled_landmarks.flatten().tolist()) x, y = result[0], result[1] diff --git a/eyeGestures/eye.py b/eyeGestures/eye.py index 81ddfad..490f838 100644 --- a/eyeGestures/eye.py +++ b/eyeGestures/eye.py @@ -53,8 +53,8 @@ def __init__(self, side: int) -> None: self.y = 0 self.width = 0 self.height = 0 - self.center_x = 0 - self.center_y = 0 + self.center_x: float = 0.0 + self.center_y: float = 0.0 self.image: Optional[cv2.typing.MatLike] = None self.pupil: Optional[npt.NDArray[np.float64]] = None self.offset: Optional[npt.NDArray[np.float64]] = None @@ -162,19 +162,19 @@ def _process(self, image: cv2.typing.MatLike, region: npt.NDArray[np.float64]) - masked_image = cv2.bitwise_not(background, cv2.cvtColor(image.copy(), cv2.COLOR_BGR2GRAY), mask=mask) margin = 2 - min_x = np.min(region_int[:, 0]) - margin - max_x = np.max(region_int[:, 0]) + margin - min_y = np.min(region_int[:, 1]) - margin - max_y = np.max(region_int[:, 1]) + margin + min_x = int(np.min(region_int[:, 0]) - margin) + max_x = int(np.max(region_int[:, 0]) + margin) + min_y = int(np.min(region_int[:, 1]) - margin) + max_y = int(np.max(region_int[:, 1]) + margin) self.x = min_x self.y = min_y - self.width = np.max(region_int[:, 0]) - np.min(region_int[:, 0]) - self.height = np.max(region_int[:, 1]) - np.min(region_int[:, 1]) + self.width = int(np.max(region_int[:, 0]) - np.min(region_int[:, 0])) + self.height = int(np.max(region_int[:, 1]) - np.min(region_int[:, 1])) - self.center_x = (min_x + max_x) / 2 - self.center_y = (min_y + max_y) / 2 + self.center_x = float((min_x + max_x) / 2) + self.center_y = float((min_y + max_y) / 2) # HACKETY_HACK: assert self.pupil is not None From 91060a9d492a919346c16b760485e381bcb8b2da Mon Sep 17 00:00:00 2001 From: PeterWaIIace Date: Mon, 8 Jun 2026 23:45:25 +0200 Subject: [PATCH 10/14] adding new readme --- README.md | 121 ++++-------------------------------------------------- 1 file changed, 8 insertions(+), 113 deletions(-) diff --git a/README.md b/README.md index f6578b2..5c954af 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,6 @@ EyeGestures is open source eyetracking software/library using native webcams and Our [Mission](https://github.com/NativeSensors/EyeGestures/blob/main/MISSION.md)! ### 💜 Sponsors: -> [!NOTE] -> Check JS port: [EyeGesturesLite](https://github.com/NativeSensors/EyeGesturesLite)! - - > [!IMPORTANT] > EyeGestures is a fully volunteer-based project and exists thanks to your donations and support. > @@ -30,11 +26,7 @@ Our [Mission](https://github.com/NativeSensors/EyeGestures/blob/main/MISSION.md) > > 📢📢 **If you are bussiness and would like to collaborate, reach us: contact@eyegestures.com** 📢📢 > -> We can provide custom comercial license and invoices if needed. -> -> -> -> +> We are happy to be involved in your project! > --------- ### 🔨 Projects build with EyeGestures: @@ -48,23 +40,11 @@ Our [Mission](https://github.com/NativeSensors/EyeGestures/blob/main/MISSION.md)

-- [EyePilot](https://polar.sh/NativeSensors/products/5fce104c-46ec-4203-892b-a26e0e0ead18) +- [EyePilot](https://polar.sh/NativeSensors/products/5fce104c-46ec-4203-892b-a26e0e0ead18) - waiting to be restored - [EyePather](https://polar.sh/NativeSensors/posts/eyepather-new-tool-in-eyegestures-ecosystem) - discontinued -- [EyeFocus](https://polar.sh/NativeSensors/products/3756d557-134e-4e7e-ac50-d850126aa325?ref=producthunt) <- 4th best product on PH! +- [EyeFocus](https://polar.sh/NativeSensors/products/3756d557-134e-4e7e-ac50-d850126aa325?ref=producthunt) - Add your project! contact@eyegestures.com or PR -Subscribe and get access to our software: -

- Subscribe on Polar - --------- -

- -

- -### ⚓ Ports: -- JavaScript version: [EyeGesturesLite](https://github.com/NativeSensors/EyeGesturesLite)! - ### 💻 Install ``` python3 -m pip install eyeGestures @@ -78,20 +58,16 @@ python3 -m pip install eyeGestures Tracker works best when your camera or laptop is at arm's length, similar to how you would typically use it. If you are further away, it may be less responsive for now - currently working on solving this issue. ``` -python3 examples/simple_example_v2.py -``` - -``` -python3 examples/simple_example.py [legacy tracker, will become obsolete] +python3 examples/simple_example_v4.py ``` ### 🔧 Build your own: -#### Using EyeGesture Engine V3 - Faster smaller better: +#### Engine V4 - Rust based enginee: ```python from eyeGestures.utils import VideoCapture -from eyeGestures import EyeGestures_v3 +from eyeGestures import EyeGestures_v4 # Initialize gesture engine and video capture gestures = EyeGestures_v3() @@ -119,90 +95,9 @@ while True: -#### Using EyeGesture Engine V2 - [Legacy]: - -```python -from eyeGestures.utils import VideoCapture -from eyeGestures import EyeGestures_v2 - -# Initialize gesture engine and video capture -gestures = EyeGestures_v2() -cap = VideoCapture(0) -calibrate = True -screen_width = 500 -screen_height= 500 - -# Process each frame -while True: - ret, frame = cap.read() - event, cevent = gestures.step(frame, - calibrate, - screen_width, - screen_height, - context="my_context") - - if event: - cursor_x, cursor_y = event.point[0], event.point[1] - fixation = event.fixation - # calibration_radius: radius for data collection during calibration -``` - - - - -#### Customize [only V1/V2]: - -You can customize your calibration points/map to fit your solutions. Simple copy snippet below, and place your calibration poitns on x,y planes from 0.0 to 1.0. It will be then automatically scaled to your display. - -```python -gestures = EyeGestures_v2() -gestures.uploadCalibrationMap([[0,0],[0,1],[1,0],[1,1]]) -``` - -V2 is two stage tracker. It runs V1 under the hood but then uses it as feature extractor for V2 machine learning component, and combines both outputs to generate new gaze point. It is possible to control how much V1 affects V2 by: - -```python -gestures.setClassicImpact(N) # setting N = 2 is working best for my testing -``` -This makes that sample obtained from V2 is averaged with N times sample from V1 (same sample copied that many times). In outcome having V2 impacting output in `1/N+1` and V1 `N/N+1`. - -It is also worth to know that you can enable hidden calibration for V1 (same calibration when using only V1, but now it is invisible to user): -```python -gestures.enableCNCalib() -``` - -#### Using EyeGesture Engine V1 - Model-Based Approach [not recommended]: - -```python -from eyeGestures.utils import VideoCapture -from eyeGestures import EyeGestures_v1 - -# Initialize gesture engine with RoI parameters -gestures = EyeGestures_v1() - -cap = VideoCapture(0) -ret, frame = cap.read() -calibrate = True -screen_width = 500 -screen_height= 500 - -# Obtain estimations from camera frames -event, cevent = gestures.estimate( - frame, - "main", - calibrate, # set calibration - switch to False to stop calibration - screen_width, - screen_height, - 0, 0, 0.8, 10 -) - -if event: - cursor_x, cursor_y = event.point[0], event.point[1] - fixation = event.fixation - # calibration_radius: radius for data collection during calibration -``` +#### Legacy Enginees: -Feel free to copy and paste the relevant code snippets for your project. +With release of V4 rust based engine shared betweeen all eyegestures versions (web and desktop), fully pythonic enginees become deprecated. This decision was driven by trying to achieve single algorithm powering eyegestures application. Keeping multiple different enginees was beyond ability to maintain it. Source code can still be found in `src/Legacy`. ### 🔥 Web Demos: From 58940005b5e5a2dbf988ba2736994ff996d92731 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 8 Jun 2026 21:51:09 +0000 Subject: [PATCH 11/14] Fix CI: install uv and correct uv sync command in workflow --- .github/workflows/code_quality.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/code_quality.yml b/.github/workflows/code_quality.yml index 4432d3c..835d21e 100644 --- a/.github/workflows/code_quality.yml +++ b/.github/workflows/code_quality.yml @@ -14,9 +14,11 @@ jobs: uses: actions/setup-python@v3 with: python-version: ${{ matrix.python-version }} + - name: Install uv + run: pip install uv - name: Install dependencies run: | - uv run sync + uv sync - name: Analysing code with checkers run: | make check From ab77c0c160f0601644c4127bcb9ff1c7f9ca92b4 Mon Sep 17 00:00:00 2001 From: PeterWaIIace Date: Tue, 9 Jun 2026 00:06:37 +0200 Subject: [PATCH 12/14] import fixes --- eyeGestures/__init__.py | 4 +++- pyproject.toml | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/eyeGestures/__init__.py b/eyeGestures/__init__.py index 1745e40..68d2f88 100644 --- a/eyeGestures/__init__.py +++ b/eyeGestures/__init__.py @@ -12,7 +12,9 @@ from .EyegesturesEngine import EyeGesturesEnginePython as RustEyeGesturesEngine # type: ignore[import-untyped] except ImportError: try: - from EyegesturesEngine import EyeGesturesEnginePython as RustEyeGesturesEngine # type: ignore[import-untyped] + from EyegesturesEngine import ( # type: ignore[import-not-found, import-untyped] + EyeGesturesEnginePython as RustEyeGesturesEngine, + ) except ImportError: RustEyeGesturesEngine = None diff --git a/pyproject.toml b/pyproject.toml index 3d0d5ac..d19a666 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -81,7 +81,6 @@ ignore = "DAR101, DAR201, E203, E266, E712, W503" [tool.mypy] strict = false -plugins = ["numpy.typing.mypy_plugin"] [[tool.mypy.overrides]] module = ["sklearn.*", "mediapipe.*"] From d390fe35fb2ed924f1860d32417bacb36378a367 Mon Sep 17 00:00:00 2001 From: PeterWaIIace Date: Tue, 9 Jun 2026 00:22:23 +0200 Subject: [PATCH 13/14] [Fix] imports --- eyeGestures/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eyeGestures/__init__.py b/eyeGestures/__init__.py index 68d2f88..d550605 100644 --- a/eyeGestures/__init__.py +++ b/eyeGestures/__init__.py @@ -12,8 +12,8 @@ from .EyegesturesEngine import EyeGesturesEnginePython as RustEyeGesturesEngine # type: ignore[import-untyped] except ImportError: try: - from EyegesturesEngine import ( # type: ignore[import-not-found, import-untyped] - EyeGesturesEnginePython as RustEyeGesturesEngine, + from EyegesturesEngine import ( + EyeGesturesEnginePython as RustEyeGesturesEngine, # type: ignore[import-not-found, import-untyped] ) except ImportError: RustEyeGesturesEngine = None From 81d4197d340f1afbe1ec0525ca205be32404a1d8 Mon Sep 17 00:00:00 2001 From: PeterWaIIace Date: Tue, 9 Jun 2026 00:30:46 +0200 Subject: [PATCH 14/14] [Fix] mypy eyegesture engine --- pyproject.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index d19a666..2aa061a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -85,3 +85,7 @@ strict = false [[tool.mypy.overrides]] module = ["sklearn.*", "mediapipe.*"] ignore_missing_imports = true + +[[tool.mypy.overrides]] +module = ["EyegesturesEngine", "eyeGestures.EyegesturesEngine"] +ignore_missing_imports = true

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 literal 0 HcmV?d00001 diff --git a/eyeGestures/Legacy/processing.py b/eyeGestures/Legacy/processing.py index 9a5f8e5..4c1bc69 100644 --- a/eyeGestures/Legacy/processing.py +++ b/eyeGestures/Legacy/processing.py @@ -50,7 +50,7 @@ def append(self, pupil: Tuple[int, int], landmarks: npt.NDArray[np.float64], pup ) def __convertPoint(self, point, width=1.0, height=1.0, scale_w=1.0, scale_h=1.0, offset=(0.0, 0.0)): - (min_x, min_y) = offset + min_x, min_y = offset x = int(((point[0] - min_x) / scale_w) * width) y = int(((point[1] - min_y) / scale_h) * height) return (x, y) diff --git a/eyeGestures/Legacy/screenTracker/screenTracker.py b/eyeGestures/Legacy/screenTracker/screenTracker.py index 7441b3f..a759ec2 100644 --- a/eyeGestures/Legacy/screenTracker/screenTracker.py +++ b/eyeGestures/Legacy/screenTracker/screenTracker.py @@ -18,8 +18,8 @@ def detect_if_inside(point, rect): def detect_edges(roi, display, point_on_screen, point_on_display): """Function performing edge detection based on point, screen and display sizes""" - (s_x, s_y) = point_on_screen - (d_x, d_y) = point_on_display + s_x, s_y = point_on_screen + d_x, d_y = point_on_display x, y, width, height = roi.getBoundaries() new_roi = dp.ScreenROI(x, y, width, height) @@ -71,7 +71,7 @@ def rescale_w(roi, scale_w, change=0.5): def scaleDown(roi, edge, scale): """Function scalling down one roi till edges are met""" - (_, _, cluster_w, cluster_h) = edge.getBoundaries() + _, _, cluster_w, cluster_h = edge.getBoundaries() new_roi = dp.ScreenROI(roi.x, roi.y, roi.width, roi.height) if cluster_w < roi.width: @@ -91,7 +91,7 @@ def scaleUp(roi, roi2, scale): """Function scalling up one roi into another roi, second roi is for limiting scaling operation and scale is telling how much you can scale""" - (_, _, roi2_w, roi2_h) = roi2.getBoundaries() + _, _, roi2_w, roi2_h = roi2.getBoundaries() new_roi = dp.ScreenROI(roi.x, roi.y, roi.width, roi.height) @@ -135,7 +135,7 @@ def process(self, point, point_offset, buffor_length, roi, edges, screen, displa ) # return how close that is hist region - (_, _, roi_w, roi_h) = heatmap.getBoundaries() + _, _, roi_w, roi_h = heatmap.getBoundaries() closeness_percentage = (roi_w * roi_h) / (screen.width * screen.height) return (p_on_display, closeness_percentage) @@ -144,7 +144,7 @@ def process(self, point, point_offset, buffor_length, roi, edges, screen, displa def update(self, roi, edges, cluster, heatmap): """Function to update screen processor with new clusters and heatmaps""" - (x, y) = heatmap.getCenter() + x, y = heatmap.getCenter() # ===================================== # ---------histogram obtained---------- # ===================================== diff --git a/eyeGestures/__init__.py b/eyeGestures/__init__.py index 30317b7..a1cc674 100644 --- a/eyeGestures/__init__.py +++ b/eyeGestures/__init__.py @@ -20,6 +20,7 @@ VERSION = "4.0.0" + class EyeGestures_v4: """Main class for EyeGesture tracker. It configures and manages entire algorithm""" @@ -40,7 +41,7 @@ def __init__(self, calibration_radius: int = 1000) -> None: self.starting_head_position = np.zeros((1, 2)) self.starting_size = np.zeros((1, 2)) - + def uploadCalibrationMap(self, points: npt.NDArray[np.float64], context: str = "main") -> None: self.clb.updMatrix(np.array(points)) @@ -112,10 +113,13 @@ def reset(self, context: str = "main") -> None: def setFixation(self, fix: float) -> None: self.fix = fix - @recoverable(ret_error_params=(None, None, None)) def step( - self, frame: cv2.typing.MatLike, width: int, height: int,): + self, + frame: cv2.typing.MatLike, + width: int, + height: int, + ): if self.engine is None: self.engine = RustEyeGesturesEngine(width, height) @@ -127,9 +131,9 @@ def step( scaled_landmarks = np.array(scaled_landmarks) result = self.engine.process(scaled_landmarks.flatten().tolist()) - x, y = result[0], result[1] + x, y = result[0], result[1] is_calibrating = result[2] == 1.0 calib_x, calib_y = result[3], result[4] - calib_x = min(max(calib_x, 0), width) + calib_x = min(max(calib_x, 0), width) calib_y = min(max(calib_y, 0), height) return [x, y], is_calibrating, [calib_x, calib_y] diff --git a/eyeGestures/eye.py b/eyeGestures/eye.py index 9775132..81ddfad 100644 --- a/eyeGestures/eye.py +++ b/eyeGestures/eye.py @@ -3,9 +3,9 @@ from typing import Optional, Tuple import cv2 -from mediapipe.tasks.python.vision.face_landmarker import FaceLandmarksConnections import numpy as np import numpy.typing as npt +from mediapipe.tasks.python.vision.face_landmarker import FaceLandmarksConnections from eyeGestures.utils import Buffor diff --git a/eyeGestures/face.py b/eyeGestures/face.py index 2496ebf..ef481ec 100644 --- a/eyeGestures/face.py +++ b/eyeGestures/face.py @@ -1,16 +1,16 @@ """Module providing finding and extraction of face from image.""" import os +import urllib.request from pathlib import Path from typing import Any, NamedTuple, Optional, Tuple -import urllib.request import cv2 import mediapipe as mp -from mediapipe.tasks import python -from mediapipe.tasks.python import vision import numpy as np import numpy.typing as npt +from mediapipe.tasks import python +from mediapipe.tasks.python import vision from eyeGestures.eye import Eye diff --git a/eyeGestures/processing.py b/eyeGestures/processing.py index 9a5f8e5..4c1bc69 100644 --- a/eyeGestures/processing.py +++ b/eyeGestures/processing.py @@ -50,7 +50,7 @@ def append(self, pupil: Tuple[int, int], landmarks: npt.NDArray[np.float64], pup ) def __convertPoint(self, point, width=1.0, height=1.0, scale_w=1.0, scale_h=1.0, offset=(0.0, 0.0)): - (min_x, min_y) = offset + min_x, min_y = offset x = int(((point[0] - min_x) / scale_w) * width) y = int(((point[1] - min_y) / scale_h) * height) return (x, y) diff --git a/pyproject.toml b/pyproject.toml index bf1c544..3d0d5ac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,9 +22,10 @@ classifiers = [ "Operating System :: OS Independent", ] dependencies = [ + "black>=26.5.1", + "isort>=8.0.1", "mediapipe>=0.10.35", "opencv-python>=4.13.0.92", - "pygame>=2.6.1", ] [tool.maturin] diff --git a/uv.lock b/uv.lock index 9e29743..42d5af3 100644 --- a/uv.lock +++ b/uv.lock @@ -11,6 +11,33 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/18/a6/907a406bb7d359e6a63f99c313846d9eec4f7e6f7437809e03aa00fa3074/absl_py-2.4.0-py3-none-any.whl", hash = "sha256:88476fd881ca8aab94ffa78b7b6c632a782ab3ba1cd19c9bd423abc4fb4cd28d", size = 135750, upload-time = "2026-01-28T10:17:04.19Z" }, ] +[[package]] +name = "black" +version = "26.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, + { name = "pytokens" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/37/5628dd55bf2b34257fc7603f0fe97c40e3aaf24265f416a9c85c95ca1436/black-26.5.1.tar.gz", hash = "sha256:dd321f668053961824bcc1be1cc1df748b2d7e4fa28086b08331e577b0100a73", size = 679439, upload-time = "2026-05-18T16:53:36.107Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/5c/c384363980e11e25ca6b93205949bb331fbf35f4e0dbec376dfa6326cec8/black-26.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b36cf2ddf5566e205f6535f782a62194a184d33e175b64ae8c40b1737522be3", size = 2009020, upload-time = "2026-05-18T17:05:28.132Z" }, + { url = "https://files.pythonhosted.org/packages/0b/df/9f31c5e0babbfed77d505fc5d120beb98b21b33feaeded3924ea941fe360/black-26.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f7ea64ebfa01b50f693508fc39f875e264446d3b097088f84f203b9d09618a0", size = 1813335, upload-time = "2026-05-18T17:05:31.266Z" }, + { url = "https://files.pythonhosted.org/packages/fb/24/8e7b9a2fa61b0afd82209efe937557d180a1fa055bd7f6161eb9defc3719/black-26.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecb3e624844c798144e9bd986954e0adc81d8911a1f30f375e1252fe26e8c294", size = 1881614, upload-time = "2026-05-18T17:05:32.718Z" }, + { url = "https://files.pythonhosted.org/packages/49/ad/b4e0d9365ba8ac34f6bbab62a4b1b2dd5d618fac3fa1b8db968c844201b5/black-26.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:e1a26503279b6b310669fb0b219c39e4820b77e8189fe80f522bb511f247db0a", size = 1488925, upload-time = "2026-05-18T17:05:34.259Z" }, + { url = "https://files.pythonhosted.org/packages/a1/4b/652b859bf5df88a751c30451b09338f7fd26a77d1271c666992f836b7711/black-26.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c34b25da232ead53a6f335b76dbea124f4d152ad568b9080d6f944bc2b34b52", size = 1289883, upload-time = "2026-05-18T17:05:36.019Z" }, + { url = "https://files.pythonhosted.org/packages/a6/16/a8da8eb208c51c7f4ce74609a45d0dcc6d8a2141e45e81ee5289d1bb0d59/black-26.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e88976690a64b0af98312ca958415849cb42423423c5f2ee74af4b49a97a2168", size = 2004800, upload-time = "2026-05-18T17:05:38.182Z" }, + { url = "https://files.pythonhosted.org/packages/11/8a/a479296a19e383b70a725882a6cf3d786540601ff03cabbaaf1cce864c5a/black-26.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32d5ea7f6c8bdfa6e648326ebca1f02b0764e2a029edc6f8dce2627e19d468c3", size = 1815576, upload-time = "2026-05-18T17:05:40.309Z" }, + { url = "https://files.pythonhosted.org/packages/81/6b/cfaf3d39f25132c156a068f6b805576c9103a84086019507c70e1911ee7d/black-26.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea8d16dc41655aa113cd64665e7219446cd7e4ff2248d7178eaa905190c86b18", size = 1877927, upload-time = "2026-05-18T17:05:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/66/76/302e313964bcff7e28df329d39f84f5270095730d85ff0acc260610a0d82/black-26.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:577f21094ea469ef92ec1adaf2c9441a226d2144d01a5be2fa823cecf6543e50", size = 1511860, upload-time = "2026-05-18T17:05:43.943Z" }, + { url = "https://files.pythonhosted.org/packages/27/4e/a3827e35e0e567f9f9ee59e2a0ab979267dca98718f25547ca8c6733afd4/black-26.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:ed1a20af114c301a0269bf01163d51dbef72737fd65f850001e7cbe7f3c7abae", size = 1316632, upload-time = "2026-05-18T17:05:45.521Z" }, + { url = "https://files.pythonhosted.org/packages/94/51/f975cae76d44274cc2868dc9040ac5d58d464784610234455b4e7b19c6ef/black-26.5.1-py3-none-any.whl", hash = "sha256:4ed7f7da04046d2e488437170797d3b4a4ad83906683bcb7dfc68b673bbce5e2", size = 213693, upload-time = "2026-05-18T16:53:33.964Z" }, +] + [[package]] name = "certifi" version = "2026.5.20" @@ -65,6 +92,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, ] +[[package]] +name = "click" +version = "8.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + [[package]] name = "contourpy" version = "1.3.3" @@ -134,16 +182,18 @@ name = "eyegestures" version = "4.0.0" source = { editable = "." } dependencies = [ + { name = "black" }, + { name = "isort" }, { name = "mediapipe" }, { name = "opencv-python" }, - { name = "pygame" }, ] [package.metadata] requires-dist = [ + { name = "black", specifier = ">=26.5.1" }, + { name = "isort", specifier = ">=8.0.1" }, { name = "mediapipe", specifier = ">=0.10.35" }, { name = "opencv-python", specifier = ">=4.13.0.92" }, - { name = "pygame", specifier = ">=2.6.1" }, ] [[package]] @@ -187,6 +237,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2c/47/c99d5268f354002ce80f8d029cd9d7d872969da1de8b93d32de4dc56d6f4/fonttools-4.63.0-py3-none-any.whl", hash = "sha256:445af2eab030a16b9171ea8bdda7ebf7d96bda2df88ee182a464252f6e05e20d", size = 1164562, upload-time = "2026-05-14T12:04:29.092Z" }, ] +[[package]] +name = "isort" +version = "8.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/7c/ec4ab396d31b3b395e2e999c8f46dec78c5e29209fac49d1f4dace04041d/isort-8.0.1.tar.gz", hash = "sha256:171ac4ff559cdc060bcfff550bc8404a486fee0caab245679c2abe7cb253c78d", size = 769592, upload-time = "2026-02-28T10:08:20.685Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/95/c7c34aa53c16353c56d0b802fba48d5f5caa2cdee7958acbcb795c830416/isort-8.0.1-py3-none-any.whl", hash = "sha256:28b89bc70f751b559aeca209e6120393d43fbe2490de0559662be7a9787e3d75", size = 89733, upload-time = "2026-02-28T10:08:19.466Z" }, +] + [[package]] name = "kiwisolver" version = "1.5.0" @@ -321,6 +380,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/07/b3/5c7fa594c731e8dafab9f1a46ab6cef670fa62dbbfb6248cc70e42ec6fc5/mediapipe-0.10.35-py3-none-win_arm64.whl", hash = "sha256:46255326a6213118aaa518a7aa25e35f93337e82677960cc2a945f117bff8444", size = 9992331, upload-time = "2026-04-27T17:45:36.193Z" }, ] +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + [[package]] name = "numpy" version = "2.4.6" @@ -416,6 +484,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, ] +[[package]] +name = "pathspec" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, +] + [[package]] name = "pillow" version = "12.2.0" @@ -475,27 +552,21 @@ wheels = [ ] [[package]] -name = "pycparser" -version = "3.0" +name = "platformdirs" +version = "4.10.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", size = 31224, upload-time = "2026-05-28T03:32:53.587Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, + { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" }, ] [[package]] -name = "pygame" -version = "2.6.1" +name = "pycparser" +version = "3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/49/cc/08bba60f00541f62aaa252ce0cfbd60aebd04616c0b9574f755b583e45ae/pygame-2.6.1.tar.gz", hash = "sha256:56fb02ead529cee00d415c3e007f75e0780c655909aaa8e8bf616ee09c9feb1f", size = 14808125, upload-time = "2024-09-29T13:41:34.698Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/91/718acf3e2a9d08a6ddcc96bd02a6f63c99ee7ba14afeaff2a51c987df0b9/pygame-2.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6039f3a55d800db80e8010f387557b528d34d534435e0871326804df2a62f2", size = 13090765, upload-time = "2024-09-29T14:27:02.377Z" }, - { url = "https://files.pythonhosted.org/packages/0e/c6/9cb315de851a7682d9c7568a41ea042ee98d668cb8deadc1dafcab6116f0/pygame-2.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2a3a1288e2e9b1e5834e425bedd5ba01a3cd4902b5c2bff8ed4a740ccfe98171", size = 12381704, upload-time = "2024-09-29T14:27:10.228Z" }, - { url = "https://files.pythonhosted.org/packages/9f/8f/617a1196e31ae3b46be6949fbaa95b8c93ce15e0544266198c2266cc1b4d/pygame-2.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27eb17e3dc9640e4b4683074f1890e2e879827447770470c2aba9f125f74510b", size = 13581091, upload-time = "2024-09-29T11:30:27.653Z" }, - { url = "https://files.pythonhosted.org/packages/3b/87/2851a564e40a2dad353f1c6e143465d445dab18a95281f9ea458b94f3608/pygame-2.6.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c1623180e70a03c4a734deb9bac50fc9c82942ae84a3a220779062128e75f3b", size = 14273844, upload-time = "2024-09-29T11:40:04.138Z" }, - { url = "https://files.pythonhosted.org/packages/85/b5/aa23aa2e70bcba42c989c02e7228273c30f3b44b9b264abb93eaeff43ad7/pygame-2.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef07c0103d79492c21fced9ad68c11c32efa6801ca1920ebfd0f15fb46c78b1c", size = 13951197, upload-time = "2024-09-29T11:40:06.785Z" }, - { url = "https://files.pythonhosted.org/packages/a6/06/29e939b34d3f1354738c7d201c51c250ad7abefefaf6f8332d962ff67c4b/pygame-2.6.1-cp313-cp313-win32.whl", hash = "sha256:3acd8c009317190c2bfd81db681ecef47d5eb108c2151d09596d9c7ea9df5c0e", size = 10249309, upload-time = "2024-09-29T11:10:23.329Z" }, - { url = "https://files.pythonhosted.org/packages/7e/11/17f7f319ca91824b86557e9303e3b7a71991ef17fd45286bf47d7f0a38e6/pygame-2.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:813af4fba5d0b2cb8e58f5d95f7910295c34067dcc290d34f1be59c48bd1ea6a", size = 10620084, upload-time = "2024-09-29T11:48:51.587Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, ] [[package]] @@ -519,6 +590,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] +[[package]] +name = "pytokens" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/34/b4e015b99031667a7b960f888889c5bd34ef585c85e1cb56a594b92836ac/pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a", size = 23015, upload-time = "2026-01-30T01:03:45.924Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/dc/08b1a080372afda3cceb4f3c0a7ba2bde9d6a5241f1edb02a22a019ee147/pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b", size = 160720, upload-time = "2026-01-30T01:03:13.843Z" }, + { url = "https://files.pythonhosted.org/packages/64/0c/41ea22205da480837a700e395507e6a24425151dfb7ead73343d6e2d7ffe/pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f", size = 254204, upload-time = "2026-01-30T01:03:14.886Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d2/afe5c7f8607018beb99971489dbb846508f1b8f351fcefc225fcf4b2adc0/pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1", size = 268423, upload-time = "2026-01-30T01:03:15.936Z" }, + { url = "https://files.pythonhosted.org/packages/68/d4/00ffdbd370410c04e9591da9220a68dc1693ef7499173eb3e30d06e05ed1/pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4", size = 266859, upload-time = "2026-01-30T01:03:17.458Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c9/c3161313b4ca0c601eeefabd3d3b576edaa9afdefd32da97210700e47652/pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78", size = 103520, upload-time = "2026-01-30T01:03:18.652Z" }, + { url = "https://files.pythonhosted.org/packages/8f/a7/b470f672e6fc5fee0a01d9e75005a0e617e162381974213a945fcd274843/pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321", size = 160821, upload-time = "2026-01-30T01:03:19.684Z" }, + { url = "https://files.pythonhosted.org/packages/80/98/e83a36fe8d170c911f864bfded690d2542bfcfacb9c649d11a9e6eb9dc41/pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa", size = 254263, upload-time = "2026-01-30T01:03:20.834Z" }, + { url = "https://files.pythonhosted.org/packages/0f/95/70d7041273890f9f97a24234c00b746e8da86df462620194cef1d411ddeb/pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d", size = 268071, upload-time = "2026-01-30T01:03:21.888Z" }, + { url = "https://files.pythonhosted.org/packages/da/79/76e6d09ae19c99404656d7db9c35dfd20f2086f3eb6ecb496b5b31163bad/pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324", size = 271716, upload-time = "2026-01-30T01:03:23.633Z" }, + { url = "https://files.pythonhosted.org/packages/79/37/482e55fa1602e0a7ff012661d8c946bafdc05e480ea5a32f4f7e336d4aa9/pytokens-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9", size = 104539, upload-time = "2026-01-30T01:03:24.788Z" }, + { url = "https://files.pythonhosted.org/packages/30/e8/20e7db907c23f3d63b0be3b8a4fd1927f6da2395f5bcc7f72242bb963dfe/pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb", size = 168474, upload-time = "2026-01-30T01:03:26.428Z" }, + { url = "https://files.pythonhosted.org/packages/d6/81/88a95ee9fafdd8f5f3452107748fd04c24930d500b9aba9738f3ade642cc/pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3", size = 290473, upload-time = "2026-01-30T01:03:27.415Z" }, + { url = "https://files.pythonhosted.org/packages/cf/35/3aa899645e29b6375b4aed9f8d21df219e7c958c4c186b465e42ee0a06bf/pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975", size = 303485, upload-time = "2026-01-30T01:03:28.558Z" }, + { url = "https://files.pythonhosted.org/packages/52/a0/07907b6ff512674d9b201859f7d212298c44933633c946703a20c25e9d81/pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a", size = 306698, upload-time = "2026-01-30T01:03:29.653Z" }, + { url = "https://files.pythonhosted.org/packages/39/2a/cbbf9250020a4a8dd53ba83a46c097b69e5eb49dd14e708f496f548c6612/pytokens-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918", size = 116287, upload-time = "2026-01-30T01:03:30.912Z" }, + { url = "https://files.pythonhosted.org/packages/c6/78/397db326746f0a342855b81216ae1f0a32965deccfd7c830a2dbc66d2483/pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de", size = 13729, upload-time = "2026-01-30T01:03:45.029Z" }, +] + [[package]] name = "six" version = "1.17.0" From 6185514772fc635d1c07ef28d37c74c8a21ed91b Mon Sep 17 00:00:00 2001 From: W4ltz <40773550+PeterWaIIace@users.noreply.github.com> Date: Sat, 30 May 2026 23:30:47 +0200 Subject: [PATCH 06/14] Format, moving legacy out --- .../EyegesturesEngine.cp314-win_amd64.pyd | Bin 301056 -> 0 bytes eyeGestures/Legacy/Fixation.py | 23 - eyeGestures/Legacy/__init__.py | 471 ------------------ eyeGestures/Legacy/calibration_v1.py | 165 ------ eyeGestures/Legacy/calibration_v2.py | 201 -------- eyeGestures/Legacy/eye.py | 188 ------- eyeGestures/Legacy/face.py | 106 ---- eyeGestures/Legacy/gazeEstimator.py | 273 ---------- eyeGestures/Legacy/gaze_contexter.py | 124 ----- eyeGestures/Legacy/gevent.py | 57 --- eyeGestures/Legacy/processing.py | 72 --- eyeGestures/Legacy/requirements.txt | 7 - eyeGestures/Legacy/scalling_test.py | 60 --- eyeGestures/Legacy/screenTracker/__init__.py | 0 eyeGestures/Legacy/screenTracker/clusters.py | 91 ---- .../Legacy/screenTracker/dataPoints.py | 61 --- eyeGestures/Legacy/screenTracker/heatmap.py | 68 --- .../Legacy/screenTracker/screenTracker.py | 221 -------- eyeGestures/Legacy/screenTracker_test.py | 116 ----- eyeGestures/Legacy/utils.py | 240 --------- eyeGestures/__init__.py | 7 +- 21 files changed, 2 insertions(+), 2549 deletions(-) delete mode 100644 eyeGestures/EyegesturesEngine.cp314-win_amd64.pyd delete mode 100644 eyeGestures/Legacy/Fixation.py delete mode 100644 eyeGestures/Legacy/__init__.py delete mode 100644 eyeGestures/Legacy/calibration_v1.py delete mode 100644 eyeGestures/Legacy/calibration_v2.py delete mode 100644 eyeGestures/Legacy/eye.py delete mode 100644 eyeGestures/Legacy/face.py delete mode 100644 eyeGestures/Legacy/gazeEstimator.py delete mode 100644 eyeGestures/Legacy/gaze_contexter.py delete mode 100644 eyeGestures/Legacy/gevent.py delete mode 100644 eyeGestures/Legacy/processing.py delete mode 100644 eyeGestures/Legacy/requirements.txt delete mode 100644 eyeGestures/Legacy/scalling_test.py delete mode 100644 eyeGestures/Legacy/screenTracker/__init__.py delete mode 100644 eyeGestures/Legacy/screenTracker/clusters.py delete mode 100644 eyeGestures/Legacy/screenTracker/dataPoints.py delete mode 100644 eyeGestures/Legacy/screenTracker/heatmap.py delete mode 100644 eyeGestures/Legacy/screenTracker/screenTracker.py delete mode 100644 eyeGestures/Legacy/screenTracker_test.py delete mode 100644 eyeGestures/Legacy/utils.py diff --git a/eyeGestures/EyegesturesEngine.cp314-win_amd64.pyd b/eyeGestures/EyegesturesEngine.cp314-win_amd64.pyd deleted file mode 100644 index 9101aa684436643268644941c0035b5f72e6329d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301056 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�tE!@QB3kbm>d)WA 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�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