diff --git a/.gitignore b/.gitignore
index 5c3aa38..b0b700f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,3 +23,11 @@ pnpm-debug.log*
*.sw?
*.tns
+.superpowers/
+
+# build artifacts
+node_modules/
+target/
+dist/
+desktop/src-tauri/icons/android/
+desktop/src-tauri/icons/ios/
diff --git a/desktop/.browserslistrc b/desktop/.browserslistrc
deleted file mode 100644
index 214388f..0000000
--- a/desktop/.browserslistrc
+++ /dev/null
@@ -1,3 +0,0 @@
-> 1%
-last 2 versions
-not dead
diff --git a/desktop/.eslintrc.js b/desktop/.eslintrc.js
deleted file mode 100644
index a880a71..0000000
--- a/desktop/.eslintrc.js
+++ /dev/null
@@ -1,19 +0,0 @@
-module.exports = {
- root: true,
- env: {
- node: true
- },
- 'extends': [
- 'plugin:vue/essential',
- 'eslint:recommended',
- '@vue/typescript/recommended'
- ],
- parserOptions: {
- ecmaVersion: 2020
- },
- rules: {
- 'no-console': process.env.NODE_ENV === 'production' ? ['warn', { allow: ['warn', 'error'] }] : 'off',
- 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
- '@typescript-eslint/explicit-module-boundary-types': 'off',
- }
-}
diff --git a/desktop/.gitignore b/desktop/.gitignore
new file mode 100644
index 0000000..a547bf3
--- /dev/null
+++ b/desktop/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/desktop/README.md b/desktop/README.md
index 353e14d..ace1853 100644
--- a/desktop/README.md
+++ b/desktop/README.md
@@ -1,32 +1,99 @@
# N-Link
-Free, cross-platform, CX-II compatible computer linking program for the TI-Nspire
+Free, cross-platform, CX-II compatible computer linking program for the TI-Nspire.
-## Project setup
-You'll need to install [Node.js](https://nodejs.org/en/download/package-manager),
-[Yarn](https://classic.yarnpkg.com/en/docs/install/) (which may be included with your installation of Node.js), and
-[Rust](https://rustup.rs/). You'll also need a
-[C compiler](https://github.com/alexcrichton/cc-rs#compile-time-requirements) available. On Linux, you'll need
-`webkit2gtk` and `squashfs-tools`, which, on Ubuntu, can be installed with
-`sudo apt install webkit2gtk-4.0 squashfs-tools`.
-```
-yarn
+This package is a **Tauri 2 + Vue 3 + Vite** application. It was ported from
+Tauri 1.0.0-beta.8 / Vue CLI, which linked `webkit2gtk-4.0` and could not build
+or run on current distributions (Ubuntu 26.04 ships only `webkit2gtk-4.1`).
+
+Currently Linux-only: bundle targets are `deb` and `appimage`.
+
+## Prerequisites
+
+- [Node.js](https://nodejs.org/) 22+ (npm ships with it — this project uses
+ **npm workspaces**, not yarn)
+- [Rust](https://rustup.rs/) 1.97+
+- System libraries (Ubuntu/Debian):
+
+```bash
+sudo apt-get install -y \
+ libwebkit2gtk-4.1-dev \
+ libjavascriptcoregtk-4.1-dev \
+ libsoup-3.0-dev \
+ librsvg2-dev \
+ libxdo-dev \
+ libayatana-appindicator3-dev \
+ libusb-1.0-0-dev \
+ build-essential curl wget file
```
-### Compiles and hot-reloads for development
-```
-yarn tauri:serve
+Verify they resolve before building:
+
+```bash
+for p in webkit2gtk-4.1 javascriptcoregtk-4.1 libsoup-3.0 gtk+-3.0 libusb-1.0; do
+ printf "%-24s " "$p"; pkg-config --modversion "$p" || echo MISSING
+done
```
-### Compiles and minifies for production
-```
-yarn tauri:build
+## Setup
+
+Run from the **repository root** (this is a workspace member):
+
+```bash
+npm install
```
-### Lints and fixes files
-```
-yarn lint
+`--legacy-peer-deps` is no longer needed — `n-link-core` is on Vue 3 as of the
+frontend port.
+
+Note that the root `package.json` workspaces list contains only `desktop` and
+`n-link-core`. `web/` is deliberately excluded: it is still on Nuxt 2 and pulls
+`tailwindcss@1.9.6`, which npm hoists to the root and which then shadows the
+`tailwindcss@3` that `desktop` and `@tailwindcss/forms` require. Restore the
+entry when `web` is migrated.
+
+## Development
+
+```bash
+cd desktop
+npm run tauri dev
```
-### Customize configuration
-See [Configuration Reference](https://cli.vuejs.org/config/).
+## Production build
+
+```bash
+cd desktop
+npm run tauri build
+```
+
+Produces `src-tauri/target/release/bundle/deb/*.deb` and
+`.../appimage/*.AppImage`.
+
+## Headless CLI
+
+The same binary works without a GUI:
+
+```bash
+./src-tauri/target/release/n-link --help
+./src-tauri/target/release/n-link ls /
+```
+
+## Notes and gotchas
+
+- **`cargo` commands need `dist/` to exist.** Tauri's `generate_context!` macro
+ validates the `frontendDist` path at compile time, so a bare
+ `cargo check` / `cargo build` in `src-tauri/` fails on a fresh clone until the
+ frontend has been built once: `npm run build --workspace desktop`.
+ `npm run tauri build` does this for you.
+- **Do not run the binary from a snap-confined shell** (for example, the
+ integrated terminal of VS Code installed as a snap). Snap injects an
+ `LD_LIBRARY_PATH` whose `libpthread` shadows the system one, producing
+ `undefined symbol: __libc_pthread_init`. Use a normal terminal.
+- **AppImage needs FUSE.** Without it, run the AppImage with
+ `--appimage-extract` and launch `squashfs-root/AppRun` instead.
+- **`vendor/libnspire-sys`** at the repo root is a locally patched crate wired in
+ via `[patch.crates-io]`. It raises the CX II NNSE handshake retry limit
+ (10 → 30). The build will not reproduce upstream behaviour without it.
+- **Known upstream limitation:** libnspire's CX II support has been frozen since
+ 2020. Against current CX II firmware, data transfers may return `Busy` or hang.
+ This is independent of the Tauri version and is not a defect in this port.
diff --git a/desktop/babel.config.js b/desktop/babel.config.js
deleted file mode 100644
index e955840..0000000
--- a/desktop/babel.config.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = {
- presets: [
- '@vue/cli-plugin-babel/preset'
- ]
-}
diff --git a/desktop/index.html b/desktop/index.html
new file mode 100644
index 0000000..0230601
--- /dev/null
+++ b/desktop/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+ Tauri + Vue + Typescript App
+
+
+
+
+
+
+
diff --git a/desktop/package.json b/desktop/package.json
index 3fb3606..22ffa20 100644
--- a/desktop/package.json
+++ b/desktop/package.json
@@ -1,44 +1,34 @@
{
- "name": "desktop",
- "description": "Free, cross-platform, CX-II compatible computer linking program for the TI-Nspire",
- "version": "0.1.6",
+ "name": "n-link",
"private": true,
+ "version": "0.1.6",
+ "type": "module",
"scripts": {
- "lint": "vue-cli-service lint",
- "tauri:build": "vue-cli-service tauri:build",
- "tauri:serve": "vue-cli-service tauri:serve"
+ "dev": "vite",
+ "build": "vue-tsc --noEmit && vite build",
+ "preview": "vite preview",
+ "tauri": "tauri"
},
"dependencies": {
- "@tailwindcss/custom-forms": "^0.2.1",
- "core-js": "^3.6.5",
- "element-ui": "^2.13.2",
- "feather-icons": "^4.28.0",
- "filesize": "^6.1.0",
- "n-link-core": "0.0.0",
- "@tauri-apps/api": "^1.0.0-beta.8",
- "vue": "^2.6.11",
- "vue-async-computed": "^3.9.0",
- "vue-class-component": "^7.2.3",
- "vue-property-decorator": "^9.0.2",
- "vue-router": "^3.2.0"
+ "@tauri-apps/api": "^2.11.1",
+ "@tauri-apps/plugin-dialog": "^2.7.2",
+ "@tauri-apps/plugin-shell": "^2.3.5",
+ "element-plus": "^2.14.3",
+ "feather-icons": "^4.29.2",
+ "filesize": "^10.1.6",
+ "vue": "^3.5.13",
+ "vue-router": "^4.6.4"
},
"devDependencies": {
- "@typescript-eslint/eslint-plugin": "^4.4.0",
- "@typescript-eslint/parser": "^4.4.0",
- "@vue/cli-plugin-babel": "~4.5.0",
- "@vue/cli-plugin-eslint": "~4.5.0",
- "@vue/cli-plugin-router": "~4.5.0",
- "@vue/cli-plugin-typescript": "~4.5.0",
- "@vue/cli-service": "~4.5.0",
- "@vue/eslint-config-typescript": "^5.0.2",
- "eslint": "^6.7.2",
- "eslint-plugin-vue": "^6.2.2",
- "raw-loader": "^4.0.1",
- "sass": "^1.26.5",
- "sass-loader": "^8.0.2",
- "typescript": "~4.0.3",
- "vue-cli-plugin-tailwind": "~1.5.0",
- "vue-cli-plugin-tauri": "^1.0.0-beta.6",
- "vue-template-compiler": "^2.6.11"
+ "@tailwindcss/forms": "^0.5.11",
+ "@tauri-apps/cli": "^2",
+ "@vitejs/plugin-vue": "^5.2.1",
+ "autoprefixer": "^10.5.4",
+ "postcss": "^8.5.21",
+ "sass": "^1.101.3",
+ "tailwindcss": "^3.4.19",
+ "typescript": "~5.6.2",
+ "vite": "^6.0.3",
+ "vue-tsc": "^2.1.10"
}
}
diff --git a/desktop/postcss.config.cjs b/desktop/postcss.config.cjs
new file mode 100644
index 0000000..12a703d
--- /dev/null
+++ b/desktop/postcss.config.cjs
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/desktop/postcss.config.js b/desktop/postcss.config.js
deleted file mode 100644
index ba2afb0..0000000
--- a/desktop/postcss.config.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('n-link-core/postcss.config');
diff --git a/desktop/public/favicon.ico b/desktop/public/favicon.ico
deleted file mode 100644
index df36fcf..0000000
Binary files a/desktop/public/favicon.ico and /dev/null differ
diff --git a/desktop/public/index.html b/desktop/public/index.html
deleted file mode 100644
index 4123528..0000000
--- a/desktop/public/index.html
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
- <%= htmlWebpackPlugin.options.title %>
-
-
-
- We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.
-
-
-
-
-
diff --git a/desktop/src-tauri/.gitignore b/desktop/src-tauri/.gitignore
index fcf6e4f..b21bd68 100644
--- a/desktop/src-tauri/.gitignore
+++ b/desktop/src-tauri/.gitignore
@@ -1,12 +1,7 @@
# Generated by Cargo
# will have compiled files and executables
/target/
-WixTools
-# These are backup files generated by rustfmt
-**/*.rs.bk
-
-config.json
-bundle.json
-
-/.cargo
+# Generated by Tauri
+# will have schema files for capabilities auto-completion
+/gen/schemas
diff --git a/desktop/src-tauri/Cargo.lock b/desktop/src-tauri/Cargo.lock
index e7e92cf..b182ac8 100644
--- a/desktop/src-tauri/Cargo.lock
+++ b/desktop/src-tauri/Cargo.lock
@@ -1,6 +1,12 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
-version = 3
+version = 4
+
+[[package]]
+name = "adler2"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
[[package]]
name = "adler32"
@@ -8,31 +14,94 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
-[[package]]
-name = "ahash"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f200cbb1e856866d9eade941cf3aa0c5d7dd36f74311c4273b494f4ef036957"
-dependencies = [
- "getrandom 0.2.2",
- "once_cell",
- "version_check",
-]
-
[[package]]
name = "aho-corasick"
-version = "0.7.15"
+version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5"
+checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
dependencies = [
"memchr",
]
[[package]]
-name = "anyhow"
-version = "1.0.40"
+name = "alloc-no-stdlib"
+version = "2.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28b2cd92db5cbd74e8e5028f7e27dd7aa3090e89e4f2a197cc7c8dfb69c7063b"
+checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3"
+
+[[package]]
+name = "alloc-stdlib"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195"
+dependencies = [
+ "alloc-no-stdlib",
+]
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[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.104"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470"
[[package]]
name = "array_iterator"
@@ -40,366 +109,331 @@ version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "015eb97c25bb20230c9fdf1533b4cee74b27924cd462f74b0d6fc011aaf196de"
-[[package]]
-name = "arrayref"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544"
-
-[[package]]
-name = "arrayvec"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
-
-[[package]]
-name = "arrayvec"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd"
-
-[[package]]
-name = "async-io"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b"
-dependencies = [
- "concurrent-queue",
- "futures-lite",
- "libc",
- "log",
- "once_cell",
- "parking",
- "polling",
- "slab",
- "socket2",
- "waker-fn",
- "winapi",
-]
-
[[package]]
name = "atk"
-version = "0.14.0"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a83b21d2aa75e464db56225e1bda2dd5993311ba1095acaa8fa03d1ae67026ba"
+checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b"
dependencies = [
"atk-sys",
- "bitflags 1.2.1",
"glib",
"libc",
]
[[package]]
name = "atk-sys"
-version = "0.14.0"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "badcf670157c84bb8b1cf6b5f70b650fed78da2033c9eed84c4e49b11cbe83ea"
+checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086"
dependencies = [
- "glib-sys 0.14.0",
- "gobject-sys 0.14.0",
+ "glib-sys",
+ "gobject-sys",
"libc",
- "system-deps 3.2.0",
+ "system-deps",
]
[[package]]
-name = "attohttpc"
-version = "0.17.0"
+name = "atomic-waker"
+version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a8bda305457262b339322106c776e3fd21df860018e566eb6a5b1aa4b6ae02d"
-dependencies = [
- "flate2",
- "http",
- "log",
- "native-tls",
- "openssl",
- "serde",
- "serde_json",
- "serde_urlencoded",
- "url",
- "wildmatch",
-]
-
-[[package]]
-name = "atty"
-version = "0.2.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
-dependencies = [
- "hermit-abi",
- "libc",
- "winapi",
-]
+checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
[[package]]
name = "autocfg"
-version = "1.0.1"
+version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
+checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
[[package]]
name = "base64"
-version = "0.13.0"
+version = "0.21.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
+checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
[[package]]
-name = "bincode"
-version = "1.3.3"
+name = "base64"
+version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
+
+[[package]]
+name = "bit-set"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3"
dependencies = [
- "serde",
+ "bit-vec",
]
+[[package]]
+name = "bit-vec"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
+
[[package]]
name = "bitflags"
-version = "0.9.1"
+version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
-version = "1.2.1"
+version = "2.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
-
-[[package]]
-name = "blake2b_simd"
-version = "0.5.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587"
+checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da"
dependencies = [
- "arrayref",
- "arrayvec 0.5.2",
- "constant_time_eq",
+ "serde_core",
]
[[package]]
-name = "blake3"
-version = "1.0.0"
+name = "block-buffer"
+version = "0.10.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcd555c66291d5f836dbb6883b48660ece810fe25a31f3bdfb911945dff2691f"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
dependencies = [
- "arrayref",
- "arrayvec 0.7.1",
- "cc",
- "cfg-if 1.0.0",
- "constant_time_eq",
- "digest",
- "rayon",
+ "generic-array",
]
[[package]]
-name = "block"
-version = "0.1.6"
+name = "block2"
+version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
+checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5"
+dependencies = [
+ "objc2",
+]
+
+[[package]]
+name = "brotli"
+version = "8.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3"
+dependencies = [
+ "alloc-no-stdlib",
+ "alloc-stdlib",
+ "brotli-decompressor",
+]
+
+[[package]]
+name = "brotli-decompressor"
+version = "5.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583"
+dependencies = [
+ "alloc-no-stdlib",
+ "alloc-stdlib",
+]
+
+[[package]]
+name = "bs58"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4"
+dependencies = [
+ "tinyvec",
+]
[[package]]
name = "bstr"
-version = "0.2.15"
+version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a40b47ad93e1a5404e6c18dec46b628214fee441c70f4ab5d6942142cc268a3d"
+checksum = "1f7dc094d718f2e1c1559ad110e27eeaae14a5465d3d56dd6dbd793079fbd530"
dependencies = [
"memchr",
+ "serde_core",
]
[[package]]
name = "bumpalo"
-version = "3.6.1"
+version = "3.20.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe"
+checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
[[package]]
name = "bytemuck"
-version = "1.5.1"
+version = "1.25.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bed57e2090563b83ba8f83366628ce535a7584c9afa4c9fc0612a03925c6df58"
+checksum = "d6aedf8ae72766347502cf3cb4f41cf5e9cc37d28bee90f1fdaaae15f9cf9424"
[[package]]
name = "byteorder"
-version = "1.4.3"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "bytes"
-version = "1.0.1"
+version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040"
-
-[[package]]
-name = "bzip2"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42b7c3cbf0fa9c1b82308d57191728ca0256cb821220f4e2fd410a72ade26e3b"
+checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04"
dependencies = [
- "bzip2-sys",
- "libc",
+ "serde",
]
-[[package]]
-name = "bzip2-sys"
-version = "0.1.10+1.0.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17fa3d1ac1ca21c5c4e36a97f3c3eb25084576f6fc47bf0139c1123434216c6c"
-dependencies = [
- "cc",
- "libc",
- "pkg-config",
-]
-
-[[package]]
-name = "cache-padded"
-version = "1.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba"
-
[[package]]
name = "cairo-rs"
-version = "0.14.3"
+version = "0.18.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f859ade407c19810ae920b4fafab92189ed312adad490d08fb16b5f49f1e2207"
+checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2"
dependencies = [
- "bitflags 1.2.1",
+ "bitflags 2.13.1",
"cairo-sys-rs",
"glib",
"libc",
- "thiserror",
+ "once_cell",
+ "thiserror 1.0.69",
]
[[package]]
name = "cairo-sys-rs"
-version = "0.14.0"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7c9c3928781e8a017ece15eace05230f04b647457d170d2d9641c94a444ff80"
+checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51"
dependencies = [
- "glib-sys 0.14.0",
+ "glib-sys",
"libc",
- "system-deps 3.2.0",
+ "system-deps",
+]
+
+[[package]]
+name = "camino"
+version = "1.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f2d30e4173c4026932d51d31d6b0613b1fd3014bf3f9f8943d4ba139c437ba0"
+dependencies = [
+ "serde_core",
+]
+
+[[package]]
+name = "cargo-platform"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "cargo_metadata"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba"
+dependencies = [
+ "camino",
+ "cargo-platform",
+ "semver",
+ "serde",
+ "serde_json",
+ "thiserror 2.0.19",
+]
+
+[[package]]
+name = "cargo_toml"
+version = "0.22.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77"
+dependencies = [
+ "serde",
+ "toml 0.9.12+spec-1.1.0",
]
[[package]]
name = "cc"
-version = "1.0.67"
+version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd"
+checksum = "c89588d05638b5b4594a3348a2d6c20277e43a7f5c5202b05cc56888475a47b8"
dependencies = [
+ "find-msvc-tools",
"jobserver",
+ "libc",
+ "shlex",
]
[[package]]
-name = "cfb"
-version = "0.4.0"
+name = "cesu8"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca453e8624711b2f0f4eb47076a318feda166252a827ee25d067b43de83dcba0"
+checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
+
+[[package]]
+name = "cfb"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f"
dependencies = [
"byteorder",
+ "fnv",
"uuid",
]
[[package]]
name = "cfg-expr"
-version = "0.8.1"
+version = "0.15.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b412e83326147c2bb881f8b40edfbf9905b9b8abaebd0e47ca190ba62fda8f0e"
+checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02"
dependencies = [
"smallvec",
+ "target-lexicon",
]
[[package]]
name = "cfg-if"
-version = "0.1.10"
+version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
-
-[[package]]
-name = "cfg-if"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
-
-[[package]]
-name = "cfg_aliases"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
+checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "chrono"
-version = "0.4.19"
+version = "0.4.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"
+checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"
dependencies = [
- "libc",
- "num-integer",
+ "iana-time-zone",
"num-traits",
- "time",
- "winapi",
+ "serde",
+ "windows-link 0.2.1",
]
[[package]]
name = "clap"
-version = "3.0.0-beta.2"
+version = "4.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bd1061998a501ee7d4b6d449020df3266ca3124b941ec56cf2005c3779ca142"
+checksum = "dd059f9da4f5c36b3787f65d38ccaab1cc315f07b01f89abc8359ee6a8205011"
dependencies = [
- "atty",
- "bitflags 1.2.1",
+ "clap_builder",
"clap_derive",
- "indexmap",
- "lazy_static",
- "os_str_bytes",
- "strsim 0.10.0",
- "termcolor",
- "textwrap",
- "unicode-width",
- "vec_map",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "clap_lex",
+ "strsim",
]
[[package]]
name = "clap_derive"
-version = "3.0.0-beta.2"
+version = "4.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "370f715b81112975b1b69db93e0b56ea4cd4e5002ac43b2da8474106a54096a1"
+checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9"
dependencies = [
- "heck",
- "proc-macro-error",
+ "heck 0.5.0",
"proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "quote",
+ "syn 2.0.119",
]
[[package]]
-name = "cocoa"
-version = "0.24.0"
+name = "clap_lex"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832"
-dependencies = [
- "bitflags 1.2.1",
- "block",
- "cocoa-foundation",
- "core-foundation 0.9.1",
- "core-graphics 0.22.2",
- "foreign-types",
- "libc",
- "objc",
-]
-
-[[package]]
-name = "cocoa-foundation"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318"
-dependencies = [
- "bitflags 1.2.1",
- "block",
- "core-foundation 0.9.1",
- "core-graphics-types",
- "foreign-types",
- "libc",
- "objc",
-]
+checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
[[package]]
name = "color_quant"
@@ -408,124 +442,67 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
[[package]]
-name = "com"
-version = "0.2.0"
+name = "colorchoice"
+version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a30a2b2a013da986dc5cc3eda3d19c0d59d53f835be1b2356eb8d00f000c793"
-dependencies = [
- "com_macros",
-]
+checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
[[package]]
-name = "com_macros"
-version = "0.2.0"
+name = "combine"
+version = "4.6.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7606b05842fea68ddcc89e8053b8860ebcb2a0ba8d6abfe3a148e5d5a8d3f0c1"
+checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd"
dependencies = [
- "com_macros_support",
- "proc-macro2",
- "syn 1.0.68",
-]
-
-[[package]]
-name = "com_macros_support"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97e9a6d20f4ac8830e309a455d7e9416e65c6af5a97c88c55fbb4c2012e107da"
-dependencies = [
- "proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
-]
-
-[[package]]
-name = "concurrent-queue"
-version = "1.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3"
-dependencies = [
- "cache-padded",
+ "bytes",
+ "memchr",
]
[[package]]
name = "console"
-version = "0.14.1"
+version = "0.16.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3993e6445baa160675931ec041a5e03ca84b9c6e32a056150d3aa2bdda0a1f45"
+checksum = "4fe5f465a4f6fee88fad41b85d990f84c835335e85b5d9e6e63e0d06d28cba7c"
dependencies = [
"encode_unicode",
- "lazy_static",
"libc",
- "regex",
- "terminal_size",
"unicode-width",
- "winapi",
+ "windows-sys 0.61.2",
]
[[package]]
-name = "constant_time_eq"
-version = "0.1.5"
+name = "cookie"
+version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
-
-[[package]]
-name = "convert_case"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
-
-[[package]]
-name = "core-foundation"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171"
+checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747"
dependencies = [
- "core-foundation-sys 0.7.0",
- "libc",
+ "time",
+ "version_check",
]
[[package]]
name = "core-foundation"
-version = "0.9.1"
+version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62"
+checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
dependencies = [
- "core-foundation-sys 0.8.2",
+ "core-foundation-sys",
"libc",
]
[[package]]
name = "core-foundation-sys"
-version = "0.7.0"
+version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac"
-
-[[package]]
-name = "core-foundation-sys"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]]
name = "core-graphics"
-version = "0.19.2"
+version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923"
+checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97"
dependencies = [
- "bitflags 1.2.1",
- "core-foundation 0.7.0",
- "foreign-types",
- "libc",
-]
-
-[[package]]
-name = "core-graphics"
-version = "0.22.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "269f35f69b542b80e736a20a89a05215c0ce80c2c03c514abb2e318b78379d86"
-dependencies = [
- "bitflags 1.2.1",
- "core-foundation 0.9.1",
+ "bitflags 2.13.1",
+ "core-foundation",
"core-graphics-types",
"foreign-types",
"libc",
@@ -533,115 +510,121 @@ dependencies = [
[[package]]
name = "core-graphics-types"
-version = "0.1.1"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b"
+checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb"
dependencies = [
- "bitflags 1.2.1",
- "core-foundation 0.9.1",
- "foreign-types",
+ "bitflags 2.13.1",
+ "core-foundation",
"libc",
]
[[package]]
-name = "core-video-sys"
-version = "0.1.4"
+name = "cpufeatures"
+version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828"
+checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
dependencies = [
- "cfg-if 0.1.10",
- "core-foundation-sys 0.7.0",
- "core-graphics 0.19.2",
"libc",
- "objc",
]
[[package]]
name = "crc32fast"
-version = "1.2.1"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
+checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
]
[[package]]
name = "crossbeam-channel"
-version = "0.5.0"
+version = "0.5.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775"
+checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e"
dependencies = [
- "cfg-if 1.0.0",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-deque"
-version = "0.8.0"
+version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9"
+checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb"
dependencies = [
- "cfg-if 1.0.0",
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
-version = "0.9.3"
+version = "0.9.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2584f639eb95fea8c798496315b297cf81b9b58b6d30ab066a75455333cf4b12"
+checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f"
dependencies = [
- "cfg-if 1.0.0",
"crossbeam-utils",
- "lazy_static",
- "memoffset",
- "scopeguard",
]
[[package]]
name = "crossbeam-utils"
-version = "0.8.3"
+version = "0.8.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7e9d99fa91428effe99c5c6d4634cdeba32b8cf784fc428a2a687f61a952c49"
+checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17"
+
+[[package]]
+name = "crypto-common"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
dependencies = [
- "autocfg",
- "cfg-if 1.0.0",
- "lazy_static",
+ "generic-array",
+ "typenum",
]
[[package]]
name = "cssparser"
-version = "0.27.2"
+version = "0.36.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a"
+checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2"
dependencies = [
"cssparser-macros",
"dtoa-short",
"itoa",
- "matches",
- "phf 0.8.0",
- "proc-macro2",
- "quote 1.0.9",
+ "phf",
"smallvec",
- "syn 1.0.68",
]
[[package]]
name = "cssparser-macros"
-version = "0.6.0"
+version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e"
+checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
dependencies = [
- "quote 1.0.9",
- "syn 1.0.68",
+ "quote",
+ "syn 2.0.119",
]
[[package]]
-name = "darling"
-version = "0.10.2"
+name = "ctor"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858"
+checksum = "352d39c2f7bef1d6ad73db6f5160efcaed66d94ef8c6c573a8410c00bf909a98"
+dependencies = [
+ "ctor-proc-macro",
+ "dtor",
+]
+
+[[package]]
+name = "ctor-proc-macro"
+version = "0.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1"
+
+[[package]]
+name = "darling"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d"
dependencies = [
"darling_core",
"darling_macro",
@@ -649,120 +632,112 @@ dependencies = [
[[package]]
name = "darling_core"
-version = "0.10.2"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b"
+checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0"
dependencies = [
- "fnv",
"ident_case",
"proc-macro2",
- "quote 1.0.9",
- "strsim 0.9.3",
- "syn 1.0.68",
+ "quote",
+ "strsim",
+ "syn 2.0.119",
]
[[package]]
name = "darling_macro"
-version = "0.10.2"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72"
+checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d"
dependencies = [
"darling_core",
- "quote 1.0.9",
- "syn 1.0.68",
+ "quote",
+ "syn 2.0.119",
]
[[package]]
-name = "deflate"
-version = "0.7.20"
+name = "dbus"
+version = "0.9.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "707b6a7b384888a70c8d2e8650b3e60170dfc6a67bb4aa67b6dfca57af4bedb4"
+checksum = "3ab69f03cc8c4340c9c8e315114e1658e6775a9b16a04357973aa21cec22b32e"
dependencies = [
- "adler32",
- "byteorder",
+ "libc",
+ "libdbus-sys",
+ "windows-sys 0.61.2",
]
[[package]]
-name = "deflate"
-version = "0.8.6"
+name = "deranged"
+version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174"
+checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
dependencies = [
- "adler32",
- "byteorder",
-]
-
-[[package]]
-name = "derivative"
-version = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"
-dependencies = [
- "proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "serde_core",
]
[[package]]
name = "derive_more"
-version = "0.99.16"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40eebddd2156ce1bb37b20bbe5151340a31828b1f2d22ba4141f3531710e38df"
+checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134"
+dependencies = [
+ "derive_more-impl",
+]
+
+[[package]]
+name = "derive_more-impl"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb"
dependencies = [
- "convert_case",
"proc-macro2",
- "quote 1.0.9",
+ "quote",
"rustc_version",
- "syn 1.0.68",
+ "syn 2.0.119",
]
[[package]]
name = "digest"
-version = "0.9.0"
+version = "0.10.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
dependencies = [
- "generic-array",
+ "block-buffer",
+ "crypto-common",
]
[[package]]
name = "dirs"
-version = "1.0.5"
+version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901"
+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",
- "redox_users 0.3.5",
- "winapi",
+ "option-ext",
+ "redox_users",
+ "windows-sys 0.61.2",
]
[[package]]
-name = "dirs-next"
-version = "2.0.0"
+name = "dispatch2"
+version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"
-dependencies = [
- "cfg-if 1.0.0",
- "dirs-sys-next",
-]
-
-[[package]]
-name = "dirs-sys-next"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"
+checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38"
dependencies = [
+ "bitflags 2.13.1",
+ "block2",
"libc",
- "redox_users 0.4.0",
- "winapi",
+ "objc2",
]
-[[package]]
-name = "dispatch"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
-
[[package]]
name = "displaydoc"
version = "0.1.7"
@@ -770,78 +745,192 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adc2ab4d5a16117f9029e9a6b5e4e79f4c67f6519bc134210d4d4a04ba31f41b"
dependencies = [
"proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "displaydoc"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "dlopen2"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4"
+dependencies = [
+ "dlopen2_derive",
+ "libc",
+ "once_cell",
+ "winapi",
+]
+
+[[package]]
+name = "dlopen2_derive"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "dom_query"
+version = "0.27.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89"
+dependencies = [
+ "bit-set",
+ "cssparser",
+ "foldhash",
+ "html5ever",
+ "precomputed-hash",
+ "selectors",
+ "tendril",
+]
+
+[[package]]
+name = "dpi"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76"
+dependencies = [
+ "serde",
]
[[package]]
name = "dtoa"
-version = "0.4.8"
+version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0"
+checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590"
[[package]]
name = "dtoa-short"
-version = "0.3.3"
+version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6"
+checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87"
dependencies = [
"dtoa",
]
[[package]]
-name = "either"
-version = "1.6.1"
+name = "dtor"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
-
-[[package]]
-name = "embed_plist"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53dd2e43a7d32952a6054141ee0d75183958620e84e5eab045de362dff13dc99"
-
-[[package]]
-name = "encode_unicode"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
-
-[[package]]
-name = "enumflags2"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0"
+checksum = "f1057d6c64987086ff8ed0fd3fbf377a6b7d205cc7715868cd401705f715cbe4"
dependencies = [
- "enumflags2_derive",
- "serde",
+ "dtor-proc-macro",
]
[[package]]
-name = "enumflags2_derive"
-version = "0.6.4"
+name = "dtor-proc-macro"
+version = "0.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce"
+checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5"
+
+[[package]]
+name = "dunce"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
+
+[[package]]
+name = "dyn-clone"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555"
+
+[[package]]
+name = "embed-resource"
+version = "3.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbfdaacccebec3b28e4866b8973543c7647797db5ada1bdab552e48fe665fbbd"
dependencies = [
- "proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "cc",
+ "memchr",
+ "rustc_version",
+ "toml 1.1.3+spec-1.1.0",
+ "vswhom",
+ "winreg",
+]
+
+[[package]]
+name = "embed_plist"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7"
+
+[[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 = "equivalent"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+
+[[package]]
+name = "erased-serde"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec"
+dependencies = [
+ "serde",
+ "serde_core",
+ "typeid",
+]
+
+[[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 = "1.4.0"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca5faf057445ce5c9d4329e382b2ce7ca38550ef3b73a5348362d5f24e0c7fe3"
+checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223"
+
+[[package]]
+name = "fdeflate"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c"
dependencies = [
- "instant",
+ "simd-adler32",
]
[[package]]
name = "field-offset"
-version = "0.3.4"
+version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e1c54951450cbd39f3dbcf1005ac413b49487dabf18a720ad2383eccfeffb92"
+checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f"
dependencies = [
"memoffset",
"rustc_version",
@@ -849,25 +938,27 @@ dependencies = [
[[package]]
name = "filetime"
-version = "0.2.14"
+version = "0.2.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d34cfa13a63ae058bfa601fe9e313bbdb3746427c1459185464ce0fcf62e1e8"
+checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759"
dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
"libc",
- "redox_syscall 0.2.10",
- "winapi",
]
[[package]]
-name = "flate2"
-version = "1.0.14"
+name = "find-msvc-tools"
+version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2cfff41391129e0a856d6d822600b8d71179d46879e310417eb9c762eb178b42"
+checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
+
+[[package]]
+name = "flate2"
+version = "1.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c"
dependencies = [
- "cfg-if 0.1.10",
"crc32fast",
- "libc",
"miniz_oxide",
]
@@ -878,76 +969,67 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
-name = "foreign-types"
-version = "0.3.2"
+name = "foldhash"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
+
+[[package]]
+name = "foreign-types"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
dependencies = [
+ "foreign-types-macros",
"foreign-types-shared",
]
[[package]]
-name = "foreign-types-shared"
-version = "0.1.1"
+name = "foreign-types-macros"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
[[package]]
name = "form_urlencoded"
-version = "1.0.1"
+version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191"
+checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
dependencies = [
- "matches",
"percent-encoding",
]
-[[package]]
-name = "futf"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b"
-dependencies = [
- "mac",
- "new_debug_unreachable",
-]
-
-[[package]]
-name = "futures"
-version = "0.3.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f55667319111d593ba876406af7c409c0ebb44dc4be6132a783ccf163ea14c1"
-dependencies = [
- "futures-channel",
- "futures-core",
- "futures-executor",
- "futures-io",
- "futures-sink",
- "futures-task",
- "futures-util",
-]
-
[[package]]
name = "futures-channel"
-version = "0.3.13"
+version = "0.3.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c2dd2df839b57db9ab69c2c9d8f3e8c81984781937fe2807dc6dcf3b2ad2939"
+checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae"
dependencies = [
"futures-core",
- "futures-sink",
]
[[package]]
name = "futures-core"
-version = "0.3.13"
+version = "0.3.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15496a72fabf0e62bdc3df11a59a3787429221dd0710ba8ef163d6f7a9112c94"
+checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7"
[[package]]
name = "futures-executor"
-version = "0.3.13"
+version = "0.3.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "891a4b7b96d84d5940084b2a37632dd65deeae662c114ceaa2c879629c9c0ad1"
+checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458"
dependencies = [
"futures-core",
"futures-task",
@@ -956,56 +1038,39 @@ dependencies = [
[[package]]
name = "futures-io"
-version = "0.3.13"
+version = "0.3.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d71c2c65c57704c32f5241c1223167c2c3294fd34ac020c807ddbe6db287ba59"
-
-[[package]]
-name = "futures-lite"
-version = "1.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48"
-dependencies = [
- "fastrand",
- "futures-core",
- "futures-io",
- "memchr",
- "parking",
- "pin-project-lite",
- "waker-fn",
-]
+checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a"
[[package]]
name = "futures-macro"
-version = "0.3.13"
+version = "0.3.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea405816a5139fb39af82c2beb921d52143f556038378d6db21183a5c37fbfb7"
+checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b"
dependencies = [
- "proc-macro-hack",
"proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "quote",
+ "syn 2.0.119",
]
[[package]]
name = "futures-sink"
-version = "0.3.13"
+version = "0.3.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85754d98985841b7d4f5e8e6fbfa4a4ac847916893ec511a2917ccd8525b8bb3"
+checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307"
[[package]]
name = "futures-task"
-version = "0.3.13"
+version = "0.3.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa189ef211c15ee602667a6fcfe1c1fd9e07d42250d2156382820fba33c9df80"
+checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109"
[[package]]
name = "futures-util"
-version = "0.3.13"
+version = "0.3.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1812c7ab8aedf8d6f2701a43e1243acdbcc2b36ab26e2ad421eb99ac963d96d1"
+checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa"
dependencies = [
- "futures-channel",
"futures-core",
"futures-io",
"futures-macro",
@@ -1013,28 +1078,15 @@ dependencies = [
"futures-task",
"memchr",
"pin-project-lite",
- "pin-utils",
- "proc-macro-hack",
- "proc-macro-nested",
"slab",
]
-[[package]]
-name = "fxhash"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
-dependencies = [
- "byteorder",
-]
-
[[package]]
name = "gdk"
-version = "0.14.0"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "679e22651cd15888e7acd01767950edca2ee9fcd6421fbf5b3c3b420d4e88bb0"
+checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691"
dependencies = [
- "bitflags 1.2.1",
"cairo-rs",
"gdk-pixbuf",
"gdk-sys",
@@ -1046,64 +1098,93 @@ dependencies = [
[[package]]
name = "gdk-pixbuf"
-version = "0.14.0"
+version = "0.18.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "534192cb8f01daeb8fab2c8d4baa8f9aae5b7a39130525779f5c2608e235b10f"
+checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec"
dependencies = [
"gdk-pixbuf-sys",
"gio",
"glib",
"libc",
+ "once_cell",
]
[[package]]
name = "gdk-pixbuf-sys"
-version = "0.14.0"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f097c0704201fbc8f69c1762dc58c6947c8bb188b8ed0bc7e65259f1894fe590"
+checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7"
dependencies = [
- "gio-sys 0.14.0",
- "glib-sys 0.14.0",
- "gobject-sys 0.14.0",
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
"libc",
- "system-deps 3.2.0",
+ "system-deps",
]
[[package]]
name = "gdk-sys"
-version = "0.14.0"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e091b3d3d6696949ac3b3fb3c62090e5bfd7bd6850bef5c3c5ea701de1b1f1e"
+checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7"
dependencies = [
"cairo-sys-rs",
"gdk-pixbuf-sys",
- "gio-sys 0.14.0",
- "glib-sys 0.14.0",
- "gobject-sys 0.14.0",
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
"libc",
"pango-sys",
"pkg-config",
- "system-deps 3.2.0",
+ "system-deps",
]
[[package]]
-name = "generator"
-version = "0.7.0"
+name = "gdkwayland-sys"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1d9279ca822891c1a4dae06d185612cf8fc6acfe5dff37781b41297811b12ee"
+checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69"
dependencies = [
- "cc",
+ "gdk-sys",
+ "glib-sys",
+ "gobject-sys",
"libc",
- "log",
- "rustversion",
- "winapi",
+ "pkg-config",
+ "system-deps",
+]
+
+[[package]]
+name = "gdkx11"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe"
+dependencies = [
+ "gdk",
+ "gdkx11-sys",
+ "gio",
+ "glib",
+ "libc",
+ "x11",
+]
+
+[[package]]
+name = "gdkx11-sys"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d"
+dependencies = [
+ "gdk-sys",
+ "glib-sys",
+ "libc",
+ "system-deps",
+ "x11",
]
[[package]]
name = "generic-array"
-version = "0.14.4"
+version = "0.14.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
dependencies = [
"typenum",
"version_check",
@@ -1111,134 +1192,134 @@ dependencies = [
[[package]]
name = "getrandom"
-version = "0.1.16"
+version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
"libc",
- "wasi 0.9.0+wasi-snapshot-preview1",
+ "wasi",
]
[[package]]
name = "getrandom"
-version = "0.2.2"
+version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8"
+checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
dependencies = [
- "cfg-if 1.0.0",
+ "cfg-if",
"libc",
- "wasi 0.10.2+wasi-snapshot-preview1",
+ "r-efi 5.3.0",
+ "wasip2",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "r-efi 6.0.0",
]
[[package]]
name = "gio"
-version = "0.14.3"
+version = "0.18.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "402a7057cd21d64bfa7ac027b344a7f50f677fb3308693df0e8c70fb55d29f0d"
+checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73"
dependencies = [
- "bitflags 1.2.1",
"futures-channel",
"futures-core",
"futures-io",
- "gio-sys 0.14.0",
+ "futures-util",
+ "gio-sys",
"glib",
"libc",
"once_cell",
- "thiserror",
+ "pin-project-lite",
+ "smallvec",
+ "thiserror 1.0.69",
]
[[package]]
name = "gio-sys"
-version = "0.10.1"
+version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e24fb752f8f5d2cf6bbc2c606fd2bc989c81c5e2fe321ab974d54f8b6344eac"
+checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2"
dependencies = [
- "glib-sys 0.10.1",
- "gobject-sys 0.10.0",
+ "glib-sys",
+ "gobject-sys",
"libc",
- "system-deps 1.3.2",
- "winapi",
-]
-
-[[package]]
-name = "gio-sys"
-version = "0.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0a41df66e57fcc287c4bcf74fc26b884f31901ea9792ec75607289b456f48fa"
-dependencies = [
- "glib-sys 0.14.0",
- "gobject-sys 0.14.0",
- "libc",
- "system-deps 3.2.0",
+ "system-deps",
"winapi",
]
[[package]]
name = "glib"
-version = "0.14.4"
+version = "0.18.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8fb802e3798d75b415bea8f016eed88d50106ce82f1274e80f31d80cfd4b056"
+checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5"
dependencies = [
- "bitflags 1.2.1",
+ "bitflags 2.13.1",
"futures-channel",
"futures-core",
"futures-executor",
"futures-task",
+ "futures-util",
+ "gio-sys",
"glib-macros",
- "glib-sys 0.14.0",
- "gobject-sys 0.14.0",
+ "glib-sys",
+ "gobject-sys",
"libc",
+ "memchr",
"once_cell",
"smallvec",
+ "thiserror 1.0.69",
]
[[package]]
name = "glib-macros"
-version = "0.14.1"
+version = "0.18.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2aad66361f66796bfc73f530c51ef123970eb895ffba991a234fcf7bea89e518"
+checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc"
dependencies = [
- "anyhow",
- "heck",
- "proc-macro-crate 1.0.0",
+ "heck 0.4.1",
+ "proc-macro-crate 2.0.2",
"proc-macro-error",
"proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "quote",
+ "syn 2.0.119",
]
[[package]]
name = "glib-sys"
-version = "0.10.1"
+version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7e9b997a66e9a23d073f2b1abb4dbfc3925e0b8952f67efd8d9b6e168e4cdc1"
+checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898"
dependencies = [
"libc",
- "system-deps 1.3.2",
+ "system-deps",
]
[[package]]
-name = "glib-sys"
-version = "0.14.0"
+name = "glob"
+version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c1d60554a212445e2a858e42a0e48cece1bd57b311a19a9468f70376cf554ae"
-dependencies = [
- "libc",
- "system-deps 3.2.0",
-]
+checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
[[package]]
name = "globset"
-version = "0.4.6"
+version = "0.4.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c152169ef1e421390738366d2f796655fec62621dabbd0fd476f905934061e4a"
+checksum = "e47d37d2ae4464254884b60ab7071be2b876a9c35b696bd018ddcc76847309cd"
dependencies = [
"aho-corasick",
"bstr",
- "fnv",
"log",
- "regex",
+ "regex-automata",
+ "regex-syntax",
]
[[package]]
@@ -1253,34 +1334,22 @@ dependencies = [
[[package]]
name = "gobject-sys"
-version = "0.10.0"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "952133b60c318a62bf82ee75b93acc7e84028a093e06b9e27981c2b6fe68218c"
+checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44"
dependencies = [
- "glib-sys 0.10.1",
+ "glib-sys",
"libc",
- "system-deps 1.3.2",
-]
-
-[[package]]
-name = "gobject-sys"
-version = "0.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa92cae29759dae34ab5921d73fff5ad54b3d794ab842c117e36cafc7994c3f5"
-dependencies = [
- "glib-sys 0.14.0",
- "libc",
- "system-deps 3.2.0",
+ "system-deps",
]
[[package]]
name = "gtk"
-version = "0.14.1"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6603bb79ded6ac6f3bac203794383afa8b1d6a8656d34a93a88f0b22826cd46c"
+checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a"
dependencies = [
"atk",
- "bitflags 1.2.1",
"cairo-rs",
"field-offset",
"futures-channel",
@@ -1291,116 +1360,277 @@ dependencies = [
"gtk-sys",
"gtk3-macros",
"libc",
- "once_cell",
"pango",
"pkg-config",
]
[[package]]
name = "gtk-sys"
-version = "0.14.0"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c14c8d3da0545785a7c5a120345b3abb534010fb8ae0f2ef3f47c027fba303e"
+checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414"
dependencies = [
"atk-sys",
"cairo-sys-rs",
"gdk-pixbuf-sys",
"gdk-sys",
- "gio-sys 0.14.0",
- "glib-sys 0.14.0",
- "gobject-sys 0.14.0",
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
"libc",
"pango-sys",
- "system-deps 3.2.0",
+ "system-deps",
]
[[package]]
name = "gtk3-macros"
-version = "0.14.0"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21de1da96dc117443fb03c2e270b2d34b7de98d0a79a19bbb689476173745b79"
+checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d"
dependencies = [
- "anyhow",
- "heck",
- "proc-macro-crate 1.0.0",
+ "proc-macro-crate 1.3.1",
"proc-macro-error",
"proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "quote",
+ "syn 2.0.119",
]
[[package]]
name = "hashbrown"
-version = "0.9.1"
+version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
[[package]]
name = "hashbrown"
-version = "0.11.2"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
-dependencies = [
- "ahash",
-]
+checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
[[package]]
name = "heck"
-version = "0.3.2"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac"
-dependencies = [
- "unicode-segmentation",
-]
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]]
-name = "hermit-abi"
-version = "0.1.18"
+name = "heck"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c"
-dependencies = [
- "libc",
-]
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
name = "html5ever"
-version = "0.25.1"
+version = "0.38.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aafcf38a1a36118242d29b92e1b08ef84e67e4a5ed06e0a80be20e6a32bfed6b"
+checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2"
dependencies = [
"log",
- "mac",
"markup5ever",
- "proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
]
[[package]]
name = "http"
-version = "0.2.4"
+version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11"
+checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425"
dependencies = [
"bytes",
- "fnv",
"itoa",
]
[[package]]
-name = "http-range"
+name = "http-body"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c"
+dependencies = [
+ "bytes",
+ "http",
+]
+
+[[package]]
+name = "http-body-util"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eee9694f83d9b7c09682fdb32213682939507884e5bcf227be9aff5d644b90dc"
+checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "http",
+ "http-body",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "httparse"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
+
+[[package]]
+name = "hyper"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498"
+dependencies = [
+ "atomic-waker",
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "http",
+ "http-body",
+ "httparse",
+ "itoa",
+ "pin-project-lite",
+ "smallvec",
+ "tokio",
+ "want",
+]
+
+[[package]]
+name = "hyper-util"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0"
+dependencies = [
+ "base64 0.22.1",
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "http",
+ "http-body",
+ "hyper",
+ "ipnet",
+ "libc",
+ "percent-encoding",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.65"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "log",
+ "wasm-bindgen",
+ "windows-core 0.62.2",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
[[package]]
name = "ico"
-version = "0.1.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a4b3331534254a9b64095ae60d3dc2a8225a7a70229cd5888be127cdc1f6804"
+checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371"
dependencies = [
"byteorder",
- "png 0.11.0",
+ "png 0.17.16",
+]
+
+[[package]]
+name = "icu_collections"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c"
+dependencies = [
+ "displaydoc 0.2.6",
+ "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 0.2.6",
+ "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 0.2.6",
+ "icu_locale_core",
+ "writeable",
+ "yoke",
+ "zerofrom",
+ "zerotrie",
+ "zerovec",
]
[[package]]
@@ -1411,29 +1641,37 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]]
name = "idna"
-version = "0.2.2"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89829a5d69c23d348314a7ac337fe39173b61149a9864deabd260983aed48c21"
+checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
dependencies = [
- "matches",
- "unicode-bidi",
- "unicode-normalization",
+ "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.17"
+version = "0.4.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b287fb45c60bb826a0dc68ff08742b9d88a2fea13d6e0c286b3172065aaf878c"
+checksum = "7b009b6744c1445efd7244084e25e498636412effb6760b55067553baa925cc7"
dependencies = [
- "crossbeam-utils",
+ "crossbeam-deque",
"globset",
- "lazy_static",
"log",
"memchr",
- "regex",
+ "regex-automata",
"same-file",
- "thread_local",
"walkdir",
"winapi-util",
]
@@ -1454,12 +1692,25 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "1.6.2"
+version = "1.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
dependencies = [
"autocfg",
- "hashbrown 0.9.1",
+ "hashbrown 0.12.3",
+ "serde",
+]
+
+[[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]]
@@ -1476,130 +1727,245 @@ dependencies = [
[[package]]
name = "infer"
-version = "0.4.0"
+version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f92b41dab759f9e8427c03f519c344a14655490b8db548dac1e57a75b3258391"
+checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7"
dependencies = [
"cfb",
]
[[package]]
-name = "inflate"
-version = "0.3.4"
+name = "ipnet"
+version = "2.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f5f9f47468e9a76a6452271efadc88fe865a82be91fe75e6c0c57b87ccea59d4"
+checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2"
+
+[[package]]
+name = "is-docker"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3"
dependencies = [
- "adler32",
+ "once_cell",
]
[[package]]
-name = "instant"
-version = "0.1.9"
+name = "is-wsl"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec"
+checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5"
dependencies = [
- "cfg-if 1.0.0",
+ "is-docker",
+ "once_cell",
]
[[package]]
-name = "itertools"
-version = "0.10.1"
+name = "is_terminal_polyfill"
+version = "1.70.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf"
-dependencies = [
- "either",
-]
+checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
[[package]]
name = "itoa"
-version = "0.4.7"
+version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736"
+checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
[[package]]
name = "javascriptcore-rs"
-version = "0.14.0"
+version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ca9c7d1445bba2889672fbadc16c3d5007bfdcf0a15a18a3a50fe9fab2c7427"
+checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc"
dependencies = [
+ "bitflags 1.3.2",
"glib",
"javascriptcore-rs-sys",
]
[[package]]
name = "javascriptcore-rs-sys"
-version = "0.2.0"
+version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f46ada8a08dcd75a10afae872fbfb51275df4a8ae0d46b8cc7c708f08dd2998"
+checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124"
dependencies = [
+ "glib-sys",
+ "gobject-sys",
"libc",
+ "system-deps",
+]
+
+[[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.0"
+version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
+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 2.0.119",
+]
[[package]]
name = "jobserver"
-version = "0.1.21"
+version = "0.1.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2"
+checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3"
dependencies = [
+ "getrandom 0.4.3",
"libc",
]
[[package]]
name = "js-sys"
-version = "0.3.50"
+version = "0.3.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d99f9e3e84b8f67f846ef5b4cbbc3b1c29f6c759fcbce6f01aa0e73d932a24c"
+checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102"
dependencies = [
+ "cfg-if",
+ "futures-util",
"wasm-bindgen",
]
[[package]]
-name = "kuchiki"
-version = "0.8.1"
+name = "json-patch"
+version = "3.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358"
+checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08"
dependencies = [
- "cssparser",
- "html5ever",
- "matches",
- "selectors",
+ "jsonptr",
+ "serde",
+ "serde_json",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "jsonptr"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70"
+dependencies = [
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "keyboard-types"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a"
+dependencies = [
+ "bitflags 2.13.1",
+ "serde",
+ "unicode-segmentation",
]
[[package]]
name = "lazy_static"
-version = "1.4.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+
+[[package]]
+name = "libappindicator"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a"
+dependencies = [
+ "glib",
+ "gtk",
+ "gtk-sys",
+ "libappindicator-sys",
+ "log",
+]
+
+[[package]]
+name = "libappindicator-sys"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf"
+dependencies = [
+ "gtk-sys",
+ "libloading",
+ "once_cell",
+]
[[package]]
name = "libc"
-version = "0.2.101"
+version = "0.2.186"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3cb00336871be5ed2c8ed44b60ae9959dc5b9f08539422ed43f09e34ecaeba21"
+checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
+
+[[package]]
+name = "libdbus-sys"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043"
+dependencies = [
+ "pkg-config",
+]
[[package]]
name = "libflate"
-version = "1.0.4"
+version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "158ae2ca09a761eaf6050894f5a6f013f2773dafe24f67bfa73a7504580e2916"
+checksum = "5ff4ae71b685bbad2f2f391fe74f6b7659a34871c08b210fdc039e43bee07d18"
dependencies = [
"adler32",
"crc32fast",
"libflate_lz77",
- "rle-decode-fast",
]
[[package]]
name = "libflate_lz77"
-version = "1.0.0"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3286f09f7d4926fc486334f28d8d2e6ebe4f7f9994494b6dab27ddfad2c9b11b"
+checksum = "a52d3a8bfc85f250440e4424db7d857e241a3aebbbe301f3eb606ab15c39acbf"
+dependencies = [
+ "rle-decode-fast",
+]
+
+[[package]]
+name = "libloading"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
+dependencies = [
+ "cfg-if",
+ "winapi",
+]
[[package]]
name = "libnspire"
@@ -1608,26 +1974,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6428b72ef81134d34d077748639ae280cf8b5b3314ae99fa8ff1e34cbc1d64b"
dependencies = [
"array_iterator",
- "displaydoc",
+ "displaydoc 0.1.7",
"image",
"libnspire-sys",
"libusb1-sys",
"rusb",
"serde",
- "thiserror",
+ "thiserror 1.0.69",
]
[[package]]
name = "libnspire-sys"
version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f5f7be821d3660a256cbc96d8dfd6da6d87abf5cce9cec8393bb5f68d2ca3d4"
dependencies = [
"cc",
"globwalk",
"libusb1-sys",
]
+[[package]]
+name = "libredox"
+version = "0.1.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652"
+dependencies = [
+ "libc",
+]
+
[[package]]
name = "libusb1-sys"
version = "0.4.4"
@@ -1643,111 +2016,104 @@ dependencies = [
]
[[package]]
-name = "lock_api"
-version = "0.4.5"
+name = "linux-raw-sys"
+version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109"
+checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
+
+[[package]]
+name = "litemap"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0"
+
+[[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.14"
+version = "0.4.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
-dependencies = [
- "cfg-if 1.0.0",
-]
-
-[[package]]
-name = "loom"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2111607c723d7857e0d8299d5ce7a0bf4b844d3e44f8de136b13da513eaf8fc4"
-dependencies = [
- "cfg-if 1.0.0",
- "generator",
- "scoped-tls",
- "serde",
- "serde_json",
-]
-
-[[package]]
-name = "mac"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
-
-[[package]]
-name = "mac-notification-sys"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3dfb6b71a9a89cd38b395d994214297447e8e63b1ba5708a9a2b0b1048ceda76"
-dependencies = [
- "cc",
- "chrono",
- "dirs",
- "objc-foundation",
-]
-
-[[package]]
-name = "malloc_buf"
-version = "0.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
-dependencies = [
- "libc",
-]
+checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
[[package]]
name = "markup5ever"
-version = "0.10.1"
+version = "0.38.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd"
+checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862"
dependencies = [
"log",
- "phf 0.8.0",
- "phf_codegen",
- "string_cache",
- "string_cache_codegen",
"tendril",
+ "web_atoms",
]
-[[package]]
-name = "matches"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
-
-[[package]]
-name = "maybe-uninit"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
-
[[package]]
name = "memchr"
-version = "2.3.4"
+version = "2.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
+checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
[[package]]
name = "memoffset"
-version = "0.6.3"
+version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f83fb6581e8ed1f85fd45c116db8405483899489e38406156c25eb743554361d"
+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
dependencies = [
"autocfg",
]
[[package]]
-name = "miniz_oxide"
-version = "0.3.7"
+name = "mime"
+version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.8.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
dependencies = [
- "adler32",
+ "adler2",
+ "simd-adler32",
+]
+
+[[package]]
+name = "mio"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427"
+dependencies = [
+ "libc",
+ "wasi",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "muda"
+version = "0.19.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1dd04e60bc0b07438a6771710ee1698f98f6ebbc7f89b61264af1563b8aeb878"
+dependencies = [
+ "crossbeam-channel",
+ "dpi",
+ "gtk",
+ "keyboard-types",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-core-foundation",
+ "objc2-foundation",
+ "once_cell",
+ "png 0.18.1",
+ "serde",
+ "thiserror 2.0.19",
+ "windows-sys 0.61.2",
]
[[package]]
@@ -1756,148 +2122,69 @@ version = "0.1.6"
dependencies = [
"anyhow",
"clap",
- "hashbrown 0.11.2",
"indicatif",
"lazy_static",
"libnspire",
- "libusb1-sys",
"rusb",
"serde",
"serde_json",
"tauri",
"tauri-build",
-]
-
-[[package]]
-name = "native-tls"
-version = "0.2.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8d96b2e1c8da3957d58100b09f102c6d9cfdfced01b7ec5a8974044bb09dbd4"
-dependencies = [
- "lazy_static",
- "libc",
- "log",
- "openssl",
- "openssl-probe",
- "openssl-sys",
- "schannel",
- "security-framework",
- "security-framework-sys",
- "tempfile",
-]
-
-[[package]]
-name = "nb-connect"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1bb540dc6ef51cfe1916ec038ce7a620daf3a111e2502d745197cd53d6bca15"
-dependencies = [
- "libc",
- "socket2",
+ "tauri-plugin-dialog",
+ "tauri-plugin-shell",
]
[[package]]
name = "ndk"
-version = "0.4.0"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d64d6af06fde0e527b1ba5c7b79a6cc89cfc46325b0b2887dffe8f70197e0c3c"
+checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4"
dependencies = [
- "bitflags 1.2.1",
- "jni-sys",
+ "bitflags 2.13.1",
+ "jni-sys 0.3.1",
+ "log",
"ndk-sys",
"num_enum",
- "thiserror",
-]
-
-[[package]]
-name = "ndk-glue"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3e9e94628f24e7a3cb5b96a2dc5683acd9230bf11991c2a1677b87695138420"
-dependencies = [
- "lazy_static",
- "libc",
- "log",
- "ndk",
- "ndk-macro",
- "ndk-sys",
-]
-
-[[package]]
-name = "ndk-macro"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d"
-dependencies = [
- "darling",
- "proc-macro-crate 0.1.5",
- "proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "raw-window-handle",
+ "thiserror 1.0.69",
]
[[package]]
name = "ndk-sys"
-version = "0.2.1"
+version = "0.6.0+11769913"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c44922cb3dbb1c70b5e5f443d63b64363a898564d739ba5198e3a9138442868d"
+checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873"
+dependencies = [
+ "jni-sys 0.3.1",
+]
[[package]]
name = "new_debug_unreachable"
-version = "1.0.4"
+version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
+checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
[[package]]
-name = "nix"
-version = "0.17.0"
+name = "num-conv"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363"
-dependencies = [
- "bitflags 1.2.1",
- "cc",
- "cfg-if 0.1.10",
- "libc",
- "void",
-]
-
-[[package]]
-name = "nodrop"
-version = "0.1.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
-
-[[package]]
-name = "notify-rust"
-version = "4.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a2ca742cd7268b60c35828d318357f0b1bb9b82088e157ccf3013eb3ce70247"
-dependencies = [
- "mac-notification-sys",
- "serde",
- "winrt-notification",
- "zbus",
- "zvariant",
- "zvariant_derive",
-]
+checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441"
[[package]]
name = "num-integer"
-version = "0.1.44"
+version = "0.1.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
+checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
dependencies = [
- "autocfg",
"num-traits",
]
[[package]]
name = "num-iter"
-version = "0.1.42"
+version = "0.1.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59"
+checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b"
dependencies = [
- "autocfg",
"num-integer",
"num-traits",
]
@@ -1915,43 +2202,33 @@ dependencies = [
[[package]]
name = "num-traits"
-version = "0.2.14"
+version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
]
-[[package]]
-name = "num_cpus"
-version = "1.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
-dependencies = [
- "hermit-abi",
- "libc",
-]
-
[[package]]
name = "num_enum"
-version = "0.5.4"
+version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f9bd055fb730c4f8f4f57d45d35cd6b3f0980535b056dc7ff119cee6a66ed6f"
+checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26"
dependencies = [
- "derivative",
"num_enum_derive",
+ "rustversion",
]
[[package]]
name = "num_enum_derive"
-version = "0.5.4"
+version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "486ea01961c4a818096de679a8b740b26d9033146ac5291b1c98557658f8cdd9"
+checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8"
dependencies = [
- "proc-macro-crate 1.0.0",
+ "proc-macro-crate 3.5.0",
"proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "quote",
+ "syn 2.0.119",
]
[[package]]
@@ -1961,96 +2238,247 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a"
[[package]]
-name = "objc"
-version = "0.2.7"
+name = "objc2"
+version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
+checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f"
dependencies = [
- "malloc_buf",
+ "objc2-encode",
+ "objc2-exception-helper",
]
[[package]]
-name = "objc-foundation"
-version = "0.1.1"
+name = "objc2-app-kit"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9"
+checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c"
dependencies = [
- "block",
- "objc",
- "objc_id",
+ "bitflags 2.13.1",
+ "block2",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-foundation",
]
[[package]]
-name = "objc_id"
+name = "objc2-cloud-kit"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c"
+dependencies = [
+ "bitflags 2.13.1",
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-core-data"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa"
+dependencies = [
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-core-foundation"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
+dependencies = [
+ "bitflags 2.13.1",
+ "dispatch2",
+ "objc2",
+]
+
+[[package]]
+name = "objc2-core-graphics"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807"
+dependencies = [
+ "bitflags 2.13.1",
+ "dispatch2",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-io-surface",
+]
+
+[[package]]
+name = "objc2-core-image"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006"
+dependencies = [
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-core-location"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009"
+dependencies = [
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-core-text"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d"
+dependencies = [
+ "bitflags 2.13.1",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-core-graphics",
+]
+
+[[package]]
+name = "objc2-encode"
+version = "4.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
+
+[[package]]
+name = "objc2-exception-helper"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b"
+checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a"
dependencies = [
- "objc",
+ "cc",
+]
+
+[[package]]
+name = "objc2-foundation"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"
+dependencies = [
+ "bitflags 2.13.1",
+ "block2",
+ "libc",
+ "objc2",
+ "objc2-core-foundation",
+]
+
+[[package]]
+name = "objc2-io-surface"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d"
+dependencies = [
+ "bitflags 2.13.1",
+ "objc2",
+ "objc2-core-foundation",
+]
+
+[[package]]
+name = "objc2-quartz-core"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f"
+dependencies = [
+ "bitflags 2.13.1",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-ui-kit"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22"
+dependencies = [
+ "bitflags 2.13.1",
+ "block2",
+ "objc2",
+ "objc2-cloud-kit",
+ "objc2-core-data",
+ "objc2-core-foundation",
+ "objc2-core-graphics",
+ "objc2-core-image",
+ "objc2-core-location",
+ "objc2-core-text",
+ "objc2-foundation",
+ "objc2-quartz-core",
+ "objc2-user-notifications",
+]
+
+[[package]]
+name = "objc2-user-notifications"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e"
+dependencies = [
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-web-kit"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f"
+dependencies = [
+ "bitflags 2.13.1",
+ "block2",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-core-foundation",
+ "objc2-foundation",
]
[[package]]
name = "once_cell"
-version = "1.8.0"
+version = "1.21.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56"
+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 = "open"
-version = "2.0.1"
+version = "5.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b46b233de7d83bc167fe43ae2dda3b5b84e80e09cceba581e4decb958a4896bf"
+checksum = "a0b3d059e795d52b8a72fef45658620edd4d9c359b338564aa14391ffa511ed5"
dependencies = [
- "pathdiff",
- "winapi",
-]
-
-[[package]]
-name = "openssl"
-version = "0.10.33"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a61075b62a23fef5a29815de7536d940aa35ce96d18ce0cc5076272db678a577"
-dependencies = [
- "bitflags 1.2.1",
- "cfg-if 1.0.0",
- "foreign-types",
+ "dunce",
+ "is-wsl",
"libc",
- "once_cell",
- "openssl-sys",
]
[[package]]
-name = "openssl-probe"
-version = "0.1.2"
+name = "option-ext"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de"
+checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
[[package]]
-name = "openssl-sys"
-version = "0.9.61"
+name = "os_pipe"
+version = "1.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "313752393519e876837e09e1fa183ddef0be7735868dced3196f4472d536277f"
+checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967"
dependencies = [
- "autocfg",
- "cc",
"libc",
- "pkg-config",
- "vcpkg",
+ "windows-sys 0.61.2",
]
-[[package]]
-name = "os_str_bytes"
-version = "2.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "afb2e1c3ee07430c2cf76151675e583e0f19985fa6efae47d6848a3e2c824f85"
-
[[package]]
name = "pango"
-version = "0.14.3"
+version = "0.18.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1fc88307d9797976ea62722ff2ec5de3fae279c6e20100ed3f49ca1a4bf3f96"
+checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4"
dependencies = [
- "bitflags 1.2.1",
+ "gio",
"glib",
"libc",
"once_cell",
@@ -2059,226 +2487,163 @@ dependencies = [
[[package]]
name = "pango-sys"
-version = "0.14.0"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2367099ca5e761546ba1d501955079f097caa186bb53ce0f718dca99ac1942fe"
+checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5"
dependencies = [
- "glib-sys 0.14.0",
- "gobject-sys 0.14.0",
+ "glib-sys",
+ "gobject-sys",
"libc",
- "system-deps 3.2.0",
+ "system-deps",
]
-[[package]]
-name = "parking"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72"
-
[[package]]
name = "parking_lot"
-version = "0.11.2"
+version = "0.12.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
+checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
dependencies = [
- "instant",
"lock_api",
"parking_lot_core",
]
[[package]]
name = "parking_lot_core"
-version = "0.8.5"
+version = "0.9.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216"
+checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
dependencies = [
- "cfg-if 1.0.0",
- "instant",
+ "cfg-if",
"libc",
- "redox_syscall 0.2.10",
+ "redox_syscall",
"smallvec",
- "winapi",
+ "windows-link 0.2.1",
]
-[[package]]
-name = "pathdiff"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "877630b3de15c0b64cc52f659345724fbf6bdad9bd9566699fc53688f3c34a34"
-
[[package]]
name = "percent-encoding"
-version = "2.1.0"
+version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
-
-[[package]]
-name = "pest"
-version = "2.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53"
-dependencies = [
- "ucd-trie",
-]
+checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]]
name = "phf"
-version = "0.8.0"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
+checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf"
dependencies = [
- "phf_macros 0.8.0",
- "phf_shared 0.8.0",
- "proc-macro-hack",
-]
-
-[[package]]
-name = "phf"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9fc3db1018c4b59d7d582a739436478b6035138b6aecbce989fc91c3e98409f"
-dependencies = [
- "phf_macros 0.10.0",
- "phf_shared 0.10.0",
- "proc-macro-hack",
+ "phf_macros",
+ "phf_shared",
+ "serde",
]
[[package]]
name = "phf_codegen"
-version = "0.8.0"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815"
+checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1"
dependencies = [
- "phf_generator 0.8.0",
- "phf_shared 0.8.0",
+ "phf_generator",
+ "phf_shared",
]
[[package]]
name = "phf_generator"
-version = "0.8.0"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526"
+checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737"
dependencies = [
- "phf_shared 0.8.0",
- "rand 0.7.3",
-]
-
-[[package]]
-name = "phf_generator"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6"
-dependencies = [
- "phf_shared 0.10.0",
- "rand 0.8.3",
+ "fastrand",
+ "phf_shared",
]
[[package]]
name = "phf_macros"
-version = "0.8.0"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c"
+checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef"
dependencies = [
- "phf_generator 0.8.0",
- "phf_shared 0.8.0",
- "proc-macro-hack",
+ "phf_generator",
+ "phf_shared",
"proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
-]
-
-[[package]]
-name = "phf_macros"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0"
-dependencies = [
- "phf_generator 0.10.0",
- "phf_shared 0.10.0",
- "proc-macro-hack",
- "proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "quote",
+ "syn 2.0.119",
]
[[package]]
name = "phf_shared"
-version = "0.8.0"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7"
-dependencies = [
- "siphasher",
-]
-
-[[package]]
-name = "phf_shared"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096"
+checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266"
dependencies = [
"siphasher",
]
[[package]]
name = "pin-project-lite"
-version = "0.2.6"
+version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905"
-
-[[package]]
-name = "pin-utils"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
[[package]]
name = "pkg-config"
-version = "0.3.19"
+version = "0.3.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
+checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e"
[[package]]
-name = "png"
-version = "0.11.0"
+name = "plist"
+version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0b0cabbbd20c2d7f06dbf015e06aad59b6ca3d9ed14848783e98af9aaf19925"
+checksum = "7da1d65da6dd5d1e44199ac0f58712d241c0f439f80adea8924d832384087f85"
dependencies = [
- "bitflags 1.2.1",
- "deflate 0.7.20",
- "inflate",
- "num-iter",
+ "base64 0.22.1",
+ "indexmap 2.14.0",
+ "quick-xml",
+ "serde",
+ "time",
]
[[package]]
name = "png"
-version = "0.16.8"
+version = "0.17.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6"
+checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526"
dependencies = [
- "bitflags 1.2.1",
+ "bitflags 1.3.2",
"crc32fast",
- "deflate 0.8.6",
+ "fdeflate",
+ "flate2",
"miniz_oxide",
]
[[package]]
-name = "polling"
-version = "2.1.0"
+name = "png"
+version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92341d779fa34ea8437ef4d82d440d5e1ce3f3ff7f824aa64424cd481f9a1f25"
+checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61"
dependencies = [
- "cfg-if 1.0.0",
- "libc",
- "log",
- "wepoll-ffi",
- "winapi",
+ "bitflags 2.13.1",
+ "crc32fast",
+ "fdeflate",
+ "flate2",
+ "miniz_oxide",
]
[[package]]
-name = "ppv-lite86"
-version = "0.2.10"
+name = "potential_utf"
+version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
+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 = "precomputed-hash"
@@ -2288,21 +2653,31 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
[[package]]
name = "proc-macro-crate"
-version = "0.1.5"
+version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785"
+checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
dependencies = [
- "toml",
+ "once_cell",
+ "toml_edit 0.19.15",
]
[[package]]
name = "proc-macro-crate"
-version = "1.0.0"
+version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41fdbd1df62156fbc5945f4762632564d7d038153091c3fcf1067f6aef7cff92"
+checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24"
dependencies = [
- "thiserror",
- "toml",
+ "toml_datetime 0.6.3",
+ "toml_edit 0.20.2",
+]
+
+[[package]]
+name = "proc-macro-crate"
+version = "3.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f"
+dependencies = [
+ "toml_edit 0.25.13+spec-1.1.0",
]
[[package]]
@@ -2313,8 +2688,8 @@ checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
dependencies = [
"proc-macro-error-attr",
"proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "quote",
+ "syn 1.0.109",
"version_check",
]
@@ -2325,212 +2700,112 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
dependencies = [
"proc-macro2",
- "quote 1.0.9",
+ "quote",
"version_check",
]
-[[package]]
-name = "proc-macro-hack"
-version = "0.5.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
-
-[[package]]
-name = "proc-macro-nested"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086"
-
[[package]]
name = "proc-macro2"
-version = "1.0.26"
+version = "1.0.107"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec"
+checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
dependencies = [
- "unicode-xid 0.2.1",
+ "unicode-ident",
+]
+
+[[package]]
+name = "quick-xml"
+version = "0.41.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1"
+dependencies = [
+ "memchr",
]
[[package]]
name = "quote"
-version = "0.3.15"
+version = "1.0.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
-
-[[package]]
-name = "quote"
-version = "1.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
+checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
dependencies = [
"proc-macro2",
]
[[package]]
-name = "rand"
-version = "0.7.3"
+name = "r-efi"
+version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
-dependencies = [
- "getrandom 0.1.16",
- "libc",
- "rand_chacha 0.2.2",
- "rand_core 0.5.1",
- "rand_hc 0.2.0",
- "rand_pcg",
-]
+checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
-name = "rand"
-version = "0.8.3"
+name = "r-efi"
+version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e"
-dependencies = [
- "libc",
- "rand_chacha 0.3.0",
- "rand_core 0.6.2",
- "rand_hc 0.3.0",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
-dependencies = [
- "ppv-lite86",
- "rand_core 0.5.1",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d"
-dependencies = [
- "ppv-lite86",
- "rand_core 0.6.2",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
-dependencies = [
- "getrandom 0.1.16",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7"
-dependencies = [
- "getrandom 0.2.2",
-]
-
-[[package]]
-name = "rand_hc"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
-dependencies = [
- "rand_core 0.5.1",
-]
-
-[[package]]
-name = "rand_hc"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73"
-dependencies = [
- "rand_core 0.6.2",
-]
-
-[[package]]
-name = "rand_pcg"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
-dependencies = [
- "rand_core 0.5.1",
-]
+checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
[[package]]
name = "raw-window-handle"
-version = "0.3.3"
+version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a441a7a6c80ad6473bd4b74ec1c9a4c951794285bf941c2126f607c72e48211"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "rayon"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674"
-dependencies = [
- "autocfg",
- "crossbeam-deque",
- "either",
- "rayon-core",
-]
-
-[[package]]
-name = "rayon-core"
-version = "1.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a"
-dependencies = [
- "crossbeam-channel",
- "crossbeam-deque",
- "crossbeam-utils",
- "lazy_static",
- "num_cpus",
-]
+checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539"
[[package]]
name = "redox_syscall"
-version = "0.1.57"
+version = "0.5.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
-
-[[package]]
-name = "redox_syscall"
-version = "0.2.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff"
+checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
dependencies = [
- "bitflags 1.2.1",
+ "bitflags 2.13.1",
]
[[package]]
name = "redox_users"
-version = "0.3.5"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d"
+checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac"
dependencies = [
- "getrandom 0.1.16",
- "redox_syscall 0.1.57",
- "rust-argon2",
+ "getrandom 0.2.17",
+ "libredox",
+ "thiserror 2.0.19",
]
[[package]]
-name = "redox_users"
-version = "0.4.0"
+name = "ref-cast"
+version = "1.0.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64"
+checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d"
dependencies = [
- "getrandom 0.2.2",
- "redox_syscall 0.2.10",
+ "ref-cast-impl",
+]
+
+[[package]]
+name = "ref-cast-impl"
+version = "1.0.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 3.0.0",
]
[[package]]
name = "regex"
-version = "1.4.5"
+version = "1.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "957056ecddbeba1b26965114e191d2e8589ce74db242b6ea25fc4062427a5c19"
+checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad"
dependencies = [
"aho-corasick",
"memchr",
@@ -2539,47 +2814,73 @@ dependencies = [
[[package]]
name = "regex-syntax"
-version = "0.6.23"
+version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24d5f089152e60f62d28b835fbff2cd2e8dc0baf1ac13343bef92ab7eed84548"
+checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
[[package]]
-name = "remove_dir_all"
-version = "0.5.3"
+name = "reqwest"
+version = "0.13.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
+checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3"
dependencies = [
- "winapi",
+ "base64 0.22.1",
+ "bytes",
+ "futures-core",
+ "futures-util",
+ "http",
+ "http-body",
+ "http-body-util",
+ "hyper",
+ "hyper-util",
+ "js-sys",
+ "log",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "sync_wrapper",
+ "tokio",
+ "tokio-util",
+ "tower",
+ "tower-http",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "wasm-streams",
+ "web-sys",
]
[[package]]
name = "rfd"
-version = "0.4.3"
+version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cede43618603a102f37bb58244534a33de7daa6a3b77f00277675eef5f8174fe"
+checksum = "a15ad77d9e70a92437d8f74c35d99b4e4691128df018833e99f90bcd36152672"
dependencies = [
- "block",
- "dispatch",
- "glib-sys 0.14.0",
- "gobject-sys 0.14.0",
+ "block2",
+ "dispatch2",
+ "glib-sys",
+ "gobject-sys",
"gtk-sys",
"js-sys",
- "lazy_static",
- "objc",
- "objc-foundation",
- "objc_id",
+ "log",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-core-foundation",
+ "objc2-foundation",
"raw-window-handle",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
- "winapi",
+ "windows-sys 0.60.2",
]
[[package]]
name = "rle-decode-fast"
-version = "1.0.1"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cabe4fa914dec5870285fa7f71f602645da47c486e68486d2b4ceb4a343e90ac"
+checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422"
[[package]]
name = "rusb"
@@ -2592,37 +2893,38 @@ dependencies = [
]
[[package]]
-name = "rust-argon2"
-version = "0.8.3"
+name = "rustc-hash"
+version = "2.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb"
-dependencies = [
- "base64",
- "blake2b_simd",
- "constant_time_eq",
- "crossbeam-utils",
-]
+checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d"
[[package]]
name = "rustc_version"
-version = "0.3.3"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee"
+checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
dependencies = [
- "semver 0.11.0",
+ "semver",
+]
+
+[[package]]
+name = "rustix"
+version = "1.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
+dependencies = [
+ "bitflags 2.13.1",
+ "errno",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.61.2",
]
[[package]]
name = "rustversion"
-version = "1.0.5"
+version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088"
-
-[[package]]
-name = "ryu"
-version = "1.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
+checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
[[package]]
name = "same-file"
@@ -2634,419 +2936,559 @@ dependencies = [
]
[[package]]
-name = "schannel"
-version = "0.1.19"
+name = "schemars"
+version = "0.8.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75"
+checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615"
dependencies = [
- "lazy_static",
- "winapi",
+ "dyn-clone",
+ "indexmap 1.9.3",
+ "schemars_derive",
+ "serde",
+ "serde_json",
+ "url",
+ "uuid",
]
[[package]]
-name = "scoped-tls"
-version = "1.0.0"
+name = "schemars"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2"
+checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f"
+dependencies = [
+ "dyn-clone",
+ "ref-cast",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "schemars"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc"
+dependencies = [
+ "dyn-clone",
+ "ref-cast",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "schemars_derive"
+version = "0.8.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "serde_derive_internals",
+ "syn 2.0.119",
+]
[[package]]
name = "scopeguard"
-version = "1.1.0"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
-
-[[package]]
-name = "security-framework"
-version = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3670b1d2fdf6084d192bc71ead7aabe6c06aa2ea3fbd9cc3ac111fa5c2b1bd84"
-dependencies = [
- "bitflags 1.2.1",
- "core-foundation 0.9.1",
- "core-foundation-sys 0.8.2",
- "libc",
- "security-framework-sys",
-]
-
-[[package]]
-name = "security-framework-sys"
-version = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3676258fd3cfe2c9a0ec99ce3038798d847ce3e4bb17746373eb9f0f1ac16339"
-dependencies = [
- "core-foundation-sys 0.8.2",
- "libc",
-]
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "selectors"
-version = "0.22.0"
+version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe"
+checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c"
dependencies = [
- "bitflags 1.2.1",
+ "bitflags 2.13.1",
"cssparser",
"derive_more",
- "fxhash",
"log",
- "matches",
- "phf 0.8.0",
+ "new_debug_unreachable",
+ "phf",
"phf_codegen",
"precomputed-hash",
+ "rustc-hash",
"servo_arc",
"smallvec",
- "thin-slice",
]
[[package]]
name = "semver"
-version = "0.11.0"
+version = "1.0.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6"
+checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
dependencies = [
- "semver-parser",
-]
-
-[[package]]
-name = "semver"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012"
-
-[[package]]
-name = "semver-parser"
-version = "0.10.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7"
-dependencies = [
- "pest",
+ "serde",
+ "serde_core",
]
[[package]]
name = "serde"
-version = "1.0.125"
+version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171"
+checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
+dependencies = [
+ "serde_core",
+ "serde_derive",
+]
+
+[[package]]
+name = "serde-untagged"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058"
+dependencies = [
+ "erased-serde",
+ "serde",
+ "serde_core",
+ "typeid",
+]
+
+[[package]]
+name = "serde_core"
+version = "1.0.229"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.125"
+version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d"
+checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
dependencies = [
"proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "quote",
+ "syn 3.0.0",
+]
+
+[[package]]
+name = "serde_derive_internals"
+version = "0.29.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
]
[[package]]
name = "serde_json"
-version = "1.0.64"
+version = "1.0.150"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79"
+checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9"
dependencies = [
"itoa",
- "ryu",
+ "memchr",
"serde",
+ "serde_core",
+ "zmij",
]
[[package]]
name = "serde_repr"
-version = "0.1.6"
+version = "0.1.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dc6b7951b17b051f3210b063f12cc17320e2fe30ae05b0fe2a3abb068551c76"
+checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906"
dependencies = [
"proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "quote",
+ "syn 3.0.0",
]
[[package]]
-name = "serde_urlencoded"
-version = "0.6.1"
+name = "serde_spanned"
+version = "0.6.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97"
+checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3"
dependencies = [
- "dtoa",
- "itoa",
"serde",
- "url",
+]
+
+[[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 = "serde_with"
+version = "3.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c"
+dependencies = [
+ "base64 0.22.1",
+ "bs58",
+ "chrono",
+ "hex",
+ "indexmap 1.9.3",
+ "indexmap 2.14.0",
+ "schemars 0.9.0",
+ "schemars 1.2.1",
+ "serde_core",
+ "serde_json",
+ "serde_with_macros",
+ "time",
+]
+
+[[package]]
+name = "serde_with_macros"
+version = "3.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660"
+dependencies = [
+ "darling",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "serialize-to-javascript"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5"
+dependencies = [
+ "serde",
+ "serde_json",
+ "serialize-to-javascript-impl",
+]
+
+[[package]]
+name = "serialize-to-javascript-impl"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
]
[[package]]
name = "servo_arc"
-version = "0.1.1"
+version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432"
+checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930"
dependencies = [
- "nodrop",
"stable_deref_trait",
]
[[package]]
-name = "siphasher"
-version = "0.3.5"
+name = "sha2"
+version = "0.10.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cbce6d4507c7e4a3962091436e56e95290cb71fa302d0d270e32130b75fbff27"
-
-[[package]]
-name = "slab"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
-
-[[package]]
-name = "smallvec"
-version = "1.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e"
-
-[[package]]
-name = "socket2"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "765f090f0e423d2b55843402a07915add955e7d60657db13707a159727326cad"
+checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
dependencies = [
- "libc",
- "winapi",
+ "cfg-if",
+ "cpufeatures",
+ "digest",
]
[[package]]
-name = "soup-sys"
-version = "0.10.0"
+name = "shared_child"
+version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3c7adf08565630bbb71f955f11f8a68464817ded2703a3549747c235b58a13e"
+checksum = "1e362d9935bc50f019969e2f9ecd66786612daae13e8f277be7bfb66e8bed3f7"
dependencies = [
- "bitflags 1.2.1",
- "gio-sys 0.10.1",
- "glib-sys 0.10.1",
- "gobject-sys 0.10.0",
"libc",
- "pkg-config",
- "system-deps 1.3.2",
+ "sigchld",
+ "windows-sys 0.60.2",
+]
+
+[[package]]
+name = "shlex"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
+
+[[package]]
+name = "sigchld"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47106eded3c154e70176fc83df9737335c94ce22f821c32d17ed1db1f83badb1"
+dependencies = [
+ "libc",
+ "os_pipe",
+ "signal-hook",
+]
+
+[[package]]
+name = "signal-hook"
+version = "0.3.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2"
+dependencies = [
+ "libc",
+ "signal-hook-registry",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
+dependencies = [
+ "errno",
+ "libc",
+]
+
+[[package]]
+name = "simd-adler32"
+version = "0.3.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea"
+
+[[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.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
+
+[[package]]
+name = "socket2"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4"
+dependencies = [
+ "libc",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "softbuffer"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3"
+dependencies = [
+ "bytemuck",
+ "js-sys",
+ "ndk",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-core-graphics",
+ "objc2-foundation",
+ "objc2-quartz-core",
+ "raw-window-handle",
+ "redox_syscall",
+ "tracing",
+ "wasm-bindgen",
+ "web-sys",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "soup3"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f"
+dependencies = [
+ "futures-channel",
+ "gio",
+ "glib",
+ "libc",
+ "soup3-sys",
+]
+
+[[package]]
+name = "soup3-sys"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27"
+dependencies = [
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps",
]
[[package]]
name = "stable_deref_trait"
-version = "1.2.0"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
-
-[[package]]
-name = "state"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87cf4f5369e6d3044b5e365c9690f451516ac8f0954084622b49ea3fde2f6de5"
-dependencies = [
- "loom",
-]
-
-[[package]]
-name = "static_assertions"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
[[package]]
name = "string_cache"
-version = "0.8.1"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ddb1139b5353f96e429e1a5e19fbaf663bddedaa06d1dbd49f82e352601209a"
+checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901"
dependencies = [
- "lazy_static",
"new_debug_unreachable",
- "phf_shared 0.8.0",
+ "parking_lot",
+ "phf_shared",
"precomputed-hash",
- "serde",
]
[[package]]
name = "string_cache_codegen"
-version = "0.5.1"
+version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f24c8e5e19d22a726626f1a5e16fe15b132dcf21d10177fa5a45ce7962996b97"
+checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69"
dependencies = [
- "phf_generator 0.8.0",
- "phf_shared 0.8.0",
+ "phf_generator",
+ "phf_shared",
"proc-macro2",
- "quote 1.0.9",
+ "quote",
]
[[package]]
name = "strsim"
-version = "0.9.3"
+version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
-name = "strsim"
-version = "0.10.0"
+name = "swift-rs"
+version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
-
-[[package]]
-name = "strum"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ca6e4730f517e041e547ffe23d29daab8de6b73af4b6ae2a002108169f5e7da"
-
-[[package]]
-name = "strum"
-version = "0.18.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57bd81eb48f4c437cadc685403cad539345bf703d78e63707418431cecd4522b"
-
-[[package]]
-name = "strum"
-version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aaf86bbcfd1fa9670b7a129f64fc0c9fcbbfe4f1bc4210e9e98fe71ffc12cde2"
-
-[[package]]
-name = "strum_macros"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3384590878eb0cab3b128e844412e2d010821e7e091211b9d87324173ada7db8"
+checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7"
dependencies = [
- "quote 0.3.15",
- "syn 0.11.11",
-]
-
-[[package]]
-name = "strum_macros"
-version = "0.18.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87c85aa3f8ea653bfd3ddf25f7ee357ee4d204731f6aa9ad04002306f6e2774c"
-dependencies = [
- "heck",
- "proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
-]
-
-[[package]]
-name = "strum_macros"
-version = "0.21.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec"
-dependencies = [
- "heck",
- "proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "base64 0.21.7",
+ "serde",
+ "serde_json",
]
[[package]]
name = "syn"
-version = "0.11.11"
+version = "1.0.109"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
dependencies = [
- "quote 0.3.15",
- "synom",
- "unicode-xid 0.0.4",
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
]
[[package]]
name = "syn"
-version = "1.0.68"
+version = "2.0.119"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ce15dd3ed8aa2f8eeac4716d6ef5ab58b6b9256db41d7e1a0224c2788e8fd87"
+checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
dependencies = [
"proc-macro2",
- "quote 1.0.9",
- "unicode-xid 0.2.1",
+ "quote",
+ "unicode-ident",
]
[[package]]
-name = "synom"
-version = "0.11.3"
+name = "syn"
+version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6"
+checksum = "f2fac314a64dc9a36e61a9eb4261a5e9bbfbc922b27e518af97bc32b926cf967"
dependencies = [
- "unicode-xid 0.0.4",
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "sync_wrapper"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
+dependencies = [
+ "futures-core",
+]
+
+[[package]]
+name = "synstructure"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
]
[[package]]
name = "system-deps"
-version = "1.3.2"
+version = "6.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f3ecc17269a19353b3558b313bba738b25d82993e30d62a18406a24aba4649b"
+checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349"
dependencies = [
- "heck",
- "pkg-config",
- "strum 0.18.0",
- "strum_macros 0.18.0",
- "thiserror",
- "toml",
- "version-compare 0.0.10",
-]
-
-[[package]]
-name = "system-deps"
-version = "3.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "480c269f870722b3b08d2f13053ce0c2ab722839f472863c3e2d61ff3a1c2fa6"
-dependencies = [
- "anyhow",
"cfg-expr",
- "heck",
- "itertools",
+ "heck 0.5.0",
"pkg-config",
- "strum 0.21.0",
- "strum_macros 0.21.1",
- "thiserror",
- "toml",
- "version-compare 0.0.11",
+ "toml 0.8.2",
+ "version-compare",
]
[[package]]
name = "tao"
-version = "0.5.2"
+version = "0.35.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1aa57de7c282b68f8906278543a724ed8f5a2568f069dd0cc05fc10d1f07036b"
+checksum = "d1c93047acf68669466a34690ac58cca7010bd1b201e1ec86f1fd0a75d3dd4a9"
dependencies = [
- "bitflags 1.2.1",
- "cairo-rs",
- "cc",
- "cocoa",
- "core-foundation 0.9.1",
- "core-graphics 0.22.2",
- "core-video-sys",
+ "bitflags 2.13.1",
+ "block2",
+ "core-foundation",
+ "core-graphics",
"crossbeam-channel",
- "dispatch",
- "gdk",
- "gdk-pixbuf",
- "gdk-sys",
- "gio",
- "glib",
- "glib-sys 0.14.0",
+ "dbus",
+ "dispatch2",
+ "dlopen2",
+ "dpi",
+ "gdkwayland-sys",
+ "gdkx11-sys",
"gtk",
- "instant",
- "lazy_static",
+ "jni",
"libc",
"log",
"ndk",
- "ndk-glue",
"ndk-sys",
- "objc",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
+ "objc2-ui-kit",
+ "once_cell",
"parking_lot",
+ "percent-encoding",
"raw-window-handle",
- "scopeguard",
- "serde",
+ "tao-macros",
"unicode-segmentation",
- "winapi",
+ "url",
+ "windows",
+ "windows-core 0.61.2",
+ "windows-version",
"x11-dl",
]
[[package]]
-name = "tar"
-version = "0.4.33"
+name = "tao-macros"
+version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0bcfbd6a598361fda270d82469fff3d65089dc33e175c9a131f7b4cd395f228"
+checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "tar"
+version = "0.4.46"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840"
dependencies = [
"filetime",
"libc",
@@ -3054,595 +3496,1008 @@ dependencies = [
]
[[package]]
-name = "tauri"
-version = "1.0.0-beta.8"
+name = "target-lexicon"
+version = "0.12.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79a0579dcc6fb883fe90dd3c66d76b8b8f4a1786e1e915e314b2017a500ede09"
+checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
+
+[[package]]
+name = "tauri"
+version = "2.11.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "667b20e2726d572dea2de7370da16e188eb06008faf9a92fab7cdc46791190b5"
dependencies = [
- "attohttpc",
- "bincode",
- "cfg_aliases",
- "dirs-next",
- "either",
+ "anyhow",
+ "bytes",
+ "cookie",
+ "dirs",
+ "dunce",
"embed_plist",
- "flate2",
- "futures",
- "futures-lite",
- "glib",
+ "getrandom 0.3.4",
+ "glob",
"gtk",
+ "heck 0.5.0",
"http",
- "ignore",
- "notify-rust",
- "once_cell",
- "open",
+ "jni",
+ "libc",
+ "log",
+ "mime",
+ "muda",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
+ "objc2-ui-kit",
+ "objc2-web-kit",
"percent-encoding",
- "rand 0.8.3",
+ "plist",
"raw-window-handle",
- "rfd",
- "semver 1.0.4",
+ "reqwest",
"serde",
"serde_json",
"serde_repr",
- "state",
- "tar",
+ "serialize-to-javascript",
+ "swift-rs",
+ "tauri-build",
"tauri-macros",
"tauri-runtime",
"tauri-runtime-wry",
"tauri-utils",
- "tempfile",
- "thiserror",
+ "thiserror 2.0.19",
"tokio",
+ "tray-icon",
"url",
- "uuid",
- "zip",
+ "webkit2gtk",
+ "webview2-com",
+ "window-vibrancy",
+ "windows",
]
[[package]]
name = "tauri-build"
-version = "1.0.0-beta.4"
+version = "2.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c9c9a9bea25b9d6f5845b8662e18447e17218f99860cab37e39e2b57a9fcd49"
+checksum = "bc9ce40b16101cb6ea63d3e221567affd1c3a9205f95d7bc574941a10636b632"
dependencies = [
"anyhow",
- "proc-macro2",
- "quote 1.0.9",
+ "cargo_toml",
+ "dirs",
+ "glob",
+ "heck 0.5.0",
+ "json-patch",
+ "schemars 0.8.22",
+ "semver",
+ "serde",
"serde_json",
"tauri-utils",
- "winres",
+ "tauri-winres",
+ "walkdir",
]
[[package]]
name = "tauri-codegen"
-version = "1.0.0-beta.4"
+version = "2.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1663739ab53e281919676f216fb56a031104d0d2cd1a2dd5b012d279bcdb0ea4"
+checksum = "08279169ff42f8fc45a1dbc9dcae888893ba95288142e5880c59b93a26d2cfc5"
dependencies = [
- "blake3",
- "kuchiki",
+ "base64 0.22.1",
+ "brotli",
+ "ico",
+ "json-patch",
+ "plist",
+ "png 0.17.16",
"proc-macro2",
- "quote 1.0.9",
- "regex",
+ "quote",
+ "semver",
"serde",
"serde_json",
+ "sha2",
+ "syn 2.0.119",
"tauri-utils",
- "thiserror",
+ "thiserror 2.0.19",
+ "time",
+ "url",
+ "uuid",
"walkdir",
- "zstd",
]
[[package]]
name = "tauri-macros"
-version = "1.0.0-beta.5"
+version = "2.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bddf9f5868402323f35ef94fa6ab1d5d10b29aea9de598d829723aa1db5693b4"
+checksum = "e8b394794f399a421811d06966343e7933fcae92d59f5180b9388d1174497a45"
dependencies = [
+ "heck 0.5.0",
"proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "quote",
+ "syn 2.0.119",
"tauri-codegen",
+ "tauri-utils",
+]
+
+[[package]]
+name = "tauri-plugin"
+version = "2.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "74be5dd4bed9afbd145e5716b5fa2ec28cbc29c34ffa61c258c9273d896c8020"
+dependencies = [
+ "anyhow",
+ "glob",
+ "plist",
+ "schemars 0.8.22",
+ "serde",
+ "serde_json",
+ "tauri-utils",
+ "walkdir",
+]
+
+[[package]]
+name = "tauri-plugin-dialog"
+version = "2.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2d3c1dbe38037e7f590cdf2492594d5ceebe031e7bc7e827509b22a999d2940"
+dependencies = [
+ "log",
+ "raw-window-handle",
+ "rfd",
+ "serde",
+ "serde_json",
+ "tauri",
+ "tauri-plugin",
+ "tauri-plugin-fs",
+ "thiserror 2.0.19",
+ "url",
+]
+
+[[package]]
+name = "tauri-plugin-fs"
+version = "2.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7ecc274121aca0c036a2b42d1cbe83d368d348f54e0bb8a735c2b1548e8f371"
+dependencies = [
+ "anyhow",
+ "dunce",
+ "glob",
+ "log",
+ "objc2-foundation",
+ "percent-encoding",
+ "schemars 0.8.22",
+ "serde",
+ "serde_json",
+ "serde_repr",
+ "tauri",
+ "tauri-plugin",
+ "tauri-utils",
+ "thiserror 2.0.19",
+ "toml 1.1.3+spec-1.1.0",
+ "url",
+]
+
+[[package]]
+name = "tauri-plugin-shell"
+version = "2.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8457dbf9e2bab1edd8df22bb2c20857a59a9868e79cb3eac5ed639eec4d0c73b"
+dependencies = [
+ "encoding_rs",
+ "log",
+ "open",
+ "os_pipe",
+ "regex",
+ "schemars 0.8.22",
+ "serde",
+ "serde_json",
+ "shared_child",
+ "tauri",
+ "tauri-plugin",
+ "thiserror 2.0.19",
+ "tokio",
]
[[package]]
name = "tauri-runtime"
-version = "0.2.1"
+version = "2.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e9c52eccfb7f2ce5a09262bdc3671f0f07f637e27f8aa25e5f38145cddcd4e01"
+checksum = "b0b4bc95aed361b0019067d189a1174a603d460d0f6c72606512d59fc9c12ec8"
dependencies = [
+ "cookie",
+ "dpi",
"gtk",
"http",
- "http-range",
- "infer",
+ "jni",
+ "objc2",
+ "objc2-ui-kit",
+ "objc2-web-kit",
+ "raw-window-handle",
"serde",
"serde_json",
"tauri-utils",
- "thiserror",
- "uuid",
- "winapi",
+ "thiserror 2.0.19",
+ "url",
+ "webkit2gtk",
+ "webview2-com",
+ "windows",
]
[[package]]
name = "tauri-runtime-wry"
-version = "0.2.1"
+version = "2.11.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fed8dd0a448c303fa764859d6dfa1c746c4f2c6c30a83c162f8bebb12e4af4e"
+checksum = "4e6fac707727b7a2f48e4ded90976324267371073edbb415ffb73bb0458d203f"
dependencies = [
"gtk",
- "ico",
- "infer",
- "png 0.16.8",
+ "http",
+ "jni",
+ "log",
+ "objc2",
+ "objc2-app-kit",
+ "once_cell",
+ "percent-encoding",
+ "raw-window-handle",
+ "softbuffer",
+ "tao",
"tauri-runtime",
"tauri-utils",
- "uuid",
- "winapi",
+ "url",
+ "webkit2gtk",
+ "webview2-com",
+ "windows",
"wry",
]
[[package]]
name = "tauri-utils"
-version = "1.0.0-beta.3"
+version = "2.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fcb9b79594f22b6ed0cc8362e0dfde5b7969962de3cd8ca683de702e59e8221b"
+checksum = "3e176a18e67764923c4f1ce66f25ae4abe5f688384d5eb1a0fa6c77f3d90f887"
dependencies = [
- "html5ever",
- "kuchiki",
- "phf 0.10.0",
+ "anyhow",
+ "brotli",
+ "cargo_metadata",
+ "ctor",
+ "dom_query",
+ "dunce",
+ "glob",
+ "http",
+ "infer",
+ "json-patch",
+ "log",
+ "memchr",
+ "phf",
+ "plist",
"proc-macro2",
- "quote 1.0.9",
+ "quote",
+ "regex",
+ "schemars 0.8.22",
+ "semver",
"serde",
+ "serde-untagged",
"serde_json",
- "thiserror",
+ "serde_with",
+ "swift-rs",
+ "thiserror 2.0.19",
+ "toml 1.1.3+spec-1.1.0",
"url",
- "zstd",
+ "urlpattern",
+ "uuid",
+ "walkdir",
]
[[package]]
-name = "tempfile"
-version = "3.2.0"
+name = "tauri-winres"
+version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22"
+checksum = "cc65d45c68858bfe420dd29e834b5d15dbecf8a07a8a16cf4d532c7b1f69d4b6"
dependencies = [
- "cfg-if 1.0.0",
- "libc",
- "rand 0.8.3",
- "redox_syscall 0.2.10",
- "remove_dir_all",
- "winapi",
+ "dunce",
+ "embed-resource",
+ "toml 1.1.3+spec-1.1.0",
]
[[package]]
name = "tendril"
-version = "0.4.2"
+version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9ef557cb397a4f0a5a3a628f06515f78563f2209e64d47055d9dc6052bf5e33"
+checksum = "5fed54709c5b3a53d09bb1c113ea4f5ceafd1e772ddcb0030a82e1d56c087b08"
dependencies = [
- "futf",
- "mac",
- "utf-8",
+ "new_debug_unreachable",
]
-[[package]]
-name = "termcolor"
-version = "1.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4"
-dependencies = [
- "winapi-util",
-]
-
-[[package]]
-name = "terminal_size"
-version = "0.1.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86ca8ced750734db02076f44132d802af0b33b09942331f4459dde8636fd2406"
-dependencies = [
- "libc",
- "winapi",
-]
-
-[[package]]
-name = "textwrap"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "203008d98caf094106cfaba70acfed15e18ed3ddb7d94e49baec153a2b462789"
-dependencies = [
- "unicode-width",
-]
-
-[[package]]
-name = "thin-slice"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c"
-
[[package]]
name = "thiserror"
-version = "1.0.26"
+version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2"
+checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
dependencies = [
- "thiserror-impl",
+ "thiserror-impl 1.0.69",
+]
+
+[[package]]
+name = "thiserror"
+version = "2.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9"
+dependencies = [
+ "thiserror-impl 2.0.19",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.26"
+version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745"
+checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "quote",
+ "syn 2.0.119",
]
[[package]]
-name = "thread_local"
-version = "1.1.3"
+name = "thiserror-impl"
+version = "2.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd"
+checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd"
dependencies = [
- "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 3.0.0",
]
[[package]]
name = "time"
-version = "0.1.43"
+version = "0.3.53"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438"
+checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50"
dependencies = [
- "libc",
- "winapi",
+ "deranged",
+ "num-conv",
+ "powerfmt",
+ "serde_core",
+ "time-core",
+ "time-macros",
+]
+
+[[package]]
+name = "time-core"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109"
+
+[[package]]
+name = "time-macros"
+version = "0.2.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f"
+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 0.2.6",
+ "zerovec",
]
[[package]]
name = "tinyvec"
-version = "1.2.0"
+version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342"
+checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f"
dependencies = [
"tinyvec_macros",
]
[[package]]
name = "tinyvec_macros"
-version = "0.1.0"
+version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.10.1"
+version = "1.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92036be488bb6594459f2e03b60e42df6f937fe6ca5c5ffdcb539c6b84dc40f5"
+checksum = "d988bcd52dbe076d3d46903332f58c912b87a2c49b1428419a5845154762ffee"
dependencies = [
- "autocfg",
"bytes",
- "memchr",
- "num_cpus",
+ "libc",
+ "mio",
"pin-project-lite",
+ "socket2",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
]
[[package]]
name = "toml"
-version = "0.5.8"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa"
+checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d"
+dependencies = [
+ "serde",
+ "serde_spanned 0.6.9",
+ "toml_datetime 0.6.3",
+ "toml_edit 0.20.2",
+]
+
+[[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 2.14.0",
+ "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.3+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53c96ecdfa941c8fc4fcaed14f99ada8ebed502eef533015095a07e3301d4c3c"
+dependencies = [
+ "indexmap 2.14.0",
+ "serde_core",
+ "serde_spanned 1.1.1",
+ "toml_datetime 1.1.1+spec-1.1.0",
+ "toml_parser",
+ "toml_writer",
+ "winnow 1.0.4",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b"
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.19.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
+dependencies = [
+ "indexmap 2.14.0",
+ "toml_datetime 0.6.3",
+ "winnow 0.5.40",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.20.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338"
+dependencies = [
+ "indexmap 2.14.0",
+ "serde",
+ "serde_spanned 0.6.9",
+ "toml_datetime 0.6.3",
+ "winnow 0.5.40",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.25.13+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b"
+dependencies = [
+ "indexmap 2.14.0",
+ "toml_datetime 1.1.1+spec-1.1.0",
+ "toml_parser",
+ "winnow 1.0.4",
+]
+
+[[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.4",
+]
+
+[[package]]
+name = "toml_writer"
+version = "1.1.2+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2"
+
+[[package]]
+name = "tower"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4"
+dependencies = [
+ "futures-core",
+ "futures-util",
+ "pin-project-lite",
+ "sync_wrapper",
+ "tokio",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "tower-http"
+version = "0.6.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840"
+dependencies = [
+ "bitflags 2.13.1",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "pin-project-lite",
+ "tower",
+ "tower-layer",
+ "tower-service",
+ "url",
+]
+
+[[package]]
+name = "tower-layer"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
+
+[[package]]
+name = "tower-service"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
+
+[[package]]
+name = "tracing"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
+dependencies = [
+ "pin-project-lite",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "tray-icon"
+version = "0.24.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "65ba1e5f6b9ef9fd87e21b9c6f351554dbd717960089168fcfdef854686961dc"
+dependencies = [
+ "crossbeam-channel",
+ "dirs",
+ "libappindicator",
+ "muda",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-core-foundation",
+ "objc2-core-graphics",
+ "objc2-foundation",
+ "once_cell",
+ "png 0.18.1",
+ "serde",
+ "thiserror 2.0.19",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+
+[[package]]
+name = "typeid"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c"
+
[[package]]
name = "typenum"
-version = "1.13.0"
+version = "1.20.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06"
+checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
[[package]]
-name = "ucd-trie"
-version = "0.1.3"
+name = "unic-char-property"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c"
-
-[[package]]
-name = "unicode-bidi"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
+checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221"
dependencies = [
- "matches",
+ "unic-char-range",
]
[[package]]
-name = "unicode-normalization"
-version = "0.1.17"
+name = "unic-char-range"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef"
+checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc"
+
+[[package]]
+name = "unic-common"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc"
+
+[[package]]
+name = "unic-ucd-ident"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987"
dependencies = [
- "tinyvec",
+ "unic-char-property",
+ "unic-char-range",
+ "unic-ucd-version",
]
+[[package]]
+name = "unic-ucd-version"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4"
+dependencies = [
+ "unic-common",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
+
[[package]]
name = "unicode-segmentation"
-version = "1.8.0"
+version = "1.13.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b"
+checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8"
[[package]]
name = "unicode-width"
-version = "0.1.8"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
-
-[[package]]
-name = "unicode-xid"
-version = "0.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"
-
-[[package]]
-name = "unicode-xid"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
+checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
[[package]]
name = "url"
-version = "2.2.1"
+version = "2.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ccd964113622c8e9322cfac19eb1004a07e636c545f325da085d5cdde6f1f8b"
+checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
dependencies = [
"form_urlencoded",
"idna",
- "matches",
"percent-encoding",
"serde",
+ "serde_derive",
]
[[package]]
-name = "utf-8"
-version = "0.7.6"
+name = "urlpattern"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d"
+dependencies = [
+ "regex",
+ "serde",
+ "unic-ucd-ident",
+ "url",
+]
+
+[[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 = "0.8.2"
+version = "1.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
+checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239"
dependencies = [
- "getrandom 0.2.2",
+ "getrandom 0.4.3",
+ "js-sys",
+ "serde_core",
+ "wasm-bindgen",
]
[[package]]
name = "vcpkg"
-version = "0.2.11"
+version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb"
-
-[[package]]
-name = "vec_map"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]]
name = "version-compare"
-version = "0.0.10"
+version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d63556a25bae6ea31b52e640d7c41d1ab27faba4ccb600013837a3d0b3994ca1"
-
-[[package]]
-name = "version-compare"
-version = "0.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b"
+checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e"
[[package]]
name = "version_check"
-version = "0.9.3"
+version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe"
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
-name = "void"
-version = "1.0.2"
+name = "vswhom"
+version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
+checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b"
+dependencies = [
+ "libc",
+ "vswhom-sys",
+]
[[package]]
-name = "waker-fn"
-version = "1.1.0"
+name = "vswhom-sys"
+version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
+checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150"
+dependencies = [
+ "cc",
+ "libc",
+]
[[package]]
name = "walkdir"
-version = "2.3.2"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56"
+checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
dependencies = [
"same-file",
- "winapi",
"winapi-util",
]
[[package]]
-name = "wasi"
-version = "0.9.0+wasi-snapshot-preview1"
+name = "want"
+version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
-
-[[package]]
-name = "wasi"
-version = "0.10.2+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
-
-[[package]]
-name = "wasm-bindgen"
-version = "0.2.73"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83240549659d187488f91f33c0f8547cbfef0b2088bc470c116d1d260ef623d9"
+checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
dependencies = [
- "cfg-if 1.0.0",
- "wasm-bindgen-macro",
+ "try-lock",
]
[[package]]
-name = "wasm-bindgen-backend"
-version = "0.2.73"
+name = "wasi"
+version = "0.11.1+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae70622411ca953215ca6d06d3ebeb1e915f0f6613e3b495122878d7ebec7dae"
+checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
+
+[[package]]
+name = "wasip2"
+version = "1.0.4+wasi-0.2.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
dependencies = [
- "bumpalo",
- "lazy_static",
- "log",
- "proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "wit-bindgen",
+]
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.126"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.23"
+version = "0.4.76"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81b8b767af23de6ac18bf2168b690bed2902743ddf0fb39252e36f9e2bfc63ea"
+checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d"
dependencies = [
- "cfg-if 1.0.0",
"js-sys",
"wasm-bindgen",
- "web-sys",
]
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.73"
+version = "0.2.126"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e734d91443f177bfdb41969de821e15c516931c3c3db3d318fa1b68975d0f6f"
+checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1"
dependencies = [
- "quote 1.0.9",
+ "quote",
"wasm-bindgen-macro-support",
]
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.73"
+version = "0.2.126"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d53739ff08c8a68b0fdbcd54c372b8ab800b1449ab3c9d706503bc7dd1621b2c"
+checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e"
dependencies = [
+ "bumpalo",
"proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
- "wasm-bindgen-backend",
+ "quote",
+ "syn 2.0.119",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.73"
+version = "0.2.126"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9a543ae66aa233d14bb765ed9af4a33e81b8b58d1584cf1b47ff8cd0b9e4489"
+checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "wasm-streams"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb"
+dependencies = [
+ "futures-util",
+ "js-sys",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
[[package]]
name = "web-sys"
-version = "0.3.50"
+version = "0.3.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a905d57e488fec8861446d3393670fb50d27a262344013181c2cdf9fff5481be"
+checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141"
dependencies = [
"js-sys",
"wasm-bindgen",
]
[[package]]
-name = "webkit2gtk"
-version = "0.14.0"
+name = "web_atoms"
+version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3e47b7f870883fc21612d2a51b74262f7f2cc5371f1621370817292a35300a9"
+checksum = "075474b12bcb3d2e3d4546580e9de478eeeead668a1761e2a8860c836b7ef297"
dependencies = [
- "bitflags 1.2.1",
+ "phf",
+ "phf_codegen",
+ "string_cache",
+ "string_cache_codegen",
+]
+
+[[package]]
+name = "webkit2gtk"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793"
+dependencies = [
+ "bitflags 1.3.2",
"cairo-rs",
"gdk",
"gdk-sys",
"gio",
- "gio-sys 0.14.0",
+ "gio-sys",
"glib",
- "glib-sys 0.14.0",
- "gobject-sys 0.14.0",
+ "glib-sys",
+ "gobject-sys",
"gtk",
"gtk-sys",
"javascriptcore-rs",
"libc",
"once_cell",
+ "soup3",
"webkit2gtk-sys",
]
[[package]]
name = "webkit2gtk-sys"
-version = "0.14.0"
+version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b66ccc9f0cb4de7c3b92376a5bf64e7ddffb33852f092721731a039ec38dda98"
+checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5"
dependencies = [
- "atk-sys",
- "bitflags 1.2.1",
+ "bitflags 1.3.2",
"cairo-sys-rs",
- "gdk-pixbuf-sys",
"gdk-sys",
- "gio-sys 0.14.0",
- "glib-sys 0.14.0",
- "gobject-sys 0.14.0",
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
"gtk-sys",
"javascriptcore-rs-sys",
"libc",
- "pango-sys",
"pkg-config",
- "soup-sys",
- "system-deps 3.2.0",
+ "soup3-sys",
+ "system-deps",
]
[[package]]
-name = "webview2"
-version = "0.1.1"
+name = "webview2-com"
+version = "0.38.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fab1ccfdabb098b047293c8d496c1914d1c654b68fdaa3bb77cfa47c4bca2c7"
+checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a"
dependencies = [
- "com",
- "once_cell",
- "webview2-sys",
- "widestring",
- "winapi",
+ "webview2-com-macros",
+ "webview2-com-sys",
+ "windows",
+ "windows-core 0.61.2",
+ "windows-implement",
+ "windows-interface",
]
[[package]]
-name = "webview2-sys"
-version = "0.1.0"
+name = "webview2-com-macros"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc5288cef1e0cbcf7a0b961e6271e33589b8989c80b2e11078504e989b5346ff"
+checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54"
dependencies = [
- "com",
- "winapi",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
]
[[package]]
-name = "wepoll-ffi"
-version = "0.1.2"
+name = "webview2-com-sys"
+version = "0.38.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb"
+checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c"
dependencies = [
- "cc",
+ "thiserror 2.0.19",
+ "windows",
+ "windows-core 0.61.2",
]
-[[package]]
-name = "widestring"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c"
-
-[[package]]
-name = "wildmatch"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f44b95f62d34113cf558c93511ac93027e03e9c29a60dd0fd70e6e025c7270a"
-
[[package]]
name = "winapi"
version = "0.3.9"
@@ -3661,11 +4516,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-util"
-version = "0.1.5"
+version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
dependencies = [
- "winapi",
+ "windows-sys 0.61.2",
]
[[package]]
@@ -3675,195 +4530,599 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
-name = "winres"
-version = "0.1.11"
+name = "window-vibrancy"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff4fb510bbfe5b8992ff15f77a2e6fe6cf062878f0eda00c0f44963a807ca5dc"
+checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c"
dependencies = [
- "toml",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-core-foundation",
+ "objc2-foundation",
+ "raw-window-handle",
+ "windows-sys 0.59.0",
+ "windows-version",
]
[[package]]
-name = "winrt"
-version = "0.4.0"
+name = "windows"
+version = "0.61.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e30cba82e22b083dc5a422c2ee77e20dc7927271a0dc981360c57c1453cb48d"
+checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893"
dependencies = [
- "winapi",
+ "windows-collections",
+ "windows-core 0.61.2",
+ "windows-future",
+ "windows-link 0.1.3",
+ "windows-numerics",
]
[[package]]
-name = "winrt-notification"
-version = "0.2.4"
+name = "windows-collections"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57790eb281688a4682dab44df2a1ba8b78373233bd71cb291c3e75fecb1a01c4"
+checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8"
dependencies = [
- "strum 0.8.0",
- "strum_macros 0.8.0",
- "winapi",
- "winrt",
- "xml-rs",
+ "windows-core 0.61.2",
]
+[[package]]
+name = "windows-core"
+version = "0.61.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
+dependencies = [
+ "windows-implement",
+ "windows-interface",
+ "windows-link 0.1.3",
+ "windows-result 0.3.4",
+ "windows-strings 0.4.2",
+]
+
+[[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 0.2.1",
+ "windows-result 0.4.1",
+ "windows-strings 0.5.1",
+]
+
+[[package]]
+name = "windows-future"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e"
+dependencies = [
+ "windows-core 0.61.2",
+ "windows-link 0.1.3",
+ "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 2.0.119",
+]
+
+[[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 2.0.119",
+]
+
+[[package]]
+name = "windows-link"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
+
+[[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.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
+dependencies = [
+ "windows-core 0.61.2",
+ "windows-link 0.1.3",
+]
+
+[[package]]
+name = "windows-result"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
+dependencies = [
+ "windows-link 0.1.3",
+]
+
+[[package]]
+name = "windows-result"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
+dependencies = [
+ "windows-link 0.2.1",
+]
+
+[[package]]
+name = "windows-strings"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
+dependencies = [
+ "windows-link 0.1.3",
+]
+
+[[package]]
+name = "windows-strings"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
+dependencies = [
+ "windows-link 0.2.1",
+]
+
+[[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.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.60.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
+dependencies = [
+ "windows-targets 0.53.5",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.61.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
+dependencies = [
+ "windows-link 0.2.1",
+]
+
+[[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 0.52.6",
+ "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-targets"
+version = "0.53.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
+dependencies = [
+ "windows-link 0.2.1",
+ "windows_aarch64_gnullvm 0.53.1",
+ "windows_aarch64_msvc 0.53.1",
+ "windows_i686_gnu 0.53.1",
+ "windows_i686_gnullvm 0.53.1",
+ "windows_i686_msvc 0.53.1",
+ "windows_x86_64_gnu 0.53.1",
+ "windows_x86_64_gnullvm 0.53.1",
+ "windows_x86_64_msvc 0.53.1",
+]
+
+[[package]]
+name = "windows-threading"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6"
+dependencies = [
+ "windows-link 0.1.3",
+]
+
+[[package]]
+name = "windows-version"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631"
+dependencies = [
+ "windows-link 0.2.1",
+]
+
+[[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_gnullvm"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
+
+[[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_aarch64_msvc"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
+
+[[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_gnu"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
+
+[[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_gnullvm"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
+
+[[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_i686_msvc"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
+
+[[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_gnu"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
+
+[[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_gnullvm"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
+
+[[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 = "windows_x86_64_msvc"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
+
+[[package]]
+name = "winnow"
+version = "0.5.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winnow"
+version = "0.7.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945"
+
+[[package]]
+name = "winnow"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winreg"
+version = "0.55.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97"
+dependencies = [
+ "cfg-if",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "wit-bindgen"
+version = "0.57.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
+
+[[package]]
+name = "writeable"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
+
[[package]]
name = "wry"
-version = "0.12.2"
+version = "0.55.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f9549393a3917b5303277abb0267f8eecf9fd629b25f1c04e5284aa58b61915"
+checksum = "186f9871daa55fd9c016578b810d149de58367113db7fb72b462d2323ce19514"
dependencies = [
- "cocoa",
- "core-graphics 0.22.2",
- "gdk",
- "gio",
- "glib",
+ "base64 0.22.1",
+ "block2",
+ "cookie",
+ "crossbeam-channel",
+ "dirs",
+ "dom_query",
+ "dpi",
+ "dunce",
+ "gdkx11",
"gtk",
"http",
+ "javascriptcore-rs",
+ "jni",
"libc",
- "log",
- "objc",
- "objc_id",
+ "ndk",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-core-foundation",
+ "objc2-foundation",
+ "objc2-ui-kit",
+ "objc2-web-kit",
"once_cell",
- "serde",
- "serde_json",
- "tao",
- "thiserror",
+ "percent-encoding",
+ "raw-window-handle",
+ "sha2",
+ "soup3",
+ "tao-macros",
+ "thiserror 2.0.19",
"url",
"webkit2gtk",
"webkit2gtk-sys",
- "webview2",
- "webview2-sys",
- "winapi",
+ "webview2-com",
+ "windows",
+ "windows-core 0.61.2",
+ "windows-version",
+ "x11-dl",
+]
+
+[[package]]
+name = "x11"
+version = "2.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e"
+dependencies = [
+ "libc",
+ "pkg-config",
]
[[package]]
name = "x11-dl"
-version = "2.18.5"
+version = "2.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2bf981e3a5b3301209754218f962052d4d9ee97e478f4d26d4a6eced34c1fef8"
+checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f"
dependencies = [
- "lazy_static",
"libc",
- "maybe-uninit",
+ "once_cell",
"pkg-config",
]
[[package]]
name = "xattr"
-version = "0.2.2"
+version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c"
+checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156"
dependencies = [
"libc",
+ "rustix",
]
[[package]]
-name = "xml-rs"
-version = "0.6.1"
+name = "yoke"
+version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1945e12e16b951721d7976520b0832496ef79c31602c7a29d950de79ba74621"
+checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5"
dependencies = [
- "bitflags 0.9.1",
+ "stable_deref_trait",
+ "yoke-derive",
+ "zerofrom",
]
[[package]]
-name = "zbus"
-version = "1.9.1"
+name = "yoke-derive"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2326acc379a3ac4e34b794089f5bdb17086bf29a5fdf619b7b4cc772dc2e9dad"
+checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"
dependencies = [
- "async-io",
- "byteorder",
- "derivative",
- "enumflags2",
- "fastrand",
- "futures",
- "nb-connect",
- "nix",
- "once_cell",
- "polling",
- "scoped-tls",
- "serde",
- "serde_repr",
- "zbus_macros",
- "zvariant",
-]
-
-[[package]]
-name = "zbus_macros"
-version = "1.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a482c56029e48681b89b92b5db3c446db0915e8dd1052c0328a574eda38d5f93"
-dependencies = [
- "proc-macro-crate 0.1.5",
"proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "quote",
+ "syn 2.0.119",
+ "synstructure",
]
[[package]]
-name = "zip"
-version = "0.5.11"
+name = "zerofrom"
+version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8264fcea9b7a036a4a5103d7153e988dbc2ebbafb34f68a3c2d404b6b82d74b6"
+checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272"
dependencies = [
- "byteorder",
- "bzip2",
- "crc32fast",
- "flate2",
- "thiserror",
- "time",
+ "zerofrom-derive",
]
[[package]]
-name = "zstd"
-version = "0.9.0+zstd.1.5.0"
+name = "zerofrom-derive"
+version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07749a5dc2cb6b36661290245e350f15ec3bbb304e493db54a1d354480522ccd"
+checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1"
dependencies = [
- "zstd-safe",
-]
-
-[[package]]
-name = "zstd-safe"
-version = "4.1.1+zstd.1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c91c90f2c593b003603e5e0493c837088df4469da25aafff8bce42ba48caf079"
-dependencies = [
- "libc",
- "zstd-sys",
-]
-
-[[package]]
-name = "zstd-sys"
-version = "1.6.1+zstd.1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "615120c7a2431d16cf1cf979e7fc31ba7a5b5e5707b29c8a99e5dbf8a8392a33"
-dependencies = [
- "cc",
- "libc",
-]
-
-[[package]]
-name = "zvariant"
-version = "2.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa4b785b8b32b0f8433b4474e6bb4ea77b37c1960e84d7598e01dd199b2b23ef"
-dependencies = [
- "byteorder",
- "enumflags2",
- "serde",
- "static_assertions",
- "zvariant_derive",
-]
-
-[[package]]
-name = "zvariant_derive"
-version = "2.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b42af4ee88fb928781391216c34be77ec7cdb3546042b2947ce38d86aa5f37dd"
-dependencies = [
- "proc-macro-crate 1.0.0",
"proc-macro2",
- "quote 1.0.9",
- "syn 1.0.68",
+ "quote",
+ "syn 2.0.119",
+ "synstructure",
]
+
+[[package]]
+name = "zerotrie"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf"
+dependencies = [
+ "displaydoc 0.2.6",
+ "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 2.0.119",
+]
+
+[[package]]
+name = "zmij"
+version = "1.0.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
diff --git a/desktop/src-tauri/Cargo.toml b/desktop/src-tauri/Cargo.toml
index 304e63b..7447aea 100644
--- a/desktop/src-tauri/Cargo.toml
+++ b/desktop/src-tauri/Cargo.toml
@@ -2,32 +2,35 @@
name = "n-link"
version = "0.1.6"
description = "Free, cross-platform, CX-II compatible computer linking program for the TI-Nspire"
-authors = [ "Ben Schattinger " ]
+authors = ["Ben Schattinger "]
license = "GPL-3.0"
repository = "https://github.com/lights0123/n-link"
default-run = "n-link"
-edition = "2018"
-build = "src/build.rs"
-
-[dependencies]
-anyhow = "1.0.32"
-serde_json = "1.0"
-libnspire = "0.2.2"
-lazy_static = "1.4.0"
-rusb = "0.6.4"
-serde = { version = "1.0", features = [ "derive" ] }
-tauri = { version = "1.0.0-beta.8", features = ["dialog-open", "dialog-save", "notification-all", "shell-open"] }
-clap = "3.0.0-beta.2"
-indicatif = "0.15"
-libusb1-sys = { version = "0.4.2", features = [ "vendored" ] }
-hashbrown = "0.11"
+edition = "2021"
+build = "build.rs"
[build-dependencies]
-tauri-build = { version = "1.0.0-beta.4" }
+tauri-build = { version = "2", features = [] }
+
+[dependencies]
+tauri = { version = "2.11.5", features = [] }
+tauri-plugin-dialog = "2.7.2"
+tauri-plugin-shell = "2.3.5"
+serde = { version = "1.0", features = ["derive"] }
+serde_json = "1.0"
+anyhow = "1.0"
+lazy_static = "1.4"
+libnspire = "0.2.3"
+rusb = "0.6.4"
+clap = { version = "4", features = ["derive"] }
+indicatif = "0.15"
+
+[patch.crates-io]
+libnspire-sys = { path = "../../vendor/libnspire-sys" }
[features]
-custom-protocol = [ "tauri/custom-protocol" ]
-default = [ "custom-protocol" ]
+default = ["custom-protocol"]
+custom-protocol = ["tauri/custom-protocol"]
[[bin]]
name = "n-link"
diff --git a/desktop/src-tauri/build.rs b/desktop/src-tauri/build.rs
new file mode 100644
index 0000000..d860e1e
--- /dev/null
+++ b/desktop/src-tauri/build.rs
@@ -0,0 +1,3 @@
+fn main() {
+ tauri_build::build()
+}
diff --git a/desktop/src-tauri/capabilities/default.json b/desktop/src-tauri/capabilities/default.json
new file mode 100644
index 0000000..fda1fe9
--- /dev/null
+++ b/desktop/src-tauri/capabilities/default.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "../gen/schemas/desktop-schema.json",
+ "identifier": "default",
+ "description": "Core, dialog, and shell permissions for the main window",
+ "windows": ["main"],
+ "permissions": [
+ "core:default",
+ "dialog:allow-open",
+ "shell:allow-open"
+ ]
+}
diff --git a/desktop/src-tauri/icons/128x128.png b/desktop/src-tauri/icons/128x128.png
index f234322..6924798 100644
Binary files a/desktop/src-tauri/icons/128x128.png and b/desktop/src-tauri/icons/128x128.png differ
diff --git a/desktop/src-tauri/icons/128x128@2x.png b/desktop/src-tauri/icons/128x128@2x.png
index 46d7ee8..180f82e 100644
Binary files a/desktop/src-tauri/icons/128x128@2x.png and b/desktop/src-tauri/icons/128x128@2x.png differ
diff --git a/desktop/src-tauri/icons/32x32.png b/desktop/src-tauri/icons/32x32.png
index 97fd185..34c15a2 100644
Binary files a/desktop/src-tauri/icons/32x32.png and b/desktop/src-tauri/icons/32x32.png differ
diff --git a/desktop/src-tauri/icons/64x64.png b/desktop/src-tauri/icons/64x64.png
new file mode 100644
index 0000000..52e8e24
Binary files /dev/null and b/desktop/src-tauri/icons/64x64.png differ
diff --git a/desktop/src-tauri/icons/Square107x107Logo.png b/desktop/src-tauri/icons/Square107x107Logo.png
index 432bd80..d454d29 100644
Binary files a/desktop/src-tauri/icons/Square107x107Logo.png and b/desktop/src-tauri/icons/Square107x107Logo.png differ
diff --git a/desktop/src-tauri/icons/Square142x142Logo.png b/desktop/src-tauri/icons/Square142x142Logo.png
index c392d8d..39304dd 100644
Binary files a/desktop/src-tauri/icons/Square142x142Logo.png and b/desktop/src-tauri/icons/Square142x142Logo.png differ
diff --git a/desktop/src-tauri/icons/Square150x150Logo.png b/desktop/src-tauri/icons/Square150x150Logo.png
index ded31cb..bfdc09a 100644
Binary files a/desktop/src-tauri/icons/Square150x150Logo.png and b/desktop/src-tauri/icons/Square150x150Logo.png differ
diff --git a/desktop/src-tauri/icons/Square284x284Logo.png b/desktop/src-tauri/icons/Square284x284Logo.png
index 7eb4dbf..93aa3c9 100644
Binary files a/desktop/src-tauri/icons/Square284x284Logo.png and b/desktop/src-tauri/icons/Square284x284Logo.png differ
diff --git a/desktop/src-tauri/icons/Square30x30Logo.png b/desktop/src-tauri/icons/Square30x30Logo.png
index 4e0129d..a132a6e 100644
Binary files a/desktop/src-tauri/icons/Square30x30Logo.png and b/desktop/src-tauri/icons/Square30x30Logo.png differ
diff --git a/desktop/src-tauri/icons/Square310x310Logo.png b/desktop/src-tauri/icons/Square310x310Logo.png
index 9d8a644..9ad82a4 100644
Binary files a/desktop/src-tauri/icons/Square310x310Logo.png and b/desktop/src-tauri/icons/Square310x310Logo.png differ
diff --git a/desktop/src-tauri/icons/Square44x44Logo.png b/desktop/src-tauri/icons/Square44x44Logo.png
index 9fb7e50..d4cf2cc 100644
Binary files a/desktop/src-tauri/icons/Square44x44Logo.png and b/desktop/src-tauri/icons/Square44x44Logo.png differ
diff --git a/desktop/src-tauri/icons/Square71x71Logo.png b/desktop/src-tauri/icons/Square71x71Logo.png
index 5f92c65..a3fbd19 100644
Binary files a/desktop/src-tauri/icons/Square71x71Logo.png and b/desktop/src-tauri/icons/Square71x71Logo.png differ
diff --git a/desktop/src-tauri/icons/Square89x89Logo.png b/desktop/src-tauri/icons/Square89x89Logo.png
index 16cc7eb..b38d5b8 100644
Binary files a/desktop/src-tauri/icons/Square89x89Logo.png and b/desktop/src-tauri/icons/Square89x89Logo.png differ
diff --git a/desktop/src-tauri/icons/StoreLogo.png b/desktop/src-tauri/icons/StoreLogo.png
index a41bc82..a2a16af 100644
Binary files a/desktop/src-tauri/icons/StoreLogo.png and b/desktop/src-tauri/icons/StoreLogo.png differ
diff --git a/desktop/src-tauri/icons/icon.icns b/desktop/src-tauri/icons/icon.icns
index 4dcd8cc..1f74069 100644
Binary files a/desktop/src-tauri/icons/icon.icns and b/desktop/src-tauri/icons/icon.icns differ
diff --git a/desktop/src-tauri/icons/icon.ico b/desktop/src-tauri/icons/icon.ico
index cd77b52..eb7a78d 100644
Binary files a/desktop/src-tauri/icons/icon.ico and b/desktop/src-tauri/icons/icon.ico differ
diff --git a/desktop/src-tauri/icons/icon.png b/desktop/src-tauri/icons/icon.png
index e81bcaf..87fadc8 100644
Binary files a/desktop/src-tauri/icons/icon.png and b/desktop/src-tauri/icons/icon.png differ
diff --git a/desktop/src-tauri/rustfmt.toml b/desktop/src-tauri/rustfmt.toml
deleted file mode 100644
index 45642c1..0000000
--- a/desktop/src-tauri/rustfmt.toml
+++ /dev/null
@@ -1,13 +0,0 @@
-max_width = 100
-hard_tabs = false
-tab_spaces = 2
-newline_style = "Auto"
-use_small_heuristics = "Default"
-reorder_imports = true
-reorder_modules = true
-remove_nested_parens = true
-edition = "2018"
-merge_derives = true
-use_try_shorthand = false
-use_field_init_shorthand = false
-force_explicit_abi = true
diff --git a/desktop/src-tauri/src/build.rs b/desktop/src-tauri/src/build.rs
deleted file mode 100644
index 795b9b7..0000000
--- a/desktop/src-tauri/src/build.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-fn main() {
- tauri_build::build()
-}
diff --git a/desktop/src-tauri/src/cli.rs b/desktop/src-tauri/src/cli.rs
index 926548e..922810a 100644
--- a/desktop/src-tauri/src/cli.rs
+++ b/desktop/src-tauri/src/cli.rs
@@ -3,18 +3,18 @@ use std::io::{Read, Write};
use std::path::PathBuf;
use std::{fs::File, path::Path};
-use clap::Clap;
+use clap::{Args, Parser, Subcommand};
use indicatif::{ProgressBar, ProgressStyle};
use libnspire::{dir::EntryType, PID, PID_CX2, VID};
-#[derive(Clap, Debug)]
+#[derive(Parser, Debug)]
#[clap(author, about, version)]
struct Opt {
#[clap(subcommand)]
cmd: Option,
}
-#[derive(Clap, Debug)]
+#[derive(Subcommand, Debug)]
enum SubCommand {
Upload(Upload),
Download(Download),
@@ -29,31 +29,31 @@ enum SubCommand {
}
/// Upload files to the calculator
-#[derive(Clap, Debug)]
+#[derive(Args, Debug)]
struct Upload {
/// Files to upload
- #[clap(required = true, parse(from_os_str))]
+ #[clap(required = true)]
files: Vec,
/// Destination path
dest: String,
}
/// Download files from the calculator
-#[derive(Clap, Debug)]
+#[derive(Args, Debug)]
struct Download {
/// Files to download
#[clap(required = true)]
files: Vec,
/// Destination path
- #[clap(required = true, parse(from_os_str))]
+ #[clap(required = true)]
dest: PathBuf,
}
/// Upload and install a .tcc/.tco/.tcc2/.tco2/.tct2 OS file
-#[derive(Clap, Debug)]
+#[derive(Args, Debug)]
struct UploadOS {
/// Path to the OS file
- #[clap(required = true, parse(from_os_str))]
+ #[clap(required = true)]
file: PathBuf,
/// Disables the file extension check
@@ -62,7 +62,7 @@ struct UploadOS {
}
/// Copy a file to a different location
-#[derive(Clap, Debug)]
+#[derive(Args, Debug)]
struct Copy {
/// Path to file
#[clap(required = true)]
@@ -74,7 +74,7 @@ struct Copy {
}
/// Move a file or directory to a new location
-#[derive(Clap, Debug)]
+#[derive(Args, Debug)]
struct Move {
/// Path to file
#[clap(required = true)]
@@ -86,7 +86,7 @@ struct Move {
}
/// Create a directory
-#[derive(Clap, Debug)]
+#[derive(Args, Debug)]
struct Mkdir {
/// Path to directory
#[clap(required = true)]
@@ -94,7 +94,7 @@ struct Mkdir {
}
/// Delete a directory
-#[derive(Clap, Debug)]
+#[derive(Args, Debug)]
struct Rmdir {
/// Path to directory
#[clap(required = true)]
@@ -102,7 +102,7 @@ struct Rmdir {
}
/// List the contents of a directory
-#[derive(Clap, Debug)]
+#[derive(Args, Debug)]
struct Ls {
/// Path to directory
#[clap(required = true)]
diff --git a/desktop/src-tauri/src/commands.rs b/desktop/src-tauri/src/commands.rs
new file mode 100644
index 0000000..c82e61e
--- /dev/null
+++ b/desktop/src-tauri/src/commands.rs
@@ -0,0 +1,421 @@
+use std::fs::File;
+use std::io::{Read, Write};
+use std::path::PathBuf;
+use std::sync::Arc;
+
+use libnspire::dir::EntryType;
+use libnspire::PID_CX2;
+use serde::Serialize;
+use tauri::{Emitter, Runtime, WebviewWindow};
+
+use crate::device::{
+ add_device, get_open_dev, AddDevice, DevId, DeviceState, FileInfo, ProgressUpdate, DEVICES,
+};
+use crate::error::SerializedError;
+
+/// If the device vanished mid-operation, drop it from the registry and tell
+/// the frontend, then pass the original result through unchanged.
+fn err_wrap(
+ res: Result,
+ dev: DevId,
+ window: &WebviewWindow,
+) -> Result {
+ if let Err(libnspire::Error::NoDevice) = res {
+ DEVICES
+ .write()
+ .unwrap()
+ .remove(&(dev.bus_number, dev.address));
+ if let Err(msg) = window.emit("removeDevice", dev) {
+ eprintln!("{}", msg);
+ };
+ }
+ res
+}
+
+/// Emits a `progress` event on every 6th callback, and always on completion,
+/// to avoid flooding the IPC channel during large transfers.
+fn progress_sender(
+ window: &WebviewWindow,
+ dev: DevId,
+ total: usize,
+) -> impl FnMut(usize) + '_ {
+ let mut i = 0;
+ move |remaining| {
+ if i > 5 {
+ i = 0;
+ }
+ if i == 0 || remaining == 0 {
+ if let Err(msg) = window.emit(
+ "progress",
+ ProgressUpdate {
+ dev,
+ remaining,
+ total,
+ },
+ ) {
+ eprintln!("{}", msg);
+ };
+ }
+ i += 1;
+ }
+}
+
+#[tauri::command]
+pub fn enumerate(window: WebviewWindow) -> Result, SerializedError> {
+ let devices: Vec<_> = rusb::devices()?.iter().collect();
+ let mut map = DEVICES.write().unwrap();
+
+ // Replaces hashbrown's `drain_filter`: collect the keys of devices that are
+ // no longer present on the bus, then remove them. std HashMap has no stable
+ // drain-with-predicate, and this is clearer than the original anyway.
+ let stale: Vec<(u8, u8)> = map
+ .keys()
+ .filter(|k| {
+ devices
+ .iter()
+ .all(|d| d.bus_number() != k.0 || d.address() != k.1)
+ })
+ .copied()
+ .collect();
+
+ for key in stale {
+ map.remove(&key);
+ if let Err(msg) = window.emit(
+ "removeDevice",
+ DevId {
+ bus_number: key.0,
+ address: key.1,
+ },
+ ) {
+ eprintln!("{}", msg);
+ }
+ }
+
+ let filtered: Vec<_> = devices
+ .into_iter()
+ .filter(|d| !map.contains_key(&(d.bus_number(), d.address())))
+ .collect();
+
+ Ok(
+ filtered
+ .into_iter()
+ .filter_map(|dev| add_device(Arc::new(dev)).ok())
+ .map(|dev| {
+ let msg = AddDevice {
+ dev: DevId {
+ bus_number: (dev.0).0,
+ address: (dev.0).1,
+ },
+ name: (dev.1).name.clone(),
+ is_cx_ii: (dev.1)
+ .device
+ .device_descriptor()
+ .map(|d| d.product_id() == PID_CX2)
+ .unwrap_or(false),
+ needs_drivers: (dev.1).needs_drivers,
+ };
+ map.insert(dev.0, dev.1);
+ msg
+ })
+ .collect(),
+ )
+}
+
+#[tauri::command]
+pub async fn open_device(
+ bus_number: u8,
+ address: u8,
+) -> Result {
+ tauri::async_runtime::spawn_blocking(move || {
+ let device = if let Some(dev) = DEVICES.read().unwrap().get(&(bus_number, address)) {
+ if !matches!(dev.state, DeviceState::Closed) {
+ return Err("Already open".into());
+ };
+ dev.device.clone()
+ } else {
+ return Err("Failed to find device".into());
+ };
+ let handle = libnspire::Handle::new(device.open()?)?;
+ let info = handle.info()?;
+ {
+ let mut guard = DEVICES.write().unwrap();
+ let device = guard
+ .get_mut(&(bus_number, address))
+ .ok_or_else(|| anyhow::anyhow!("Device lost"))?;
+ device.state = DeviceState::Open(Arc::new(std::sync::Mutex::new(handle)), info.clone());
+ }
+ Ok(info)
+ })
+ .await
+ .map_err(|e| SerializedError::from(e))?
+}
+
+#[tauri::command]
+pub fn close_device(bus_number: u8, address: u8) -> Result {
+ let mut guard = DEVICES.write().unwrap();
+ let device = guard
+ .get_mut(&(bus_number, address))
+ .ok_or_else(|| anyhow::anyhow!("Device lost"))?;
+ device.state = DeviceState::Closed;
+ Ok(())
+}
+
+#[tauri::command]
+pub async fn update_device(
+ bus_number: u8,
+ address: u8,
+ window: WebviewWindow,
+) -> Result {
+ tauri::async_runtime::spawn_blocking(move || {
+ let dev = DevId {
+ bus_number,
+ address,
+ };
+ let handle = get_open_dev(&dev)?;
+ let handle = handle.lock().unwrap();
+ let info = err_wrap(handle.info(), dev, &window)?;
+ Ok(info)
+ })
+ .await
+ .map_err(|e| SerializedError::from(e))?
+}
+
+#[tauri::command]
+pub async fn list_dir(
+ bus_number: u8,
+ address: u8,
+ path: String,
+ window: WebviewWindow,
+) -> Result, SerializedError> {
+ tauri::async_runtime::spawn_blocking(move || {
+ let dev = DevId {
+ bus_number,
+ address,
+ };
+ let handle = get_open_dev(&dev)?;
+ let handle = handle.lock().unwrap();
+ let dir = err_wrap(handle.list_dir(&path), dev, &window)?;
+
+ Ok(
+ dir
+ .iter()
+ .map(|file| FileInfo {
+ path: file.name().to_string_lossy().to_string(),
+ is_dir: file.entry_type() == EntryType::Directory,
+ date: file.date(),
+ size: file.size(),
+ })
+ .collect::>(),
+ )
+ })
+ .await
+ .map_err(|e| SerializedError::from(e))?
+}
+
+#[tauri::command]
+pub async fn download_file(
+ bus_number: u8,
+ address: u8,
+ path: (String, u64),
+ dest: String,
+ window: WebviewWindow,
+) -> Result<(), SerializedError> {
+ tauri::async_runtime::spawn_blocking(move || {
+ let dev = DevId {
+ bus_number,
+ address,
+ };
+ let (file, size) = path;
+ let dest = PathBuf::from(dest);
+ let handle = get_open_dev(&dev)?;
+ let handle = handle.lock().unwrap();
+ let mut buf = vec![0; size as usize];
+ err_wrap(
+ handle.read_file(
+ &file,
+ &mut buf,
+ &mut progress_sender(&window, dev, size as usize),
+ ),
+ dev,
+ &window,
+ )?;
+ if let Some(name) = file.split('/').last() {
+ File::create(dest.join(name))?.write_all(&buf)?;
+ }
+ Ok(())
+ })
+ .await
+ .map_err(|e| SerializedError::from(e))?
+}
+
+#[tauri::command]
+pub async fn upload_file(
+ bus_number: u8,
+ address: u8,
+ path: String,
+ src: String,
+ window: WebviewWindow,
+) -> Result<(), SerializedError> {
+ tauri::async_runtime::spawn_blocking(move || {
+ let dev = DevId {
+ bus_number,
+ address,
+ };
+ let file = PathBuf::from(src);
+ let handle = get_open_dev(&dev)?;
+ let handle = handle.lock().unwrap();
+ let mut buf = vec![];
+ File::open(&file)?.read_to_end(&mut buf)?;
+ let name = file
+ .file_name()
+ .ok_or_else(|| anyhow::anyhow!("Failed to get file name"))?
+ .to_string_lossy()
+ .to_string();
+ err_wrap(
+ handle.write_file(
+ &format!("{}/{}", path, name),
+ &buf,
+ &mut progress_sender(&window, dev, buf.len()),
+ ),
+ dev,
+ &window,
+ )?;
+ Ok(())
+ })
+ .await
+ .map_err(|e| SerializedError::from(e))?
+}
+
+#[tauri::command]
+pub async fn upload_os(
+ bus_number: u8,
+ address: u8,
+ src: String,
+ window: WebviewWindow,
+) -> Result<(), SerializedError> {
+ tauri::async_runtime::spawn_blocking(move || {
+ let dev = DevId {
+ bus_number,
+ address,
+ };
+ let handle = get_open_dev(&dev)?;
+ let handle = handle.lock().unwrap();
+ let mut buf = vec![];
+ File::open(&src)?.read_to_end(&mut buf)?;
+ err_wrap(
+ handle.send_os(&buf, &mut progress_sender(&window, dev, buf.len())),
+ dev,
+ &window,
+ )?;
+ Ok(())
+ })
+ .await
+ .map_err(|e| SerializedError::from(e))?
+}
+
+#[tauri::command]
+pub async fn delete_file(
+ bus_number: u8,
+ address: u8,
+ path: String,
+ window: WebviewWindow,
+) -> Result<(), SerializedError> {
+ tauri::async_runtime::spawn_blocking(move || {
+ let dev = DevId {
+ bus_number,
+ address,
+ };
+ let handle = get_open_dev(&dev)?;
+ let handle = handle.lock().unwrap();
+ err_wrap(handle.delete_file(&path), dev, &window)?;
+ Ok(())
+ })
+ .await
+ .map_err(|e| SerializedError::from(e))?
+}
+
+#[tauri::command]
+pub async fn delete_dir(
+ bus_number: u8,
+ address: u8,
+ path: String,
+ window: WebviewWindow,
+) -> Result<(), SerializedError> {
+ tauri::async_runtime::spawn_blocking(move || {
+ let dev = DevId {
+ bus_number,
+ address,
+ };
+ let handle = get_open_dev(&dev)?;
+ let handle = handle.lock().unwrap();
+ err_wrap(handle.delete_dir(&path), dev, &window)?;
+ Ok(())
+ })
+ .await
+ .map_err(|e| SerializedError::from(e))?
+}
+
+#[tauri::command]
+pub async fn create_nspire_dir(
+ bus_number: u8,
+ address: u8,
+ path: String,
+ window: WebviewWindow,
+) -> Result<(), SerializedError> {
+ tauri::async_runtime::spawn_blocking(move || {
+ let dev = DevId {
+ bus_number,
+ address,
+ };
+ let handle = get_open_dev(&dev)?;
+ let handle = handle.lock().unwrap();
+ err_wrap(handle.create_dir(&path), dev, &window)?;
+ Ok(())
+ })
+ .await
+ .map_err(|e| SerializedError::from(e))?
+}
+
+#[tauri::command]
+pub async fn move_file(
+ bus_number: u8,
+ address: u8,
+ src: String,
+ dest: String,
+ window: WebviewWindow,
+) -> Result<(), SerializedError> {
+ tauri::async_runtime::spawn_blocking(move || {
+ let dev = DevId {
+ bus_number,
+ address,
+ };
+ let handle = get_open_dev(&dev)?;
+ let handle = handle.lock().unwrap();
+ err_wrap(handle.move_file(&src, &dest), dev, &window)?;
+ Ok(())
+ })
+ .await
+ .map_err(|e| SerializedError::from(e))?
+}
+
+#[tauri::command]
+pub async fn copy(
+ bus_number: u8,
+ address: u8,
+ src: String,
+ dest: String,
+ window: WebviewWindow,
+) -> Result<(), SerializedError> {
+ tauri::async_runtime::spawn_blocking(move || {
+ let dev = DevId {
+ bus_number,
+ address,
+ };
+ let handle = get_open_dev(&dev)?;
+ let handle = handle.lock().unwrap();
+ err_wrap(handle.copy_file(&src, &dest), dev, &window)?;
+ Ok(())
+ })
+ .await
+ .map_err(|e| SerializedError::from(e))?
+}
diff --git a/desktop/src-tauri/src/cmd.rs b/desktop/src-tauri/src/device.rs
similarity index 54%
rename from desktop/src-tauri/src/cmd.rs
rename to desktop/src-tauri/src/device.rs
index a2ee4de..bff3cc3 100644
--- a/desktop/src-tauri/src/cmd.rs
+++ b/desktop/src-tauri/src/device.rs
@@ -1,12 +1,29 @@
-use std::sync::Arc;
+use std::collections::HashMap;
+use std::sync::{Arc, Mutex, RwLock};
use std::time::Duration;
use libnspire::{PID, PID_CX2, VID};
use rusb::GlobalContext;
use serde::{Deserialize, Serialize};
-use tauri::{Runtime, Window};
-use crate::{Device, DeviceState, SerializedError};
+pub enum DeviceState {
+ Open(
+ Arc>>,
+ libnspire::info::Info,
+ ),
+ Closed,
+}
+
+pub struct Device {
+ pub name: String,
+ pub device: Arc>,
+ pub state: DeviceState,
+ pub needs_drivers: bool,
+}
+
+lazy_static::lazy_static! {
+ pub static ref DEVICES: RwLock> = RwLock::new(HashMap::new());
+}
#[derive(Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
@@ -16,6 +33,34 @@ pub struct DevId {
pub address: u8,
}
+#[derive(Debug, Clone, Serialize)]
+#[serde(rename_all = "camelCase")]
+pub struct AddDevice {
+ #[serde(flatten)]
+ pub dev: DevId,
+ pub name: String,
+ pub is_cx_ii: bool,
+ pub needs_drivers: bool,
+}
+
+#[derive(Debug, Clone, Serialize)]
+#[serde(rename_all = "camelCase")]
+pub struct ProgressUpdate {
+ #[serde(flatten)]
+ pub dev: DevId,
+ pub remaining: usize,
+ pub total: usize,
+}
+
+#[derive(Debug, Serialize)]
+#[serde(rename_all = "camelCase")]
+pub struct FileInfo {
+ pub path: String,
+ pub is_dir: bool,
+ pub date: u64,
+ pub size: u64,
+}
+
pub fn add_device(dev: Arc>) -> rusb::Result<((u8, u8), Device)> {
let descriptor = dev.device_descriptor()?;
if !(descriptor.vendor_id() == VID && matches!(descriptor.product_id(), PID | PID_CX2)) {
@@ -54,80 +99,15 @@ pub fn add_device(dev: Arc>) -> rusb::Result<((u8, u
))
}
-#[tauri::command]
-pub fn enumerate(handle: Window) -> Result, SerializedError> {
- let devices: Vec<_> = rusb::devices()?.iter().collect();
- let mut map = crate::DEVICES.write().unwrap();
- map
- .drain_filter(|k, _v| {
- devices
- .iter()
- .all(|d| d.bus_number() != k.0 || d.address() != k.1)
- })
- .for_each(|d| {
- if let Err(msg) = handle.emit(
- "removeDevice",
- DevId {
- bus_number: (d.0).0,
- address: (d.0).1,
- },
- ) {
- eprintln!("{}", msg);
- }
- });
- let filtered: Vec<_> = devices
- .into_iter()
- .filter(|d| !map.contains_key(&(d.bus_number(), d.address())))
- .collect();
- Ok(
- filtered
- .into_iter()
- .filter_map(|dev| add_device(Arc::new(dev)).ok())
- .map(|dev| {
- let msg = AddDevice {
- dev: DevId {
- bus_number: (dev.0).0,
- address: (dev.0).1,
- },
- name: (dev.1).name.clone(),
- is_cx_ii: (dev.1)
- .device
- .device_descriptor()
- .map(|d| d.product_id() == PID_CX2)
- .unwrap_or(false),
- needs_drivers: (dev.1).needs_drivers,
- };
- map.insert(dev.0, dev.1);
- msg
- })
- .collect(),
- )
-}
-
-#[derive(Debug, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct AddDevice {
- #[serde(flatten)]
- pub dev: DevId,
- pub name: String,
- pub is_cx_ii: bool,
- pub needs_drivers: bool,
-}
-
-#[derive(Debug, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct ProgressUpdate {
- #[serde(flatten)]
- pub dev: DevId,
- pub remaining: usize,
- pub total: usize,
-}
-
-#[derive(Debug, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct FileInfo {
- pub path: String,
- pub is_dir: bool,
- pub date: u64,
- pub size: u64,
+pub fn get_open_dev(
+ dev: &DevId,
+) -> Result>>, anyhow::Error> {
+ if let Some(dev) = DEVICES.read().unwrap().get(&(dev.bus_number, dev.address)) {
+ match &dev.state {
+ DeviceState::Open(handle, _) => Ok(handle.clone()),
+ DeviceState::Closed => anyhow::bail!("Device closed"),
+ }
+ } else {
+ anyhow::bail!("Failed to find device");
+ }
}
diff --git a/desktop/src-tauri/src/error.rs b/desktop/src-tauri/src/error.rs
new file mode 100644
index 0000000..a013557
--- /dev/null
+++ b/desktop/src-tauri/src/error.rs
@@ -0,0 +1,12 @@
+use serde::Serialize;
+
+/// Wraps any displayable error into a serde-serializable form so it can
+/// cross the Tauri IPC boundary.
+#[derive(Serialize)]
+pub struct SerializedError(String);
+
+impl From for SerializedError {
+ fn from(f: T) -> Self {
+ SerializedError(f.to_string())
+ }
+}
diff --git a/desktop/src-tauri/src/main.rs b/desktop/src-tauri/src/main.rs
index ba1b457..ca75882 100644
--- a/desktop/src-tauri/src/main.rs
+++ b/desktop/src-tauri/src/main.rs
@@ -1,42 +1,21 @@
-#![cfg_attr(
- all(not(debug_assertions), target_os = "windows"),
- windows_subsystem = "windows"
-)]
+#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
-use std::sync::atomic::{AtomicBool, Ordering};
-use std::sync::{Arc, Mutex, RwLock};
+use std::sync::Arc;
use std::time::Duration;
-use hashbrown::HashMap;
use libnspire::{PID_CX2, VID};
use rusb::{GlobalContext, Hotplug, UsbContext};
-use serde::Serialize;
-use tauri::{Runtime, Window};
+use tauri::{Emitter, Manager, Runtime, WebviewWindow};
-use crate::cmd::{add_device, AddDevice, DevId, ProgressUpdate};
+use crate::device::{add_device, AddDevice, DevId, DEVICES};
mod cli;
-mod cmd;
+mod commands;
+mod device;
+mod error;
-pub enum DeviceState {
- Open(
- Arc>>,
- libnspire::info::Info,
- ),
- Closed,
-}
-
-pub struct Device {
- name: String,
- device: Arc>,
- state: DeviceState,
- needs_drivers: bool,
-}
-lazy_static::lazy_static! {
- static ref DEVICES: RwLock> = RwLock::new(HashMap::new());
-}
struct DeviceMon {
- window: Window,
+ window: WebviewWindow,
}
impl Hotplug for DeviceMon {
@@ -47,6 +26,8 @@ impl Hotplug for DeviceMon {
.map(|d| d.product_id() == PID_CX2)
.unwrap_or(false);
let device = Arc::new(device);
+ // The calculator often reports Busy immediately after enumeration, so
+ // retry until it settles.
std::thread::spawn(move || loop {
match add_device(device.clone()) {
Ok(dev) => {
@@ -100,378 +81,48 @@ impl Hotplug for DeviceMon {
}
}
-fn err_wrap(
- res: Result,
- dev: DevId,
- window: &Window,
-) -> Result {
- if let Err(libnspire::Error::NoDevice) = res {
- DEVICES
- .write()
- .unwrap()
- .remove(&(dev.bus_number, dev.address));
- if let Err(msg) = window.emit("removeDevice", dev) {
- eprintln!("{}", msg);
- };
- }
- res
-}
-
-fn progress_sender(
- window: &Window,
- dev: DevId,
- total: usize,
-) -> impl FnMut(usize) + '_ {
- let mut i = 0;
- move |remaining| {
- if i > 5 {
- i = 0;
- }
- if i == 0 || remaining == 0 {
- if let Err(msg) = window.emit(
- "progress",
- ProgressUpdate {
- dev,
- remaining,
- total,
- },
- ) {
- eprintln!("{}", msg);
- };
- }
- i += 1;
- }
-}
-
-fn get_open_dev(
- dev: &DevId,
-) -> Result>>, anyhow::Error> {
- if let Some(dev) = DEVICES.read().unwrap().get(&(dev.bus_number, dev.address)) {
- match &dev.state {
- DeviceState::Open(handle, _) => Ok(handle.clone()),
- DeviceState::Closed => anyhow::bail!("Device closed"),
- }
- } else {
- anyhow::bail!("Failed to find device");
- }
-}
-
-#[derive(Serialize)]
-pub struct SerializedError(String);
-
-impl From for SerializedError {
- fn from(f: T) -> Self {
- SerializedError(f.to_string())
- }
-}
-
-mod invoked {
- use std::fs::File;
- use std::io::{Read, Write};
- use std::path::PathBuf;
- use std::sync::{Arc, Mutex};
-
- use libnspire::dir::EntryType;
- use serde::Serialize;
- use tauri::{Runtime, Window};
-
- use crate::cmd::{DevId, FileInfo};
- use crate::{err_wrap, get_open_dev, progress_sender, DeviceState, SerializedError};
-
- use super::DEVICES;
-
- #[tauri::command]
- pub fn open_device(bus_number: u8, address: u8) -> Result {
- let device = if let Some(dev) = DEVICES.read().unwrap().get(&(bus_number, address)) {
- if !matches!(dev.state, DeviceState::Closed) {
- return Err("Already open".into());
- };
- dev.device.clone()
- } else {
- return Err("Failed to find device".into());
- };
- let handle = libnspire::Handle::new(device.open()?)?;
- let info = handle.info()?;
- {
- let mut guard = DEVICES.write().unwrap();
- let device = guard
- .get_mut(&(bus_number, address))
- .ok_or_else(|| anyhow::anyhow!("Device lost"))?;
- device.state = DeviceState::Open(Arc::new(Mutex::new(handle)), info.clone());
- }
- Ok(info)
- }
-
- #[tauri::command]
- pub fn close_device(bus_number: u8, address: u8) -> Result {
- let mut guard = DEVICES.write().unwrap();
- let device = guard
- .get_mut(&(bus_number, address))
- .ok_or_else(|| anyhow::anyhow!("Device lost"))?;
- device.state = DeviceState::Closed;
- Ok(())
- }
-
- #[tauri::command]
- pub fn update_device(
- bus_number: u8,
- address: u8,
- window: Window,
- ) -> Result {
- let dev = DevId {
- bus_number,
- address,
- };
- let handle = get_open_dev(&dev)?;
- let handle = handle.lock().unwrap();
- let info = err_wrap(handle.info(), dev, &window)?;
- Ok(info)
- }
-
- #[tauri::command]
- pub fn list_dir(
- bus_number: u8,
- address: u8,
- path: String,
- window: Window,
- ) -> Result {
- let dev = DevId {
- bus_number,
- address,
- };
- let handle = get_open_dev(&dev)?;
- let handle = handle.lock().unwrap();
- let dir = err_wrap(handle.list_dir(&path), dev, &window)?;
-
- Ok(
- dir
- .iter()
- .map(|file| FileInfo {
- path: file.name().to_string_lossy().to_string(),
- is_dir: file.entry_type() == EntryType::Directory,
- date: file.date(),
- size: file.size(),
- })
- .collect::>(),
- )
- }
-
- #[tauri::command]
- pub fn download_file(
- bus_number: u8,
- address: u8,
- path: (String, u64),
- dest: String,
- window: Window,
- ) -> Result {
- let dev = DevId {
- bus_number,
- address,
- };
- let (file, size) = path;
- let dest = PathBuf::from(dest);
- let handle = get_open_dev(&dev)?;
- let handle = handle.lock().unwrap();
- let mut buf = vec![0; size as usize];
- err_wrap(
- handle.read_file(
- &file,
- &mut buf,
- &mut progress_sender(&window, dev, size as usize),
- ),
- dev,
- &window,
- )?;
- if let Some(name) = file.split('/').last() {
- File::create(dest.join(name))?.write_all(&buf)?;
- }
- Ok(())
- }
-
- #[tauri::command]
- pub fn upload_file(
- bus_number: u8,
- address: u8,
- path: String,
- src: String,
- window: Window,
- ) -> Result {
- let dev = DevId {
- bus_number,
- address,
- };
- let file = PathBuf::from(src);
- let handle = get_open_dev(&dev)?;
- let handle = handle.lock().unwrap();
- let mut buf = vec![];
- File::open(&file)?.read_to_end(&mut buf)?;
- let name = file
- .file_name()
- .ok_or_else(|| anyhow::anyhow!("Failed to get file name"))?
- .to_string_lossy()
- .to_string();
- err_wrap(
- handle.write_file(
- &format!("{}/{}", path, name),
- &buf,
- &mut progress_sender(&window, dev, buf.len()),
- ),
- dev,
- &window,
- )?;
- Ok(())
- }
-
- #[tauri::command]
- pub fn upload_os(
- bus_number: u8,
- address: u8,
- src: String,
- window: Window,
- ) -> Result {
- let dev = DevId {
- bus_number,
- address,
- };
- let handle = get_open_dev(&dev)?;
- let handle = handle.lock().unwrap();
- let mut buf = vec![];
- File::open(&src)?.read_to_end(&mut buf)?;
- err_wrap(
- handle.send_os(&buf, &mut progress_sender(&window, dev, buf.len())),
- dev,
- &window,
- )?;
- Ok(())
- }
-
- #[tauri::command]
- pub fn delete_file(
- bus_number: u8,
- address: u8,
- path: String,
- window: Window,
- ) -> Result {
- let dev = DevId {
- bus_number,
- address,
- };
- let handle = get_open_dev(&dev)?;
- let handle = handle.lock().unwrap();
- err_wrap(handle.delete_file(&path), dev, &window)?;
- Ok(())
- }
-
- #[tauri::command]
- pub fn delete_dir(
- bus_number: u8,
- address: u8,
- path: String,
- window: Window,
- ) -> Result {
- let dev = DevId {
- bus_number,
- address,
- };
- let handle = get_open_dev(&dev)?;
- let handle = handle.lock().unwrap();
- err_wrap(handle.delete_dir(&path), dev, &window)?;
- Ok(())
- }
-
- #[tauri::command]
- pub fn create_nspire_dir(
- bus_number: u8,
- address: u8,
- path: String,
- window: Window,
- ) -> Result {
- let dev = DevId {
- bus_number,
- address,
- };
- let handle = get_open_dev(&dev)?;
- let handle = handle.lock().unwrap();
- err_wrap(handle.create_dir(&path), dev, &window)?;
- Ok(())
- }
-
- #[tauri::command]
- pub fn move_file(
- bus_number: u8,
- address: u8,
- src: String,
- dest: String,
- window: Window,
- ) -> Result {
- let dev = DevId {
- bus_number,
- address,
- };
- let handle = get_open_dev(&dev)?;
- let handle = handle.lock().unwrap();
- err_wrap(handle.move_file(&src, &dest), dev, &window)?;
- Ok(())
- }
-
- #[tauri::command]
- pub fn copy(
- bus_number: u8,
- address: u8,
- src: String,
- dest: String,
- window: Window,
- ) -> Result {
- let dev = DevId {
- bus_number,
- address,
- };
- let handle = get_open_dev(&dev)?;
- let handle = handle.lock().unwrap();
- err_wrap(handle.copy_file(&src, &dest), dev, &window)?;
- Ok(())
- }
-}
-
fn main() {
if cli::run() {
return;
}
- let has_registered_callback = AtomicBool::new(false);
tauri::Builder::default()
- .on_page_load(move |window, _p| {
- if !has_registered_callback.swap(true, Ordering::SeqCst) {
- if rusb::has_hotplug() {
- if let Err(msg) = GlobalContext::default().register_callback(
- Some(VID),
- None,
- None,
- Box::new(DeviceMon { window }),
- ) {
- eprintln!("{}", msg);
- };
- std::thread::spawn(|| loop {
- GlobalContext::default().handle_events(None).unwrap();
- });
- } else {
- println!("no hotplug");
- }
+ .plugin(tauri_plugin_dialog::init())
+ .plugin(tauri_plugin_shell::init())
+ .setup(|app| {
+ // Tauri 1 registered this in on_page_load, guarded by an AtomicBool to
+ // avoid double-registering on reload. In v2, setup runs exactly once,
+ // so the guard is unnecessary.
+ let window = app
+ .get_webview_window("main")
+ .expect("main window not found");
+ if rusb::has_hotplug() {
+ if let Err(msg) =
+ GlobalContext::default().register_callback(Some(VID), None, None, Box::new(DeviceMon { window }))
+ {
+ eprintln!("{}", msg);
+ };
+ std::thread::spawn(|| loop {
+ GlobalContext::default().handle_events(None).unwrap();
+ });
+ } else {
+ println!("no hotplug");
}
+ Ok(())
})
.invoke_handler(tauri::generate_handler![
- cmd::enumerate,
- invoked::open_device,
- invoked::close_device,
- invoked::update_device,
- invoked::list_dir,
- invoked::download_file,
- invoked::upload_file,
- invoked::upload_os,
- invoked::delete_file,
- invoked::delete_dir,
- invoked::create_nspire_dir,
- invoked::move_file,
- invoked::copy,
+ commands::enumerate,
+ commands::open_device,
+ commands::close_device,
+ commands::update_device,
+ commands::list_dir,
+ commands::download_file,
+ commands::upload_file,
+ commands::upload_os,
+ commands::delete_file,
+ commands::delete_dir,
+ commands::create_nspire_dir,
+ commands::move_file,
+ commands::copy,
])
.run(tauri::generate_context!())
.expect("error while running tauri application");
diff --git a/desktop/src-tauri/tauri.conf.json b/desktop/src-tauri/tauri.conf.json
index 4c6e3b8..2551495 100644
--- a/desktop/src-tauri/tauri.conf.json
+++ b/desktop/src-tauri/tauri.conf.json
@@ -1,47 +1,15 @@
{
- "tauri": {
- "bundle": {
- "active": true,
- "targets": ["deb", "msi", "appimage", "dmg"],
- "identifier": "com.lights0123.n-link",
- "icon": [
- "icons/32x32.png",
- "icons/128x128.png",
- "icons/128x128@2x.png",
- "icons/icon.icns",
- "icons/icon.ico"
- ],
- "resources": [],
- "externalBin": [],
- "copyright": "Copyright (c) 2021 Ben Schattinger. Licensed under GPL-3.0",
- "category": "Utility",
- "shortDescription": "Free, cross-platform, CX-II compatible computer linking program for the TI-Nspire",
- "longDescription": "Free, cross-platform, CX-II compatible computer linking program for the TI-Nspire",
- "macOS": {
- "frameworks": [],
- "minimumSystemVersion": "",
- "useBootstrapper": false,
- "exceptionDomain": "",
- "signingIdentity": null,
- "entitlements": null
- },
- "windows": {
- "certificateThumbprint": null,
- "digestAlgorithm": "sha256",
- "timestampUrl": ""
- }
- },
- "updater": {
- "active": false
- },
- "allowlist": {
- "shell": {
- "open": true
- },
- "dialog": {
- "open": true
- }
- },
+ "$schema": "https://schema.tauri.app/config/2",
+ "productName": "n-link",
+ "version": "0.1.6",
+ "identifier": "com.lights0123.n-link",
+ "build": {
+ "beforeDevCommand": "npm run dev",
+ "devUrl": "http://localhost:1420",
+ "beforeBuildCommand": "npm run build",
+ "frontendDist": "../dist"
+ },
+ "app": {
"windows": [
{
"title": "N-Link",
@@ -52,7 +20,24 @@
}
],
"security": {
- "csp": "default-src blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self' img-src: 'self'"
+ "csp": "default-src blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self'; img-src 'self' asset: http://asset.localhost blob: data:"
}
+ },
+ "bundle": {
+ "active": true,
+ "targets": ["deb", "appimage"],
+ "icon": [
+ "icons/32x32.png",
+ "icons/128x128.png",
+ "icons/128x128@2x.png",
+ "icons/icon.icns",
+ "icons/icon.ico"
+ ],
+ "resources": [],
+ "externalBin": [],
+ "copyright": "Copyright (c) 2021 Ben Schattinger. Licensed under GPL-3.0",
+ "category": "Utility",
+ "shortDescription": "Free, cross-platform, CX-II compatible computer linking program for the TI-Nspire",
+ "longDescription": "Free, cross-platform, CX-II compatible computer linking program for the TI-Nspire"
}
}
diff --git a/desktop/src/App.vue b/desktop/src/App.vue
index 55dbc4e..be38b53 100644
--- a/desktop/src/App.vue
+++ b/desktop/src/App.vue
@@ -5,7 +5,8 @@
+```
+
+The webpack tilde in `@import '~n-link-core/assets/tailwind.css'` is dropped — the Vite alias from Task 2 resolves the bare specifier.
+
+This replaces Plan A's harness. That is the intended end of the harness's life.
+
+- [ ] **Step 4: Port main.ts and register the store globally**
+
+```ts
+import { createApp } from 'vue';
+import App from './App.vue';
+import router from './router';
+import devices from './components/devices';
+import { DEVICES_KEY } from 'n-link-core/components/devices';
+import 'n-link-core/assets/tailwind.css';
+
+const app = createApp(App);
+app.use(router);
+// Two registrations, both required:
+// globalProperties -> templates across n-link-core reference $devices
+// provide ->
diff --git a/n-link-core/components/DeviceQueue.vue b/n-link-core/components/DeviceQueue.vue
index d6f00ad..98209e5 100644
--- a/n-link-core/components/DeviceQueue.vue
+++ b/n-link-core/components/DeviceQueue.vue
@@ -20,25 +20,28 @@
-
+ @click="device.queue?.splice(i, 1)">
+
-
-
-
-
+
+
+
+
+
+
-
+const FOLDER_ICONS: Record = {
+ games: 'games',
+ images: 'images',
+ photos: 'images',
+ music: 'music',
+ sound: 'music',
+ sounds: 'music',
+ script: 'scripts',
+ scripts: 'scripts',
+ program: 'scripts',
+ programs: 'scripts',
+ template: 'templates',
+ templates: 'templates',
+ video: 'video',
+ videos: 'video',
+};
+
+const EXT_ICONS: Record = {
+ bin: 'binary',
+ ical: 'calendar', ics: 'calendar', ifb: 'calendar', icalendar: 'calendar',
+ cfg: 'cfg',
+ vcf: 'contact',
+ csv: 'csv', log: 'csv', logs: 'csv',
+ sql: 'db', db: 'db', sqlite: 'db',
+ epub: 'epub',
+ eot: 'font', otf: 'font', ttf: 'font', woff: 'font', woff2: 'font',
+ png: 'image', bmp: 'image', jpg: 'image', jpeg: 'image', jpe: 'image',
+ jif: 'image', jfif: 'image', jfi: 'image', jp2: 'image', j2k: 'image',
+ jpf: 'image', jpx: 'image', jpm: 'image', mj2: 'image', gif: 'image',
+ tiff: 'image', tif: 'image', ppm: 'image', pgm: 'image', pbm: 'image',
+ pnm: 'image', webp: 'image', heif: 'image', heifs: 'image', heic: 'image',
+ heics: 'image', avci: 'image', avcs: 'image', avif: 'image', avifs: 'image',
+ ico: 'image', icon: 'image', icns: 'image', pcx: 'image', pgf: 'image',
+ tga: 'image', psd: 'image', xcf: 'image',
+ js: 'js', mjs: 'js',
+ json: 'json', json5: 'json',
+ lua: 'lua',
+ pdf: 'pdf',
+ py: 'python',
+ rom: 'rom', '89u': 'rom', smc: 'rom', sfc: 'rom', srm: 'rom', img: 'rom',
+ svg: 'svg', svgz: 'svg',
+ txt: 'txt',
+ mp4: 'video',
+ xml: 'xml',
+ zip: 'zip', tar: 'zip', gz: 'zip',
+};
+
+const name = computed(() => props.path.split('/').pop() as string);
+
+const ext = computed(() => {
+ const parts = name.value.split('.');
+ if (parts[parts.length - 1] === 'tns') parts.pop();
+ if (parts.length < 2) return '';
+ return parts.pop() as string;
+});
+
+const icon = computed(() => {
+ if (props.dir) {
+ const key = FOLDER_ICONS[name.value.trim().toLowerCase()] ?? 'folder';
+ return asset(`folders/${key}.svg`);
+ }
+ if (name.value === 'ndless_resources.tns') return asset('files/resources.svg');
+ if (name.value.startsWith('ndless_installer')) return asset('files/installer.svg');
+ return asset(`files/${EXT_ICONS[ext.value.toLowerCase()] ?? 'unknown'}.svg`);
+});
+
diff --git a/n-link-core/components/FileView.vue b/n-link-core/components/FileView.vue
index 40a256f..715558d 100644
--- a/n-link-core/components/FileView.vue
+++ b/n-link-core/components/FileView.vue
@@ -10,55 +10,59 @@
-
diff --git a/n-link-core/components/devices.ts b/n-link-core/components/devices.ts
index 2bfe6d9..7214bfc 100644
--- a/n-link-core/components/devices.ts
+++ b/n-link-core/components/devices.ts
@@ -59,9 +59,20 @@ export interface GenericDevices {
move(dev: DevId | string, src: string, dest: string): Promise;
}
-declare module 'vue/types/vue' {
- // 3. Declare augmentation for Vue
- interface Vue {
+import type { InjectionKey } from 'vue';
+
+/**
+ * n-link-core is consumed by more than one host (the Tauri desktop app and
+ * the WebUSB web app), each of which supplies its own GenericDevices
+ * implementation. Core components must therefore never import a concrete
+ * store — they inject this key. The host provides it at startup.
+ */
+export const DEVICES_KEY = Symbol('devices') as InjectionKey;
+
+declare module 'vue' {
+ interface ComponentCustomProperties {
$devices: GenericDevices;
}
}
+
+export {};
diff --git a/n-link-core/package.json b/n-link-core/package.json
index 13458ed..693d02c 100644
--- a/n-link-core/package.json
+++ b/n-link-core/package.json
@@ -1,18 +1,12 @@
{
"name": "n-link-core",
"version": "0.0.0",
- "dependencies": {
- "element-ui": "^2.13.2",
- "vue": "^2.6.11",
- "vue-class-component": "^7.2.3",
- "vue-property-decorator": "^9.0.2"
+ "peerDependencies": {
+ "element-plus": "^2.14.3",
+ "vue": "^3.5.40"
},
"devDependencies": {
- "@typescript-eslint/eslint-plugin": "^4.4.0",
- "@typescript-eslint/parser": "^4.4.0",
- "@vue/eslint-config-typescript": "^5.1.0",
- "eslint": "^6.7.2",
- "eslint-plugin-vue": "^6.2.2",
- "tailwindcss": "^1.8.9"
+ "tailwindcss": "^3.4.19",
+ "@tailwindcss/forms": "^0.5.11"
}
}
diff --git a/n-link-core/shims-tsx.d.ts b/n-link-core/shims-tsx.d.ts
deleted file mode 100644
index a175b0d..0000000
--- a/n-link-core/shims-tsx.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import Vue, { VNode } from 'vue'
-
-declare global {
- namespace JSX {
- // tslint:disable no-empty-interface
- interface Element extends VNode {}
- // tslint:disable no-empty-interface
- interface ElementClass extends Vue {}
- interface IntrinsicElements {
- [elem: string]: any;
- }
- }
-}
diff --git a/n-link-core/shims-vue.d.ts b/n-link-core/shims-vue.d.ts
deleted file mode 100644
index 1e13d3f..0000000
--- a/n-link-core/shims-vue.d.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-declare module '*.vue' {
- import Vue from 'vue'
- export default Vue
-}
-
-import Vue, { PluginFunction } from 'vue';
-
-interface IAsyncComputedOptions {
- errorHandler?: (error: string[]) => void;
- useRawError?: boolean;
- default?: any;
-}
-
-export default class AsyncComputed {
- constructor(options?: IAsyncComputedOptions);
- static install: PluginFunction;
- static version: string;
-}
-
-type AsyncComputedGetter = () => Promise | T;
-export interface IAsyncComputedProperty {
- default?: T | (() => T);
- get: AsyncComputedGetter;
- watch?: () => void;
- shouldUpdate?: () => boolean;
- lazy?: boolean;
-}
-
-interface IAsyncComputedProperties {
- [K: string]: AsyncComputedGetter | IAsyncComputedProperty;
-}
-
-declare module 'vue/types/options' {
- interface ComponentOptions {
- // @ts-ignore
- asyncComputed?: IAsyncComputedProperties;
- }
-}
-
-interface IASyncComputedState {
- state: 'updating' | 'success' | 'error';
- updating: boolean;
- success: boolean;
- error: boolean;
- exception: Error | null;
- update: () => void;
-}
-
-declare module 'vue/types/vue' {
- // tslint:disable-next-line:interface-name
- interface Vue {
- $asyncComputed: { [K: string]: IASyncComputedState };
- }
-}
diff --git a/n-link-core/tailwind.config.js b/n-link-core/tailwind.config.js
index acbe4d3..ea1c70f 100644
--- a/n-link-core/tailwind.config.js
+++ b/n-link-core/tailwind.config.js
@@ -1,8 +1,4 @@
module.exports = {
- future: {
- purgeLayersByDefault: true,
- removeDeprecatedGapUtilities: true,
- },
theme: {
fontFamily: {
sans: [
@@ -51,17 +47,5 @@ module.exports = {
},
},
},
- variants: {},
- plugins: [require('@tailwindcss/custom-forms')],
- purge: process.env.npm_package_name === 'web' && {
- enabled: process.env.NODE_ENV === 'production',
- content: [
- 'components/**/*.vue',
- 'layouts/**/*.vue',
- 'pages/**/*.vue',
- 'plugins/**/*.js',
- 'nuxt.config.js',
- '../n-link-core/components/**/*.vue'
- ]
- },
+ plugins: [require('@tailwindcss/forms')],
};
diff --git a/nlink-cli/Cargo.lock b/nlink-cli/Cargo.lock
new file mode 100644
index 0000000..8d3221a
--- /dev/null
+++ b/nlink-cli/Cargo.lock
@@ -0,0 +1,775 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "adler32"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
+
+[[package]]
+name = "aho-corasick"
+version = "1.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
+dependencies = [
+ "memchr",
+]
+
+[[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",
+]
+
+[[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",
+]
+
+[[package]]
+name = "array_iterator"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "015eb97c25bb20230c9fdf1533b4cee74b27924cd462f74b0d6fc011aaf196de"
+
+[[package]]
+name = "autocfg"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
+
+[[package]]
+name = "bitflags"
+version = "2.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da"
+
+[[package]]
+name = "bstr"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f7dc094d718f2e1c1559ad110e27eeaae14a5465d3d56dd6dbd793079fbd530"
+dependencies = [
+ "memchr",
+ "serde_core",
+]
+
+[[package]]
+name = "bytemuck"
+version = "1.25.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6aedf8ae72766347502cf3cb4f41cf5e9cc37d28bee90f1fdaaae15f9cf9424"
+
+[[package]]
+name = "byteorder"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
+
+[[package]]
+name = "cc"
+version = "1.2.67"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38"
+dependencies = [
+ "find-msvc-tools",
+ "jobserver",
+ "libc",
+ "shlex",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
+
+[[package]]
+name = "clap"
+version = "4.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd059f9da4f5c36b3787f65d38ccaab1cc315f07b01f89abc8359ee6a8205011"
+dependencies = [
+ "clap_builder",
+ "clap_derive",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "clap_lex",
+ "strsim",
+]
+
+[[package]]
+name = "clap_derive"
+version = "4.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "clap_lex"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
+
+[[package]]
+name = "color_quant"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
+
+[[package]]
+name = "colorchoice"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
+
+[[package]]
+name = "console"
+version = "0.16.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fe5f465a4f6fee88fad41b85d990f84c835335e85b5d9e6e63e0d06d28cba7c"
+dependencies = [
+ "encode_unicode",
+ "libc",
+ "unicode-width",
+ "windows-sys",
+]
+
+[[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-deque"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb"
+dependencies = [
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17"
+
+[[package]]
+name = "displaydoc"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "adc2ab4d5a16117f9029e9a6b5e4e79f4c67f6519bc134210d4d4a04ba31f41b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "encode_unicode"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0"
+
+[[package]]
+name = "errno"
+version = "0.3.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
+dependencies = [
+ "libc",
+ "windows-sys",
+]
+
+[[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 = "getrandom"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "r-efi",
+]
+
+[[package]]
+name = "globset"
+version = "0.4.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e47d37d2ae4464254884b60ab7071be2b876a9c35b696bd018ddcc76847309cd"
+dependencies = [
+ "aho-corasick",
+ "bstr",
+ "log",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "globwalk"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9db17aec586697a93219b19726b5b68307eba92898c34b170857343fe67c99d"
+dependencies = [
+ "ignore",
+ "walkdir",
+]
+
+[[package]]
+name = "heck"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+
+[[package]]
+name = "ignore"
+version = "0.4.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b009b6744c1445efd7244084e25e498636412effb6760b55067553baa925cc7"
+dependencies = [
+ "crossbeam-deque",
+ "globset",
+ "log",
+ "memchr",
+ "regex-automata",
+ "same-file",
+ "walkdir",
+ "winapi-util",
+]
+
+[[package]]
+name = "image"
+version = "0.23.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1"
+dependencies = [
+ "bytemuck",
+ "byteorder",
+ "color_quant",
+ "num-iter",
+ "num-rational",
+ "num-traits",
+]
+
+[[package]]
+name = "indicatif"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7baab56125e25686df467fe470785512329883aab42696d661247aca2a2896e4"
+dependencies = [
+ "console",
+ "lazy_static",
+ "number_prefix",
+ "regex",
+]
+
+[[package]]
+name = "is_terminal_polyfill"
+version = "1.70.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
+
+[[package]]
+name = "jobserver"
+version = "0.1.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3"
+dependencies = [
+ "getrandom",
+ "libc",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+
+[[package]]
+name = "libc"
+version = "0.2.186"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
+
+[[package]]
+name = "libflate"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ff4ae71b685bbad2f2f391fe74f6b7659a34871c08b210fdc039e43bee07d18"
+dependencies = [
+ "adler32",
+ "crc32fast",
+ "libflate_lz77",
+]
+
+[[package]]
+name = "libflate_lz77"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a52d3a8bfc85f250440e4424db7d857e241a3aebbbe301f3eb606ab15c39acbf"
+dependencies = [
+ "rle-decode-fast",
+]
+
+[[package]]
+name = "libnspire"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6428b72ef81134d34d077748639ae280cf8b5b3314ae99fa8ff1e34cbc1d64b"
+dependencies = [
+ "array_iterator",
+ "displaydoc",
+ "image",
+ "libnspire-sys",
+ "libusb1-sys",
+ "rusb",
+ "serde",
+ "thiserror",
+]
+
+[[package]]
+name = "libnspire-sys"
+version = "0.3.4"
+dependencies = [
+ "cc",
+ "globwalk",
+ "libusb1-sys",
+]
+
+[[package]]
+name = "libusb1-sys"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be241693102a24766d0b8526c8988771edac2842630d7e730f8e9fbc014f3703"
+dependencies = [
+ "cc",
+ "libc",
+ "libflate",
+ "pkg-config",
+ "tar",
+ "vcpkg",
+]
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
+
+[[package]]
+name = "log"
+version = "0.4.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
+
+[[package]]
+name = "memchr"
+version = "2.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
+
+[[package]]
+name = "nlink-cli"
+version = "0.1.6"
+dependencies = [
+ "clap",
+ "indicatif",
+ "libnspire",
+ "rusb",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.46"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "num-iter"
+version = "0.1.46"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b"
+dependencies = [
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-rational"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "number_prefix"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a"
+
+[[package]]
+name = "once_cell_polyfill"
+version = "1.70.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e"
+
+[[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 = "quote"
+version = "1.0.46"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "r-efi"
+version = "6.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
+
+[[package]]
+name = "regex"
+version = "1.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.8.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
+
+[[package]]
+name = "rle-decode-fast"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422"
+
+[[package]]
+name = "rusb"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6f32cd45962594f9f8cd4547b5757132715600e2c8840aa9ccd3d1a9ed6fdc6"
+dependencies = [
+ "libc",
+ "libusb1-sys",
+]
+
+[[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",
+]
+
+[[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 = "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 2.0.119",
+]
+
+[[package]]
+name = "shlex"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
+
+[[package]]
+name = "strsim"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.119"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[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 = "thiserror"
+version = "1.0.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[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 2.0.119",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
+
+[[package]]
+name = "unicode-width"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
+
+[[package]]
+name = "utf8parse"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[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 = "winapi-util"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
+dependencies = [
+ "windows-sys",
+]
+
+[[package]]
+name = "windows-link"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
+
+[[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 = "xattr"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156"
+dependencies = [
+ "libc",
+ "rustix",
+]
diff --git a/nlink-cli/Cargo.toml b/nlink-cli/Cargo.toml
new file mode 100644
index 0000000..49893cf
--- /dev/null
+++ b/nlink-cli/Cargo.toml
@@ -0,0 +1,22 @@
+[package]
+name = "nlink-cli"
+version = "0.1.6"
+description = "Standalone CLI for linking to the TI-Nspire (incl. CX II), extracted from n-link"
+edition = "2018"
+
+[[bin]]
+name = "n-link-cli"
+path = "src/main.rs"
+
+[dependencies]
+libnspire = "0.2.2"
+rusb = "0.6.4"
+clap = { version = "4", features = ["derive"] }
+indicatif = "0.15"
+# Link the system libusb (install libusb-1.0-0-dev). The vendored build in
+# libusb1-sys 0.4.x is broken on this toolchain, so we use the distro library.
+
+# Local patched libnspire-sys: raises the CX II NNSE handshake retry limit
+# (10 -> 100) so the address<->time handshake has time to complete.
+[patch.crates-io]
+libnspire-sys = { path = "../vendor/libnspire-sys" }
diff --git a/nlink-cli/README.md b/nlink-cli/README.md
new file mode 100644
index 0000000..819a516
--- /dev/null
+++ b/nlink-cli/README.md
@@ -0,0 +1,51 @@
+# nlink-cli — standalone TI-Nspire CX II link CLI (Linux)
+
+A GUI-free command-line build extracted from [n-link](https://github.com/lights0123/n-link),
+for transferring files to/from a TI-Nspire CX II (CAS) over USB on Linux.
+
+Built because:
+- **TiLP2** (distro `libticables` 1.3.6) does not support the CX II (USB PID `e022`) — its
+ probe reports "no devices found".
+- The **prebuilt n-link 0.1.6 `.deb`** won't run on Ubuntu 26.04 (needs the retired
+ `libssl.so.1.1` + WebKit2GTK 4.0). n-link is a Tauri/WebKit app.
+
+This CLI reuses only n-link's self-contained `cli.rs` (upload/download/ls/mkdir/rmdir/
+copy/move/upload-os), dropping Tauri/WebKit entirely.
+
+## Build
+```bash
+# one-time system deps
+sudo apt-get install -y libusb-1.0-0-dev pkg-config
+# Rust toolchain via rustup, then:
+cargo build --release
+# binary: target/release/n-link-cli
+```
+`Cargo.toml` uses a local `[patch.crates-io]` override of `libnspire-sys`
+(`../vendor/libnspire-sys`) whose CX II NNSE handshake retry limit is raised from 10.
+
+## Run
+```bash
+./target/release/n-link-cli ls /
+./target/release/n-link-cli download "/MyFile.tns" ./
+./target/release/n-link-cli upload ./MyFile.tns "/"
+./target/release/n-link-cli --help
+```
+
+## System setup required (Linux)
+1. **udev access** for the CX II (`/etc/udev/rules.d/70-ti-nspire.rules`):
+ ```
+ SUBSYSTEM=="usb", ATTRS{idVendor}=="0451", ENV{ID_MM_DEVICE_IGNORE}="1"
+ ```
+ (plus group/`uaccess` for PID `e022`) — then `udevadm control --reload-rules && udevadm trigger`.
+2. **ModemManager** grabs the interface on plug; the `ID_MM_DEVICE_IGNORE` rule above
+ tells it to leave TI devices alone. Restart it after adding the rule:
+ `sudo systemctl start ModemManager`.
+
+## Known limitation
+libnspire's CX II ("NavNet SE") protocol support has been **frozen upstream since 2020**
+(`lights0123/libnspire`, last commit 2020-09-30; crates.io `libnspire-sys` 0.3.4 is the newest).
+Against **current (2026) CX II firmware** the USB link and handshake work — real filenames
+are transferred — but **multi-packet stream transfers are unreliable** and long operations
+(e.g. listing a folder with many entries) can fail mid-transfer with `Busy`. Short transfers
+are more likely to complete. This is a library/firmware-era mismatch, not a local
+configuration problem.
diff --git a/nlink-cli/src/NOTICE.txt b/nlink-cli/src/NOTICE.txt
new file mode 100644
index 0000000..c333685
--- /dev/null
+++ b/nlink-cli/src/NOTICE.txt
@@ -0,0 +1,7 @@
+This program contains parts of other programs licensed under the GPL version
+3.0. They are as follows:
+
+- libnspire, available for download at
+ https://github.com/lights0123/libnspire-rs
+- Flat Remix, originally at https://github.com/daniruiz/flat-remix, with
+ parts extracted available at {}
diff --git a/nlink-cli/src/cli.rs b/nlink-cli/src/cli.rs
new file mode 100644
index 0000000..922810a
--- /dev/null
+++ b/nlink-cli/src/cli.rs
@@ -0,0 +1,394 @@
+use std::ffi::OsStr;
+use std::io::{Read, Write};
+use std::path::PathBuf;
+use std::{fs::File, path::Path};
+
+use clap::{Args, Parser, Subcommand};
+use indicatif::{ProgressBar, ProgressStyle};
+use libnspire::{dir::EntryType, PID, PID_CX2, VID};
+
+#[derive(Parser, Debug)]
+#[clap(author, about, version)]
+struct Opt {
+ #[clap(subcommand)]
+ cmd: Option,
+}
+
+#[derive(Subcommand, Debug)]
+enum SubCommand {
+ Upload(Upload),
+ Download(Download),
+ UploadOS(UploadOS),
+ Copy(Copy),
+ Move(Move),
+ Mkdir(Mkdir),
+ Rmdir(Rmdir),
+ Ls(Ls),
+ /// View license information
+ License,
+}
+
+/// Upload files to the calculator
+#[derive(Args, Debug)]
+struct Upload {
+ /// Files to upload
+ #[clap(required = true)]
+ files: Vec,
+ /// Destination path
+ dest: String,
+}
+
+/// Download files from the calculator
+#[derive(Args, Debug)]
+struct Download {
+ /// Files to download
+ #[clap(required = true)]
+ files: Vec,
+ /// Destination path
+ #[clap(required = true)]
+ dest: PathBuf,
+}
+
+/// Upload and install a .tcc/.tco/.tcc2/.tco2/.tct2 OS file
+#[derive(Args, Debug)]
+struct UploadOS {
+ /// Path to the OS file
+ #[clap(required = true)]
+ file: PathBuf,
+
+ /// Disables the file extension check
+ #[clap(long)]
+ no_check_os: bool,
+}
+
+/// Copy a file to a different location
+#[derive(Args, Debug)]
+struct Copy {
+ /// Path to file
+ #[clap(required = true)]
+ from_path: String,
+
+ /// Path to new location
+ #[clap(required = true)]
+ dist_path: String,
+}
+
+/// Move a file or directory to a new location
+#[derive(Args, Debug)]
+struct Move {
+ /// Path to file
+ #[clap(required = true)]
+ from_path: String,
+
+ /// Path to new location
+ #[clap(required = true)]
+ dist_path: String,
+}
+
+/// Create a directory
+#[derive(Args, Debug)]
+struct Mkdir {
+ /// Path to directory
+ #[clap(required = true)]
+ path: String,
+}
+
+/// Delete a directory
+#[derive(Args, Debug)]
+struct Rmdir {
+ /// Path to directory
+ #[clap(required = true)]
+ path: String,
+}
+
+/// List the contents of a directory
+#[derive(Args, Debug)]
+struct Ls {
+ /// Path to directory
+ #[clap(required = true)]
+ path: String,
+}
+
+fn get_dev() -> Option> {
+ rusb::devices()
+ .unwrap()
+ .iter()
+ .find(|dev| {
+ let descriptor = match dev.device_descriptor() {
+ Ok(d) => d,
+ Err(_) => return false,
+ };
+ descriptor.vendor_id() == VID && matches!(descriptor.product_id(), PID | PID_CX2)
+ })
+ .map(|dev| libnspire::Handle::new(dev.open().unwrap()).unwrap())
+}
+
+pub fn cwd() -> PathBuf {
+ #[cfg(target_os = "linux")]
+ if std::env::var_os("APPIMAGE").is_some() && std::env::var_os("APPDIR").is_some() {
+ if let Some(cwd) = std::env::var_os("OWD") {
+ return cwd.into();
+ }
+ };
+ std::env::current_dir().expect("Couldn't get current directory")
+}
+
+pub fn run() -> bool {
+ let opt: Opt = Opt::parse();
+ if let Some(cmd) = opt.cmd {
+ match cmd {
+ SubCommand::Upload(Upload { files, mut dest }) => {
+ if let Some(handle) = get_dev() {
+ for file in files {
+ let mut buf = vec![];
+ File::open(cwd().join(&file))
+ .unwrap()
+ .read_to_end(&mut buf)
+ .unwrap();
+ let name = file
+ .file_name()
+ .expect("Failed to get file name")
+ .to_string_lossy()
+ .to_string();
+ let bar = ProgressBar::new(buf.len() as u64);
+ bar.set_style(ProgressStyle::default_bar().template("{spinner:.green} {msg} [{elapsed_precise}] [{bar:40.cyan/blue}] {bytes}/{total_bytes} ({bytes_per_sec}, {eta})"));
+ bar.set_message(&format!("Upload {}", name));
+ bar.enable_steady_tick(100);
+ if dest.ends_with('/') {
+ dest.remove(dest.len() - 1);
+ }
+ let res = handle.write_file(&format!("{}/{}", dest, name), &buf, &mut |remaining| {
+ bar.set_position((buf.len() - remaining) as u64)
+ });
+
+ match res {
+ Ok(_) => {
+ bar.finish_with_message(&format!("Upload {}: Ok", dest));
+ }
+ Err(error) => {
+ bar.abandon_with_message(&format!("Failed: {}", error));
+ }
+ }
+ }
+ } else {
+ eprintln!("Couldn't find any device");
+ }
+ }
+ SubCommand::Download(Download { dest, files }) => {
+ if let Some(handle) = get_dev() {
+ for file in files {
+ let attr = handle.file_attr(&file);
+ match attr {
+ Ok(attr) => {
+ let path = Path::new(&file);
+ let dest_path = Path::join(&dest, path.file_name().unwrap().to_str().unwrap());
+ match File::create(dest_path) {
+ Ok(mut dest_file) => {
+ let mut buf = vec![0u8; attr.size() as usize];
+
+ let bar = ProgressBar::new(buf.len() as u64);
+ bar.set_style(ProgressStyle::default_bar().template("{spinner:.green} {msg} [{elapsed_precise}] [{bar:40.cyan/blue}] {bytes}/{total_bytes} ({bytes_per_sec}, {eta})"));
+ bar.set_message(&format!(
+ "Download {}",
+ path.file_name().unwrap().to_str().unwrap()
+ ));
+ bar.enable_steady_tick(100);
+
+ let len = buf.len();
+
+ let res = handle.read_file(&file, &mut buf, &mut |remaining| {
+ bar.set_position((len - remaining) as u64);
+ });
+
+ match res {
+ Ok(_) => {
+ bar.set_message("Writing file to disk");
+
+ match dest_file.write_all(&buf) {
+ Ok(_) => {
+ bar.finish_with_message("Transfer completed");
+ }
+ Err(error) => {
+ bar.abandon_with_message(&format!(
+ "Failed to write file to disk: {}",
+ error
+ ));
+ }
+ }
+ }
+ Err(error) => {
+ bar.abandon_with_message(&format!("Failed to transfer file: {}", error))
+ }
+ }
+ }
+ Err(error) => {
+ eprintln!("Failed to open destination file: {}", error);
+ }
+ }
+ }
+ Err(error) => {
+ eprintln!("Failed to read file info: {}", error);
+ }
+ }
+ }
+ } else {
+ eprintln!("Couldn't find any device");
+ }
+ }
+ SubCommand::UploadOS(UploadOS { file, no_check_os }) => {
+ if let Some(handle) = get_dev() {
+ let calc_info = handle.info().expect("Failed to obtain device info");
+
+ let file_ext = file
+ .extension()
+ .unwrap_or(OsStr::new(""))
+ .to_string_lossy()
+ .to_string();
+
+ let mut buf = vec![];
+ let mut f = File::open(cwd().join(&file)).unwrap_or_else(|err| {
+ eprintln!("Failed to open file: {}", err);
+ std::process::exit(1);
+ });
+
+ if format!(".{}", file_ext) != calc_info.os_extension {
+ if no_check_os {
+ eprintln!(
+ "Warning: {} expects file of type {}",
+ calc_info.name, calc_info.os_extension
+ );
+ } else {
+ eprintln!(
+ "Error: {} expects file of type {}",
+ calc_info.name, calc_info.os_extension
+ );
+ eprintln!("Provide --no-check-os to bypass this check.");
+ std::process::exit(1);
+ }
+ }
+
+ f.read_to_end(&mut buf).unwrap();
+
+ let name = file
+ .file_name()
+ .expect("Failed to get file name")
+ .to_string_lossy()
+ .to_string();
+
+ let bar = ProgressBar::new(buf.len() as u64);
+ bar.set_style(ProgressStyle::default_bar().template("{spinner:.green} {msg} [{elapsed_precise}] [{bar:40.cyan/blue}] {bytes}/{total_bytes} ({bytes_per_sec}, {eta})"));
+ bar.set_message(&format!("Upload OS {}", name));
+ bar.enable_steady_tick(100);
+
+ let res = handle.send_os(&buf, &mut |remaining| {
+ bar.set_position((buf.len() - remaining) as u64);
+ });
+
+ match res {
+ Ok(_) => {
+ bar.finish();
+ }
+ Err(error) => {
+ bar.abandon_with_message(&format!("OS Upload failed: {}", error));
+ }
+ }
+ } else {
+ eprintln!("Couldn't find any device");
+ }
+ }
+ SubCommand::Copy(Copy {
+ from_path,
+ dist_path,
+ }) => {
+ if let Some(handle) = get_dev() {
+ match handle.copy_file(&from_path, &dist_path) {
+ Ok(_) => {
+ println!("Copy {} => {}: Ok", from_path, dist_path);
+ }
+ Err(error) => {
+ eprintln!("Failed to copy file or directory: {}", error);
+ }
+ }
+ } else {
+ eprintln!("Couldn't find any device");
+ }
+ }
+ SubCommand::Move(Move {
+ from_path,
+ dist_path,
+ }) => {
+ if let Some(handle) = get_dev() {
+ match handle.move_file(&from_path, &dist_path) {
+ Ok(_) => {
+ println!("Move {} => {}: Ok", from_path, dist_path);
+ }
+ Err(error) => {
+ eprintln!("Failed to move file or directory: {}", error);
+ }
+ }
+ } else {
+ eprintln!("Couldn't find any device");
+ }
+ }
+ SubCommand::Mkdir(Mkdir { path }) => {
+ if let Some(handle) = get_dev() {
+ match handle.create_dir(&path) {
+ Ok(_) => {
+ println!("Create {}: Ok", path);
+ }
+ Err(error) => {
+ eprintln!("Failed to create directory: {}", error);
+ }
+ }
+ } else {
+ eprintln!("Couldn't find any device");
+ }
+ }
+ SubCommand::Rmdir(Rmdir { path }) => {
+ if let Some(handle) = get_dev() {
+ match handle.delete_dir(&path) {
+ Ok(_) => {
+ println!("Remove {}: Ok", path);
+ }
+ Err(error) => {
+ eprintln!("Failed to delete directory: {}", error);
+ }
+ }
+ } else {
+ eprintln!("Couldn't find any device");
+ }
+ }
+ SubCommand::Ls(Ls { path }) => {
+ if let Some(handle) = get_dev() {
+ match handle.list_dir(&path) {
+ Ok(dir_list) => {
+ for item in dir_list.iter() {
+ println!(
+ "{}{}",
+ item.name().to_str().unwrap(),
+ if item.entry_type() == EntryType::Directory {
+ "/"
+ } else {
+ ""
+ }
+ );
+ }
+ }
+ Err(error) => {
+ eprintln!("Failed to list directory: {}", error);
+ }
+ }
+ } else {
+ eprintln!("Couldn't find any device");
+ }
+ }
+ SubCommand::License => {
+ println!("{}", include_str!("../../LICENSE"));
+ println!(include_str!("NOTICE.txt"), env!("CARGO_PKG_REPOSITORY"));
+ }
+ }
+ true
+ } else {
+ false
+ }
+}
diff --git a/nlink-cli/src/main.rs b/nlink-cli/src/main.rs
new file mode 100644
index 0000000..d60811e
--- /dev/null
+++ b/nlink-cli/src/main.rs
@@ -0,0 +1,10 @@
+mod cli;
+
+fn main() {
+ // cli::run() parses args and performs the requested operation.
+ // It returns false only when no subcommand was given.
+ if !cli::run() {
+ eprintln!("No command given. Run with --help to see available commands.");
+ std::process::exit(2);
+ }
+}
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..de6dd94
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,3260 @@
+{
+ "name": "n-link",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "workspaces": [
+ "desktop",
+ "n-link-core"
+ ]
+ },
+ "desktop": {
+ "name": "n-link",
+ "version": "0.1.6",
+ "dependencies": {
+ "@tauri-apps/api": "^2.11.1",
+ "@tauri-apps/plugin-dialog": "^2.7.2",
+ "@tauri-apps/plugin-shell": "^2.3.5",
+ "element-plus": "^2.14.3",
+ "feather-icons": "^4.29.2",
+ "filesize": "^10.1.6",
+ "vue": "^3.5.13",
+ "vue-router": "^4.6.4"
+ },
+ "devDependencies": {
+ "@tailwindcss/forms": "^0.5.11",
+ "@tauri-apps/cli": "^2",
+ "@vitejs/plugin-vue": "^5.2.1",
+ "autoprefixer": "^10.5.4",
+ "postcss": "^8.5.21",
+ "sass": "^1.101.3",
+ "tailwindcss": "^3.4.19",
+ "typescript": "~5.6.2",
+ "vite": "^6.0.3",
+ "vue-tsc": "^2.1.10"
+ }
+ },
+ "n-link-core": {
+ "version": "0.0.0",
+ "devDependencies": {
+ "@tailwindcss/forms": "^0.5.11",
+ "tailwindcss": "^3.4.19"
+ },
+ "peerDependencies": {
+ "element-plus": "^2.14.3",
+ "vue": "^3.5.40"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz",
+ "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==",
+ "dependencies": {
+ "@babel/types": "^7.29.7"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz",
+ "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@ctrl/tinycolor": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz",
+ "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@element-plus/icons-vue": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz",
+ "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==",
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
+ "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
+ "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
+ "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
+ "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
+ "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
+ "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
+ "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
+ "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
+ "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
+ "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
+ "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
+ "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
+ "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
+ "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
+ "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
+ "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
+ "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
+ "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
+ "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
+ "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
+ "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz",
+ "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.12"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz",
+ "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==",
+ "dependencies": {
+ "@floating-ui/core": "^1.8.0",
+ "@floating-ui/utils": "^0.2.12"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.12",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz",
+ "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww=="
+ },
+ "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,
+ "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,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "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=="
+ },
+ "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,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@parcel/watcher": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz",
+ "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "dependencies": {
+ "detect-libc": "^2.0.3",
+ "is-glob": "^4.0.3",
+ "node-addon-api": "^7.0.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher-android-arm64": "2.6.0",
+ "@parcel/watcher-darwin-arm64": "2.6.0",
+ "@parcel/watcher-darwin-x64": "2.6.0",
+ "@parcel/watcher-freebsd-x64": "2.6.0",
+ "@parcel/watcher-linux-arm-glibc": "2.6.0",
+ "@parcel/watcher-linux-arm-musl": "2.6.0",
+ "@parcel/watcher-linux-arm64-glibc": "2.6.0",
+ "@parcel/watcher-linux-arm64-musl": "2.6.0",
+ "@parcel/watcher-linux-x64-glibc": "2.6.0",
+ "@parcel/watcher-linux-x64-musl": "2.6.0",
+ "@parcel/watcher-win32-arm64": "2.6.0",
+ "@parcel/watcher-win32-x64": "2.6.0"
+ }
+ },
+ "node_modules/@parcel/watcher-android-arm64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz",
+ "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-arm64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz",
+ "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-x64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz",
+ "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-freebsd-x64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz",
+ "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-glibc": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz",
+ "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-musl": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz",
+ "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-glibc": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz",
+ "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-musl": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz",
+ "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-glibc": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz",
+ "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-musl": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz",
+ "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-arm64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz",
+ "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-x64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz",
+ "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@popperjs/core": {
+ "name": "@sxzz/popperjs-es",
+ "version": "2.11.8",
+ "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.8.tgz",
+ "integrity": "sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz",
+ "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz",
+ "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz",
+ "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz",
+ "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz",
+ "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz",
+ "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz",
+ "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz",
+ "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz",
+ "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz",
+ "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz",
+ "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz",
+ "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz",
+ "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz",
+ "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz",
+ "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz",
+ "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz",
+ "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz",
+ "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz",
+ "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz",
+ "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz",
+ "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz",
+ "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz",
+ "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz",
+ "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz",
+ "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@tailwindcss/forms": {
+ "version": "0.5.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.11.tgz",
+ "integrity": "sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==",
+ "dev": true,
+ "dependencies": {
+ "mini-svg-data-uri": "^1.2.3"
+ },
+ "peerDependencies": {
+ "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1"
+ }
+ },
+ "node_modules/@tauri-apps/api": {
+ "version": "2.11.1",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.11.1.tgz",
+ "integrity": "sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/tauri"
+ }
+ },
+ "node_modules/@tauri-apps/cli": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.11.4.tgz",
+ "integrity": "sha512-R8xGtMpwyetawSqm9kYOuMmEqkhUbvcUy8n0aNXIxollKBLESUu5f4Fx+64hgASYm1H+jSWq6jCW6zqTnH6hqQ==",
+ "dev": true,
+ "bin": {
+ "tauri": "tauri.js"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/tauri"
+ },
+ "optionalDependencies": {
+ "@tauri-apps/cli-darwin-arm64": "2.11.4",
+ "@tauri-apps/cli-darwin-x64": "2.11.4",
+ "@tauri-apps/cli-linux-arm-gnueabihf": "2.11.4",
+ "@tauri-apps/cli-linux-arm64-gnu": "2.11.4",
+ "@tauri-apps/cli-linux-arm64-musl": "2.11.4",
+ "@tauri-apps/cli-linux-riscv64-gnu": "2.11.4",
+ "@tauri-apps/cli-linux-x64-gnu": "2.11.4",
+ "@tauri-apps/cli-linux-x64-musl": "2.11.4",
+ "@tauri-apps/cli-win32-arm64-msvc": "2.11.4",
+ "@tauri-apps/cli-win32-ia32-msvc": "2.11.4",
+ "@tauri-apps/cli-win32-x64-msvc": "2.11.4"
+ }
+ },
+ "node_modules/@tauri-apps/cli-darwin-arm64": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.11.4.tgz",
+ "integrity": "sha512-1ryOF3ZhpZ/nemHV5zVwBQBz9jDGKmKPvWPADOhc83ig0P4bMc2iER4NbC6r9sjeIZ6RVQ4g3RZIYvezhcl4TQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-darwin-x64": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.11.4.tgz",
+ "integrity": "sha512-uFsGQAAfuyz1k/yGLmkWfkBlgKAqZfxqlHmLWx81QU27RJWfmbNHCIq8T8w1e+VClleIuZUjpHWfoE4E3DLo3A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.11.4.tgz",
+ "integrity": "sha512-IaHZn5CdBL21oUmjiVOS1ctw6Ip1O0pjp70FwOWmYz1myWe0SY96ZIj2FYf7pT0m8bI2h/hrs5ZbEXXh44/MkQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-linux-arm64-gnu": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.11.4.tgz",
+ "integrity": "sha512-N41/ukTRVe6XSuUTESuFdGeOW2i7k62tK+6gHK5Kd5/q5RPvvi19GaWAVPPb9u95HSGmTChSolBfzynUsssFaA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-linux-arm64-musl": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.11.4.tgz",
+ "integrity": "sha512-v277UnT/fB64xAfSroL5N3Km3tLmvATWqJJw/wRI+g6o+HkeD0slyE7gOhNs1MbjE41R7bQOTxMVoL3aomUJmw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-linux-riscv64-gnu": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.11.4.tgz",
+ "integrity": "sha512-qqgNkQ2u1yZHxjhxsZaxUtRDW8dIqIYm33rx/mzwQv0SfY9x1B+iraj8vWeFiXjjSVVhEMepXSOts1TqPzvXNQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-linux-x64-gnu": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.11.4.tgz",
+ "integrity": "sha512-2VRNWl84FOH0m2giiDkO2h0QXlcMJeX+zJDpI5kDIQAx6s+geF3v48F4DXfJez4GS/FdoDGnPnw1C2iYGbQ7bQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-linux-x64-musl": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.11.4.tgz",
+ "integrity": "sha512-o9GyhYor/nc7xarmwDE3ka2szuW3uuZzXjHWh64Q8YX5AtSgxdQkFWzrY4O8KiGtVNvFBI14H3Q49Qj5TOIP/A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-win32-arm64-msvc": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.11.4.tgz",
+ "integrity": "sha512-ld5Ehb598m0VkYyylRPNeCFsBe/km0jxis6KgMpl3IGY6I/i1RwQXO05I1AsXUXO2WC6AvB/Lw4qTf/asiuEiQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-win32-ia32-msvc": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.11.4.tgz",
+ "integrity": "sha512-12Hxi0XX/H5VFxO/bGgHkFWhml9VMgEOu9CidjeCeTNQ1l6fpUlbiGgSP7CLI3PFtW9/FfbeHieZ+kyWK5H7CA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-win32-x64-msvc": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.11.4.tgz",
+ "integrity": "sha512-+vDiqBIU5dMISg/wNvX3sF+ZHfgJGJ5T0AcO+EHNXV9GGAG+P5fzodlDXD3QdKCRgZxMoCm5PPvj3BqLNjBthw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/plugin-dialog": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-dialog/-/plugin-dialog-2.7.2.tgz",
+ "integrity": "sha512-pX0IGm1I3I6wc+zeKYcq1GSqogK6okCNX5fOdaNU5ab1AjGS6l1E5wFNjEb7meg7ZFSp0JUs+0jQGQNyOvLrsg==",
+ "dependencies": {
+ "@tauri-apps/api": "^2.11.0"
+ }
+ },
+ "node_modules/@tauri-apps/plugin-shell": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-shell/-/plugin-shell-2.3.5.tgz",
+ "integrity": "sha512-jewtULhiQ7lI7+owCKAjc8tYLJr92U16bPOeAa472LHJdgaibLP83NcfAF2e+wkEcA53FxKQAZ7byDzs2eeizg==",
+ "dependencies": {
+ "@tauri-apps/api": "^2.10.1"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+ "dev": true
+ },
+ "node_modules/@types/lodash": {
+ "version": "4.17.24",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz",
+ "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ=="
+ },
+ "node_modules/@types/lodash-es": {
+ "version": "4.17.12",
+ "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
+ "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
+ "dependencies": {
+ "@types/lodash": "*"
+ }
+ },
+ "node_modules/@types/web-bluetooth": {
+ "version": "0.0.21",
+ "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz",
+ "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA=="
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz",
+ "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==",
+ "dev": true,
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0 || ^6.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@volar/language-core": {
+ "version": "2.4.15",
+ "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz",
+ "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==",
+ "dev": true,
+ "dependencies": {
+ "@volar/source-map": "2.4.15"
+ }
+ },
+ "node_modules/@volar/source-map": {
+ "version": "2.4.15",
+ "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz",
+ "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==",
+ "dev": true
+ },
+ "node_modules/@volar/typescript": {
+ "version": "2.4.15",
+ "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz",
+ "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==",
+ "dev": true,
+ "dependencies": {
+ "@volar/language-core": "2.4.15",
+ "path-browserify": "^1.0.1",
+ "vscode-uri": "^3.0.8"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.40.tgz",
+ "integrity": "sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==",
+ "dependencies": {
+ "@babel/parser": "^7.29.7",
+ "@vue/shared": "3.5.40",
+ "entities": "^7.0.1",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.40.tgz",
+ "integrity": "sha512-pwkx4vqlqOspFstrcmzwkKLePVMD3PT65imRzLhanU2V1Fj4K13g6OXjanOyzw3aTAuRk84BOmY8f3rEHqPaVA==",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.40",
+ "@vue/shared": "3.5.40"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.40.tgz",
+ "integrity": "sha512-gIf497P4kpuALcvs5n3AEg1Vdn0pSY4XbjASIfHNYF1/MP3T2Mf2STERTubysBxCRxzJGJYtF/O7vwJrxFB3Vw==",
+ "dependencies": {
+ "@babel/parser": "^7.29.7",
+ "@vue/compiler-core": "3.5.40",
+ "@vue/compiler-dom": "3.5.40",
+ "@vue/compiler-ssr": "3.5.40",
+ "@vue/shared": "3.5.40",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.21",
+ "postcss": "^8.5.19",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.40.tgz",
+ "integrity": "sha512-rrE5xiXG663+vHCHa3J9p2z5OcBRjXmoqenprJxAFQxg5pSshzeBiCE6pu46axapRJ2Adk0YDA2BRZVjiHXnhg==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.40",
+ "@vue/shared": "3.5.40"
+ }
+ },
+ "node_modules/@vue/compiler-vue2": {
+ "version": "2.7.16",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz",
+ "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==",
+ "dev": true,
+ "dependencies": {
+ "de-indent": "^1.0.2",
+ "he": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "6.6.4",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
+ },
+ "node_modules/@vue/language-core": {
+ "version": "2.2.12",
+ "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz",
+ "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==",
+ "dev": true,
+ "dependencies": {
+ "@volar/language-core": "2.4.15",
+ "@vue/compiler-dom": "^3.5.0",
+ "@vue/compiler-vue2": "^2.7.16",
+ "@vue/shared": "^3.5.0",
+ "alien-signals": "^1.0.3",
+ "minimatch": "^9.0.3",
+ "muggle-string": "^0.4.1",
+ "path-browserify": "^1.0.1"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.40.tgz",
+ "integrity": "sha512-B7ot9UlUZOi1zbq61/LvE88ZLTV8IlajTdiZTAEiDQgrnIMIZoPr9kGw0Zw46ObW62O9+H/Be3kMbfb7kYPQZA==",
+ "dependencies": {
+ "@vue/shared": "3.5.40"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.40.tgz",
+ "integrity": "sha512-KAZLweuZ6uUJPK1PMSQPgBU5gCjgrrfjUhSglmU9NhH+Zjepa8cnwSydPWDWHDwOgY4g3VcZ+PljbiHlURNCbw==",
+ "dependencies": {
+ "@vue/reactivity": "3.5.40",
+ "@vue/shared": "3.5.40"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.40.tgz",
+ "integrity": "sha512-ZfrX8ssZQds900L9pr8AuK05ddnMsR4MPMZr8cPN9GoqoPWcXLhjvvbIA2SMv+7a97sJ1vv9pj/zxK0Cq/eEFQ==",
+ "dependencies": {
+ "@vue/reactivity": "3.5.40",
+ "@vue/runtime-core": "3.5.40",
+ "@vue/shared": "3.5.40",
+ "csstype": "^3.2.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.40.tgz",
+ "integrity": "sha512-XNJym9WpevhTVt1HuwOrCRJ5Q+9z4BjTMrDtjTrvx74SmUll8spNTw6whWJa9mEkO4PKn5TihI/bm/8ds2QVJw==",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.5.40",
+ "@vue/runtime-dom": "3.5.40",
+ "@vue/shared": "3.5.40"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.40.tgz",
+ "integrity": "sha512-WxnBtruIqOoV3rA4jeKDWzrYI5h7Cp4+pjwDi8kWGHz+IslhiN+wguLVVhtv2l8VoU02rzDCVfDjgCl1lNpZVg=="
+ },
+ "node_modules/@vueuse/core": {
+ "version": "14.3.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.3.0.tgz",
+ "integrity": "sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.21",
+ "@vueuse/metadata": "14.3.0",
+ "@vueuse/shared": "14.3.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vue": "^3.5.0"
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "14.3.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.3.0.tgz",
+ "integrity": "sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "14.3.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.3.0.tgz",
+ "integrity": "sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vue": "^3.5.0"
+ }
+ },
+ "node_modules/alien-signals": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz",
+ "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==",
+ "dev": true
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/anymatch/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true
+ },
+ "node_modules/async-validator": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz",
+ "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.5.4",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.4.tgz",
+ "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.28.6",
+ "caniuse-lite": "^1.0.30001806",
+ "fraction.js": "^5.3.4",
+ "picocolors": "^1.1.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.0.tgz",
+ "integrity": "sha512-oCu2wfipvX3AePSgmOuKkIywOu+8n9psz7hXYmk56ghpu3+7KzNIBopaOs4c9BrtdnTtW30unG9GTfHo7EwERQ==",
+ "dev": true,
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz",
+ "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.7",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz",
+ "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "baseline-browser-mapping": "^2.10.44",
+ "caniuse-lite": "^1.0.30001806",
+ "electron-to-chromium": "^1.5.393",
+ "node-releases": "^2.0.51",
+ "update-browserslist-db": "^1.2.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001806",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz",
+ "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chokidar": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
+ "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
+ "dev": true,
+ "dependencies": {
+ "readdirp": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/classnames": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
+ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/core-js": {
+ "version": "3.49.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz",
+ "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==",
+ "hasInstallScript": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.21",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz",
+ "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA=="
+ },
+ "node_modules/de-indent": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
+ "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
+ "dev": true
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.395",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.395.tgz",
+ "integrity": "sha512-7zt9Aw+SrmxLWLN0zhaTWZQiCdryLVrYTq5R7iZakLvi2UQPYMMsROYV/2qVCzMeCiSXHwKOU+sZ4zOVVlrtKA==",
+ "dev": true
+ },
+ "node_modules/element-plus": {
+ "version": "2.14.3",
+ "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.14.3.tgz",
+ "integrity": "sha512-pJcvxcpZjYruNzuJhAeVwnbYjfNgzBKnWHwSVEhwzM2/kcLI3brzmtIBxtPqd4hQWJfD1PRnjoc1WipLw2eBGg==",
+ "dependencies": {
+ "@ctrl/tinycolor": "^4.2.0",
+ "@element-plus/icons-vue": "^2.3.2",
+ "@floating-ui/dom": "^1.7.6",
+ "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.8",
+ "@types/lodash": "^4.17.24",
+ "@types/lodash-es": "^4.17.12",
+ "@vueuse/core": "14.3.0",
+ "async-validator": "^4.2.5",
+ "dayjs": "^1.11.20",
+ "lodash": "^4.18.1",
+ "lodash-es": "^4.18.1",
+ "lodash-unified": "^1.0.3",
+ "memoize-one": "^6.0.0",
+ "normalize-wheel-es": "^1.2.0",
+ "vue-component-type-helpers": "^3.3.5"
+ },
+ "peerDependencies": {
+ "vue": "^3.3.7"
+ }
+ },
+ "node_modules/entities": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
+ "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
+ "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.12",
+ "@esbuild/android-arm": "0.25.12",
+ "@esbuild/android-arm64": "0.25.12",
+ "@esbuild/android-x64": "0.25.12",
+ "@esbuild/darwin-arm64": "0.25.12",
+ "@esbuild/darwin-x64": "0.25.12",
+ "@esbuild/freebsd-arm64": "0.25.12",
+ "@esbuild/freebsd-x64": "0.25.12",
+ "@esbuild/linux-arm": "0.25.12",
+ "@esbuild/linux-arm64": "0.25.12",
+ "@esbuild/linux-ia32": "0.25.12",
+ "@esbuild/linux-loong64": "0.25.12",
+ "@esbuild/linux-mips64el": "0.25.12",
+ "@esbuild/linux-ppc64": "0.25.12",
+ "@esbuild/linux-riscv64": "0.25.12",
+ "@esbuild/linux-s390x": "0.25.12",
+ "@esbuild/linux-x64": "0.25.12",
+ "@esbuild/netbsd-arm64": "0.25.12",
+ "@esbuild/netbsd-x64": "0.25.12",
+ "@esbuild/openbsd-arm64": "0.25.12",
+ "@esbuild/openbsd-x64": "0.25.12",
+ "@esbuild/openharmony-arm64": "0.25.12",
+ "@esbuild/sunos-x64": "0.25.12",
+ "@esbuild/win32-arm64": "0.25.12",
+ "@esbuild/win32-ia32": "0.25.12",
+ "@esbuild/win32-x64": "0.25.12"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/feather-icons": {
+ "version": "4.29.2",
+ "resolved": "https://registry.npmjs.org/feather-icons/-/feather-icons-4.29.2.tgz",
+ "integrity": "sha512-0TaCFTnBTVCz6U+baY2UJNKne5ifGh7sMG4ZC2LoBWCZdIyPa+y6UiR4lEYGws1JOFWdee8KAsAIvu0VcXqiqA==",
+ "dependencies": {
+ "classnames": "^2.2.5",
+ "core-js": "^3.1.3"
+ }
+ },
+ "node_modules/filesize": {
+ "version": "10.1.6",
+ "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz",
+ "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==",
+ "engines": {
+ "node": ">= 10.4.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
+ "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/immutable": {
+ "version": "5.1.9",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz",
+ "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==",
+ "dev": true
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.2",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
+ "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.21.7",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
+ "dev": true,
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
+ "node_modules/lodash": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="
+ },
+ "node_modules/lodash-es": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
+ "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A=="
+ },
+ "node_modules/lodash-unified": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz",
+ "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
+ "peerDependencies": {
+ "@types/lodash-es": "*",
+ "lodash": "*",
+ "lodash-es": "*"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/memoize-one": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
+ "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/micromatch/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/mini-svg-data-uri": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz",
+ "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==",
+ "dev": true,
+ "bin": {
+ "mini-svg-data-uri": "cli.js"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
+ "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/muggle-string": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz",
+ "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==",
+ "dev": true
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/n-link": {
+ "resolved": "desktop",
+ "link": true
+ },
+ "node_modules/n-link-core": {
+ "resolved": "n-link-core",
+ "link": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.16",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz",
+ "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.51",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz",
+ "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-wheel-es": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
+ "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/path-browserify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+ "dev": true
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.22",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.22.tgz",
+ "integrity": "sha512-KBDEIpLrvpv16pp3K0Fw+UCoZfopFjjgeB+0tA/aaThfEE74kKDLrgg603YvOWJyg3+WYtyq3xYsQWsIyZlPqQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.16",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz",
+ "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
+ "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "lilconfig": "^3.1.1"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "jiti": ">=1.21.0",
+ "postcss": ">=8.0.9",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "postcss-selector-parser": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz",
+ "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz",
+ "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.12",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
+ "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "is-core-module": "^2.16.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz",
+ "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "1.0.9"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.62.2",
+ "@rollup/rollup-android-arm64": "4.62.2",
+ "@rollup/rollup-darwin-arm64": "4.62.2",
+ "@rollup/rollup-darwin-x64": "4.62.2",
+ "@rollup/rollup-freebsd-arm64": "4.62.2",
+ "@rollup/rollup-freebsd-x64": "4.62.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.62.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.62.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.62.2",
+ "@rollup/rollup-linux-arm64-musl": "4.62.2",
+ "@rollup/rollup-linux-loong64-gnu": "4.62.2",
+ "@rollup/rollup-linux-loong64-musl": "4.62.2",
+ "@rollup/rollup-linux-ppc64-gnu": "4.62.2",
+ "@rollup/rollup-linux-ppc64-musl": "4.62.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.62.2",
+ "@rollup/rollup-linux-riscv64-musl": "4.62.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.62.2",
+ "@rollup/rollup-linux-x64-gnu": "4.62.2",
+ "@rollup/rollup-linux-x64-musl": "4.62.2",
+ "@rollup/rollup-openbsd-x64": "4.62.2",
+ "@rollup/rollup-openharmony-arm64": "4.62.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.62.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.62.2",
+ "@rollup/rollup-win32-x64-gnu": "4.62.2",
+ "@rollup/rollup-win32-x64-msvc": "4.62.2",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/sass": {
+ "version": "1.101.3",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.101.3.tgz",
+ "integrity": "sha512-Z1lLHhtAII+dyLNIQB6JQTZMy7sDxk3f5NzbINRc9ks1P0HCGvSuKev0wUhULFpLSaHBIMZrcTs9WDQUZerrgA==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": "^5.0.0",
+ "immutable": "^5.1.5",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher": "^2.4.1"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sucrase": {
+ "version": "3.35.1",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
+ "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "tinyglobby": "^0.2.11",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.4.19",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz",
+ "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==",
+ "dev": true,
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.6.0",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.3.2",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.21.7",
+ "lilconfig": "^3.1.3",
+ "micromatch": "^4.0.8",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.1.1",
+ "postcss": "^8.4.47",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0",
+ "postcss-nested": "^6.2.0",
+ "postcss-selector-parser": "^6.1.2",
+ "resolve": "^1.22.8",
+ "sucrase": "^3.35.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
+ "dev": true,
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "dev": true
+ },
+ "node_modules/typescript": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
+ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
+ "devOptional": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/vite": {
+ "version": "6.4.3",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz",
+ "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "fdir": "^6.4.4",
+ "picomatch": "^4.0.2",
+ "postcss": "^8.5.3",
+ "rollup": "^4.34.9",
+ "tinyglobby": "^0.2.13"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "jiti": ">=1.21.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vscode-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz",
+ "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==",
+ "dev": true
+ },
+ "node_modules/vue": {
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.40.tgz",
+ "integrity": "sha512-+8PJ4SJXdn/cHGImF4CKdxlWHIN5Dkt7DoufRREM6h6uVCx2m7QxgcEQmmzyOK8A9mcafg7sFbJFYsdFVubTig==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.40",
+ "@vue/compiler-sfc": "3.5.40",
+ "@vue/runtime-dom": "3.5.40",
+ "@vue/server-renderer": "3.5.40",
+ "@vue/shared": "3.5.40"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-component-type-helpers": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.3.7.tgz",
+ "integrity": "sha512-Skkhw9agYSgsWqv7bxSOGJZa9SaiJbZVGdXuFWnrzKaQYHnw9qbjD630rw6RyMqDbp54nfLCLw5SZA55if7JLg=="
+ },
+ "node_modules/vue-router": {
+ "version": "4.6.4",
+ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz",
+ "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==",
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "vue": "^3.5.0"
+ }
+ },
+ "node_modules/vue-tsc": {
+ "version": "2.2.12",
+ "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz",
+ "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==",
+ "dev": true,
+ "dependencies": {
+ "@volar/typescript": "2.4.15",
+ "@vue/language-core": "2.2.12"
+ },
+ "bin": {
+ "vue-tsc": "bin/vue-tsc.js"
+ },
+ "peerDependencies": {
+ "typescript": ">=5.0.0"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
index db4b633..b9e7ab2 100644
--- a/package.json
+++ b/package.json
@@ -1,14 +1,7 @@
{
"private": true,
- "workspaces": {
- "packages": [
- "desktop",
- "n-link-core",
- "web"
- ]
- },
- "dependencies": {
- "@vue/cli-plugin-eslint": "~4.5.0",
- "fork-ts-checker-webpack-plugin": "^5.2.0"
- }
+ "workspaces": [
+ "desktop",
+ "n-link-core"
+ ]
}
diff --git a/vendor/libnspire-sys/.cargo-ok b/vendor/libnspire-sys/.cargo-ok
new file mode 100644
index 0000000..5f8b795
--- /dev/null
+++ b/vendor/libnspire-sys/.cargo-ok
@@ -0,0 +1 @@
+{"v":1}
\ No newline at end of file
diff --git a/vendor/libnspire-sys/.cargo_vcs_info.json b/vendor/libnspire-sys/.cargo_vcs_info.json
new file mode 100644
index 0000000..0ca879d
--- /dev/null
+++ b/vendor/libnspire-sys/.cargo_vcs_info.json
@@ -0,0 +1,5 @@
+{
+ "git": {
+ "sha1": "efc388fc49ba82c1fac6b381ef1f55d42eba93dc"
+ }
+}
diff --git a/vendor/libnspire-sys/Cargo.toml b/vendor/libnspire-sys/Cargo.toml
new file mode 100644
index 0000000..29e3226
--- /dev/null
+++ b/vendor/libnspire-sys/Cargo.toml
@@ -0,0 +1,31 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g., crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+edition = "2018"
+name = "libnspire-sys"
+version = "0.3.4"
+authors = ["lights0123 "]
+build = "build.rs"
+links = "nspire"
+description = "low-level FFI bindings to libnspire for USB interaction with TI Nspire calculators"
+readme = "README.md"
+license = "GPL-3.0"
+repository = "https://github.com/lights0123/libnspire-rs"
+[dependencies.libusb1-sys]
+version = "0.4.1"
+[build-dependencies.cc]
+version = "1.0"
+features = ["parallel"]
+
+[build-dependencies.globwalk]
+version = "0.7"
diff --git a/vendor/libnspire-sys/Cargo.toml.orig b/vendor/libnspire-sys/Cargo.toml.orig
new file mode 100644
index 0000000..586625e
--- /dev/null
+++ b/vendor/libnspire-sys/Cargo.toml.orig
@@ -0,0 +1,21 @@
+[package]
+name = "libnspire-sys"
+description = "low-level FFI bindings to libnspire for USB interaction with TI Nspire calculators"
+version = "0.3.4"
+authors = ["lights0123 "]
+edition = "2018"
+build = "build.rs"
+links = "nspire"
+license = "GPL-3.0"
+readme = "README.md"
+repository = "https://github.com/lights0123/libnspire-rs"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+libusb1-sys = "0.4.1"
+
+[build-dependencies]
+cc = { version = "1.0", features = ["parallel"] }
+globwalk = "0.7"
+# bindgen = "0.55.1"
diff --git a/vendor/libnspire-sys/README.md b/vendor/libnspire-sys/README.md
new file mode 100644
index 0000000..89bbaf2
--- /dev/null
+++ b/vendor/libnspire-sys/README.md
@@ -0,0 +1,11 @@
+# libnspire-sys
+[](https://crates.io/crates/libnspire-sys)
+[](https://docs.rs/libnspire-sys)
+
+Low-level bindings to [libnspire] for USB interaction with TI Nspire calculators.
+
+## License
+
+WARNING: this crate is under the GPL-3.0, as that is what [libnspire] is under.
+
+[libnspire]: https://github.com/Vogtinator/libnspire
diff --git a/vendor/libnspire-sys/build.rs b/vendor/libnspire-sys/build.rs
new file mode 100644
index 0000000..002bd51
--- /dev/null
+++ b/vendor/libnspire-sys/build.rs
@@ -0,0 +1,46 @@
+use globwalk::DirEntry;
+
+fn main() {
+ let files = globwalk::GlobWalkerBuilder::from_patterns("libnspire/src", &["*.{c,cpp}"])
+ .build()
+ .unwrap()
+ .into_iter()
+ .filter_map(Result::ok)
+ .map(DirEntry::into_path)
+ .inspect(|path| println!("cargo:rerun-if-changed={}", path.display()));
+ let mut cfg = cc::Build::new();
+ if let Some(include) = std::env::var_os("DEP_USB_1.0_INCLUDE") {
+ cfg.include(include);
+ }
+ if std::env::var_os("NSPIRE_DEBUG").is_some() {
+ cfg.define("DEBUG", None);
+ }
+ cfg.files(files)
+ .include("libnspire/src")
+ .include("libnspire/src/services")
+ .include("libnspire/src/api")
+ .compile("nspire");
+
+ // let bindings = bindgen::Builder::default()
+ // // The input header we would like to generate
+ // // bindings for.
+ // .header("libnspire/src/api/nspire.h")
+ // // Tell cargo to invalidate the built crate whenever any of the
+ // // included header files changed.
+ // .parse_callbacks(Box::new(bindgen::CargoCallbacks))
+ // .whitelist_function("(nspire.*|free)")
+ // .whitelist_type("nspire.*")
+ // .whitelist_var("nspire.*")
+ // .whitelist_type("NSPIRE.*")
+ // .whitelist_var("NSPIRE.*")
+ // .size_t_is_usize(true)
+ // // Finish the builder and generate the bindings.
+ // .generate()
+ // // Unwrap the Result and panic on failure.
+ // .expect("Unable to generate bindings");
+ //
+ // // Write the bindings to the $OUT_DIR/bindings.rs file.
+ // bindings
+ // .write_to_file("src/bindings.rs")
+ // .expect("Couldn't write bindings!");
+}
diff --git a/vendor/libnspire-sys/libnspire/AUTHORS b/vendor/libnspire-sys/libnspire/AUTHORS
new file mode 100644
index 0000000..a94e063
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/AUTHORS
@@ -0,0 +1,6 @@
+Daniel Tang
+===========
+
+Main developer
+
+tangrs@tangrs.id.au
diff --git a/vendor/libnspire-sys/libnspire/COPYING b/vendor/libnspire-sys/libnspire/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+ .
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/vendor/libnspire-sys/libnspire/README b/vendor/libnspire-sys/libnspire/README
new file mode 100644
index 0000000..629ce10
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/README
@@ -0,0 +1,27 @@
+==============================
+ Libnspire
+==============================
+
+This is a library for communicating with TI-Nspire calculators. It was created as a lightweight alternative to the Nspire-specific functions in TiLP (http://lpg.ticalc.org/prj_tilp/index.html). The goal is to have a small library with a simple API and minimal dependancies.
+
+At the moment, it is still in need of polishing up and documentation needs writing.
+
+Dependancies
+==========
+
+You will need:
+
+ * libusb-1.0
+ * pkg-config
+
+to build this library.
+
+Installing
+==========
+
+To install:
+
+ ./configure
+ make
+ make install
+
diff --git a/vendor/libnspire-sys/libnspire/src/api/devinfo.h b/vendor/libnspire-sys/libnspire/src/api/devinfo.h
new file mode 100644
index 0000000..d140bdd
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/api/devinfo.h
@@ -0,0 +1,99 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef NSP_DEVINFO_H
+#define NSP_DEVINFO_H
+
+#include
+#include "handle.h"
+
+enum nspire_battery {
+ NSPIRE_BATT_POWERED = 0x00,
+ NSPIRE_BATT_LOW = 0xF1,
+ NSPIRE_BATT_OK = 0x7F,
+ NSPIRE_BATT_UNKNOWN = 0xFF
+};
+
+enum nspire_version_index {
+ NSPIRE_VER_OS,
+ NSPIRE_VER_BOOT1,
+ NSPIRE_VER_BOOT2,
+
+ /* Reserved */
+ NSPIRE_VER_MAXNUM
+};
+
+enum nspire_type {
+ NSPIRE_CAS = 0x0E,
+ NSPIRE_NONCAS = 0x1E,
+ NSPIRE_CASCX = 0x0F,
+ NSPIRE_NONCASCX = 0x1F
+};
+
+enum nspire_runlevel {
+ NSPIRE_RUNLEVEL_RECOVERY = 1,
+ NSPIRE_RUNLEVEL_OS = 2
+};
+
+struct nspire_devinfo {
+ /* Flash storage */
+ struct {
+ uint64_t free, total;
+ } storage;
+
+ /* Memory */
+ struct {
+ uint64_t free, total;
+ } ram;
+
+ /* Versions */
+ struct {
+ uint8_t major, minor;
+ uint16_t build;
+ } versions[NSPIRE_VER_MAXNUM];
+ enum nspire_type hw_type;
+
+ /* Power */
+ struct {
+ enum nspire_battery status;
+ uint8_t is_charging;
+ } batt;
+ uint8_t clock_speed;
+
+ /* LCD */
+ struct {
+ uint16_t width, height;
+ uint8_t bbp, sample_mode;
+ } lcd;
+
+ /* File extensions */
+ struct {
+ char file[8];
+ char os[8];
+ } extensions;
+
+ /* ID */
+ char device_name[20];
+ char electronic_id[28];
+
+ /* Misc */
+ enum nspire_runlevel runlevel;
+};
+
+int nspire_device_info(nspire_handle_t *handle, struct nspire_devinfo *i);
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/api/dir.h b/vendor/libnspire-sys/libnspire/src/api/dir.h
new file mode 100644
index 0000000..a6cde92
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/api/dir.h
@@ -0,0 +1,50 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef NSP_DIR_H
+#define NSP_DIR_H
+
+#include "file.h"
+#include "handle.h"
+
+enum nspire_dir_type {
+ NSPIRE_FILE = 0,
+ NSPIRE_DIR = 1
+};
+
+struct nspire_dir_item {
+ char name[240];
+ uint64_t size, date;
+ enum nspire_dir_type type;
+};
+
+struct nspire_dir_info {
+ uint64_t num;
+ struct nspire_dir_item items[];
+};
+
+int nspire_dirlist(nspire_handle_t *, const char *, struct nspire_dir_info **);
+void nspire_dirlist_free(struct nspire_dir_info *d);
+int nspire_dir_create(nspire_handle_t *handle, const char *path);
+int nspire_dir_delete(nspire_handle_t *handle, const char *path);
+
+int nspire_attr(nspire_handle_t *, const char *, struct nspire_dir_item *);
+
+#define nspire_dir_move nspire_file_move
+#define nspire_dir_rename nspire_file_move
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/api/error.h b/vendor/libnspire-sys/libnspire/src/api/error.h
new file mode 100644
index 0000000..807a365
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/api/error.h
@@ -0,0 +1,53 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef NSP_ERROR_H
+#define NSP_ERROR_H
+
+enum {
+ NSPIRE_ERR_SUCCESS,
+
+ /* Generic */
+ NSPIRE_ERR_TIMEOUT,
+ NSPIRE_ERR_NOMEM,
+ NSPIRE_ERR_INVALID,
+
+ /* USB */
+ NSPIRE_ERR_LIBUSB,
+ NSPIRE_ERR_NODEVICE,
+
+ /* Packet */
+ NSPIRE_ERR_INVALPKT,
+ NSPIRE_ERR_NACK,
+
+ /* Service */
+ NSPIRE_ERR_BUSY,
+
+ /* File/Dir services */
+ NSPIRE_ERR_EXISTS,
+ NSPIRE_ERR_NONEXIST,
+
+ /* OS install */
+ NSPIRE_ERR_OSFAILED,
+
+ /* Number of errors */
+ NSPIRE_ERR_MAX
+};
+
+const char *nspire_strerror(int error);
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/api/file.h b/vendor/libnspire-sys/libnspire/src/api/file.h
new file mode 100644
index 0000000..c1cdf72
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/api/file.h
@@ -0,0 +1,35 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef NSP_FILE_H
+#define NSP_FILE_H
+
+#include
+#include "handle.h"
+
+typedef void (*nspire_callback)(size_t, void*);
+int nspire_file_write(nspire_handle_t *, const char *, void*, size_t, nspire_callback cb, void *cb_data);
+int nspire_file_read(nspire_handle_t *handle, const char *path,
+ void* data, size_t size, size_t *read_bytes, nspire_callback cb, void *cb_data);
+int nspire_file_move(nspire_handle_t *handle, const char *src, const char *dst);
+int nspire_file_copy(nspire_handle_t *handle, const char *src, const char *dst);
+int nspire_file_delete(nspire_handle_t *handle, const char *path);
+
+#define nspire_file_touch(h,p) nspire_file_write((h), (p), NULL, 0);
+#define nspire_file_rename nspire_file_move
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/api/handle.h b/vendor/libnspire-sys/libnspire/src/api/handle.h
new file mode 100644
index 0000000..566649d
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/api/handle.h
@@ -0,0 +1,29 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef NSP_HANDLE_H
+#define NSP_HANDLE_H
+
+#include
+
+typedef struct nspire_handle nspire_handle_t;
+typedef struct libusb_device_handle libusb_device_handle;
+
+int nspire_init(nspire_handle_t **ptr, libusb_device_handle *dev, bool is_cx2);
+void nspire_free(nspire_handle_t *ptr);
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/api/nspire.h b/vendor/libnspire-sys/libnspire/src/api/nspire.h
new file mode 100644
index 0000000..08d130a
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/api/nspire.h
@@ -0,0 +1,30 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef NSP_NSPIRE_H
+#define NSP_NSPIRE_H
+
+#include "usb.h"
+#include "devinfo.h"
+#include "dir.h"
+#include "error.h"
+#include "file.h"
+#include "handle.h"
+#include "os.h"
+#include "screenshot.h"
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/api/os.h b/vendor/libnspire-sys/libnspire/src/api/os.h
new file mode 100644
index 0000000..f621225
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/api/os.h
@@ -0,0 +1,27 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef NSP_OS_H
+#define NSP_OS_H
+
+#include
+#include "handle.h"
+
+typedef void (*nspire_callback)(size_t, void*);
+int nspire_os_send(nspire_handle_t *handle, void* data, size_t size, nspire_callback cb, void *cb_data);
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/api/screenshot.h b/vendor/libnspire-sys/libnspire/src/api/screenshot.h
new file mode 100644
index 0000000..44ac2f4
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/api/screenshot.h
@@ -0,0 +1,33 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef NSP_SCREENSHOT_H
+#define NSP_SCREENSHOT_H
+
+#include
+#include "handle.h"
+
+struct nspire_image {
+ uint16_t width, height;
+ uint8_t bbp;
+
+ unsigned char data[];
+};
+
+int nspire_screenshot(nspire_handle_t *handle, struct nspire_image **ptr);
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/cx2.cpp b/vendor/libnspire-sys/libnspire/src/cx2.cpp
new file mode 100644
index 0000000..a0e14da
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/cx2.cpp
@@ -0,0 +1,481 @@
+/*
+ * This file is part of libnspire.
+ *
+ * libnspire is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * libnspire is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with libnspire. If not, see .
+ */
+
+#include
+#include
+#include
+#include
+#include
+
+#include "endianconv.h"
+#ifdef _WIN32
+#include
+#include
+#include
+
+int gettimeofday(struct timeval *t, void *timezone) {
+ struct _timeb timebuffer;
+ _ftime( &timebuffer );
+ t->tv_sec=timebuffer.time;
+ t->tv_usec=1000*timebuffer.millitm;
+ return 0;
+}
+#define PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop))
+#else
+#include
+#define PACK( __Declaration__ ) __Declaration__ __attribute__((__packed__))
+#endif
+
+#include
+
+#include "cx2.h"
+#include "error.h"
+#include "packet.h"
+// Windows...
+#undef min
+
+enum Address {
+ AddrAll = 0xFF,
+ AddrMe = 0xFE,
+ AddrCalc = 0x01
+};
+
+enum Service {
+ AddrReqService = 0x01,
+ TimeService = 0x02,
+ EchoService = 0x03,
+ StreamService = 0x04,
+ TransmitService = 0x05,
+ LoopbackService = 0x06,
+ StatsService = 0x07,
+ UnknownService = 0x08,
+ AckFlag = 0x80
+};
+
+// Big endian!
+PACK(struct NNSEMessage {
+ uint8_t misc; // Unused?
+ uint8_t service; // Service number. If bit 7 set, an ACK
+ uint8_t src; // Address of the source
+ uint8_t dest; // Address of the destination
+ uint8_t unknown; // No idea
+ uint8_t reqAck; // 0x1: Whether an ack is expected, 0x9: Not the first try
+ uint16_t length; // Length of the packet, including this header
+ uint16_t seqno; // Sequence number. Increases by one for every non-ACK packet.
+ uint16_t csum; // Checksum. Inverse of the 16bit modular sum with carry added.
+});
+
+PACK(struct NNSEMessage_AddrReq {
+ NNSEMessage hdr;
+ uint8_t code; // 00
+ uint8_t clientID[64];
+});
+
+PACK(struct NNSEMessage_AddrResp {
+ NNSEMessage hdr;
+ uint8_t addr;
+});
+
+PACK(struct NNSEMessage_UnkResp {
+ NNSEMessage hdr;
+ uint8_t noidea[2]; // 80 03
+});
+
+PACK(struct NNSEMessage_TimeReq {
+ NNSEMessage hdr;
+ uint8_t code;
+});
+
+PACK(struct NNSEMessage_TimeResp {
+ NNSEMessage hdr;
+ uint8_t noidea; // 80
+ uint32_t sec;
+ uint64_t frac;
+ uint32_t frac2;
+});
+
+static uint8_t *getPacketData(const NNSEMessage *c) {
+ return ((uint8_t *)c) + sizeof(NNSEMessage);
+}
+
+#ifdef DEBUG
+static void dumpPacket(const NNSEMessage *message)
+{
+ printf("Misc: \t%02x\n", message->misc);
+ printf("Service:\t%02x\n", message->service);
+ printf("Dest: \t%02x\n", message->dest);
+ printf("Src: \t%02x\n", message->src);
+ printf("Unknown:\t%02x\n", message->unknown);
+ printf("ReqAck: \t%02x\n", message->reqAck);
+ printf("Length: \t%04x\n", ntohs(message->length));
+ printf("SeqNo: \t%04x\n", ntohs(message->seqno));
+ printf("Csum: \t%04x\n", ntohs(message->csum));
+
+ auto datalen = ntohs(message->length) - sizeof(NNSEMessage);
+ for(int i = 0; i < datalen; ++i)
+ printf("%02x ", getPacketData(message)[i]);
+
+ printf("\n");
+}
+#endif
+
+static uint16_t compute_checksum(const uint8_t *data, uint32_t size)
+{
+ uint32_t acc = 0;
+
+ if (size > 0)
+ {
+ for (uint32_t i = 0; i < size - 1; i += 2)
+ {
+ uint16_t cur = (((uint16_t)data[i]) << 8) | data[i + 1];
+ acc += cur;
+ }
+
+ if (size & 1)
+ acc += (((uint16_t)data[size - 1]) << 8);
+ }
+
+ while (acc >> 16)
+ acc = (acc >> 16) + uint16_t(acc);
+
+ return acc;
+}
+
+static bool readPacket(libusb_device_handle *handle, NNSEMessage *message, int maxlen)
+{
+ if(maxlen < sizeof(NNSEMessage))
+ return false;
+
+ int transferred = 0;
+ memset(message, 0, sizeof(NNSEMessage));
+ int r = libusb_bulk_transfer(handle, 0x81, reinterpret_cast(message), maxlen, &transferred, 60000);
+
+ if(r < 0
+ || transferred < sizeof(NNSEMessage))
+ return false;
+
+ const auto completeLength = ntohs(message->length);
+
+ if(completeLength < sizeof(NNSEMessage)
+ || completeLength > maxlen)
+ return false;
+
+ uint8_t *data = reinterpret_cast(message) + transferred;
+ auto remainingLength = completeLength - transferred;
+ while(remainingLength > 0)
+ {
+ r = libusb_bulk_transfer(handle, 0x81, data, remainingLength, &transferred, 1000);
+ if(r < 0)
+ return false;
+
+ data += transferred;
+ remainingLength -= transferred;
+ }
+
+#ifdef DEBUG
+ printf("Got packet:\n");
+ dumpPacket(message);
+#endif
+
+ if(compute_checksum(reinterpret_cast(message), transferred) != 0xFFFF)
+ return false;
+
+ return true;
+}
+
+static bool writePacket(libusb_device_handle *handle, NNSEMessage *message)
+{
+ auto length = ntohs(message->length);
+
+ message->csum = 0;
+ message->csum = htons(compute_checksum(reinterpret_cast(message), length) ^ 0xFFFF);
+
+ if(compute_checksum(reinterpret_cast(message), length) != 0xFFFF)
+ return false;
+
+#ifdef DEBUG
+ printf("Sending packet:\n");
+ dumpPacket(message);
+#endif
+
+ int transferred = 0;
+ int r = libusb_bulk_transfer(handle, 0x01, reinterpret_cast(message), length, &transferred, 1000);
+ if(r < 0
+ || length != transferred)
+ return false;
+
+ return true;
+}
+
+static uint16_t nextSeqno()
+{
+ static uint16_t seqno = 0;
+ return seqno++;
+}
+
+template bool sendMessage(libusb_device_handle *handle, T &message)
+{
+ message.hdr.src = AddrMe;
+ message.hdr.dest = AddrCalc;
+ message.hdr.length = htons(sizeof(T));
+ message.hdr.seqno = htons(nextSeqno());
+
+ return writePacket(handle, &message.hdr);
+}
+
+template T* messageCast(NNSEMessage *message)
+{
+ if(ntohs(message->length) < sizeof(T))
+ return nullptr;
+
+ return reinterpret_cast(message);
+}
+
+static void handlePacket(struct nspire_handle *nsp_handle, NNSEMessage *message, uint8_t **streamdata = nullptr, int *streamsize = nullptr)
+{
+ auto *handle = nsp_handle->device.dev;
+
+ if(message->dest != AddrMe && message->dest != AddrAll)
+ {
+#ifdef DEBUG
+ printf("Not for me?\n");
+#endif
+ return;
+ }
+
+ if(message->service & AckFlag)
+ {
+#ifdef DEBUG
+ printf("Got ack for %02x\n", ntohs(message->seqno));
+#endif
+ return;
+ }
+
+ if(message->reqAck & 1)
+ {
+ NNSEMessage ack = {};
+ ack.misc = message->misc;
+ ack.service = uint8_t(message->service | AckFlag);
+ ack.src = message->dest;
+ ack.dest = message->src;
+ ack.unknown = message->unknown;
+ ack.reqAck = uint8_t(message->reqAck & ~1);
+ ack.length = htons(sizeof(NNSEMessage));
+ ack.seqno = message->seqno;
+
+ if(!writePacket(handle, &ack))
+ printf("Failed to ack\n");
+ }
+
+ switch(message->service & ~AckFlag)
+ {
+ case AddrReqService:
+ {
+ const NNSEMessage_AddrReq *req = messageCast(message);
+ if(!req || req->code != 0)
+ goto drop;
+
+#ifdef DEBUG
+ printf("Got request from client %s (product id %c%c)\n", &req->clientID[12], req->clientID[10], req->clientID[11]);
+#endif
+/* Sending this somehow introduces issues like the time request not
+ arriving or the calc responding with yet another address request.
+ // Address release request. Not sure how that works.
+ NNSEMessage_AddrResp resp{};
+ resp.hdr.service = message->service;
+ resp.addr = AddrCalc;
+
+ if(!sendMessage(resp))
+ printf("Failed to send message\n");
+*/
+
+ NNSEMessage_AddrResp resp2 = {};
+ resp2.hdr.service = message->service;
+ resp2.addr = 0x80; // No idea
+
+ // In some cases on HW and in Firebird always after reconnecting
+ // it ignores the first packet for some reason. So just send it
+ // twice (the seqno doesn't really matter at this point), if it
+ // receives both it'll ignore the second one.
+ if(!sendMessage(handle, resp2) || !sendMessage(handle, resp2))
+ printf("Failed to send message\n");
+
+ break;
+ }
+ case TimeService:
+ {
+ const NNSEMessage_TimeReq *req = messageCast(message);
+ if(!req || req->code != 0)
+ goto drop;
+
+#ifdef DEBUG
+ printf("Got time request\n");
+#endif
+
+ struct timeval val;
+ gettimeofday(&val, nullptr);
+
+ NNSEMessage_TimeResp resp = {};
+ resp.hdr.service = message->service;
+ resp.noidea = 0x80;
+ resp.sec = htonl(uint32_t(val.tv_sec));
+ resp.frac = 0;
+
+ if(!sendMessage(handle, resp))
+ printf("Failed to send message\n");
+
+ nsp_handle->cx2_handshake_complete = true;
+ break;
+ }
+ case UnknownService:
+ {
+ if(ntohs(message->length) != sizeof(NNSEMessage) + 1 || getPacketData(message)[0] != 0x01)
+ goto drop;
+
+#ifdef DEBUG
+ printf("Got packet for unknown service\n");
+#endif
+
+ NNSEMessage_UnkResp resp = {};
+ resp.hdr.service = message->service;
+ resp.noidea[0] = 0x81;
+ resp.noidea[1] = 0x03;
+
+ if(!sendMessage(handle, resp))
+ printf("Failed to send message\n");
+
+ break;
+ }
+ case StreamService:
+ {
+ if(streamdata)
+ *streamdata = getPacketData(message);
+ if(streamsize)
+ *streamsize = ntohs(message->length) - sizeof(NNSEMessage);
+
+ break;
+ }
+ default:
+ printf("Unhandled service %02x\n", message->service & ~AckFlag);
+ }
+
+ return;
+
+ drop:
+ printf("Ignoring packet.\n");
+}
+
+static bool assureReady(struct nspire_handle *nsp_handle)
+{
+ if(nsp_handle->cx2_handshake_complete)
+ return true;
+
+ auto *handle = nsp_handle->device.dev;
+
+ const int maxlen = sizeof(NNSEMessage) + 1472;
+ NNSEMessage * const message = reinterpret_cast(malloc(maxlen));
+ for(int i = 30; i-- && !nsp_handle->cx2_handshake_complete;)
+ {
+ if(!readPacket(handle, message, maxlen))
+ continue;
+
+ handlePacket(nsp_handle, message);
+ }
+ free(message);
+
+ return nsp_handle->cx2_handshake_complete;
+}
+
+int packet_send_cx2(struct nspire_handle *nsp_handle, char *data, int size)
+{
+ if(!assureReady(nsp_handle))
+ return -NSPIRE_ERR_BUSY;
+
+ auto *handle = nsp_handle->device.dev;
+
+ int len = sizeof(NNSEMessage) + size;
+ NNSEMessage *msg = reinterpret_cast(malloc(len));
+
+ msg->service = StreamService;
+ msg->src = AddrMe;
+ msg->dest = AddrCalc;
+ msg->reqAck = 1;
+ msg->length = htons(len);
+ msg->seqno = htons(nextSeqno());
+
+ memcpy(getPacketData(msg), data, size);
+
+ int ret = -NSPIRE_ERR_SUCCESS;
+ if(!writePacket(handle, msg))
+ ret = -NSPIRE_ERR_BUSY;
+ else
+ {
+ const int maxlen = sizeof(NNSEMessage) + 1472;
+ NNSEMessage * const message = reinterpret_cast(malloc(maxlen));
+
+ bool acked = false;
+ for(int i = 40; i-- && !ret && !acked;)
+ {
+ if(!readPacket(handle, message, maxlen))
+ continue;
+
+ handlePacket(nsp_handle, message);
+
+ if(message->dest == AddrMe
+ && message->service == (StreamService | AckFlag)
+ && message->seqno == msg->seqno)
+ acked = true;
+ }
+
+ if(!acked)
+ ret = -NSPIRE_ERR_BUSY;
+
+ free(message);
+ }
+
+ free(msg);
+
+ return ret;
+}
+
+int packet_recv_cx2(struct nspire_handle *nsp_handle, char *data, int size)
+{
+ if(!assureReady(nsp_handle))
+ return -NSPIRE_ERR_BUSY;
+
+ auto *handle = nsp_handle->device.dev;
+
+ const int maxlen = sizeof(NNSEMessage) + 1472;
+ NNSEMessage * const message = reinterpret_cast(malloc(maxlen));
+
+ uint8_t *streamdata = nullptr;
+ int streamsize = 0;
+ for(int i = 40; i-- && !streamdata;)
+ {
+ if(!readPacket(handle, message, maxlen))
+ continue;
+
+ handlePacket(nsp_handle, message, &streamdata, &streamsize);
+ }
+
+ if(streamdata)
+ memcpy(data, streamdata, std::min(size, streamsize));
+
+ free(message);
+
+ return streamdata ? -NSPIRE_ERR_SUCCESS : -NSPIRE_ERR_INVALPKT;
+}
diff --git a/vendor/libnspire-sys/libnspire/src/cx2.h b/vendor/libnspire-sys/libnspire/src/cx2.h
new file mode 100644
index 0000000..a64e51f
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/cx2.h
@@ -0,0 +1,43 @@
+/*
+ * This file is part of libnspire.
+ *
+ * libnspire is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * libnspire is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with libnspire. If not, see .
+ */
+
+#ifndef CX2_H
+#define CX2_H
+
+#ifdef _WIN32
+#include
+#endif
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct nspire_handle;
+
+// Receive a NavNet packet wrapped in the NavNet SE protocol.
+// Takes care of the handshake and other NNSE stuff like acking.
+int packet_recv_cx2(struct nspire_handle *handle, char *data, int size);
+// Send a NavNet packet wrapped in the NavNet SE protocol and wait for an ack.
+// Takes care of the handshake and other NNSE stuff like acking.
+int packet_send_cx2(struct nspire_handle *handle, char *data, int size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // CX2_H
diff --git a/vendor/libnspire-sys/libnspire/src/data.c b/vendor/libnspire-sys/libnspire/src/data.c
new file mode 100644
index 0000000..5243aa0
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/data.c
@@ -0,0 +1,383 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#include
+#include
+
+#include "endianconv.h"
+#include "error.h"
+#include "packet.h"
+#include "handle.h"
+
+static int handle_unknown(nspire_handle_t *handle, struct packet p) {
+ int ret;
+
+ switch (p.dst_sid) {
+ case 0x40de: /* Disconnection */
+ ret = packet_ack(handle, p);
+ break;
+ default:
+ ret = packet_nack(handle, p);
+ break;
+ }
+ return ret;
+}
+
+int data_write_special(nspire_handle_t *handle, void *ptr, size_t len,
+ void (*packet_callback)(struct packet *p)) {
+ int ret;
+ struct packet p = packet_new(handle);
+
+ if(len < 0xFF) {
+ memcpy(p.data, ptr, len);
+ p.data_size = len;
+ } else if(len <= packet_max_datasize(handle)) {
+ memcpy(p.bigdata, ptr, len);
+ p.bigdatasize = dcpu32(len);
+ p.data_size = 0xFF;
+ } else
+ return NSPIRE_ERR_NOMEM;
+
+ if (packet_callback)
+ packet_callback(&p);
+
+ if ((ret = packet_send(handle, p)))
+ return ret;
+
+ // Acks are handled a level lower only, in packet_send
+ if (handle->is_cx2)
+ return NSPIRE_ERR_SUCCESS;
+
+ /*
+ * Wait for an ACK packet while also NACKing spurious packets (like
+ * the LOGIN request).
+ *
+ * Legitimate packets that need ACKing will be resent by the device
+ * ready for reading in the next data_read call
+ */
+ while (1) {
+ if ( (ret = packet_recv(handle, &p)) )
+ return ret;
+
+ if (p.dst_sid == handle->host_sid) {
+ if ((p.src_sid == 0xFF || p.src_sid == 0xFE)) {
+ handle->seq++;
+ if (!handle->seq) handle->seq++;
+ return NSPIRE_ERR_SUCCESS;
+ } else
+ if (p.src_sid == 0xD3) {
+ return -NSPIRE_ERR_INVALPKT;
+ }
+ } else {
+ handle_unknown(handle, p);
+ }
+ }
+}
+
+int data_write(nspire_handle_t *handle, void *ptr, size_t len) {
+ return data_write_special(handle, ptr, len, NULL);
+}
+
+int data_read(nspire_handle_t *handle, void *ptr, size_t maxlen, size_t *actual) {
+ int ret;
+ size_t len;
+ struct packet p;
+
+ while (1) {
+ if ( (ret = packet_recv(handle, &p)) )
+ return ret;
+
+ if (p.dst_sid == handle->host_sid) {
+ // Acks are handled a level lower only, in packet_recv
+ if(handle->is_cx2)
+ break;
+
+ if ( (ret = packet_ack(handle, p)) )
+ return ret;
+ break;
+ } else {
+ handle_unknown(handle, p);
+ }
+
+ if (ret)
+ return ret;
+ }
+
+ len = (maxlen < packet_datasize(&p)) ? maxlen : packet_datasize(&p);
+ memcpy(ptr, packet_dataptr(&p), len);
+
+ if(actual)
+ *actual = len;
+
+ return NSPIRE_ERR_SUCCESS;
+}
+
+/*
+ Format string:
+ b 8 bit integer
+ h 16 bit integer
+ w 32 bit integer
+ l 64 bit integer
+ 0 expect zero
+ s null terminated string len >= 8
+ S null terminated string
+*/
+
+int data_scan(const char *format, const void *buffer, size_t len, ...) {
+ int ret;
+ const uint8_t *ptr = buffer, *end = ptr + len;
+ va_list ap;
+
+ va_start(ap, len);
+ while (ptr < end && *format) {
+ len = end - ptr;
+ switch (*format) {
+ case 'b':
+ {
+ uint8_t *in = va_arg(ap, uint8_t*);
+ if (in) *in = *ptr;
+ ptr++;
+ break;
+ }
+ case 'h':
+ {
+ uint16_t *in = va_arg(ap, uint16_t*);
+ if (len < 2) {
+ ret = -NSPIRE_ERR_INVALID;
+ goto end;
+ }
+ if (in) {
+ *in = ptr[0]<<8 | ptr[1];
+ }
+ ptr+=2;
+ break;
+
+ }
+ case 'w':
+ {
+ uint32_t *in = va_arg(ap, uint32_t*);
+ if (len < 4) {
+ ret = -NSPIRE_ERR_INVALID;
+ goto end;
+ }
+ if (in) {
+ *in = ptr[0]<<24 |
+ ptr[1]<<16 |
+ ptr[2]<<8 |
+ ptr[3];
+ }
+ ptr+=4;
+ break;
+
+ }
+ case 'l':
+ {
+ uint64_t *in = va_arg(ap, uint64_t*);
+ if (len < 8) {
+ ret = -NSPIRE_ERR_INVALID;
+ goto end;
+ }
+ if (in) {
+ uint32_t low, high;
+ high = ptr[0]<<24 |
+ ptr[1]<<16 |
+ ptr[2]<<8 |
+ ptr[3];
+ low = ptr[4]<<24 |
+ ptr[5]<<16 |
+ ptr[6]<<8 |
+ ptr[7];
+ *in = ((uint64_t)high<<32) | low;
+
+ }
+ ptr+=8;
+ break;
+ }
+ case 's':
+ {
+ char **in = va_arg(ap, char **);
+ uint8_t *next = memchr(ptr, '\0', len);
+
+ if (!next) {
+ ret = -NSPIRE_ERR_INVALID;
+ goto end;
+ }
+ *in = (char*)ptr;
+
+ /* Strings are padded with zeros until len >= 8 */
+ /* Take this into account */
+ if (next - ptr < 8) {
+ ptr = next + (8 - (next - ptr));
+ } else {
+ ptr = next;
+ }
+ ptr++;
+ break;
+ }
+ case 'S':
+ {
+ char **in = va_arg(ap, char **);
+ uint8_t *next = memchr(ptr, '\0', len);
+
+ if (!next) {
+ ret = -NSPIRE_ERR_INVALID;
+ goto end;
+ }
+ *in = (char*)ptr;
+
+ ptr = next + 1;
+ break;
+ }
+ case '0':
+ if (*ptr != 0) {
+ ret = -NSPIRE_ERR_INVALID;
+ goto end;
+ }
+ ptr++;
+ break;
+ default:
+ ret = -NSPIRE_ERR_INVALID;
+ goto end;
+ }
+ format++;
+ }
+
+ ret = NSPIRE_ERR_SUCCESS;
+end:
+ va_end(ap);
+ return ret;
+}
+
+int data_build(const char *format, void *buffer,
+ size_t len, size_t *wrote_bytes, ...) {
+ int ret;
+ uint8_t *ptr = buffer, *end = ptr + len;
+ va_list ap;
+
+ va_start(ap, wrote_bytes);
+ while (ptr < end && *format) {
+ len = end - ptr;
+ switch (*format) {
+ case 'b':
+ {
+ uint8_t in = va_arg(ap, unsigned int);
+ *ptr = in;
+ ptr++;
+ break;
+ }
+ case 'h':
+ {
+ uint16_t in = va_arg(ap, unsigned int);
+ if (len < 2) {
+ ret = -NSPIRE_ERR_INVALID;
+ goto end;
+ }
+ ptr[0] = (in>>8) & 0xFF;
+ ptr[1] = (in) & 0xFF;
+ ptr+=2;
+ break;
+
+ }
+ case 'w':
+ {
+ uint32_t in = va_arg(ap, uint32_t);
+ if (len < 4) {
+ ret = -NSPIRE_ERR_INVALID;
+ goto end;
+ }
+ ptr[0] = (in>>24) & 0xFF;
+ ptr[1] = (in>>16) & 0xFF;
+ ptr[2] = (in>>8) & 0xFF;
+ ptr[3] = (in) & 0xFF;
+ ptr+=4;
+ break;
+
+ }
+ case 'l':
+ {
+ uint64_t in = va_arg(ap, uint64_t);
+ if (len < 8) {
+ ret = -NSPIRE_ERR_INVALID;
+ goto end;
+ }
+ ptr[0] = (in>>56) & 0xFF;
+ ptr[1] = (in>>48) & 0xFF;
+ ptr[2] = (in>>40) & 0xFF;
+ ptr[3] = (in>>32) & 0xFF;
+ ptr[4] = (in>>24) & 0xFF;
+ ptr[5] = (in>>16) & 0xFF;
+ ptr[6] = (in>>8) & 0xFF;
+ ptr[7] = (in) & 0xFF;
+ ptr+=8;
+ break;
+ }
+ case 's':
+ {
+ char *in = va_arg(ap, char *);
+ size_t strl = strlen(in);
+
+ if (len <= strl || len <= 9) {
+ ret = -NSPIRE_ERR_INVALID;
+ goto end;
+ }
+
+ /* Strings are padded with zeros until len (including the final 0) >= 9 */
+ /* Take this into account */
+ memset(ptr, 0, 9);
+ strncpy((char*)ptr, in, len);
+
+ if (strl < 8) {
+ ptr += 8;
+ } else {
+ ptr += strl;
+ }
+ *ptr++ = '\0';
+ break;
+ }
+ case 'S':
+ {
+ char *in = va_arg(ap, char *);
+ size_t strl = strlen(in);
+
+ if (len <= strl) {
+ ret = -NSPIRE_ERR_INVALID;
+ goto end;
+ }
+
+ strncpy((char*)ptr, in, len);
+ ptr += strl;
+ *ptr++ = '\0';
+ break;
+ }
+ case '0':
+ *ptr++ = '\0';
+ break;
+ default:
+ ret = -NSPIRE_ERR_INVALID;
+ goto end;
+ }
+ format++;
+ }
+
+ if (wrote_bytes)
+ *wrote_bytes = ptr - (uint8_t*)buffer;
+
+ ret = NSPIRE_ERR_SUCCESS;
+end:
+ va_end(ap);
+ return ret;
+}
diff --git a/vendor/libnspire-sys/libnspire/src/data.h b/vendor/libnspire-sys/libnspire/src/data.h
new file mode 100644
index 0000000..6dace8c
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/data.h
@@ -0,0 +1,43 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef _DATA_H
+#define _DATA_H
+
+#include
+#include "handle.h"
+#include "endianconv.h"
+#include "packet.h"
+
+int data_write_special(nspire_handle_t*, void*, size_t,
+ void (*)(struct packet *));
+
+int data_write(nspire_handle_t *handle, void *ptr, size_t maxlen);
+int data_read(nspire_handle_t *handle, void *ptr, size_t maxlen, size_t *actual);
+int data_build(const char *, void *, size_t, size_t *, ...);
+int data_scan(const char *, const void *, size_t, ...);
+
+static inline int data_write8(nspire_handle_t *handle, uint8_t x) {
+ return data_write(handle, &x, 1);
+}
+
+static inline int data_write16(nspire_handle_t *handle, uint16_t x) {
+ x = dcpu16(x);
+ return data_write(handle, &x, 2);
+}
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/endianconv.h b/vendor/libnspire-sys/libnspire/src/endianconv.h
new file mode 100644
index 0000000..e7b25dd
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/endianconv.h
@@ -0,0 +1,32 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef ENDIANCONV_H
+#define ENDIANCONV_H
+
+#ifdef _WIN32
+#include
+#else
+#include
+#endif
+#include
+
+#define dcpu16(x) htons(x)
+#define dcpu32(x) htonl(x)
+#define dcpu64(x) ((1==htonl(1)) ? (x) : ((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/error.c b/vendor/libnspire-sys/libnspire/src/error.c
new file mode 100644
index 0000000..b7fb79b
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/error.c
@@ -0,0 +1,47 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#include
+
+#include "error.h"
+
+static const char *error_msg[NSPIRE_ERR_MAX] = {
+ [NSPIRE_ERR_SUCCESS] = "No error",
+ [NSPIRE_ERR_TIMEOUT] = "Timeout",
+ [NSPIRE_ERR_NOMEM] = "Out of memory",
+ [NSPIRE_ERR_LIBUSB] = "Libusb error",
+ [NSPIRE_ERR_NODEVICE] = "No device found",
+ [NSPIRE_ERR_INVALPKT] = "Invalid packet received",
+ [NSPIRE_ERR_NACK] = "NACK received",
+ [NSPIRE_ERR_BUSY] = "Busy",
+ [NSPIRE_ERR_INVALID] = "Invalid input",
+ [NSPIRE_ERR_EXISTS] = "Already exists",
+ [NSPIRE_ERR_NONEXIST] = "Path does not exist",
+
+};
+
+static const char* unknown_err = "Unknown error";
+
+const char *nspire_strerror(int error) {
+ if (error > 0)
+ return unknown_err;
+
+ if (error < -(sizeof(error_msg) / sizeof(const char*)))
+ return unknown_err;
+
+ return error_msg[-error];
+}
diff --git a/vendor/libnspire-sys/libnspire/src/error.h b/vendor/libnspire-sys/libnspire/src/error.h
new file mode 100644
index 0000000..858f870
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/error.h
@@ -0,0 +1,23 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef _ERROR_H
+#define _ERROR_H
+
+#include "api/error.h"
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/handle.h b/vendor/libnspire-sys/libnspire/src/handle.h
new file mode 100644
index 0000000..f68ac80
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/handle.h
@@ -0,0 +1,38 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef _HANDLE_H
+#define _HANDLE_H
+
+#include
+#include
+
+#include "api/handle.h"
+#include "usb.h"
+
+struct nspire_handle {
+ usb_device_t device;
+
+ uint16_t host_addr, device_addr;
+ uint16_t host_sid, device_sid;
+ uint8_t seq, connected;
+
+ bool is_cx2;
+ bool cx2_handshake_complete;
+};
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/init.c b/vendor/libnspire-sys/libnspire/src/init.c
new file mode 100644
index 0000000..a3ff2f4
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/init.c
@@ -0,0 +1,76 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#include
+#include
+
+#include "packet.h"
+#include "error.h"
+#include "usb.h"
+
+int nspire_init(nspire_handle_t **ptr, libusb_device_handle *dev, bool is_cx2) {
+ int ret;
+ struct packet p;
+ nspire_handle_t *h = malloc(sizeof(*h));
+
+ if (!h)
+ return -NSPIRE_ERR_NOMEM;
+
+ if ( (ret = usb_init()) )
+ goto error;
+
+ h->is_cx2 = is_cx2;
+ if ( (ret = usb_get_device(&h->device, dev)) ) {
+ goto error;
+ }
+
+ h->host_addr = 0x6400;
+ h->device_addr = 0x6401;
+ h->host_sid = 0x4003;
+ h->device_sid = 0x4003;
+ h->connected = 0;
+ h->seq = 1;
+ h->cx2_handshake_complete = false;
+
+ if (!h->is_cx2) {
+ // Wait for an address request
+ if ( (ret = packet_recv(h, NULL)) )
+ goto error_free_usb;
+ }
+
+ p = packet_new(h);
+ packet_set_data(p, 0x64, 0x01, 0xFF, 0x00);
+ if ( (ret = packet_send(h, p)) )
+ goto error_free_usb;
+
+ h->host_sid = 0x8000;
+
+ *ptr = h;
+
+ return NSPIRE_ERR_SUCCESS;
+
+error_free_usb:
+ usb_free_device(&h->device);
+error:
+ free(h);
+ return ret;
+}
+
+void nspire_free(nspire_handle_t *ptr) {
+ usb_free_device(&ptr->device);
+ free(ptr);
+}
diff --git a/vendor/libnspire-sys/libnspire/src/init.h b/vendor/libnspire-sys/libnspire/src/init.h
new file mode 100644
index 0000000..02d67c2
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/init.h
@@ -0,0 +1,23 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef _INIT_H
+#define _INIT_H
+
+#include "handle.h"
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/packet.c b/vendor/libnspire-sys/libnspire/src/packet.c
new file mode 100644
index 0000000..41b7413
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/packet.c
@@ -0,0 +1,224 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#include
+#include
+
+#include "cx2.h"
+#include "handle.h"
+#include "packet.h"
+#include "error.h"
+#include "usb.h"
+#include "endianconv.h"
+
+#define PACKET_CONSTANT 0x54FD
+#define HEADER_SIZE offsetof(struct packet, data)
+
+static uint8_t calculate_header_checksum(uint8_t *data, uint8_t size) {
+ uint8_t chksum = 0;
+ int i;
+ for (i=0; i>8;
+ chksum &= 0xFF;
+ tmp2 = (((chksum & 0xF) << 4) ^ chksum) << 8;
+ tmp3 = tmp2 >> 5;
+ chksum = tmp3 >> 7;
+ chksum ^= tmp1 ^ tmp2 ^ tmp3;
+ }
+ return chksum;
+}
+
+static void fix_endian(struct packet *p) {
+ p->magic = dcpu16(p->magic);
+ p->src_addr = dcpu16(p->src_addr);
+ p->src_sid = dcpu16(p->src_sid);
+ p->dst_addr = dcpu16(p->dst_addr);
+ p->dst_sid = dcpu16(p->dst_sid);
+ p->data_checksum = dcpu16(p->data_checksum);
+}
+
+static void finalize_packet(struct packet *p) {
+ p->magic = PACKET_CONSTANT;
+
+ /* Calculate checksums */
+ p->data_checksum = calculate_data_checksum(p->fulldata, packet_fulldatasize(p));
+ p->header_checksum = calculate_header_checksum(
+ (uint8_t*)p,
+ HEADER_SIZE - 1
+ );
+
+ /* Convert endian */
+ fix_endian(p);
+}
+
+static int is_header_valid(struct packet *p) {
+ uint8_t header_chksum = calculate_header_checksum(
+ (uint8_t*)p,
+ HEADER_SIZE - 1
+ );
+
+ if (p->magic != PACKET_CONSTANT) return 0;
+ if (p->header_checksum != header_chksum) return 0;
+ return 1;
+}
+
+static int is_data_valid(struct packet *p) {
+ uint16_t data_chksum = calculate_data_checksum(p->fulldata, packet_fulldatasize(p));
+ if (!(p->data_checksum == data_chksum)) return 0;
+ return 1;
+}
+
+#ifdef DEBUG
+#include
+static void dump_packet(const struct packet *p) {
+ printf(
+ "magic = %04x\n"
+ "src_addr = %04x\n"
+ "src_sid = %04x\n"
+ "dst_addr = %04x\n"
+ "dst_sid = %04x\n"
+ "data_chksm = %04x\n"
+ "size = %02x\n"
+ "ack = %02x\n"
+ "seq = %02x\n"
+ "hdr_chksm = %02x\n"
+ "data = ",
+ p->magic,
+ p->src_addr,
+ p->src_sid,
+ p->dst_addr,
+ p->dst_sid,
+ p->data_checksum,
+ p->data_size,
+ p->ack,
+ p->seq,
+ p->header_checksum);
+
+ int i;
+ for (i=0; i<(packet_fulldatasize(p)); i++) {
+ printf("%02x ", p->fulldata[i]);
+ }
+ printf("\n");
+}
+#endif
+
+int packet_send(nspire_handle_t *h, struct packet p) {
+ int size = HEADER_SIZE + packet_fulldatasize(&p);
+
+#ifdef DEBUG
+ printf("\nOUT ===>\n");
+ dump_packet(&p);
+#endif
+
+ finalize_packet(&p);
+ if(h->is_cx2)
+ return packet_send_cx2(h, (char*)&p, size);
+ else
+ return usb_write(&h->device, (char*)&p, size);
+}
+
+int packet_recv(nspire_handle_t *h, struct packet *p) {
+ int ret;
+ struct packet unused;
+
+ /* if user passes in NULL, receive packet but ignore it */
+ if (!p)
+ p = &unused;
+
+ if(h->is_cx2)
+ ret = packet_recv_cx2(h, (char*)p, sizeof(*p));
+ else
+ ret = usb_read(&h->device, p, sizeof(*p));
+
+ if (ret < 0)
+ return ret;
+
+ fix_endian(p);
+ if (!is_header_valid(p) || !is_data_valid(p))
+ return -NSPIRE_ERR_INVALPKT;
+
+#ifdef DEBUG
+ printf("\nIN <===\n");
+ dump_packet(p);
+#endif
+
+ return -NSPIRE_ERR_SUCCESS;
+}
+
+struct packet packet_new(nspire_handle_t *h) {
+ struct packet p = {0};
+
+ p.src_addr = h->host_addr;
+ p.dst_addr = h->device_addr;
+ p.src_sid = h->host_sid;
+ p.dst_sid = h->device_sid;
+ p.seq = h->is_cx2 ? 0 : h->seq;
+
+ return p;
+}
+
+static struct packet packet_new_ack(nspire_handle_t *h, struct packet p) {
+ struct packet ack = packet_new(h);
+
+ ack.src_sid = p.seq ? 0xFF : 0xFE;
+ ack.dst_sid = p.src_sid;
+
+ ack.seq = p.seq;
+ ack.ack = 0x0A;
+
+ ack.data[0] = p.dst_sid>>8;
+ ack.data[1] = p.dst_sid&0xFF;
+ ack.data_size = 2;
+
+ return ack;
+}
+
+int packet_ack(nspire_handle_t *h, struct packet p) {
+ struct packet ack = packet_new_ack(h, p);
+ return packet_send(h, ack);
+}
+
+int packet_nack(nspire_handle_t *h, struct packet p) {
+ struct packet nack = packet_new_ack(h, p);
+ nack.src_sid = 0xD3;
+
+ return packet_send(h, nack);
+}
+
+uint8_t *packet_dataptr(struct packet *p) {
+ return (p->data_size == 0xFF) ? p->bigdata : p->data;
+}
+
+uint32_t packet_datasize(const struct packet *p) {
+ return (p->data_size == 0xFF) ? dcpu32(p->bigdatasize) : p->data_size;
+}
+
+uint32_t packet_max_datasize(nspire_handle_t *h) {
+ return h->is_cx2 ? 1440 : 254;
+}
+
+uint32_t packet_fulldatasize(const struct packet *p) {
+ return (p->data_size == 0xFF) ? (dcpu32(p->bigdatasize) + 4) : p->data_size;
+}
diff --git a/vendor/libnspire-sys/libnspire/src/packet.h b/vendor/libnspire-sys/libnspire/src/packet.h
new file mode 100644
index 0000000..cf207ef
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/packet.h
@@ -0,0 +1,61 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef _PACKET_H
+#define _PACKET_H
+
+#include
+#include "handle.h"
+
+struct packet {
+ uint16_t magic,
+ src_addr,
+ src_sid,
+ dst_addr,
+ dst_sid,
+ data_checksum;
+ uint8_t data_size, // If 0xFF, bigdata* counts
+ ack,
+ seq,
+ header_checksum;
+ union {
+ uint8_t data[254];
+ struct {
+ uint32_t bigdatasize;
+ uint8_t bigdata[1440];
+ };
+ uint8_t fulldata[1444];
+ };
+};
+
+#define packet_set_data(p, ...) do { \
+ unsigned char buffer[] = { __VA_ARGS__ }; \
+ p.data_size = sizeof(buffer); \
+ memcpy(p.data, buffer, p.data_size); \
+ } while (0)
+
+int packet_send(nspire_handle_t *h, struct packet p);
+int packet_recv(nspire_handle_t *h, struct packet *p);
+struct packet packet_new(nspire_handle_t *h);
+int packet_ack(nspire_handle_t *h, struct packet p);
+int packet_nack(nspire_handle_t *h, struct packet p);
+uint8_t *packet_dataptr(struct packet *p);
+uint32_t packet_datasize(const struct packet *p);
+uint32_t packet_fulldatasize(const struct packet *p);
+uint32_t packet_max_datasize(nspire_handle_t *h);
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/service.c b/vendor/libnspire-sys/libnspire/src/service.c
new file mode 100644
index 0000000..0c0d30e
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/service.c
@@ -0,0 +1,55 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#include "error.h"
+#include "data.h"
+#include "packet.h"
+
+int service_connect(nspire_handle_t *handle, uint16_t sid) {
+ if (handle->connected)
+ return -NSPIRE_ERR_BUSY;
+
+ handle->connected = 1;
+ handle->device_sid = sid;
+
+ return NSPIRE_ERR_SUCCESS;
+}
+
+static void mod_src(struct packet *p) {
+ p->src_sid = 0x40DE;
+}
+
+int service_disconnect(nspire_handle_t *handle) {
+ int ret;
+ struct packet p;
+ uint8_t data[] = {
+ (handle->host_sid>>8) & 0xFF,
+ (handle->host_sid>>0) & 0xFF };
+
+ if (!handle->connected)
+ return NSPIRE_ERR_SUCCESS;
+
+ p = packet_new(handle);
+ if ( (ret = data_write_special(handle, &data, 2, mod_src)) ) {
+ return ret;
+ }
+
+ handle->connected = 0;
+ handle->host_sid++;
+
+ return NSPIRE_ERR_SUCCESS;
+}
diff --git a/vendor/libnspire-sys/libnspire/src/service.h b/vendor/libnspire-sys/libnspire/src/service.h
new file mode 100644
index 0000000..6ceb493
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/service.h
@@ -0,0 +1,27 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef _SERVICE_H
+#define _SERVICE_H
+
+#include
+#include "handle.h"
+
+int service_connect(nspire_handle_t *handle, uint16_t sid);
+int service_disconnect(nspire_handle_t *handle);
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/services/devinfo.c b/vendor/libnspire-sys/libnspire/src/services/devinfo.c
new file mode 100644
index 0000000..b4171b6
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/services/devinfo.c
@@ -0,0 +1,117 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#include
+
+#include "handle.h"
+#include "error.h"
+#include "data.h"
+#include "service.h"
+#include "endianconv.h"
+#include "devinfo.h"
+
+int nspire_device_info(nspire_handle_t *handle, struct nspire_devinfo *i) {
+ int ret;
+ uint8_t buffer[253];
+ char *devname, *file, *os;
+ struct deviceinfo_01 devinfo;
+
+ if ( (ret = service_connect(handle, 0x4020)) )
+ return ret;
+
+ if ( (ret = data_write8(handle, 0x01)) )
+ goto end;
+
+ if ( (ret = data_read(handle, buffer, sizeof(buffer), NULL)) )
+ goto end;
+
+ /* Shift up one byte to align */
+ memmove(&devinfo, buffer+1, sizeof(devinfo));
+
+ /* Maybe we should convert all this to a data scan call */
+ i->storage.free = dcpu64(devinfo.flash_free);
+ i->storage.total = dcpu64(devinfo.flash_total);
+ i->ram.free = dcpu64(devinfo.ram_free);
+ i->ram.total = dcpu64(devinfo.ram_total);
+
+ i->versions[NSPIRE_VER_OS].major = devinfo.p_version[0];
+ i->versions[NSPIRE_VER_OS].minor = devinfo.p_version[1];
+ i->versions[NSPIRE_VER_OS].build =
+ devinfo.p_version[2]<<8 | devinfo.p_version[3];
+
+ i->versions[NSPIRE_VER_BOOT1].major = devinfo.boot1_version[0];
+ i->versions[NSPIRE_VER_BOOT1].minor = devinfo.boot1_version[1];
+ i->versions[NSPIRE_VER_BOOT1].build =
+ devinfo.boot1_version[2]<<8 | devinfo.boot1_version[3];
+
+ i->versions[NSPIRE_VER_BOOT2].major = devinfo.boot2_version[0];
+ i->versions[NSPIRE_VER_BOOT2].minor = devinfo.boot2_version[1];
+ i->versions[NSPIRE_VER_BOOT2].build =
+ devinfo.boot2_version[2]<<8 | devinfo.boot2_version[3];
+
+ i->hw_type = devinfo.device;
+
+ i->batt.status = devinfo.batt_lvl;
+ i->batt.is_charging = devinfo.is_charging;
+ i->clock_speed = devinfo.clock_speed;
+
+ i->lcd.width = dcpu16(devinfo.lcd_width);
+ i->lcd.height = dcpu16(devinfo.lcd_height);
+ i->lcd.bbp = devinfo.lcd_bbp;
+ i->lcd.sample_mode = devinfo.lcd_sample_mode;
+
+ memcpy(i->electronic_id, devinfo.full_electronic_id,
+ sizeof(i->electronic_id) - 1);
+ i->electronic_id[sizeof(i->electronic_id) - 1] = '\0';
+
+ i->runlevel = dcpu16(devinfo.run_level);
+
+ if ( (ret = data_write8(handle, 0x02)) )
+ goto end;
+
+ if ( (ret = data_read(handle, buffer, sizeof(buffer), NULL)) )
+ goto end;
+
+ if ( (ret = data_scan("bS", buffer, sizeof(buffer),
+ NULL, &devname)) )
+ goto end;
+
+ strncpy(i->device_name, devname, sizeof(i->device_name)-1);
+ i->device_name[sizeof(i->device_name)-1] = '\0';
+
+ if ( (ret = data_write8(handle, 0x03)) )
+ goto end;
+
+ if ( (ret = data_read(handle, buffer, sizeof(buffer), NULL)) )
+ goto end;
+
+ if ( (ret = data_scan("bSS", buffer, sizeof(buffer),
+ NULL, &file, &os)) )
+ goto end;
+
+ strncpy(i->extensions.file, file, sizeof(i->extensions.file)-1);
+ strncpy(i->extensions.os, os, sizeof(i->extensions.os)-1);
+
+ i->extensions.file[sizeof(i->extensions.file)-1] = '\0';
+ i->extensions.os[sizeof(i->extensions.os)-1] = '\0';
+
+ ret = NSPIRE_ERR_SUCCESS;
+
+end:
+ service_disconnect(handle);
+ return ret;
+}
diff --git a/vendor/libnspire-sys/libnspire/src/services/devinfo.h b/vendor/libnspire-sys/libnspire/src/services/devinfo.h
new file mode 100644
index 0000000..716c1b4
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/services/devinfo.h
@@ -0,0 +1,57 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef _DEVINFO_H
+#define _DEVINFO_H
+
+#include "api/devinfo.h"
+#ifdef _WIN32
+#define PACK( ... ) __pragma( pack(push, 1) ) __VA_ARGS__ __pragma( pack(pop))
+#else
+#define PACK( ... ) __VA_ARGS__ __attribute__((__packed__))
+#endif
+PACK(struct deviceinfo_01 {
+ uint64_t flash_free, flash_total;
+ uint64_t ram_free, ram_total;
+
+ uint8_t batt_lvl;
+
+ /* Avoid unaligned accesses on some CPUs */
+ /* uint16_t is_charging; */
+ uint8_t __padding;
+ uint8_t is_charging;
+
+ uint8_t clock_speed;
+
+ uint8_t p_version[4];
+ uint8_t boot1_version[4];
+ uint8_t boot2_version[4];
+
+ uint32_t h_version;
+ uint16_t run_level;
+
+ uint16_t lcd_x, lcd_y, lcd_width, lcd_height;
+ uint8_t lcd_bbp;
+ uint8_t lcd_sample_mode;
+
+ uint8_t device;
+
+ uint8_t electronic_id[17];
+ uint8_t full_electronic_id[27];
+});
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/services/dir.c b/vendor/libnspire-sys/libnspire/src/services/dir.c
new file mode 100644
index 0000000..6d5d3c4
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/services/dir.c
@@ -0,0 +1,244 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#include
+#include
+
+#include "handle.h"
+#include "error.h"
+#include "data.h"
+#include "service.h"
+#include "dir.h"
+
+static int dir_enum(nspire_handle_t *handle, struct nspire_dir_info **d) {
+ int ret;
+ char *name;
+ uint32_t size, date;
+ uint8_t is_dir;
+ struct nspire_dir_info *new_dir;
+ struct nspire_dir_item *current;
+
+ unsigned char buffer[254];
+
+ if ( (ret = data_write8(handle, 0x0E)) )
+ return ret;
+ if ( (ret = data_read(handle, buffer, sizeof(buffer), NULL)) )
+ return ret;
+
+ if (buffer[0] == 0xFF)
+ return 1;
+
+ if ( (ret = data_scan("hbswwb0", buffer, sizeof(buffer),
+ NULL, NULL, &name, &size, &date, &is_dir)) )
+ return ret;
+
+ new_dir = realloc(*d, sizeof(struct nspire_dir_info) +
+ (((*d)->num + 1) * sizeof(struct nspire_dir_item)));
+ if (!new_dir)
+ return -NSPIRE_ERR_NOMEM;
+ current = new_dir->items + new_dir->num;
+ new_dir->num++;
+ *d = new_dir;
+
+ strncpy(current->name, name, sizeof(current->name));
+ current->name[sizeof(current->name)-1] = '\0';
+ current->size = size;
+ current->date = date;
+ current->type = is_dir;
+
+ return NSPIRE_ERR_SUCCESS;
+}
+
+int nspire_dirlist(nspire_handle_t *handle, const char *path,
+ struct nspire_dir_info **info_ptr) {
+ int ret;
+ size_t len;
+ uint8_t buffer[254], code;
+ uint16_t result;
+ struct nspire_dir_info *d;
+
+ if ( (ret = service_connect(handle, 0x4060)) )
+ return ret;
+
+ /* Begin dir enum */
+ if ( (ret = data_build("bs0", buffer, sizeof(buffer), &len,
+ 0x0D, path)) )
+ goto end;
+
+ if ( (ret = data_write(handle, buffer, len)) )
+ goto end;
+
+ if ( (ret = data_read(handle, buffer, 2, NULL)) )
+ goto end;
+
+ if ( (ret = data_scan("bb", buffer, sizeof(buffer),
+ NULL, &code)) )
+ goto end;
+
+ switch (code) {
+ case 0x0A:
+ ret = -NSPIRE_ERR_NONEXIST;
+ goto end;
+ case 0x0F:
+ ret = -NSPIRE_ERR_INVALID;
+ goto end;
+ }
+
+ d = malloc(sizeof(struct nspire_dir_info));
+ (d)->num = 0;
+ if (!d) {
+ ret = -NSPIRE_ERR_NOMEM;
+ goto end;
+ }
+
+ *info_ptr = d;
+ /* Start enumerating */
+ while (1) {
+ ret = dir_enum(handle, info_ptr);
+ if (ret < 0) {
+ free(*info_ptr);
+ goto end;
+ }
+
+ if (ret)
+ break;
+ }
+
+ /* End dir enum */
+ if ( (ret = data_build("b", buffer, sizeof(buffer), &len,
+ 0x0F)) )
+ goto end;
+
+ if ( (ret = data_write(handle, buffer, len)) )
+ goto end;
+
+ if ( (ret = data_read(handle, buffer, 2, NULL)) )
+ goto end;
+
+ if ( (ret = data_scan("h", buffer, sizeof(buffer),
+ NULL, &result)) )
+ goto end;
+
+ // TODO: result ignored here, what to do on failure anyway?
+
+ ret = NSPIRE_ERR_SUCCESS;
+end:
+ service_disconnect(handle);
+ return ret;
+}
+
+void nspire_dirlist_free(struct nspire_dir_info *d) {
+ free(d);
+}
+
+int nspire_dir_create(nspire_handle_t *handle, const char *path) {
+ int ret;
+ size_t len;
+ uint16_t result;
+ uint8_t buffer[254];
+
+ if ( (ret = service_connect(handle, 0x4060)) )
+ return ret;
+
+ if ( (ret = data_build("hs", buffer, sizeof(buffer), &len,
+ 0x0A03, path)) )
+ goto end;
+
+ if ( (ret = data_write(handle, &buffer, len)) )
+ goto end;
+
+ if ( (ret = data_read(handle, &buffer, 2, NULL)) )
+ goto end;
+
+ if ( (ret = data_scan("h", buffer, sizeof(buffer), &result)) )
+ goto end;
+
+ ret = (result == 0xFF00) ? NSPIRE_ERR_SUCCESS : -NSPIRE_ERR_EXISTS;
+end:
+ service_disconnect(handle);
+ return ret;
+}
+
+int nspire_dir_delete(nspire_handle_t *handle, const char *path) {
+ int ret;
+ size_t len;
+ uint16_t result;
+ uint8_t buffer[254];
+
+
+ if ( (ret = service_connect(handle, 0x4060)) )
+ return ret;
+
+ if ( (ret = data_build("hs", buffer, sizeof(buffer), &len,
+ 0x0B03, path)) )
+ goto end;
+
+ if ( (ret = data_write(handle, &buffer, len)) )
+ goto end;
+
+ if ( (ret = data_read(handle, &buffer, 2, NULL)) )
+ goto end;
+
+ if ( (ret = data_scan("h", buffer, sizeof(buffer), &result)) )
+ goto end;
+
+ ret = (result == 0xFF00) ? NSPIRE_ERR_SUCCESS : -NSPIRE_ERR_NONEXIST;
+end:
+ service_disconnect(handle);
+ return ret;
+}
+
+int nspire_attr(nspire_handle_t *handle, const char *path,
+ struct nspire_dir_item *info) {
+ int ret;
+ size_t len;
+ uint8_t is_dir, buffer[254];
+ uint32_t size, date;
+
+ if ( (ret = service_connect(handle, 0x4060)) )
+ return ret;
+
+ if ( (ret = data_build("hs0", buffer, sizeof(buffer), &len,
+ 0x2001, path)) )
+ goto end;
+
+ if ( (ret = data_write(handle, buffer, len)) )
+ goto end;
+
+ if ( (ret = data_read(handle, buffer, sizeof(buffer), NULL)) )
+ goto end;
+
+ if (buffer[0] != 0x20) {
+ ret = -NSPIRE_ERR_NONEXIST;
+ goto end;
+ }
+
+ if ( (ret = data_scan("bwwb0", buffer, sizeof(buffer),
+ NULL, &size, &date, &is_dir)) )
+ goto end;
+
+ strncpy(info->name, path, sizeof(info->name));
+ info->name[sizeof(info->name)-1] = '\0';
+ info->size = size;
+ info->date = date;
+ info->type = is_dir;
+
+ ret = NSPIRE_ERR_SUCCESS;
+end:
+ service_disconnect(handle);
+ return ret;
+}
diff --git a/vendor/libnspire-sys/libnspire/src/services/dir.h b/vendor/libnspire-sys/libnspire/src/services/dir.h
new file mode 100644
index 0000000..dec1fd7
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/services/dir.h
@@ -0,0 +1,23 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef _DIR_H
+#define _DIR_H
+
+#include "api/dir.h"
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/services/file.c b/vendor/libnspire-sys/libnspire/src/services/file.c
new file mode 100644
index 0000000..f22cc47
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/services/file.c
@@ -0,0 +1,234 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#include
+
+#include "handle.h"
+#include "error.h"
+#include "data.h"
+#include "service.h"
+
+typedef void (*nspire_callback)(size_t, void*);
+int nspire_file_write(nspire_handle_t *handle, const char *path,
+ void* data, size_t size, nspire_callback cb, void *cb_data) {
+ int ret;
+ size_t len;
+ uint8_t buffer[sizeof(struct packet)], *ptr = data;
+ uint16_t result;
+
+ if ( (ret = service_connect(handle, 0x4060)) )
+ return ret;
+
+ if ( (ret = data_build("hsw", buffer, sizeof(buffer), &len,
+ 0x0301, path, size)) )
+ goto end;
+
+ if ( (ret = data_write(handle, buffer, len)) )
+ goto end;
+
+ if ( (ret = data_read(handle, buffer, sizeof(buffer), NULL)) )
+ goto end;
+
+ if (buffer[0] != 0x04) {
+ ret = -NSPIRE_ERR_INVALID;
+ goto end;
+ }
+
+ size_t datasize = packet_max_datasize(handle) - 1;
+
+ buffer[0] = 0x05;
+ while (size) {
+ len = (datasize < size) ? datasize : size;
+
+ memcpy(buffer + 1, ptr, len);
+ if ( (ret = data_write(handle, buffer, len+1)) )
+ goto end;
+
+ size -= len;
+ ptr += len;
+
+ cb(size, cb_data);
+ }
+
+ if ( (ret = data_read(handle, buffer, sizeof(buffer), NULL)) )
+ goto end;
+
+ if ( (ret = data_scan("h", buffer, sizeof(buffer), &result)) )
+ goto end;
+
+ ret = (result == 0xFF00) ? NSPIRE_ERR_SUCCESS : -NSPIRE_ERR_NONEXIST;
+end:
+ service_disconnect(handle);
+ return ret;
+}
+
+int nspire_file_read(nspire_handle_t *handle, const char *path,
+ void* data, size_t size, size_t *total_bytes, nspire_callback cb, void *cb_data) {
+ int ret;
+ size_t len;
+ uint8_t buffer[1440], *ptr = data;
+ uint16_t result;
+ uint32_t data_len;
+
+ if ( (ret = service_connect(handle, 0x4060)) )
+ return ret;
+
+ if ( (ret = data_build("hs", buffer, packet_max_datasize(handle), &len,
+ 0x0701, path)) )
+ goto end;
+
+ if ( (ret = data_write(handle, buffer, len)) )
+ goto end;
+
+ if ( (ret = data_read(handle, buffer, packet_max_datasize(handle), NULL)) )
+ goto end;
+
+ if ( (ret = data_scan("h000000000w", buffer, packet_max_datasize(handle),
+ &result, &data_len)) )
+ goto end;
+
+ if (result != 0x0301) {
+ ret = -NSPIRE_ERR_NONEXIST;
+ goto end;
+ }
+
+ if ( (ret = data_write8(handle, 0x04)) )
+ goto end;
+
+ if (total_bytes) *total_bytes = 0;
+
+ size_t maxsize = packet_max_datasize(handle) - 1;
+
+ while (data_len) {
+ len = (maxsize < data_len) ? maxsize : data_len;
+
+ if ( (ret = data_read(handle, buffer, len+1, &len)) )
+ goto end;
+
+ size_t to_copy = len - 1;
+ memcpy(ptr, buffer + 1, (size < to_copy) ? size : to_copy);
+ if (total_bytes) *total_bytes += (size < to_copy) ? size : to_copy;
+ size -= (size < to_copy) ? size : to_copy;
+ if(!size) {
+ goto end;
+ }
+
+ ptr += to_copy;
+
+ data_len -= len - 1;
+ cb(size, cb_data);
+ }
+
+ if ( (ret = data_write16(handle, 0xFF00)) )
+ goto end;
+
+ ret = NSPIRE_ERR_SUCCESS;
+end:
+ service_disconnect(handle);
+ return ret;
+}
+
+int nspire_file_move(nspire_handle_t *handle,
+ const char *src, const char *dst) {
+ int ret;
+ size_t len;
+ uint16_t result;
+ uint8_t buffer[254];
+
+
+ if ( (ret = service_connect(handle, 0x4060)) )
+ return ret;
+
+ if ( (ret = data_build("hss0", buffer, sizeof(buffer), &len,
+ 0x2101, src, dst)) )
+ goto end;
+
+ if ( (ret = data_write(handle, &buffer, len)) )
+ goto end;
+
+ if ( (ret = data_read(handle, &buffer, 2, NULL)) )
+ goto end;
+
+ if ( (ret = data_scan("h", buffer, sizeof(buffer), &result)) )
+ goto end;
+
+ ret = (result == 0xFF00) ? NSPIRE_ERR_SUCCESS : -NSPIRE_ERR_INVALID;
+end:
+ service_disconnect(handle);
+ return ret;
+}
+
+int nspire_file_copy(nspire_handle_t *handle,
+ const char *src, const char *dst) {
+ int ret;
+ size_t len;
+ uint16_t result;
+ uint8_t buffer[254];
+
+
+ if ( (ret = service_connect(handle, 0x4060)) )
+ return ret;
+
+ if ( (ret = data_build("hss0", buffer, sizeof(buffer), &len,
+ 0x0C01, src, dst)) )
+ goto end;
+
+ if ( (ret = data_write(handle, &buffer, len)) )
+ goto end;
+
+ if ( (ret = data_read(handle, &buffer, 2, NULL)) )
+ goto end;
+
+ if ( (ret = data_scan("h", buffer, sizeof(buffer), &result)) )
+ goto end;
+
+ ret = (result == 0xFF00) ? NSPIRE_ERR_SUCCESS : -NSPIRE_ERR_INVALID;
+end:
+ service_disconnect(handle);
+ return ret;
+}
+
+int nspire_file_delete(nspire_handle_t *handle, const char *path) {
+ int ret;
+ size_t len;
+ uint16_t result;
+ uint8_t buffer[254];
+
+
+ if ( (ret = service_connect(handle, 0x4060)) )
+ return ret;
+
+ if ( (ret = data_build("hs0", buffer, sizeof(buffer), &len,
+ 0x0901, path)) )
+ goto end;
+
+ if ( (ret = data_write(handle, &buffer, len)) )
+ goto end;
+
+ if ( (ret = data_read(handle, &buffer, 2, NULL)) )
+ goto end;
+
+ if ( (ret = data_scan("h", buffer, sizeof(buffer), &result)) )
+ goto end;
+
+ ret = (result == 0xFF00) ? NSPIRE_ERR_SUCCESS : -NSPIRE_ERR_EXISTS;
+end:
+ service_disconnect(handle);
+ return ret;
+}
+
+
diff --git a/vendor/libnspire-sys/libnspire/src/services/file.h b/vendor/libnspire-sys/libnspire/src/services/file.h
new file mode 100644
index 0000000..66fcd85
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/services/file.h
@@ -0,0 +1,23 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef _FILE_H
+#define _FILE_H
+
+#include "api/file.h"
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/services/os.c b/vendor/libnspire-sys/libnspire/src/services/os.c
new file mode 100644
index 0000000..b1cabb4
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/services/os.c
@@ -0,0 +1,94 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#include
+
+#include "handle.h"
+
+#include "error.h"
+#include "data.h"
+#include "service.h"
+
+typedef void (*nspire_callback)(size_t, void*);
+int nspire_os_send(nspire_handle_t *handle, void* data, size_t size, nspire_callback cb, void *cb_data) {
+ int ret;
+ size_t len;
+ uint8_t buffer[sizeof(struct packet)], *ptr = data;
+
+ if ( (ret = service_connect(handle, 0x4080)) )
+ return ret;
+
+ if ( (ret = data_build("bw", buffer, sizeof(buffer), &len,
+ 0x03, (uint32_t)size)) )
+ goto end;
+
+ if ( (ret = data_write(handle, buffer, len)) )
+ goto end;
+
+ if ( (ret = data_read(handle, buffer, sizeof(buffer), NULL)) )
+ goto end;
+
+ if (buffer[0] != 0x04) {
+ ret = -NSPIRE_ERR_OSFAILED;
+ goto end;
+ }
+
+ size_t datasize = packet_max_datasize(handle) - 1;
+ buffer[0] = 0x05;
+ while (size) {
+ len = (datasize < size) ? datasize : size;
+
+ memcpy(buffer + 1, ptr, len);
+ if ( (ret = data_write(handle, buffer, len+1)) )
+ goto end;
+
+ if (ptr == data) {
+ /* First run - read 0xFF00 */
+ uint16_t code;
+ if ( (ret = data_read(handle, &code, 2, NULL)) )
+ goto end;
+
+ if (dcpu16(code) != 0xFF00 && dcpu16(code) != 0x0400) {
+ ret = -NSPIRE_ERR_OSFAILED;
+ goto end;
+ }
+ }
+
+ size -= len;
+ ptr += len;
+ cb(size, cb_data);
+ }
+
+ while (1) {
+ if ( (ret = data_read(handle, buffer, sizeof(buffer), NULL)) )
+ goto end;
+
+ if (buffer[0] == 0xFF) {
+ ret = -NSPIRE_ERR_OSFAILED;
+ goto end;
+ }
+
+ // Yes, over 100% is actually possible...
+ if (buffer[1] >= 100)
+ break;
+ }
+
+ ret = NSPIRE_ERR_SUCCESS;
+end:
+ service_disconnect(handle);
+ return ret;
+}
diff --git a/vendor/libnspire-sys/libnspire/src/services/os.h b/vendor/libnspire-sys/libnspire/src/services/os.h
new file mode 100644
index 0000000..587685c
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/services/os.h
@@ -0,0 +1,23 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef _OS_H
+#define _OS_H
+
+#include "api/os.h"
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/services/screenshot.c b/vendor/libnspire-sys/libnspire/src/services/screenshot.c
new file mode 100644
index 0000000..65938e6
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/services/screenshot.c
@@ -0,0 +1,123 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#include
+#include
+
+#include "handle.h"
+#include "error.h"
+#include "data.h"
+#include "service.h"
+#include "screenshot.h"
+
+struct rle {
+ signed char len;
+ unsigned char byte;
+};
+
+static void rle_decode(const void *in, void *_out,
+ size_t in_size, size_t out_size) {
+ size_t len;
+ unsigned char *out = _out;
+ const struct rle *ptr = in;
+
+ while (in_size > 1 && out_size) {
+ if (ptr->len < 0) {
+ len = -(ptr->len) + 1;
+ len = len < out_size ? len : out_size;
+ len = len < in_size ? len : in_size;
+
+ memcpy(out, &ptr->byte, len);
+
+ in_size -= (1 + (len));
+ ptr = (void*)((unsigned char*)ptr + (1 + (len)));
+ } else {
+ len = ptr->len + 1;
+ len = len < out_size ? len : out_size;
+ memset(out, ptr->byte, len);
+
+ in_size -= sizeof(struct rle);
+ ptr++;
+ }
+
+ out_size -= len;
+ out += len;
+ }
+}
+
+int nspire_screenshot(nspire_handle_t *handle, struct nspire_image **ptr) {
+ int ret;
+ size_t len, in_len, out_len;
+ uint8_t buffer[254], bbp, *tmp = NULL, *tmp_ptr = NULL;
+ uint16_t width, height;
+ uint32_t size;
+ struct nspire_image *i;
+
+
+ if ( (ret = service_connect(handle, 0x4024)) )
+ return ret;
+
+ if ( (ret = data_write8(handle, 0x00)) )
+ return ret;
+
+ if ( (ret = data_read(handle, buffer, sizeof(buffer), NULL)) )
+ goto end;
+
+ if ( (ret = data_scan("bwhhhhbb", buffer, sizeof(buffer),
+ NULL, &size, NULL, NULL, &width, &height, &bbp, NULL)) )
+ goto end;
+
+ tmp_ptr = tmp = malloc(size);
+ if (!tmp) {
+ ret = -NSPIRE_ERR_NOMEM;
+ goto end;
+ }
+
+ in_len = size;
+ out_len = (width * height * bbp) / 8;
+
+ i = malloc(sizeof(*i) + out_len);
+ if (!i) {
+ ret = -NSPIRE_ERR_NOMEM;
+ goto end;
+ }
+
+ i->width = width;
+ i->height = height;
+ i->bbp = bbp;
+
+ while (size) {
+ if ( (ret = data_read(handle, buffer, sizeof(buffer), NULL)) )
+ goto error_free;
+
+ len = 253 < size ? 253 : size;
+ memcpy(tmp_ptr, buffer + 1, len);
+ tmp_ptr += len;
+ size -= len;
+ }
+
+ rle_decode(tmp, i->data, in_len, out_len);
+ *ptr = i;
+ ret = NSPIRE_ERR_SUCCESS;
+ goto end;
+error_free:
+ if (i) free(i);
+end:
+ if (tmp) free(tmp);
+ service_disconnect(handle);
+ return ret;
+}
diff --git a/vendor/libnspire-sys/libnspire/src/services/screenshot.h b/vendor/libnspire-sys/libnspire/src/services/screenshot.h
new file mode 100644
index 0000000..3dcc145
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/services/screenshot.h
@@ -0,0 +1,23 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef _SCREENSHOT_H
+#define _SCREENSHOT_H
+
+#include "api/screenshot.h"
+
+#endif
diff --git a/vendor/libnspire-sys/libnspire/src/usb.c b/vendor/libnspire-sys/libnspire/src/usb.c
new file mode 100644
index 0000000..37fd7dd
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/usb.c
@@ -0,0 +1,120 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#include "usb.h"
+#include "error.h"
+
+#include
+
+#define NSP_DEFAULT_CONFIG 1
+#define NSP_DEFAULT_IFACE 0
+#define NSP_TIMEOUT 10000
+
+static libusb_context * usb_ctx = NULL;
+
+int usb_init() {
+ if (usb_ctx)
+ return NSPIRE_ERR_SUCCESS;
+
+ if (libusb_init(&usb_ctx))
+ return -NSPIRE_ERR_LIBUSB;
+
+ //libusb_set_debug(usb_ctx, 3);
+
+ return NSPIRE_ERR_SUCCESS;
+}
+
+void usb_finish() {
+ libusb_exit(usb_ctx);
+}
+
+int usb_get_device(usb_device_t *handle, libusb_device_handle *dev) {
+ int i;
+ struct libusb_config_descriptor *config;
+ const struct libusb_interface_descriptor *iface;
+
+ /* Libusb boilerplate */
+ if (libusb_set_configuration(dev, NSP_DEFAULT_CONFIG))
+ goto error_close;
+ if (libusb_reset_device(dev))
+ goto error_close;
+ if (libusb_claim_interface(dev, NSP_DEFAULT_IFACE))
+ goto error_close;
+
+ /* Find and use first found input and output endpoints */
+ /* We can't hardcode or else it won't work in recovery mode */
+ if (libusb_get_active_config_descriptor(
+ libusb_get_device(dev), &config))
+ goto error_close;
+ if (config->bNumInterfaces < NSP_DEFAULT_IFACE)
+ goto error_free_desc;
+ iface = config->interface[NSP_DEFAULT_IFACE].altsetting;
+
+ handle->ep_in = 0;
+ handle->ep_out = 0;
+ for (i=0; ibNumEndpoints; i++) {
+ unsigned char ep = iface->endpoint[i].bEndpointAddress;
+ if (ep & LIBUSB_ENDPOINT_IN) {
+ if (!handle->ep_in) handle->ep_in = ep;
+ } else {
+ if (!handle->ep_out) handle->ep_out = ep;
+ }
+ }
+ libusb_free_config_descriptor(config);
+
+ if (!handle->ep_in || !handle->ep_out)
+ goto error_close;
+
+ handle->dev = dev;
+ return NSPIRE_ERR_SUCCESS;
+error_free_desc:
+ libusb_free_config_descriptor(config);
+error_close:
+error:
+ return -NSPIRE_ERR_NODEVICE;
+}
+
+void usb_free_device(usb_device_t *handle) {
+ libusb_release_interface(handle->dev, NSP_DEFAULT_IFACE);
+}
+
+static inline int usb_xfer(libusb_device_handle *handle, unsigned char ep,
+ void *ptr, int len) {
+ int ret, transferred = 0;
+ ret = libusb_bulk_transfer(handle,
+ ep,
+ ptr,
+ len,
+ &transferred,
+ NSP_TIMEOUT);
+
+ switch (ret) {
+ case 0: return (len - transferred);
+ case LIBUSB_ERROR_NO_DEVICE: return -NSPIRE_ERR_NODEVICE;
+ case LIBUSB_ERROR_TIMEOUT: return -NSPIRE_ERR_TIMEOUT;
+ default: return -NSPIRE_ERR_LIBUSB;
+ }
+}
+
+int usb_write(usb_device_t *handle, void *ptr, int len) {
+ return usb_xfer(handle->dev, handle->ep_out, ptr, len);
+}
+
+int usb_read(usb_device_t *handle, void *ptr, int len) {
+ return usb_xfer(handle->dev, handle->ep_in, ptr, len);
+}
+
diff --git a/vendor/libnspire-sys/libnspire/src/usb.h b/vendor/libnspire-sys/libnspire/src/usb.h
new file mode 100644
index 0000000..1a849e8
--- /dev/null
+++ b/vendor/libnspire-sys/libnspire/src/usb.h
@@ -0,0 +1,40 @@
+/*
+ This file is part of libnspire.
+
+ libnspire is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libnspire is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libnspire. If not, see .
+*/
+
+#ifndef _USB_H
+#define _USB_H
+
+#include "endianconv.h"
+#include
+
+#define NSP_VID 0x0451
+#define NSP_PID 0xe012
+#define NSP_PID_CX2 0xe022
+
+typedef struct {
+ libusb_device_handle *dev;
+ unsigned char ep_in, ep_out;
+} usb_device_t;
+
+int usb_init();
+void usb_finish();
+int usb_get_device(usb_device_t *handle, libusb_device_handle *dev);
+void usb_free_device(usb_device_t *handle);
+int usb_write(usb_device_t *handle, void *ptr, int len);
+int usb_read(usb_device_t *handle, void *ptr, int len);
+
+#endif
diff --git a/vendor/libnspire-sys/src/bindings.rs b/vendor/libnspire-sys/src/bindings.rs
new file mode 100644
index 0000000..0f5a48a
--- /dev/null
+++ b/vendor/libnspire-sys/src/bindings.rs
@@ -0,0 +1,785 @@
+/* automatically generated by rust-bindgen 0.55.1 */
+
+#[repr(C)]
+#[derive(Default)]
+pub struct __IncompleteArrayField(::std::marker::PhantomData, [T; 0]);
+impl __IncompleteArrayField {
+ #[inline]
+ pub const fn new() -> Self {
+ __IncompleteArrayField(::std::marker::PhantomData, [])
+ }
+ #[inline]
+ pub fn as_ptr(&self) -> *const T {
+ self as *const _ as *const T
+ }
+ #[inline]
+ pub fn as_mut_ptr(&mut self) -> *mut T {
+ self as *mut _ as *mut T
+ }
+ #[inline]
+ pub unsafe fn as_slice(&self, len: usize) -> &[T] {
+ ::std::slice::from_raw_parts(self.as_ptr(), len)
+ }
+ #[inline]
+ pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] {
+ ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len)
+ }
+}
+impl ::std::fmt::Debug for __IncompleteArrayField {
+ fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ fmt.write_str("__IncompleteArrayField")
+ }
+}
+pub type __uint8_t = ::std::os::raw::c_uchar;
+pub type __uint16_t = ::std::os::raw::c_ushort;
+pub type __uint64_t = ::std::os::raw::c_ulong;
+extern "C" {
+ pub fn free(__ptr: *mut ::std::os::raw::c_void);
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct nspire_handle {
+ _unused: [u8; 0],
+}
+pub type nspire_handle_t = nspire_handle;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct libusb_device_handle {
+ _unused: [u8; 0],
+}
+extern "C" {
+ pub fn nspire_init(
+ ptr: *mut *mut nspire_handle_t,
+ dev: *mut libusb_device_handle,
+ is_cx2: bool,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn nspire_free(ptr: *mut nspire_handle_t);
+}
+pub const nspire_battery_NSPIRE_BATT_POWERED: nspire_battery = 0;
+pub const nspire_battery_NSPIRE_BATT_LOW: nspire_battery = 241;
+pub const nspire_battery_NSPIRE_BATT_OK: nspire_battery = 127;
+pub const nspire_battery_NSPIRE_BATT_UNKNOWN: nspire_battery = 255;
+pub type nspire_battery = ::std::os::raw::c_uint;
+pub const nspire_version_index_NSPIRE_VER_OS: nspire_version_index = 0;
+pub const nspire_version_index_NSPIRE_VER_BOOT1: nspire_version_index = 1;
+pub const nspire_version_index_NSPIRE_VER_BOOT2: nspire_version_index = 2;
+pub const nspire_version_index_NSPIRE_VER_MAXNUM: nspire_version_index = 3;
+pub type nspire_version_index = ::std::os::raw::c_uint;
+pub const nspire_type_NSPIRE_CAS: nspire_type = 14;
+pub const nspire_type_NSPIRE_NONCAS: nspire_type = 30;
+pub const nspire_type_NSPIRE_CASCX: nspire_type = 15;
+pub const nspire_type_NSPIRE_NONCASCX: nspire_type = 31;
+pub type nspire_type = ::std::os::raw::c_uint;
+pub const nspire_runlevel_NSPIRE_RUNLEVEL_RECOVERY: nspire_runlevel = 1;
+pub const nspire_runlevel_NSPIRE_RUNLEVEL_OS: nspire_runlevel = 2;
+pub type nspire_runlevel = ::std::os::raw::c_uint;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct nspire_devinfo {
+ pub storage: nspire_devinfo__bindgen_ty_1,
+ pub ram: nspire_devinfo__bindgen_ty_2,
+ pub versions: [nspire_devinfo__bindgen_ty_3; 3usize],
+ pub hw_type: nspire_type,
+ pub batt: nspire_devinfo__bindgen_ty_4,
+ pub clock_speed: u8,
+ pub lcd: nspire_devinfo__bindgen_ty_5,
+ pub extensions: nspire_devinfo__bindgen_ty_6,
+ pub device_name: [::std::os::raw::c_char; 20usize],
+ pub electronic_id: [::std::os::raw::c_char; 28usize],
+ pub runlevel: nspire_runlevel,
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct nspire_devinfo__bindgen_ty_1 {
+ pub free: u64,
+ pub total: u64,
+}
+#[test]
+fn bindgen_test_layout_nspire_devinfo__bindgen_ty_1() {
+ assert_eq!(
+ ::std::mem::size_of::(),
+ 16usize,
+ concat!("Size of: ", stringify!(nspire_devinfo__bindgen_ty_1))
+ );
+ assert_eq!(
+ ::std::mem::align_of::(),
+ 8usize,
+ concat!("Alignment of ", stringify!(nspire_devinfo__bindgen_ty_1))
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::())).free as *const _ as usize
+ },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo__bindgen_ty_1),
+ "::",
+ stringify!(free)
+ )
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::())).total as *const _ as usize
+ },
+ 8usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo__bindgen_ty_1),
+ "::",
+ stringify!(total)
+ )
+ );
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct nspire_devinfo__bindgen_ty_2 {
+ pub free: u64,
+ pub total: u64,
+}
+#[test]
+fn bindgen_test_layout_nspire_devinfo__bindgen_ty_2() {
+ assert_eq!(
+ ::std::mem::size_of::(),
+ 16usize,
+ concat!("Size of: ", stringify!(nspire_devinfo__bindgen_ty_2))
+ );
+ assert_eq!(
+ ::std::mem::align_of::(),
+ 8usize,
+ concat!("Alignment of ", stringify!(nspire_devinfo__bindgen_ty_2))
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::())).free as *const _ as usize
+ },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo__bindgen_ty_2),
+ "::",
+ stringify!(free)
+ )
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::())).total as *const _ as usize
+ },
+ 8usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo__bindgen_ty_2),
+ "::",
+ stringify!(total)
+ )
+ );
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct nspire_devinfo__bindgen_ty_3 {
+ pub major: u8,
+ pub minor: u8,
+ pub build: u16,
+}
+#[test]
+fn bindgen_test_layout_nspire_devinfo__bindgen_ty_3() {
+ assert_eq!(
+ ::std::mem::size_of::(),
+ 4usize,
+ concat!("Size of: ", stringify!(nspire_devinfo__bindgen_ty_3))
+ );
+ assert_eq!(
+ ::std::mem::align_of::(),
+ 2usize,
+ concat!("Alignment of ", stringify!(nspire_devinfo__bindgen_ty_3))
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::())).major as *const _ as usize
+ },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo__bindgen_ty_3),
+ "::",
+ stringify!(major)
+ )
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::())).minor as *const _ as usize
+ },
+ 1usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo__bindgen_ty_3),
+ "::",
+ stringify!(minor)
+ )
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::())).build as *const _ as usize
+ },
+ 2usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo__bindgen_ty_3),
+ "::",
+ stringify!(build)
+ )
+ );
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct nspire_devinfo__bindgen_ty_4 {
+ pub status: nspire_battery,
+ pub is_charging: u8,
+}
+#[test]
+fn bindgen_test_layout_nspire_devinfo__bindgen_ty_4() {
+ assert_eq!(
+ ::std::mem::size_of::(),
+ 8usize,
+ concat!("Size of: ", stringify!(nspire_devinfo__bindgen_ty_4))
+ );
+ assert_eq!(
+ ::std::mem::align_of::(),
+ 4usize,
+ concat!("Alignment of ", stringify!(nspire_devinfo__bindgen_ty_4))
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::())).status as *const _ as usize
+ },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo__bindgen_ty_4),
+ "::",
+ stringify!(status)
+ )
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::())).is_charging as *const _
+ as usize
+ },
+ 4usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo__bindgen_ty_4),
+ "::",
+ stringify!(is_charging)
+ )
+ );
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct nspire_devinfo__bindgen_ty_5 {
+ pub width: u16,
+ pub height: u16,
+ pub bbp: u8,
+ pub sample_mode: u8,
+}
+#[test]
+fn bindgen_test_layout_nspire_devinfo__bindgen_ty_5() {
+ assert_eq!(
+ ::std::mem::size_of::(),
+ 6usize,
+ concat!("Size of: ", stringify!(nspire_devinfo__bindgen_ty_5))
+ );
+ assert_eq!(
+ ::std::mem::align_of::(),
+ 2usize,
+ concat!("Alignment of ", stringify!(nspire_devinfo__bindgen_ty_5))
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::())).width as *const _ as usize
+ },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo__bindgen_ty_5),
+ "::",
+ stringify!(width)
+ )
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::())).height as *const _ as usize
+ },
+ 2usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo__bindgen_ty_5),
+ "::",
+ stringify!(height)
+ )
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::())).bbp as *const _ as usize
+ },
+ 4usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo__bindgen_ty_5),
+ "::",
+ stringify!(bbp)
+ )
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::())).sample_mode as *const _
+ as usize
+ },
+ 5usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo__bindgen_ty_5),
+ "::",
+ stringify!(sample_mode)
+ )
+ );
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct nspire_devinfo__bindgen_ty_6 {
+ pub file: [::std::os::raw::c_char; 8usize],
+ pub os: [::std::os::raw::c_char; 8usize],
+}
+#[test]
+fn bindgen_test_layout_nspire_devinfo__bindgen_ty_6() {
+ assert_eq!(
+ ::std::mem::size_of::(),
+ 16usize,
+ concat!("Size of: ", stringify!(nspire_devinfo__bindgen_ty_6))
+ );
+ assert_eq!(
+ ::std::mem::align_of::(),
+ 1usize,
+ concat!("Alignment of ", stringify!(nspire_devinfo__bindgen_ty_6))
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::())).file as *const _ as usize
+ },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo__bindgen_ty_6),
+ "::",
+ stringify!(file)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).os as *const _ as usize },
+ 8usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo__bindgen_ty_6),
+ "::",
+ stringify!(os)
+ )
+ );
+}
+#[test]
+fn bindgen_test_layout_nspire_devinfo() {
+ assert_eq!(
+ ::std::mem::size_of::(),
+ 136usize,
+ concat!("Size of: ", stringify!(nspire_devinfo))
+ );
+ assert_eq!(
+ ::std::mem::align_of::(),
+ 8usize,
+ concat!("Alignment of ", stringify!(nspire_devinfo))
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).storage as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo),
+ "::",
+ stringify!(storage)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).ram as *const _ as usize },
+ 16usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo),
+ "::",
+ stringify!(ram)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).versions as *const _ as usize },
+ 32usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo),
+ "::",
+ stringify!(versions)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).hw_type as *const _ as usize },
+ 44usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo),
+ "::",
+ stringify!(hw_type)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).batt as *const _ as usize },
+ 48usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo),
+ "::",
+ stringify!(batt)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).clock_speed as *const _ as usize },
+ 56usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo),
+ "::",
+ stringify!(clock_speed)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).lcd as *const _ as usize },
+ 58usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo),
+ "::",
+ stringify!(lcd)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).extensions as *const _ as usize },
+ 64usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo),
+ "::",
+ stringify!(extensions)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).device_name as *const _ as usize },
+ 80usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo),
+ "::",
+ stringify!(device_name)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).electronic_id as *const _ as usize },
+ 100usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo),
+ "::",
+ stringify!(electronic_id)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).runlevel as *const _ as usize },
+ 128usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_devinfo),
+ "::",
+ stringify!(runlevel)
+ )
+ );
+}
+extern "C" {
+ pub fn nspire_device_info(
+ handle: *mut nspire_handle_t,
+ i: *mut nspire_devinfo,
+ ) -> ::std::os::raw::c_int;
+}
+pub type nspire_callback =
+ ::std::option::Option;
+extern "C" {
+ pub fn nspire_file_write(
+ arg1: *mut nspire_handle_t,
+ arg2: *const ::std::os::raw::c_char,
+ arg3: *mut ::std::os::raw::c_void,
+ arg4: usize,
+ cb: nspire_callback,
+ cb_data: *mut ::std::os::raw::c_void,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn nspire_file_read(
+ handle: *mut nspire_handle_t,
+ path: *const ::std::os::raw::c_char,
+ data: *mut ::std::os::raw::c_void,
+ size: usize,
+ read_bytes: *mut usize,
+ cb: nspire_callback,
+ cb_data: *mut ::std::os::raw::c_void,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn nspire_file_move(
+ handle: *mut nspire_handle_t,
+ src: *const ::std::os::raw::c_char,
+ dst: *const ::std::os::raw::c_char,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn nspire_file_copy(
+ handle: *mut nspire_handle_t,
+ src: *const ::std::os::raw::c_char,
+ dst: *const ::std::os::raw::c_char,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn nspire_file_delete(
+ handle: *mut nspire_handle_t,
+ path: *const ::std::os::raw::c_char,
+ ) -> ::std::os::raw::c_int;
+}
+pub const nspire_dir_type_NSPIRE_FILE: nspire_dir_type = 0;
+pub const nspire_dir_type_NSPIRE_DIR: nspire_dir_type = 1;
+pub type nspire_dir_type = ::std::os::raw::c_uint;
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct nspire_dir_item {
+ pub name: [::std::os::raw::c_char; 240usize],
+ pub size: u64,
+ pub date: u64,
+ pub type_: nspire_dir_type,
+}
+#[test]
+fn bindgen_test_layout_nspire_dir_item() {
+ assert_eq!(
+ ::std::mem::size_of::(),
+ 264usize,
+ concat!("Size of: ", stringify!(nspire_dir_item))
+ );
+ assert_eq!(
+ ::std::mem::align_of::(),
+ 8usize,
+ concat!("Alignment of ", stringify!(nspire_dir_item))
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).name as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_dir_item),
+ "::",
+ stringify!(name)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).size as *const _ as usize },
+ 240usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_dir_item),
+ "::",
+ stringify!(size)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).date as *const _ as usize },
+ 248usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_dir_item),
+ "::",
+ stringify!(date)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize },
+ 256usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_dir_item),
+ "::",
+ stringify!(type_)
+ )
+ );
+}
+#[repr(C)]
+pub struct nspire_dir_info {
+ pub num: u64,
+ pub items: __IncompleteArrayField,
+}
+#[test]
+fn bindgen_test_layout_nspire_dir_info() {
+ assert_eq!(
+ ::std::mem::size_of::(),
+ 8usize,
+ concat!("Size of: ", stringify!(nspire_dir_info))
+ );
+ assert_eq!(
+ ::std::mem::align_of::(),
+ 8usize,
+ concat!("Alignment of ", stringify!(nspire_dir_info))
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).num as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_dir_info),
+ "::",
+ stringify!(num)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).items as *const _ as usize },
+ 8usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_dir_info),
+ "::",
+ stringify!(items)
+ )
+ );
+}
+extern "C" {
+ pub fn nspire_dirlist(
+ arg1: *mut nspire_handle_t,
+ arg2: *const ::std::os::raw::c_char,
+ arg3: *mut *mut nspire_dir_info,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn nspire_dirlist_free(d: *mut nspire_dir_info);
+}
+extern "C" {
+ pub fn nspire_dir_create(
+ handle: *mut nspire_handle_t,
+ path: *const ::std::os::raw::c_char,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn nspire_dir_delete(
+ handle: *mut nspire_handle_t,
+ path: *const ::std::os::raw::c_char,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn nspire_attr(
+ arg1: *mut nspire_handle_t,
+ arg2: *const ::std::os::raw::c_char,
+ arg3: *mut nspire_dir_item,
+ ) -> ::std::os::raw::c_int;
+}
+pub const NSPIRE_ERR_SUCCESS: ::std::os::raw::c_uint = 0;
+pub const NSPIRE_ERR_TIMEOUT: ::std::os::raw::c_uint = 1;
+pub const NSPIRE_ERR_NOMEM: ::std::os::raw::c_uint = 2;
+pub const NSPIRE_ERR_INVALID: ::std::os::raw::c_uint = 3;
+pub const NSPIRE_ERR_LIBUSB: ::std::os::raw::c_uint = 4;
+pub const NSPIRE_ERR_NODEVICE: ::std::os::raw::c_uint = 5;
+pub const NSPIRE_ERR_INVALPKT: ::std::os::raw::c_uint = 6;
+pub const NSPIRE_ERR_NACK: ::std::os::raw::c_uint = 7;
+pub const NSPIRE_ERR_BUSY: ::std::os::raw::c_uint = 8;
+pub const NSPIRE_ERR_EXISTS: ::std::os::raw::c_uint = 9;
+pub const NSPIRE_ERR_NONEXIST: ::std::os::raw::c_uint = 10;
+pub const NSPIRE_ERR_OSFAILED: ::std::os::raw::c_uint = 11;
+pub const NSPIRE_ERR_MAX: ::std::os::raw::c_uint = 12;
+pub type _bindgen_ty_5 = ::std::os::raw::c_uint;
+extern "C" {
+ pub fn nspire_strerror(error: ::std::os::raw::c_int) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn nspire_os_send(
+ handle: *mut nspire_handle_t,
+ data: *mut ::std::os::raw::c_void,
+ size: usize,
+ cb: nspire_callback,
+ cb_data: *mut ::std::os::raw::c_void,
+ ) -> ::std::os::raw::c_int;
+}
+#[repr(C)]
+#[derive(Debug)]
+pub struct nspire_image {
+ pub width: u16,
+ pub height: u16,
+ pub bbp: u8,
+ pub data: __IncompleteArrayField<::std::os::raw::c_uchar>,
+}
+#[test]
+fn bindgen_test_layout_nspire_image() {
+ assert_eq!(
+ ::std::mem::size_of::(),
+ 6usize,
+ concat!("Size of: ", stringify!(nspire_image))
+ );
+ assert_eq!(
+ ::std::mem::align_of::(),
+ 2usize,
+ concat!("Alignment of ", stringify!(nspire_image))
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).width as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_image),
+ "::",
+ stringify!(width)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::())).height as *const _ as usize },
+ 2usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(nspire_image),
+ "::",
+ stringify!(height)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::