From 5c5aa88507686afb80428def71971353d7846962 Mon Sep 17 00:00:00 2001 From: RTSDA Date: Thu, 6 Feb 2025 00:12:04 -0500 Subject: [PATCH] Initial commit: Beacon digital signage application --- .gitignore | 25 + Cargo.lock | 6043 ++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 40 + README.md | 53 + beacon.desktop | 11 + digital-sign.desktop | 9 + icons/icon_128.png | Bin 0 -> 27117 bytes icons/icon_256.png | Bin 0 -> 90702 bytes icons/icon_32.png | Bin 0 -> 3343 bytes icons/icon_64.png | Bin 0 -> 8620 bytes install.sh | 30 + src/config.rs | 50 + src/main.rs | 663 +++++ src/pocketbase.rs | 92 + 14 files changed, 7016 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 beacon.desktop create mode 100644 digital-sign.desktop create mode 100644 icons/icon_128.png create mode 100644 icons/icon_256.png create mode 100644 icons/icon_32.png create mode 100644 icons/icon_64.png create mode 100755 install.sh create mode 100644 src/config.rs create mode 100644 src/main.rs create mode 100644 src/pocketbase.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..458b80a --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Generated by Cargo +/target/ +**/*.rs.bk + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +# Cargo.lock + +# IDE specific files +.idea/ +.vscode/ +*.swp +*.swo + +# Config files that might contain sensitive information +config.toml +config.json + +# macOS specific +.DS_Store + +# Backup files +*.bak +*.backup +*~ diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..3f16fd4 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,6043 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ab_glyph" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom 0.2.15", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android-activity" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" +dependencies = [ + "android-properties", + "bitflags 2.8.0", + "cc", + "cesu8", + "jni", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys 0.6.0+11769913", + "num_enum", + "thiserror 1.0.69", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[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 = "anyhow" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + +[[package]] +name = "ashpd" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9c39d707614dbcc6bed00015539f488d8e3fe3e66ed60961efc0c90f4b380b3" +dependencies = [ + "async-fs", + "async-net", + "enumflags2", + "futures-channel", + "futures-util", + "rand", + "serde", + "serde_repr", + "url", + "zbus", +] + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener 5.4.0", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "slab", +] + +[[package]] +name = "async-fs" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" +dependencies = [ + "async-lock", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.3.1", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", +] + +[[package]] +name = "async-io" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.4.0", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-net" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" +dependencies = [ + "async-io", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-process" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +dependencies = [ + "async-channel 2.3.1", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener 5.4.0", + "futures-lite", + "rustix", + "tracing", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-signal" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-std" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c634475f29802fde2b8f0b505b1bd00dfe4df7d4a000f0b36f7671197d5c3615" +dependencies = [ + "async-channel 1.9.0", + "async-global-executor", + "async-io", + "async-lock", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "beacon" +version = "0.1.0" +dependencies = [ + "anyhow", + "chrono", + "config", + "dirs", + "html2text", + "iced", + "infer", + "once_cell", + "reqwest", + "ril", + "serde", + "serde_json", + "tokio", + "toml", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +dependencies = [ + "serde", +] + +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel 2.3.1", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "built" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "by_address" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" + +[[package]] +name = "bytemuck" +version = "1.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "bytes" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.8.0", + "log", + "polling", + "rustix", + "slab", + "thiserror 1.0.69", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop", + "rustix", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "cc" +version = "1.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4730490333d58093109dc02c23174c3f4d490998c3fed3cc8e82d57afedb9cf" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +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.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[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" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-targets 0.52.6", +] + +[[package]] +name = "clipboard-win" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" +dependencies = [ + "error-code", +] + +[[package]] +name = "clipboard_macos" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7f4aaa047ba3c3630b080bb9860894732ff23e2aee290a418909aa6d5df38f" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-foundation", +] + +[[package]] +name = "clipboard_wayland" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003f886bc4e2987729d10c1db3424e7f80809f3fc22dbc16c685738887cb37b8" +dependencies = [ + "smithay-clipboard", +] + +[[package]] +name = "clipboard_x11" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4274ea815e013e0f9f04a2633423e14194e408a0576c943ce3d14ca56c50031c" +dependencies = [ + "thiserror 1.0.69", + "x11rb", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "colorgrad" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a5f405d474b9d05e0a093d3120e77e9bf26461b57a84b40aa2a221ac5617fb6" +dependencies = [ + "csscolorparser", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "config" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68578f196d2a33ff61b27fae256c3164f65e36382648e30666dde05b8cc9dfdf" +dependencies = [ + "async-trait", + "convert_case", + "json5", + "nom", + "pathdiff", + "ron", + "rust-ini", + "serde", + "serde_json", + "toml", + "yaml-rust2", +] + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.15", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "foreign-types 0.5.0", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" +dependencies = [ + "bitflags 2.8.0", + "core-foundation 0.10.0", + "core-graphics-types 0.2.0", + "foreign-types 0.5.0", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.8.0", + "core-foundation 0.10.0", + "libc", +] + +[[package]] +name = "cosmic-text" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fd57d82eb4bfe7ffa9b1cec0c05e2fd378155b47f255a67983cb4afe0e80c2" +dependencies = [ + "bitflags 2.8.0", + "fontdb", + "log", + "rangemap", + "rayon", + "rustc-hash 1.1.0", + "rustybuzz", + "self_cell", + "swash", + "sys-locale", + "ttf-parser 0.21.1", + "unicode-bidi", + "unicode-linebreak", + "unicode-script", + "unicode-segmentation", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "csscolorparser" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" + +[[package]] +name = "ctor-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f791803201ab277ace03903de1594460708d2d54df6053f2d9e82f592b19e3b" + +[[package]] +name = "cursor-icon" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" + +[[package]] +name = "dark-light" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e1a09f280e29a8b00bc7e81eca5ac87dca0575639c9422a5fa25a07bb884b8" +dependencies = [ + "ashpd", + "async-std", + "objc2", + "objc2-foundation", + "web-sys", + "winreg 0.52.0", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + +[[package]] +name = "dlv-list" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" +dependencies = [ + "const-random", +] + +[[package]] +name = "document-features" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" +dependencies = [ + "litrs", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dpi" +version = "0.1.1" +source = "git+https://github.com/iced-rs/winit.git?rev=11414b6aa45699f038114e61b4ddf5102b2d3b4b#11414b6aa45699f038114e61b4ddf5102b2d3b4b" + +[[package]] +name = "drm" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98888c4bbd601524c11a7ed63f814b8825f420514f78e96f752c437ae9cbb5d1" +dependencies = [ + "bitflags 2.8.0", + "bytemuck", + "drm-ffi", + "drm-fourcc", + "rustix", +] + +[[package]] +name = "drm-ffi" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97c98727e48b7ccb4f4aea8cfe881e5b07f702d17b7875991881b41af7278d53" +dependencies = [ + "drm-sys", + "rustix", +] + +[[package]] +name = "drm-fourcc" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4" + +[[package]] +name = "drm-sys" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd39dde40b6e196c2e8763f23d119ddb1a8714534bf7d77fa97a65b0feda3986" +dependencies = [ + "libc", + "linux-raw-sys 0.6.5", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[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 = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + +[[package]] +name = "enumflags2" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "error-code" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" + +[[package]] +name = "etagere" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc89bf99e5dc15954a60f707c1e09d7540e5cd9af85fa75caa0b510bc08c5342" +dependencies = [ + "euclid", + "svg_fmt", +] + +[[package]] +name = "euclid" +version = "0.22.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" +dependencies = [ + "num-traits", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +dependencies = [ + "event-listener 5.4.0", + "pin-project-lite", +] + +[[package]] +name = "exr" +version = "1.73.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + +[[package]] +name = "fast-srgb8" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" + +[[package]] +name = "fast_image_resize" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ca4b58827213977eabab8ee8d8258db8441338f3a1832a1c0f2de3372175531" +dependencies = [ + "cfg-if", + "document-features", + "num-traits", + "thiserror 1.0.69", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "flate2" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + +[[package]] +name = "font-types" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3971f9a5ca983419cdc386941ba3b9e1feba01a0ab888adf78739feb2798492" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "fontconfig-parser" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1fcfcd44ca6e90c921fee9fa665d530b21ef1327a4c1a6c5250ea44b776ada7" +dependencies = [ + "roxmltree", +] + +[[package]] +name = "fontdb" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0299020c3ef3f60f526a4f64ab4a3d4ce116b1acbf24cdd22da0068e5d81dc3" +dependencies = [ + "fontconfig-parser", + "log", + "memmap2", + "slotmap", + "tinyvec", + "ttf-parser 0.20.0", +] + +[[package]] +name = "fontdue" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0793f5137567643cf65ea42043a538804ff0fbf288649e2141442b602d81f9bc" +dependencies = [ + "hashbrown 0.13.2", + "ttf-parser 0.15.2", +] + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + +[[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 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[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.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", + "num_cpus", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-lite" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.5", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "gif" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glam" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "glow" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "glyphon" +version = "0.5.0" +source = "git+https://github.com/hecrj/glyphon.git?rev=09712a70df7431e9a3b1ac1bbd4fb634096cb3b4#09712a70df7431e9a3b1ac1bbd4fb634096cb3b4" +dependencies = [ + "cosmic-text", + "etagere", + "lru", + "rustc-hash 2.1.1", + "wgpu", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.8.0", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.8.0", +] + +[[package]] +name = "gpu-allocator" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" +dependencies = [ + "log", + "presser", + "thiserror 1.0.69", + "windows 0.58.0", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" +dependencies = [ + "bitflags 2.8.0", + "gpu-descriptor-types", + "hashbrown 0.15.2", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.8.0", +] + +[[package]] +name = "guillotiere" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782" +dependencies = [ + "euclid", + "svg_fmt", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashlink" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "html2text" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "042a9677c258ac2952dd026bb0cd21972f00f644a5a38f5a215cb22cdaf6834e" +dependencies = [ + "html5ever", + "markup5ever", + "tendril", + "thiserror 1.0.69", + "unicode-width", +] + +[[package]] +name = "html5ever" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13771afe0e6e846f1e67d038d4cb29998a6779f93c809212e4e9c32efd244d4" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core 0.52.0", +] + +[[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 = "iced" +version = "0.14.0-dev" +source = "git+https://github.com/iced-rs/iced.git#4bbb5cbc1f8b2a0ee8e09be18071368df3ba5bbd" +dependencies = [ + "iced_core", + "iced_futures", + "iced_renderer", + "iced_widget", + "iced_winit", + "image", + "thiserror 1.0.69", +] + +[[package]] +name = "iced_core" +version = "0.14.0-dev" +source = "git+https://github.com/iced-rs/iced.git#4bbb5cbc1f8b2a0ee8e09be18071368df3ba5bbd" +dependencies = [ + "bitflags 2.8.0", + "bytes", + "dark-light", + "glam", + "lilt", + "log", + "num-traits", + "palette", + "rustc-hash 2.1.1", + "smol_str", + "thiserror 1.0.69", + "web-time", +] + +[[package]] +name = "iced_futures" +version = "0.14.0-dev" +source = "git+https://github.com/iced-rs/iced.git#4bbb5cbc1f8b2a0ee8e09be18071368df3ba5bbd" +dependencies = [ + "futures", + "iced_core", + "log", + "rustc-hash 2.1.1", + "tokio", + "wasm-bindgen-futures", + "wasm-timer", +] + +[[package]] +name = "iced_graphics" +version = "0.14.0-dev" +source = "git+https://github.com/iced-rs/iced.git#4bbb5cbc1f8b2a0ee8e09be18071368df3ba5bbd" +dependencies = [ + "bitflags 2.8.0", + "bytemuck", + "cosmic-text", + "half", + "iced_core", + "iced_futures", + "image", + "kamadak-exif", + "log", + "raw-window-handle", + "rustc-hash 2.1.1", + "thiserror 1.0.69", + "unicode-segmentation", +] + +[[package]] +name = "iced_renderer" +version = "0.14.0-dev" +source = "git+https://github.com/iced-rs/iced.git#4bbb5cbc1f8b2a0ee8e09be18071368df3ba5bbd" +dependencies = [ + "iced_graphics", + "iced_tiny_skia", + "iced_wgpu", + "log", + "thiserror 1.0.69", +] + +[[package]] +name = "iced_runtime" +version = "0.14.0-dev" +source = "git+https://github.com/iced-rs/iced.git#4bbb5cbc1f8b2a0ee8e09be18071368df3ba5bbd" +dependencies = [ + "bytes", + "iced_core", + "iced_futures", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "iced_tiny_skia" +version = "0.14.0-dev" +source = "git+https://github.com/iced-rs/iced.git#4bbb5cbc1f8b2a0ee8e09be18071368df3ba5bbd" +dependencies = [ + "bytemuck", + "cosmic-text", + "iced_graphics", + "kurbo", + "log", + "rustc-hash 2.1.1", + "softbuffer", + "tiny-skia", +] + +[[package]] +name = "iced_wgpu" +version = "0.14.0-dev" +source = "git+https://github.com/iced-rs/iced.git#4bbb5cbc1f8b2a0ee8e09be18071368df3ba5bbd" +dependencies = [ + "bitflags 2.8.0", + "bytemuck", + "futures", + "glam", + "glyphon", + "guillotiere", + "iced_graphics", + "log", + "rustc-hash 2.1.1", + "thiserror 1.0.69", + "wgpu", +] + +[[package]] +name = "iced_widget" +version = "0.14.0-dev" +source = "git+https://github.com/iced-rs/iced.git#4bbb5cbc1f8b2a0ee8e09be18071368df3ba5bbd" +dependencies = [ + "iced_renderer", + "iced_runtime", + "log", + "num-traits", + "rustc-hash 2.1.1", + "thiserror 1.0.69", + "unicode-segmentation", +] + +[[package]] +name = "iced_winit" +version = "0.14.0-dev" +source = "git+https://github.com/iced-rs/iced.git#4bbb5cbc1f8b2a0ee8e09be18071368df3ba5bbd" +dependencies = [ + "iced_futures", + "iced_graphics", + "iced_runtime", + "log", + "rustc-hash 2.1.1", + "sysinfo", + "thiserror 1.0.69", + "tracing", + "wasm-bindgen-futures", + "web-sys", + "window_clipboard", + "winit", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "image" +version = "0.25.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", + "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" + +[[package]] +name = "indexmap" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", +] + +[[package]] +name = "infer" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb33622da908807a06f9513c19b3c1ad50fab3e4137d82a78107d502075aa199" +dependencies = [ + "cfb", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[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", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" +dependencies = [ + "rayon", +] + +[[package]] +name = "jpeg-encoder" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fefe5a4fb12fa836172dc53cc36c37af693f6197ae702f931faad8774caf926" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + +[[package]] +name = "kamadak-exif" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4fc70d0ab7e5b6bafa30216a6b48705ea964cdfc29c050f2412295eba58077" +dependencies = [ + "mutate_once", +] + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "kurbo" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1618d4ebd923e97d67e7cd363d80aef35fe961005cbbbb3d2dad8bdd1bc63440" +dependencies = [ + "arrayvec", + "smallvec", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + +[[package]] +name = "libc" +version = "0.2.169" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + +[[package]] +name = "libfuzzer-sys" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" +dependencies = [ + "arbitrary", + "cc", +] + +[[package]] +name = "libloading" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.8.0", + "libc", + "redox_syscall 0.5.8", +] + +[[package]] +name = "libwebp-sys2" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3196c90eb6895d0b6b9520bcc942afa0daf836f928bee77035cc78d4fa1ca163" +dependencies = [ + "cc", + "cfg-if", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "lilt" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ab94c7e69044511f79ce4b4201a49324b7f5b35410f862264e044690b950a67" +dependencies = [ + "web-time", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" + +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + +[[package]] +name = "litrs" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +dependencies = [ + "value-bag", +] + +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "markup5ever" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16ce3abbeba692c8b8441d036ef91aea6df8da2c6b6e21c7e14d3c18e526be45" +dependencies = [ + "log", + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memmap2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.8.0", + "block", + "core-graphics-types 0.1.3", + "foreign-types 0.5.0", + "log", + "objc", + "paste", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "mutate_once" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16cf681a23b4d0a43fc35024c176437f9dcd818db34e0f42ab456a0ee5ad497b" + +[[package]] +name = "naga" +version = "23.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "364f94bc34f61332abebe8cad6f6cd82a5b65cff22c828d05d0968911462ca4f" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.8.0", + "cfg_aliases 0.1.1", + "codespan-reporting", + "hexf-parse", + "indexmap", + "log", + "rustc-hash 1.1.0", + "spirv", + "termcolor", + "thiserror 1.0.69", + "unicode-xid", +] + +[[package]] +name = "native-tls" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.8.0", + "jni-sys", + "log", + "ndk-sys 0.6.0+11769913", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.8.0", + "cfg-if", + "cfg_aliases 0.2.1", + "libc", + "memoffset", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[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-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "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 = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.8.0", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.8.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.8.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2", + "objc2", + "objc2-contacts", + "objc2-foundation", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.8.0", + "block2", + "dispatch", + "libc", + "objc2", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.8.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.8.0", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.8.0", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.8.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "openssl" +version = "0.10.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" +dependencies = [ + "bitflags 2.8.0", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "orbclient" +version = "0.3.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" +dependencies = [ + "libredox", +] + +[[package]] +name = "ordered-multimap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" +dependencies = [ + "dlv-list", + "hashbrown 0.14.5", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "owned_ttf_parser" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" +dependencies = [ + "ttf-parser 0.25.1", +] + +[[package]] +name = "palette" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbf71184cc5ecc2e4e1baccdb21026c20e5fc3dcf63028a086131b3ab00b6e6" +dependencies = [ + "approx", + "fast-srgb8", + "palette_derive", + "phf", +] + +[[package]] +name = "palette_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5030daf005bface118c096f510ffb781fc28f9ab6a32ab224d8631be6851d30" +dependencies = [ + "by_address", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.10", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.8", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" +dependencies = [ + "memchr", + "thiserror 2.0.11", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit 0.22.23", +] + +[[package]] +name = "proc-macro2" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quick-xml" +version = "0.37.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "range-alloc" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" + +[[package]] +name = "rangemap" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" + +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror 1.0.69", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "read-fonts" +version = "0.22.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69aacb76b5c29acfb7f90155d39759a29496aebb49395830e928a9703d2eec2f" +dependencies = [ + "bytemuck", + "font-types", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +dependencies = [ + "bitflags 2.8.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.15", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg 0.50.0", +] + +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" + +[[package]] +name = "ril" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be4e1fa2abf98b455940fe5a1c1574f8ff0e2fd1586efc92d078d2b87bc14bd" +dependencies = [ + "color_quant", + "colorgrad", + "fast_image_resize", + "fontdue", + "gif", + "jpeg-decoder", + "jpeg-encoder", + "libwebp-sys2", + "num-traits", + "png", +] + +[[package]] +name = "ron" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" +dependencies = [ + "base64", + "bitflags 2.8.0", + "serde", + "serde_derive", +] + +[[package]] +name = "roxmltree" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" + +[[package]] +name = "rust-ini" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e0698206bcb8882bf2a9ecb4c1e7785db57ff052297085a6efd4fe42302068a" +dependencies = [ + "cfg-if", + "ordered-multimap", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.8.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64", +] + +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + +[[package]] +name = "rustybuzz" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" +dependencies = [ + "bitflags 2.8.0", + "bytemuck", + "libm", + "smallvec", + "ttf-parser 0.21.1", + "unicode-bidi-mirroring", + "unicode-ccc", + "unicode-properties", + "unicode-script", +] + +[[package]] +name = "ryu" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sctk-adwaita" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" +dependencies = [ + "ab_glyph", + "log", + "memmap2", + "smithay-client-toolkit", + "tiny-skia", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.8.0", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "self_cell" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2fdfc24bc566f839a2da4c4295b82db7d25a24253867d5c64355abb5799bdbe" + +[[package]] +name = "serde" +version = "1.0.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.138" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "skrifa" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1c44ad1f6c5bdd4eefed8326711b7dbda9ea45dfd36068c427d332aa382cbe" +dependencies = [ + "bytemuck", + "read-fonts", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "smithay-client-toolkit" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +dependencies = [ + "bitflags 2.8.0", + "calloop", + "calloop-wayland-source", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix", + "thiserror 1.0.69", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-clipboard" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc8216eec463674a0e90f29e0ae41a4db573ec5b56b1c6c1c71615d249b6d846" +dependencies = [ + "libc", + "smithay-client-toolkit", + "wayland-backend", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "softbuffer" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" +dependencies = [ + "as-raw-xcb-connection", + "bytemuck", + "cfg_aliases 0.2.1", + "core-graphics 0.24.0", + "drm", + "fastrand", + "foreign-types 0.5.0", + "js-sys", + "log", + "memmap2", + "objc2", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall 0.5.8", + "rustix", + "tiny-xlib", + "wasm-bindgen", + "wayland-backend", + "wayland-client", + "wayland-sys", + "web-sys", + "windows-sys 0.59.0", + "x11rb", +] + +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.8.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" + +[[package]] +name = "string_cache" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "938d512196766101d333398efde81bc1f37b00cb42c2f8350e5df639f040bbbe" +dependencies = [ + "new_debug_unreachable", + "parking_lot 0.12.3", + "phf_shared", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "244292f3441c89febe5b5bdfbb6863aeaf4f64da810ea3050fd927b27b8d92ce" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", +] + +[[package]] +name = "svg_fmt" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce5d813d71d82c4cbc1742135004e4a79fd870214c155443451c139c9470a0aa" + +[[package]] +name = "swash" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbd59f3f359ddd2c95af4758c18270eddd9c730dde98598023cdabff472c2ca2" +dependencies = [ + "skrifa", + "yazi", + "zeno", +] + +[[package]] +name = "syn" +version = "2.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sys-locale" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" +dependencies = [ + "libc", +] + +[[package]] +name = "sysinfo" +version = "0.30.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" +dependencies = [ + "cfg-if", + "core-foundation-sys", + "libc", + "ntapi", + "once_cell", + "rayon", + "windows 0.52.0", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tempfile" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" +dependencies = [ + "cfg-if", + "fastrand", + "getrandom 0.3.1", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +dependencies = [ + "thiserror-impl 2.0.11", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "png", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tiny-xlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0324504befd01cab6e0c994f34b2ffa257849ee019d3fb3b64fb2c858887d89e" +dependencies = [ + "as-raw-xcb-connection", + "ctor-lite", + "libloading", + "pkg-config", + "tracing", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot 0.12.3", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.23", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.7.1", +] + +[[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.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "ttf-parser" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd" + +[[package]] +name = "ttf-parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" + +[[package]] +name = "ttf-parser" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset", + "tempfile", + "winapi", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-bidi-mirroring" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cb788ffebc92c5948d0e997106233eeb1d8b9512f93f41651f52b6c5f5af86" + +[[package]] +name = "unicode-ccc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" + +[[package]] +name = "unicode-ident" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" + +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + +[[package]] +name = "unicode-script" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb421b350c9aff471779e262955939f565ec18b86c15364e6bdf0d662ca7c1f" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-width" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0" + +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "value-bag" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[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 = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-timer" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" +dependencies = [ + "futures", + "js-sys", + "parking_lot 0.11.2", + "pin-utils", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wayland-backend" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7208998eaa3870dad37ec8836979581506e0c5c64c20c9e79e9d2a10d6f47bf" +dependencies = [ + "cc", + "downcast-rs", + "rustix", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f" +dependencies = [ + "bitflags 2.8.0", + "rustix", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.8.0", + "cursor-icon", + "wayland-backend", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a93029cbb6650748881a00e4922b076092a6a08c11e7fbdb923f064b23968c5d" +dependencies = [ + "rustix", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc" +dependencies = [ + "bitflags 2.8.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ccaacc76703fefd6763022ac565b590fcade92202492381c95b2edfdf7d46b3" +dependencies = [ + "bitflags 2.8.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248a02e6f595aad796561fa82d25601bd2c8c3b145b1c7453fc8f94c1a58f8b2" +dependencies = [ + "bitflags 2.8.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + +[[package]] +name = "wgpu" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80f70000db37c469ea9d67defdc13024ddf9a5f1b89cb2941b812ad7cde1735a" +dependencies = [ + "arrayvec", + "cfg_aliases 0.1.1", + "document-features", + "js-sys", + "log", + "naga", + "parking_lot 0.12.3", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d63c3c478de8e7e01786479919c8769f62a22eec16788d8c2ac77ce2c132778a" +dependencies = [ + "arrayvec", + "bit-vec", + "bitflags 2.8.0", + "cfg_aliases 0.1.1", + "document-features", + "indexmap", + "log", + "naga", + "once_cell", + "parking_lot 0.12.3", + "profiling", + "raw-window-handle", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 1.0.69", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-hal" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89364b8a0b211adc7b16aeaf1bd5ad4a919c1154b44c9ce27838213ba05fd821" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 2.8.0", + "block", + "bytemuck", + "cfg_aliases 0.1.1", + "core-graphics-types 0.1.3", + "glow", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal", + "naga", + "ndk-sys 0.5.0+25.2.9519653", + "objc", + "once_cell", + "parking_lot 0.12.3", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 1.0.69", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "windows 0.58.0", + "windows-core 0.58.0", +] + +[[package]] +name = "wgpu-types" +version = "23.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "610f6ff27778148c31093f3b03abc4840f9636d58d597ca2f5977433acfe0068" +dependencies = [ + "bitflags 2.8.0", + "js-sys", + "web-sys", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window_clipboard" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6d692d46038c433f9daee7ad8757e002a4248c20b0a3fbc991d99521d3bcb6d" +dependencies = [ + "clipboard-win", + "clipboard_macos", + "clipboard_wayland", + "clipboard_x11", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[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.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winit" +version = "0.30.8" +source = "git+https://github.com/iced-rs/winit.git?rev=11414b6aa45699f038114e61b4ddf5102b2d3b4b#11414b6aa45699f038114e61b4ddf5102b2d3b4b" +dependencies = [ + "ahash", + "android-activity", + "atomic-waker", + "bitflags 2.8.0", + "block2", + "bytemuck", + "calloop", + "cfg_aliases 0.2.1", + "concurrent-queue", + "core-foundation 0.9.4", + "core-graphics 0.23.2", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "memmap2", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix", + "sctk-adwaita", + "smithay-client-toolkit", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.8.0", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading", + "once_cell", + "rustix", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" + +[[package]] +name = "xcursor" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" + +[[package]] +name = "xdg-home" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.8.0", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xml-rs" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" + +[[package]] +name = "yaml-rust2" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8902160c4e6f2fb145dbe9d6760a75e3c9522d8bf796ed7047c85919ac7115f8" +dependencies = [ + "arraydeque", + "encoding_rs", + "hashlink", +] + +[[package]] +name = "yazi" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c94451ac9513335b5e23d7a8a2b61a7102398b8cca5160829d313e84c9d98be1" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbddd8b6cb25d5d8ec1b23277b45299a98bfb220f1761ca11e186d5c702507f8" +dependencies = [ + "async-broadcast", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener 5.4.0", + "futures-core", + "futures-util", + "hex", + "nix", + "ordered-stream", + "serde", + "serde_repr", + "static_assertions", + "tracing", + "uds_windows", + "windows-sys 0.59.0", + "winnow 0.7.1", + "xdg-home", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dac404d48b4e9cf193c8b49589f3280ceca5ff63519e7e64f55b4cf9c47ce146" +dependencies = [ + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" +dependencies = [ + "serde", + "static_assertions", + "winnow 0.7.1", + "zvariant", +] + +[[package]] +name = "zeno" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd15f8e0dbb966fd9245e7498c7e9e5055d9e5c8b676b95bd67091cd11a1e697" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" +dependencies = [ + "zune-core", +] + +[[package]] +name = "zvariant" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c951c21879c6e1d46ac5adfc34f698fefb465d498cf4ac87545849bd71bb5a" +dependencies = [ + "endi", + "enumflags2", + "serde", + "static_assertions", + "url", + "winnow 0.7.1", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eeb539471af098d9e63faf428c71ac4cd4efe0b5baa3c8a6b991c5f2543b70e" +dependencies = [ + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "static_assertions", + "syn", + "winnow 0.7.1", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..72edb7e --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "beacon" +version = "0.1.0" +edition = "2021" +description = "A modern digital signage application for displaying church events" +authors = ["Benjamin Slingo"] + +[package.metadata.bundle] +name = "Beacon" +identifier = "church.rockvilletollandsda.beacon" +icon = ["icons/icon_256.png", "icons/icon_128.png", "icons/icon_64.png", "icons/icon_32.png"] +version = "1.0.0" +resources = ["icons/*"] +copyright = "© 2024 Rockville Tolland SDA Church" +category = "Office" +short_description = "Digital signage for church events" +long_description = """ +A digital signage application that displays upcoming church events, +announcements, and information in a beautiful and engaging way. +""" + +[dependencies] +tokio = { version = "1.36", features = ["full"] } +iced = { git = "https://github.com/iced-rs/iced.git", features = ["image", "tokio", "advanced", "debug", "system"] } +reqwest = { version = "0.11", features = ["json"] } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +anyhow = "1.0" +chrono = { version = "0.4", features = ["serde"] } +tracing = "0.1" +tracing-subscriber = "0.3" +config = "0.14" +once_cell = "1.19" +html2text = "0.12" +toml = "0.8" +dirs = "5.0" +ril = { version = "0.10", features = ["all"] } +infer = "0.15" +[package.metadata.iced.assets] +icon = "icons/appicon.png" \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..49359df --- /dev/null +++ b/README.md @@ -0,0 +1,53 @@ +# Beacon + +A modern digital signage application for displaying church events, built with Rust and Iced. + +## Features + +- Real-time event display with automatic updates +- Smooth image loading and transitions +- Modern, clean interface design +- Automatic event filtering based on date/time +- Support for high-resolution displays +- Efficient memory management for images + +## Requirements + +- Rust 1.70 or higher +- A running Pocketbase instance with events collection + +## Configuration + +Create a `config.toml` file in the application directory with the following settings: + +```toml +pocketbase_url = "http://your-pocketbase-url" +window_width = 1920 +window_height = 1080 +slide_interval_secs = 10 +refresh_interval_mins = 5 +``` + +## Building + +```bash +cargo build --release +``` + +## Running + +```bash +./target/release/beacon +``` + +## Development + +The application is built using: +- Iced for the UI framework +- Tokio for async runtime +- Reqwest for HTTP requests +- Chrono for date/time handling + +## License + +MIT License \ No newline at end of file diff --git a/beacon.desktop b/beacon.desktop new file mode 100644 index 0000000..01e80be --- /dev/null +++ b/beacon.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Version=1.0 +Type=Application +Name=Beacon +Comment=Digital signage application for church events +Exec=/usr/local/bin/beacon +Icon=beacon +Terminal=false +Categories=Office;Graphics; +Keywords=church;events;signage;display +StartupNotify=true \ No newline at end of file diff --git a/digital-sign.desktop b/digital-sign.desktop new file mode 100644 index 0000000..1bd7c56 --- /dev/null +++ b/digital-sign.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name= Beacon Digital Signage +Comment=Digital signage for church events +Exec=/usr/local/bin/beacon +Icon=appicon.png +Terminal=false +Type=Application +Categories=Office;Graphics; +StartupNotify=true diff --git a/icons/icon_128.png b/icons/icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..c1bcf65e9209cddcd520a045e578533bcedebd42 GIT binary patch literal 27117 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 Hu0mjfJ4=$+ literal 0 HcmV?d00001 diff --git a/icons/icon_32.png b/icons/icon_32.png new file mode 100644 index 0000000000000000000000000000000000000000..cc956b96ce8df80078fcad6e8cd20745ebccf281 GIT binary patch literal 3343 zcmZ`*c|25o7r(M(50PDCN_La6k1@8%l6@&N43BLv#SCLa7$hZ2m>64(lqHmmO30FZ z&61=|UL+pvrXFi~XR5b)pU?B$`}y5-?)RMU`JUhXoj-1hqrIg7uM{r;00P!lNN1)6 zu@*NM^BEo;{fTKf0!{5q0f3=jh3i??&+W|oI0RTuy0)P!Bl&}N<5eETa*&6_0 z`2ZjuTGZ?WX9l9MDC+<_J3xi$a|0Y~A^{rUgL6fZ zPYZX!IFGHQ6a(ja9ETP_*({y>9b%681yZLbleDx zvU3EP6Np%luEs%)gJ1+N2n2!?{R3dmNQ)nI=9>{Xh(rp7K_HQlks6U&8U$h>MAN{) z0CErtfkM@p8S3FD@g$!pb$s}~??wJs2Z;^$BjQ3yI07ETs_WxRh#(n(!7QPl*Y`e2 zxPV_u`0yXwVr~$^ia<0q4nqEkhK<7g3yl@|PW!g6?{aWfF&Nqz8%_w0V6}zNgTlWl z{2%zMzwZRpKM{Th|4wiq;;_t5@=ZbWhrsXHZ~3e~VUD;cY%mIm3&G;USzSSObm5SH zjQpKxP6#FtT|#~Qun4BmH_C6&-?P8zp#N3px5y7B9Kt%c-_G&-kbFa#Q-a`yLw-&i zg15MLAci@!KGsN6R}{|?x0qmRq-0#%P}8lk*WM<|<;tYgl&&xj&fZQl@k_JNQ$BMu zh57mUt)=KiqR^3$?FlQJ~*a_i->L0JYx(p|6s94^Kl7xR?%dX?O_ zc(Oe_G_JD!{mR{z_YB1Qh1D8%uf7af53h&|iZ!8v>?6cJQ`hT9i&gs8lDaag<0xH% zf-9AA=U?|utWHEt09;;!WOr*HSS zMoLczsHXN@PI57bAW}GNgpAkiODQkio~(5aMR;1@MkF7**4|LzTJ4Q*^Jai|KreMJ z=;Of@WROnzFg?+ zg^`m*O1&yR{h9@K*|t|vqSVQ&&dRy5#*^buA8x7U<>DcEgKRq|Zk?@Hpydv_JK@yJ zywJktAIN+6o{vqP&U|OKO`Bd@%XVs%!wDLU7|2t_`NaGz`3LgeG-xhIDnUJYROB)7 zcSbqog`>|t3h3FrZ%0^CGPz#;>%MVq@Ws}&D?3+xM&~oroQ8*oeV2-DfqR6X` z4TZK_N{&j>x%dP5L7s>FNUy0k}zK;%JNs7xo!mb%R< z#I6O$lQ(sGO`n2x7Pk2(H zTeE$SQ5k>gtzl#-VRN7UdUnbD)p z&*4@!Fn62{-NMDTM0E;rFS2Cg08O9xFwxE+?&ZMzVLo`|M&9F=(y2rT$|`!uuVO(& zQq;J-&kY`Qnf4cWVJjutRFn75v9gkThVe}q*~T*6U)gs``ipUuofKlb@^y^jXZ1k9 zA^tUo-14);SW{&cNfD3ip2}+tmnsB3tL4gSEVK-@l@=b{2mnXLgeIkYlS+URxN=Tlyysp+JQ zv4bx6WV_TduDardRriePu#*EG+^2X%tq-f}f9hr{BCqebB`#FD;)z)OSmMw}|JWfA zwQP90j4rz#dn)EEl}}CWrCrCVuH^ByV1vdK;e^vBytXF=fcA2f9n}ezUzL7Fs3v-E zcmH{5CE=E5IUqp2jE85Y>+zasL-3QJ!HX9Q>G`AkCda%J_3doyH5VEM7I}ITDP-RQ zt|^S9n<;1hM$Vkr(cY#Wk-?{~>|FZ=9yMNFjhGOO%!_-`OdZ_0Q_@Cm<&b-=cC|wV zcrdl$&*pEr|h=RMR@=OKw}g=4)1AZO;{k{F6Avsdp$GDeXqUR3 z8p)W`;BqON1h+uWfiwH3Mhy2o5<`JzA(T6dqkKI zOYP{=axO?8zOQ~s$?L7}!mE5WJ)1Q=7USS9BJ^V3F4_F$ zt+CZTz1*oc$lEXWSiAWX%TW>r*(QYngJm-#?Dd5r>1GH8+cPal@nQAc_4E&myKZvn zf$EYhmvxfsZ+Uen*1f48()0OLO22n%(Co=I=jgCjr<&z*Rc`hx9-5A$1fGi!E>wS> zK`-YX%&n}{98GBAT$8R~OS3PVIB$ufnfbmX`O<2kLuEL+qsdH0@rRcE76h^{K>F%( zdLAvR)o%bno?1ULnJ-xJCYxOSg%`e=J7Z9Rn6;^^Jtr`3DSl4Qy&E%0`=e!3F4I*Z zcQT>Pc4h5$_lhUCh|FHUOBv5wQfg^l{-}uv+M_0u+ezSebVWXa1iC7h!6<`LT-a^7 zH^ckOqHf)Z1$8 zV`{^YLgEx7tDx~T!@O%NqwdDG6YYx>nn&EaO3fwf@RAl_8u#2YOS|I#SzyE z{fy(tbIxeXkP0z&E1k{;v~pz?*yLb3XIsk2`?nF(=j?&Dk{jx>*JjN}KddQ=q(<`zDrsf?@>?IWN7kBoC;k^l ChL21D literal 0 HcmV?d00001 diff --git a/icons/icon_64.png b/icons/icon_64.png new file mode 100644 index 0000000000000000000000000000000000000000..42ef3a0a3ada74737ad7eaee2e9c8667b4ae9d47 GIT binary patch literal 8620 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 anyhow::Result { + let config_path = Self::config_path()?; + let contents = fs::read_to_string(config_path)?; + let settings: Settings = toml::from_str(&contents)?; + Ok(settings) + } + + pub fn slide_interval(&self) -> Duration { + Duration::from_secs(self.slide_interval_seconds) + } + + pub fn refresh_interval(&self) -> Duration { + Duration::from_secs(self.refresh_interval_minutes * 60) + } + + fn config_path() -> anyhow::Result { + let mut path = dirs::config_dir() + .ok_or_else(|| anyhow::anyhow!("Could not find config directory"))?; + path.push("digital-sign"); + path.push("config.toml"); + Ok(path) + } +} + +impl Default for Settings { + fn default() -> Self { + Self { + pocketbase_url: String::from("https://pocketbase.rockvilletollandsda.church"), + window_width: 1920, + window_height: 1080, + slide_interval_seconds: 10, + refresh_interval_minutes: 5, + } + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..210befd --- /dev/null +++ b/src/main.rs @@ -0,0 +1,663 @@ +mod config; +mod pocketbase; + +use crate::pocketbase::PocketbaseEvent; +use iced::widget::{column, row, image, container, text}; +use iced::{ + window, Element, + Length, Settings, Subscription, Theme, Task, +}; +use iced::executor; +pub use iced::Program as IcedProgram; +use iced::Color; +use once_cell::sync::Lazy; +use std::time::Instant; +use iced::window::settings::PlatformSpecific; + + + + +static SETTINGS: Lazy = Lazy::new(|| { + config::Settings::new().unwrap_or_else(|e| { + eprintln!("Failed to load config, using defaults: {}", e); + config::Settings::default() + }) +}); + +static POCKETBASE_CLIENT: Lazy = Lazy::new(|| { + pocketbase::PocketbaseClient::new(SETTINGS.pocketbase_url.clone()) +}); + +// Define some constants for styling +const BACKGROUND_COLOR: Color = Color::from_rgb(0.05, 0.05, 0.08); // Slightly blue-tinted dark background +const ACCENT_COLOR: Color = Color::from_rgb(0.45, 0.27, 0.85); // Vibrant purple +const TEXT_COLOR: Color = Color::from_rgb(0.98, 0.98, 1.0); +const SECONDARY_TEXT_COLOR: Color = Color::from_rgb(0.85, 0.85, 0.95); +const CATEGORY_COLOR: Color = Color::from_rgb(0.45, 0.27, 0.85); // Match accent color +const DESCRIPTION_BG_COLOR: Color = Color::from_rgb(0.1, 0.1, 0.15); // Slightly blue-tinted +const TITLE_COLOR: Color = Color::from_rgb(1.0, 1.0, 0.95); // Warm white +const DATE_COLOR: Color = Color::from_rgb(0.95, 0.85, 1.0); // Light purple tint +const TIME_COLOR: Color = Color::from_rgb(0.8, 0.8, 0.95); // Soft purple-grey +const LOCATION_ICON_COLOR: Color = Color::from_rgb(0.6, 0.4, 0.9); // Brighter purple +const IMAGE_BG_COLOR: Color = Color::from_rgb(0.08, 0.08, 0.12); // Slightly lighter than background +const LOADING_FRAMES: [&str; 4] = ["⠋", "⠙", "⠹", "⠸"]; +const MAX_IMAGE_SIZE: u64 = 500 * 1024; // 500KB limit + +#[derive(Debug)] +struct DigitalSign { + events: Vec, + current_event_index: usize, + last_update: Instant, + last_refresh: Instant, + loaded_images: std::collections::HashMap, + loading_frame: usize, + is_fetching: bool, +} + +#[derive(Debug, Clone)] +struct Event { + title: String, + description: String, + start_time: String, + end_time: String, + date: String, + location: String, + //location_url: Option, + image_url: Option, + category: String, + //is_featured: bool, + timestamp: chrono::DateTime, +} + +#[derive(Debug, Clone)] +enum Message { + Tick, + EventsLoaded(Vec), + Error(String), + ImageLoaded(String, image::Handle), +} + +impl IcedProgram for DigitalSign { + type Message = Message; + type Theme = Theme; + type Executor = executor::Default; + type State = Self; + type Renderer = iced::Renderer; + + fn title(&self, _state: &Self::State, _window_id: window::Id) -> String { + String::from("Beacon") + } + + fn update(&self, state: &mut Self::State, message: Message) -> Task { + match message { + Message::Tick => { + let mut tasks = vec![]; + state.loading_frame = (state.loading_frame + 1) % LOADING_FRAMES.len(); + + if state.should_refresh() && !state.is_fetching { + tracing::info!("Refresh needed, starting event fetch"); + state.is_fetching = true; + tasks.push(Task::perform(fetch_events(), Message::handle_result)); + } + + if !state.events.is_empty() + && Instant::now().duration_since(state.last_update) >= SETTINGS.slide_interval() + { + let next_index = (state.current_event_index + 1) % state.events.len(); + tracing::info!("Updating current event index from {} to {}", + state.current_event_index, + next_index + ); + + // Clear all images that aren't needed anymore + let mut urls_to_remove = Vec::new(); + for url in state.loaded_images.keys() { + let is_needed = state.events.iter().any(|e| { + e.image_url.as_ref().map_or(false, |event_url| event_url == url) + }); + if !is_needed { + urls_to_remove.push(url.clone()); + } + } + for url in urls_to_remove { + tracing::info!("Removing unused image: {}", url); + state.loaded_images.remove(&url); + } + + // Update current index and load new image if needed + state.current_event_index = next_index; + state.last_update = Instant::now(); + + if let Some(current_event) = state.events.get(state.current_event_index) { + if let Some(url) = ¤t_event.image_url { + let url_clone = url.clone(); + if !state.loaded_images.contains_key(&url_clone) { + tracing::info!("Starting image load for new current event: {}", url_clone); + let url_for_closure = url_clone.clone(); + tasks.push(Task::perform( + load_image(url_clone), + move |handle| Message::ImageLoaded(url_for_closure.clone(), handle) + )); + } else { + tracing::info!("Image already loaded for current event: {}", url_clone); + } + } + } + } + + if tasks.is_empty() { + Task::none() + } else { + tracing::info!("Dispatching {} tasks", tasks.len()); + Task::batch(tasks) + } + } + Message::EventsLoaded(events) => { + tracing::info!("Events loaded: {} events", events.len()); + + // Clear all existing images as we have a new set of events + state.loaded_images.clear(); + tracing::info!("Cleared all existing images"); + + state.events = events; + state.last_refresh = Instant::now(); + state.is_fetching = false; + + // Load all images in parallel + let mut image_tasks = Vec::new(); + + // First, add the current event's image if it exists + if let Some(event) = state.events.get(state.current_event_index) { + if let Some(url) = &event.image_url { + tracing::info!("Starting immediate load for current image: {}", url); + let url_clone = url.clone(); + image_tasks.push(Task::perform( + load_image(url_clone.clone()), + move |handle| Message::ImageLoaded(url_clone.clone(), handle) + )); + } + } + + // Then queue the rest of the images + for (index, event) in state.events.iter().enumerate() { + if index != state.current_event_index { + if let Some(url) = &event.image_url { + tracing::info!("Queueing image preload for: {}", url); + let url_clone = url.clone(); + image_tasks.push(Task::perform( + load_image(url_clone.clone()), + move |handle| Message::ImageLoaded(url_clone.clone(), handle) + )); + } + } + } + + if !image_tasks.is_empty() { + tracing::info!("Starting load of {} images", image_tasks.len()); + Task::batch(image_tasks) + } else { + Task::none() + } + } + Message::ImageLoaded(url, handle) => { + tracing::info!("Image loaded: {}", url); + state.loaded_images.insert(url, handle); + Task::none() + } + Message::Error(error) => { + tracing::error!("Error: {}", error); + state.is_fetching = false; + Task::none() + } + } + } + + fn view<'a>( + &self, + state: &'a Self::State, + _window_id: window::Id, + ) -> Element<'a, Message, Theme, Self::Renderer> { + let content: Element<'a, Message, Theme, Self::Renderer> = if let Some(event) = state.events.get(state.current_event_index) { + let mut main_column = column![].spacing(40).padding(60).width(Length::Fill); + + // Left column with title and image + let left_column = column![ + // Title with dynamic size and enhanced color + container( + text(&event.title) + .size(if event.title.len() > 50 { 72 } else { 88 }) + .style(|_: &Theme| text::Style { color: Some(TITLE_COLOR), ..Default::default() }) + ) + .width(Length::Fill) + .padding(20), + + // Image container with enhanced styling + container( + if let Some(ref image_url) = event.image_url { + if let Some(handle) = state.loaded_images.get(image_url) { + container( + image::Image::new(handle.clone()) + .width(Length::Fixed(900.0)) + .height(Length::Fixed(600.0)) + ) + .style(|_: &Theme| container::Style { + background: Some(IMAGE_BG_COLOR.into()), + ..Default::default() + }) + } else { + container( + column![ + text(LOADING_FRAMES[state.loading_frame]) + .size(80) + .style(|_: &Theme| text::Style { color: Some(ACCENT_COLOR), ..Default::default() }), + text("Loading image...") + .size(40) + .style(|_: &Theme| text::Style { color: Some(SECONDARY_TEXT_COLOR), ..Default::default() }) + ] + .spacing(20) + .align_x(iced::alignment::Horizontal::Center) + ) + } + } else { + container( + text("No image available") + .size(32) + .style(|_: &Theme| text::Style { color: Some(SECONDARY_TEXT_COLOR), ..Default::default() }) + ) + } + ) + .width(Length::Fixed(900.0)) + .height(Length::Fixed(600.0)) + .style(|_: &Theme| container::Style { + background: Some(IMAGE_BG_COLOR.into()), + ..Default::default() + }) + ] + .spacing(20); + + // Right column with category, date/time, location, and description + let right_column = column![ + // Category badge with gradient-like effect + container( + text(event.category.to_uppercase()) + .size(36) + .style(|_: &Theme| text::Style { color: Some(TEXT_COLOR), ..Default::default() }) + ) + .padding(12) + .style(|_: &Theme| container::Style { + background: Some(CATEGORY_COLOR.into()), + ..Default::default() + }), + + // Date and time with enhanced colors + container( + column![ + text(&event.date) + .size(64) + .style(|_: &Theme| text::Style { color: Some(DATE_COLOR), ..Default::default() }), + text(format!("{} - {}", event.start_time, event.end_time)) + .size(56) + .style(|_: &Theme| text::Style { color: Some(TIME_COLOR), ..Default::default() }) + ] + .spacing(15) + ) + .padding(20), + + // Location with colored icon + if !event.location.is_empty() { + container( + row![ + text("⌾") // Using a more compatible location/target symbol + .size(48) + .style(|_: &Theme| text::Style { color: Some(LOCATION_ICON_COLOR), ..Default::default() }), + text(&event.location) + .size(48) + .style(|_: &Theme| text::Style { color: Some(SECONDARY_TEXT_COLOR), ..Default::default() }) + ] + .spacing(15) + .align_y(iced::Alignment::Center) + ) + .padding(20) + } else { + container(text("")) + }, + + // Description with styled background + container( + text(&event.description) + .size(44) + .style(|_: &Theme| text::Style { color: Some(TEXT_COLOR), ..Default::default() }) + ) + .width(Length::Fill) + .height(Length::Fill) + .padding(25) + .style(|_: &Theme| container::Style { + background: Some(DESCRIPTION_BG_COLOR.into()), + ..Default::default() + }) + ] + .spacing(30) + .width(Length::Fill) + .height(Length::Fill); + + // Main content row + let content_row = row![ + left_column, + right_column + ] + .spacing(60) + .height(Length::Fill); + + main_column = main_column.push(content_row); + + container(main_column) + .width(Length::Fill) + .height(Length::Fill) + .center_y(Length::Fill) + .into() + } else { + container( + text("Loading events...") + .size(64) + .style(|_: &Theme| text::Style { color: Some(ACCENT_COLOR), ..Default::default() }) + ) + .width(Length::Fill) + .height(Length::Fill) + .center_x(Length::Fill) + .center_y(Length::Fill) + .into() + }; + + container(content) + .width(Length::Fill) + .height(Length::Fill) + .style(|_: &Theme| container::Style { + background: Some(BACKGROUND_COLOR.into()), + ..Default::default() + }) + .into() + } + + fn subscription(&self, _state: &Self::State) -> Subscription { + iced::time::every(std::time::Duration::from_millis(100)) + .map(|_| Message::Tick) + } + + fn theme(&self, _state: &Self::State, _window_id: window::Id) -> Theme { + Theme::Dark + } +} + +impl Message { + fn handle_result(result: Result, anyhow::Error>) -> Self { + match result { + Ok(events) => Message::EventsLoaded(events), + Err(e) => Message::Error(e.to_string()), + } + } +} + +async fn fetch_events() -> Result, anyhow::Error> { + tracing::info!("Starting to fetch events from Pocketbase"); + let pb_events = match POCKETBASE_CLIENT.fetch_events().await { + Ok(events) => { + tracing::info!("Successfully fetched {} events from Pocketbase", events.len()); + events + }, + Err(e) => { + tracing::error!("Failed to fetch events from Pocketbase: {}", e); + return Err(e); + } + }; + + // Use a 12-hour window for filtering + let now = chrono::Utc::now() - chrono::Duration::hours(12); + let mut events: Vec = pb_events + .into_iter() + .filter(|event| { + let is_current = event.end_time > now; + if !is_current { + tracing::info!( + "Filtering out event '{}' with end time {} (now is {})", + event.title, + event.end_time, + now + ); + } + is_current + }) + .map(Event::from) + .collect(); + + if events.is_empty() { + tracing::warn!("No current or future events found"); + } else { + tracing::info!( + "Found {} events, from {} to {}", + events.len(), + events.first().map(|e| e.date.as_str()).unwrap_or("unknown"), + events.last().map(|e| e.date.as_str()).unwrap_or("unknown") + ); + } + + events.sort_by(|a, b| a.timestamp.cmp(&b.timestamp)); + tracing::info!("Processed and sorted {} current/future events", events.len()); + Ok(events) +} + +async fn load_image(url: String) -> image::Handle { + let client = reqwest::Client::builder() + .timeout(std::time::Duration::from_secs(5)) + .build() + .expect("Failed to create HTTP client"); + + // First check the content length + let head_resp = match client.head(&url).send().await { + Ok(resp) => resp, + Err(e) => { + tracing::error!("Failed to fetch image head {}: {}", url, e); + return image::Handle::from_bytes(vec![]); + } + }; + + if let Some(content_length) = head_resp.content_length() { + tracing::info!("Image size for {}: {} KB", url, content_length / 1024); + if content_length > MAX_IMAGE_SIZE { + tracing::warn!("Image too large ({}KB), skipping download", content_length / 1024); + return image::Handle::from_bytes(vec![]); + } + } + + let response = match client.get(&url).send().await { + Ok(resp) => resp, + Err(e) => { + tracing::error!("Failed to fetch image {}: {}", url, e); + return image::Handle::from_bytes(vec![]); + } + }; + + match response.bytes().await { + Ok(bytes) => { + if bytes.len() as u64 > MAX_IMAGE_SIZE { + tracing::warn!("Image too large after download ({}KB), skipping", bytes.len() / 1024); + return image::Handle::from_bytes(vec![]); + } + tracing::info!("Successfully downloaded image {} with {} bytes", url, bytes.len()); + image::Handle::from_bytes(bytes.to_vec()) + } + Err(e) => { + tracing::error!("Failed to get image bytes for {}: {}", url, e); + image::Handle::from_bytes(vec![]) + } + } +} + +impl From for Event { + fn from(event: PocketbaseEvent) -> Self { + let clean_description = html2text::from_read(event.description.as_bytes(), 80) + .replace('\n', " ") + .split_whitespace() + .collect::>() + .join(" "); + + let date = event.start_time.format("%A, %B %d, %Y").to_string(); + let start_time = event.start_time.format("%I:%M %p").to_string().trim_start_matches('0').to_string(); + let end_time = event.end_time.format("%I:%M %p").to_string().trim_start_matches('0').to_string(); + + let image_url = event.image.map(|img| { + let url = format!( + "{}/api/files/events/{}/{}", + SETTINGS.pocketbase_url, + event.id, + img + ); + tracing::info!("Constructed image URL: {}", url); + url + }); + + Self { + title: event.title, + description: clean_description, + start_time, + end_time, + date, + location: event.location, + //location_url: event.location_url, + image_url, + category: event.category, + //is_featured: event.is_featured, + timestamp: event.start_time, + } + } +} + +fn main() -> iced::Result { + tracing_subscriber::fmt() + .with_max_level(tracing::Level::INFO) + .init(); + + tracing::info!("Starting Beacon Digital Signage"); + tracing::info!("Pocketbase URL: {}", SETTINGS.pocketbase_url); + + // Load the icon file + let icon_data = { + // Try local development path first + let local_path = "icons/appicon.png"; + // Try system-wide installation path + let system_paths = [ + "/usr/share/icons/hicolor/256x256/apps/beacon.png", + "/usr/local/share/icons/hicolor/256x256/apps/beacon.png", + ]; + + let mut icon_bytes = None; + + // Try local path first + if let Ok(bytes) = std::fs::read(local_path) { + tracing::info!("Found icon in local path: {}", local_path); + icon_bytes = Some(bytes); + } else { + // Try system paths + for path in system_paths.iter() { + if let Ok(bytes) = std::fs::read(path) { + tracing::info!("Found icon in system path: {}", path); + icon_bytes = Some(bytes); + break; + } + } + } + + // Create icon from bytes if we found any + if let Some(bytes) = icon_bytes { + match window::icon::from_file_data(&bytes, None) { + Ok(icon) => { + tracing::info!("Successfully created icon from data"); + Some(icon) + } + Err(e) => { + tracing::error!("Failed to create icon from data: {}", e); + None + } + } + } else { + tracing::error!("Could not find icon file in any location"); + None + } + }; + + let window_settings = window::Settings { + size: iced::Size::new(SETTINGS.window_width as f32, SETTINGS.window_height as f32), + position: window::Position::Centered, + fullscreen: true, + resizable: false, + decorations: false, + icon: icon_data, + #[cfg(target_os = "macos")] + platform_specific: PlatformSpecific { + title_hidden: true, + titlebar_transparent: true, + fullsize_content_view: true, + }, + #[cfg(not(target_os = "macos"))] + platform_specific: PlatformSpecific::default(), + ..Default::default() + }; + + let settings = Settings { + // window: window_settings, + //flags: (), + fonts: vec![], + default_font: iced::Font::default(), + antialiasing: true, + ..Default::default() + }; + + // Create the initial state and start loading events + let mut app = DigitalSign::default(); + app.is_fetching = true; + + DigitalSign::run_with( + app, + settings, + Some(window_settings), + || { + let mut state = DigitalSign::default(); + state.is_fetching = true; + ( + state, + Task::perform( + fetch_events(), + Message::handle_result + ) + ) + } + ) +} + +impl DigitalSign { + fn should_refresh(&self) -> bool { + let elapsed = self.last_refresh.elapsed(); + let interval = SETTINGS.refresh_interval(); + let should_refresh = elapsed >= interval; + tracing::info!( + "Checking refresh: elapsed={:?}, interval={:?}, should_refresh={}", + elapsed, + interval, + should_refresh + ); + should_refresh + } +} + +impl Default for DigitalSign { + fn default() -> Self { + Self { + events: vec![], + current_event_index: 0, + last_update: Instant::now(), + last_refresh: Instant::now(), + loaded_images: std::collections::HashMap::new(), + loading_frame: 0, + is_fetching: false, + } + } +} diff --git a/src/pocketbase.rs b/src/pocketbase.rs new file mode 100644 index 0000000..a0f4762 --- /dev/null +++ b/src/pocketbase.rs @@ -0,0 +1,92 @@ +use anyhow::Result; +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use std::time::Duration; + +const POCKETBASE_TIMEOUT: Duration = Duration::from_secs(10); + +#[derive(Debug, Serialize, Deserialize)] +pub struct PocketbaseEvent { + pub id: String, + pub title: String, + pub description: String, + pub start_time: DateTime, + pub end_time: DateTime, + pub location: String, + pub location_url: Option, + pub image: Option, + pub thumbnail: Option, + pub category: String, + pub is_featured: bool, + pub reoccuring: String, + pub created: DateTime, + pub updated: DateTime, +} + +#[derive(Debug, Clone)] +pub struct PocketbaseClient { + client: reqwest::Client, + base_url: String, +} + +impl PocketbaseClient { + pub fn new(base_url: String) -> Self { + let client = reqwest::Client::builder() + .timeout(POCKETBASE_TIMEOUT) + .build() + .expect("Failed to create HTTP client"); + + Self { client, base_url } + } + + pub async fn fetch_events(&self) -> Result> { + // Subtract 12 hours from now to include upcoming events + let now = (chrono::Utc::now() - chrono::Duration::hours(12)).to_rfc3339(); + let url = format!( + "{}/api/collections/events/records?filter=(end_time>='{}')", + self.base_url, + now + ); + tracing::info!("Fetching events from URL: {}", url); + + let response = match self.client.get(&url) + .header("Cache-Control", "max-age=60") // Cache for 60 seconds + .send() + .await + { + Ok(resp) => { + tracing::info!("Got response with status: {}", resp.status()); + resp + }, + Err(e) => { + tracing::error!("HTTP request failed: {}", e); + return Err(e.into()); + } + }; + + let response = match response.error_for_status() { + Ok(resp) => resp, + Err(e) => { + tracing::error!("HTTP error status: {}", e); + return Err(e.into()); + } + }; + + #[derive(Deserialize)] + struct Response { + items: Vec, + } + + match response.json().await { + Ok(data) => { + let Response { items } = data; + tracing::info!("Successfully parsed {} events from response", items.len()); + Ok(items) + }, + Err(e) => { + tracing::error!("Failed to parse JSON response: {}", e); + Err(e.into()) + } + } + } +} \ No newline at end of file