├── frontend ├── README.md ├── src │ ├── utli │ │ └── axios.js │ ├── main.jsx │ ├── index.css │ ├── App.jsx │ ├── settingPage.jsx │ ├── assets │ │ └── react.svg │ ├── uploadPage.jsx │ └── downloadPage.jsx ├── .gitignore ├── .eslintrc.cjs ├── index.html ├── tailwind.config.js ├── vite.config.js ├── package.json └── public │ └── vite.svg ├── backend ├── src │ ├── service │ │ ├── mod.rs │ │ ├── sqlite.rs │ │ └── file_service.rs │ ├── vojo │ │ ├── mod.rs │ │ ├── base_response.rs │ │ └── get_path_res.rs │ └── main.rs ├── .cargo │ └── config ├── Cargo.toml └── Cargo.lock ├── README.md ├── .gitignore ├── .github └── workflows │ └── release.yaml └── LICENSE /frontend/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/src/service/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod file_service; 2 | pub mod sqlite; 3 | -------------------------------------------------------------------------------- /backend/src/vojo/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod base_response; 2 | pub mod get_path_res; 3 | -------------------------------------------------------------------------------- /frontend/src/utli/axios.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | 3 | 4 | export function getBaseUrl(){ 5 | return import.meta.env.PROD ?window.location.origin + "/api" : "http://localhost:8345/api" 6 | } -------------------------------------------------------------------------------- /backend/src/vojo/base_response.rs: -------------------------------------------------------------------------------- 1 | use serde::Deserialize; 2 | use serde::Serialize; 3 | #[derive(Serialize, Deserialize, Clone)] 4 | 5 | pub struct BaseResponse { 6 | pub response_code: i32, 7 | pub response_msg: T, 8 | } 9 | -------------------------------------------------------------------------------- /backend/.cargo/config: -------------------------------------------------------------------------------- 1 | [target.x86_64-unknown-linux-gnu] 2 | rustflags = ["-C", "target-feature=+crt-static"] 3 | 4 | [target.x86_64-pc-windows-msvc] 5 | rustflags = ["-C", "target-feature=+crt-static"] 6 | 7 | [target.x86_64-pc-windows-gnu] 8 | rustflags = ["-C", "target-feature=+crt-static"] -------------------------------------------------------------------------------- /frontend/src/main.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { BrowserRouter, useNavigate } from "react-router-dom"; 3 | import ReactDOM from "react-dom/client"; 4 | import App from "./App.jsx"; 5 | import "./index.css"; 6 | 7 | ReactDOM.createRoot(document.getElementById("root")).render( 8 | 9 | 10 | 11 | ); 12 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /backend/src/vojo/get_path_res.rs: -------------------------------------------------------------------------------- 1 | use serde::Deserialize; 2 | use serde::Serialize; 3 | #[derive(Serialize, Deserialize, Clone)] 4 | pub struct GetPathRes { 5 | pub file_list: Vec, 6 | } 7 | #[derive(Serialize, Deserialize, Clone)] 8 | 9 | pub struct FileInfo { 10 | pub file_name: String, 11 | pub is_dir: bool, 12 | pub update_time: String, 13 | pub size: String, 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/index.css: -------------------------------------------------------------------------------- 1 | @import "tailwindcss"; 2 | @plugin "daisyui" { 3 | themes: all; 4 | root: ":root"; 5 | include: ; 6 | exclude: ; 7 | prefix: ; 8 | logs: true; 9 | } 10 | .input:focus, 11 | .textarea:focus, 12 | .select:focus, 13 | .btn:focus { 14 | /* 15 | 将 outline-offset 设置为你想要的值。 16 | - 1px 会有一个很细的缝隙。 17 | - 0px 会让辉光紧贴边框,完全没有缝隙。 18 | */ 19 | outline-offset: 0px; /* <-- 推荐值 */ 20 | } 21 | 22 | .input-bordered:focus, 23 | .textarea-bordered:focus, 24 | .select-bordered:focus { 25 | outline-offset: 0px; /* <-- 推荐值 */ 26 | } 27 | -------------------------------------------------------------------------------- /frontend/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { browser: true, es2020: true }, 4 | extends: [ 5 | 'eslint:recommended', 6 | 'plugin:react/recommended', 7 | 'plugin:react/jsx-runtime', 8 | 'plugin:react-hooks/recommended', 9 | ], 10 | ignorePatterns: ['dist', '.eslintrc.cjs'], 11 | parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, 12 | settings: { react: { version: '18.2' } }, 13 | plugins: ['react-refresh'], 14 | rules: { 15 | 'react-refresh/only-export-components': [ 16 | 'warn', 17 | { allowConstantExport: true }, 18 | ], 19 | }, 20 | } 21 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | File Transfer 8 | 9 | 10 |
11 | 12 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /frontend/tailwind.config.js: -------------------------------------------------------------------------------- 1 | const { nextui } = require("@nextui-org/react"); 2 | 3 | /** @type {import('tailwindcss').Config} */ 4 | export default { 5 | content: [ 6 | "./index.html", 7 | "./src/**/*.{js,ts,jsx,tsx}", 8 | "./node_modules/@nextui-org/theme/dist/**/*.{js,ts,jsx,tsx}" 9 | 10 | ], 11 | theme: { 12 | extend: {}, 13 | }, 14 | darkMode: "class", 15 | plugins: [nextui()] 16 | } 17 | 18 | // module.exports = konstaConfig({ 19 | // // rest of your usual Tailwind CSS config here 20 | // content: [ 21 | // "./index.html", 22 | // "./src/**/*.{js,ts,jsx,tsx}", 23 | 24 | // ], 25 | // theme: { 26 | // extend: {}, 27 | // }, 28 | // }); -------------------------------------------------------------------------------- /frontend/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react"; 3 | import tailwindcss from "@tailwindcss/vite"; 4 | 5 | // https://vite.dev/config/ 6 | export default defineConfig({ 7 | plugins: [react(), tailwindcss()], 8 | server: { 9 | host: "0.0.0.0", 10 | port: 5173, 11 | proxy: { 12 | // 字符串简写写法 13 | // '/foo': 'http://localhost:4567', 14 | 15 | // 带选项写法 16 | "/api": { 17 | target: "http://127.0.0.1:8835", // 你的后端服务地址 18 | changeOrigin: true, // 改变源 19 | }, 20 | "/auth": { 21 | target: "http://127.0.0.1:8835", 22 | changeOrigin: true, 23 | }, 24 | "/demo.wav": { 25 | target: "http://127.0.0.1:8835", // 您的 Rust 后端地址 26 | changeOrigin: true, 27 | }, 28 | }, 29 | }, 30 | }); 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # File Transfer 2 | The software is to transfer files between Mobile and PC in the LAN. 3 | ## Start Steps 4 | * Download release from the https://github.com/lsk569937453/file-transfer/releases/. 5 | * Start the software from the pc.And it will print the Qrcode in the terminal. 6 | * Use your mobile scan the Qrcode in the console of pc.Open the url in the browser of your mobile.Then you could download and upload file. 7 | 8 | ## Screen Shot 9 | ### Reset the Root Path of PC 10 | ![alt tag](https://raw.githubusercontent.com/lsk569937453/image_repo/main/file-transfer/Screenshot_20240112_081413_com.android.chrome.jpg) 11 | ### Download Page 12 | ![alt tag](https://raw.githubusercontent.com/lsk569937453/image_repo/main/file-transfer/Screenshot_20240112_081354_com.android.chrome.jpg) 13 | 14 | ### Upload Page 15 | ![alt tag](https://raw.githubusercontent.com/lsk569937453/image_repo/main/file-transfer/Screenshot_20240112_081438_android.jpg) -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "@tailwindcss/vite": "^4.1.12", 14 | "axios": "^1.11.0", 15 | "daisyui": "^5.0.50", 16 | "react": "^19.1.1", 17 | "react-dom": "^19.1.1", 18 | "react-router-dom": "^7.8.2", 19 | "tailwindcss": "^4.1.12" 20 | }, 21 | "devDependencies": { 22 | "@eslint/js": "^9.33.0", 23 | "@types/react": "^19.1.10", 24 | "@types/react-dom": "^19.1.7", 25 | "@vitejs/plugin-react": "^5.0.0", 26 | "eslint": "^9.33.0", 27 | "eslint-plugin-react-hooks": "^5.2.0", 28 | "eslint-plugin-react-refresh": "^0.4.20", 29 | "globals": "^16.3.0", 30 | "vite": "^7.1.2" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /frontend/public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "file-transfer" 3 | version = "0.0.1" 4 | edition = "2021" 5 | rust-version = "1.70" 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | [profile.release] 8 | strip = true 9 | 10 | [dependencies] 11 | actix-cors = "0.7.1" 12 | anyhow = "1.0.99" 13 | axum = { version = "0.8.4", features = ["multipart"] } 14 | bytes = "1.10.1" 15 | chrono = "0.4.31" 16 | console = "0.16.0" 17 | dirs = "6.0.0" 18 | env_logger = "0.11.8" 19 | futures = "0.3.31" 20 | human_bytes = "0.4" 21 | json = "0.12.4" 22 | libsqlite3-sys = { version = "*", features = ["bundled"] } 23 | local-ip-address = "0.6.5" 24 | log = "^0.4" 25 | mime_guess = "2.0.5" 26 | qrcode = { version = "0.14.1", default-features = false } 27 | rust-embed = "8.7.2" 28 | serde = { version = "1.0", features = ["derive"] } 29 | serde_derive = "1.0.219" 30 | serde_json = "1.0.143" 31 | sqlx = { version = "0.8.6", features = ["runtime-tokio", "sqlite"] } 32 | tokio = { version = "1.47.1", features = ["full", "tracing"] } 33 | tokio-util = { version = "0.7.16", features = ["full", "time"] } 34 | tower-http = { version = "0.6.6", features = ["fs", "cors"] } 35 | time = "0.3.41" 36 | 37 | # [workspace.metadata.cross.target.x86_64-unknown-linux-gnu] 38 | # # Install libssl-dev:arm64, see 39 | # pre-build = [ 40 | # "dpkg --add-architecture $CROSS_DEB_ARCH", 41 | # "apt-get update && apt-get --assume-yes install libssl-dev:$CROSS_DEB_ARCH", 42 | # ] 43 | -------------------------------------------------------------------------------- /backend/src/service/sqlite.rs: -------------------------------------------------------------------------------- 1 | use sqlx::migrate::MigrateDatabase; 2 | use sqlx::sqlite::SqliteConnection; 3 | use sqlx::sqlite::SqlitePool; 4 | use sqlx::Connection; 5 | use sqlx::Executor; 6 | use sqlx::Pool; 7 | use sqlx::Sqlite; 8 | 9 | pub async fn init() -> Result, anyhow::Error> { 10 | let file_path = dirs::home_dir() 11 | .ok_or(anyhow!("failed to get home directory"))? 12 | .join(".file_transfer.db"); 13 | 14 | let db_path = file_path.to_str().ok_or(anyhow!("failed to get db path"))?; 15 | if Sqlite::database_exists(db_path).await? { 16 | let sqlite_pool = SqlitePool::connect(db_path).await?; 17 | 18 | return Ok(sqlite_pool); 19 | } 20 | 21 | Sqlite::create_database(db_path).await?; 22 | let mut connection = SqliteConnection::connect(db_path).await?; 23 | let _ = connection 24 | .execute( 25 | "CREATE TABLE IF NOT EXISTS config ( 26 | id INTEGER PRIMARY KEY AUTOINCREMENT, 27 | config_key TEXT NOT NULL, 28 | config_value TEXT NOT NULL 29 | )", 30 | ) 31 | .await; 32 | let default_path = if cfg!(windows) { "C:\\" } else { "/" }; 33 | println!("default path is {}", default_path); 34 | let insert_query = format!( 35 | "insert into config (config_key, config_value) values ('config_root_path', '{}')", 36 | default_path 37 | ); 38 | println!("insert query is {}", insert_query); 39 | let _ = connection.execute(insert_query.as_str()).await; 40 | let sqlite_pool = SqlitePool::connect(db_path).await?; 41 | Ok(sqlite_pool) 42 | } 43 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # This file should only ignore things that are generated during a `x.py` build, 2 | # generated by common IDEs, and optional files controlled by the user that 3 | # affect the build (such as config.toml). 4 | # In particular, things like `mir_dump` should not be listed here; they are only 5 | # created during manual debugging and many people like to clean up instead of 6 | # having git ignore such leftovers. You can use `.git/info/exclude` to 7 | # configure your local ignore list. 8 | 9 | ## File system 10 | .DS_Store 11 | desktop.ini 12 | 13 | ## Editor 14 | *.swp 15 | *.swo 16 | Session.vim 17 | .cproject 18 | .idea 19 | *.iml 20 | .vscode 21 | .project 22 | .favorites.json 23 | .settings/ 24 | .vs/ 25 | 26 | ## Tool 27 | .valgrindrc 28 | # Included because it is part of the test case 29 | !/tests/run-make/thumb-none-qemu/example/.cargo 30 | 31 | ## Configuration 32 | /config.toml 33 | /Makefile 34 | config.mk 35 | config.stamp 36 | no_llvm_build 37 | 38 | # exclude everything 39 | backend/public/* 40 | 41 | # exception to the rule 42 | !backend/public/.gitkeep 43 | target/ 44 | ## Build 45 | /dl/ 46 | /doc/ 47 | /inst/ 48 | /llvm/ 49 | /mingw-build/ 50 | build/ 51 | !/compiler/rustc_mir_build/src/build/ 52 | /build-rust-analyzer/ 53 | /dist/ 54 | /unicode-downloads 55 | /target 56 | /src/bootstrap/target 57 | /src/tools/x/target 58 | # Created by default with `src/ci/docker/run.sh` 59 | /obj/ 60 | ## Temporary files 61 | *~ 62 | \#* 63 | \#*\# 64 | 65 | 66 | ## Tags 67 | tags 68 | tags.* 69 | TAGS 70 | TAGS.* 71 | 72 | ## Python 73 | __pycache__/ 74 | *.py[cod] 75 | *$py.class 76 | 77 | ## Node 78 | node_modules 79 | 80 | 81 | ## Rustdoc GUI tests 82 | tests/rustdoc-gui/src/**.lock 83 | # Created by https://www.toptal.com/developers/gitignore/api/react 84 | # Edit at https://www.toptal.com/developers/gitignore?templates=react 85 | 86 | ### react ### 87 | .DS_* 88 | *.log 89 | logs 90 | **/*.backup.* 91 | **/*.back.* 92 | 93 | node_modules 94 | bower_components 95 | 96 | *.sublime* 97 | 98 | psd 99 | thumb 100 | sketch 101 | 102 | # End of https://www.toptal.com/developers/gitignore/api/react 103 | # Before adding new lines, see the comment at the top. -------------------------------------------------------------------------------- /frontend/src/App.jsx: -------------------------------------------------------------------------------- 1 | import { useState } from "react"; 2 | import { 3 | BrowserRouter, 4 | useNavigate, 5 | useLocation, 6 | Route, 7 | Routes, 8 | } from "react-router-dom"; 9 | import { Link } from "react-router-dom"; 10 | import DownloadPage from "./downloadPage"; 11 | import UploadPage from "./uploadPage"; 12 | import SettingPage from "./settingPage"; 13 | 14 | const headerdata = [ 15 | { 16 | id: "Computer", 17 | label: "Computer", 18 | link: "/downloadPage", 19 | svg: ( 20 | 32 | 33 | 34 | 35 | 36 | 37 | ), 38 | }, 39 | { 40 | id: "Upload", 41 | label: "Upload", 42 | link: "/uploadPage", 43 | svg: ( 44 | 56 | 57 | 58 | 59 | 60 | 61 | ), 62 | }, 63 | { 64 | id: "Setting", 65 | label: "Setting", 66 | link: "/settingPage", 67 | svg: ( 68 | 80 | 81 | 82 | 83 | 84 | 85 | ), 86 | }, 87 | ]; 88 | const router = [ 89 | { 90 | path: "/", 91 | element: , 92 | }, 93 | { 94 | path: "/downloadPage", 95 | element: , 96 | }, 97 | { 98 | path: "/uploadPage", 99 | element: , 100 | }, 101 | { 102 | path: "/settingPage", 103 | element: , 104 | }, 105 | ]; 106 | 107 | function App() { 108 | const { pathname } = useLocation(); 109 | 110 | return ( 111 |
112 |
113 | {headerdata.map((item) => ( 114 | 120 | {item.label} 121 | 122 | ))} 123 |
124 | 125 | {router.map((item, index) => ( 126 | 127 | ))} 128 | 129 |
130 | ); 131 | } 132 | 133 | export default App; 134 | -------------------------------------------------------------------------------- /frontend/src/settingPage.jsx: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react"; 2 | import axios from "axios"; 3 | import { getBaseUrl } from "./utli/axios.js"; 4 | // You might need a toast library like 'react-toastify' 5 | // import { ToastContainer, toast } from 'react-toastify'; 6 | // import 'react-toastify/dist/ReactToastify.css'; 7 | 8 | const data = [ 9 | { disk: "C:\\" }, 10 | { disk: "D:\\" }, 11 | { disk: "E:\\" }, 12 | { disk: "F:\\" }, 13 | ]; 14 | 15 | export default function SettingPage() { 16 | const [inputData, setInputData] = useState(""); 17 | // const notify = () => toast("Set the path successfully"); 18 | 19 | const handleUseButtonClick = async (cellValue) => { 20 | const { response_code, response_msg } = ( 21 | await axios({ 22 | url: "/root_path", 23 | method: "PUT", 24 | baseURL: getBaseUrl(), 25 | data: { 26 | path: cellValue, 27 | }, 28 | }) 29 | ).data; 30 | if (response_code === 0) { 31 | // notify(); 32 | setTimeout(function () { 33 | window.location.reload(); 34 | }, 3000); 35 | } 36 | }; 37 | 38 | useEffect(() => { 39 | loadPage(); 40 | }, []); 41 | 42 | const loadPage = async () => { 43 | const { response_code, response_msg } = ( 44 | await axios({ 45 | url: "/rootPath", 46 | method: "GET", 47 | baseURL: getBaseUrl(), 48 | }) 49 | ).data; 50 | if (response_code === 0) { 51 | setInputData(response_msg); 52 | } 53 | }; 54 | 55 | const handleSetButtonClick = async () => { 56 | const { response_code, response_msg } = ( 57 | await axios({ 58 | url: "/root_path", 59 | method: "PUT", 60 | baseURL: getBaseUrl(), 61 | data: { 62 | path: inputData, 63 | }, 64 | }) 65 | ).data; 66 | if (response_code === 0) { 67 | // notify(); 68 | } 69 | }; 70 | 71 | return ( 72 | <> 73 | {inputData !== "" && ( 74 |
75 | setInputData(e.target.value)} 79 | placeholder="Set the root path" 80 | className="input input-bordered w-full" 81 | /> 82 | 85 | {/* */} 86 |
87 |
88 |
89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | {data.map((item, index) => ( 98 | 99 | 100 | 108 | 109 | ))} 110 | 111 |
DiskAction
{item.disk} 101 | 107 |
112 |
113 |
114 |
115 |
116 | )} 117 | 118 | ); 119 | } 120 | -------------------------------------------------------------------------------- /frontend/src/assets/react.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/src/main.rs: -------------------------------------------------------------------------------- 1 | use rust_embed::RustEmbed; 2 | mod service; 3 | use qrcode::QrCode; 4 | mod vojo; 5 | #[macro_use] 6 | extern crate anyhow; 7 | #[macro_use] 8 | extern crate log; 9 | use axum::{ 10 | extract::DefaultBodyLimit, 11 | http::{header, StatusCode, Uri}, 12 | response::{Html, IntoResponse, Response}, 13 | routing::{get, post, put, Router}, 14 | }; 15 | use local_ip_address::local_ip; 16 | use qrcode::render::unicode; 17 | use service::file_service::{download_file, get_path, get_root_path, set_root_path, upload_file}; 18 | use service::sqlite::init; 19 | use std::net::SocketAddr; 20 | use tower_http::cors::{Any, CorsLayer}; 21 | #[derive(RustEmbed)] 22 | #[folder = "public"] 23 | struct Asset; 24 | 25 | #[tokio::main] 26 | async fn main() { 27 | let res = main_with_error2().await; 28 | if let Err(e) = res { 29 | println!("{:?}", e); 30 | } 31 | } 32 | 33 | async fn main_with_error2() -> Result<(), anyhow::Error> { 34 | env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); 35 | let sqlite_pool = init().await?; 36 | let ip = local_ip()?; 37 | let origin = format!("http://{}:8345", ip); 38 | let code = QrCode::new(&origin).unwrap(); 39 | 40 | let image = code 41 | .render::() 42 | .dark_color(unicode::Dense1x2::Light) 43 | .light_color(unicode::Dense1x2::Dark) 44 | .build(); 45 | println!("{}", image); 46 | info!("Listening on {}", origin); 47 | 48 | let api_routes = Router::new() 49 | .nest("/path", Router::new().route("/", get(get_path))) 50 | .nest("/rootPath", Router::new().route("/", get(get_root_path))) 51 | .nest("/root_path", Router::new().route("/", put(set_root_path))) 52 | .nest("/download", Router::new().route("/", get(download_file))) 53 | .nest("/upload", Router::new().route("/", post(upload_file))); 54 | 55 | let app = Router::new() 56 | .nest("/api", api_routes) 57 | .route("/assets/{key}", get(static_handler)) 58 | .route("/", get(index_handler)) 59 | .route("/downloadPage", get(index_handler)) 60 | .route("/uploadPage", get(index_handler)) 61 | .route("/settingPage", get(index_handler)) 62 | .fallback_service(get(not_found)) 63 | .layer(CorsLayer::permissive().allow_methods(Any)) 64 | .layer(DefaultBodyLimit::max( 65 | 1024 * 1024 * 1024 * 1024 * 1024 * 1024, 66 | )) 67 | .with_state(sqlite_pool); 68 | 69 | let addr = SocketAddr::from(([0, 0, 0, 0], 8345)); 70 | let listener = tokio::net::TcpListener::bind(addr).await.unwrap(); 71 | axum::serve(listener, app.into_make_service()) 72 | .await 73 | .unwrap(); 74 | Ok(()) 75 | } 76 | async fn index_handler() -> impl IntoResponse { 77 | static_handler("/index.html".parse::().unwrap()).await 78 | } 79 | 80 | async fn static_handler(uri: Uri) -> impl IntoResponse { 81 | let mut path = uri.path().trim_start_matches('/').to_string(); 82 | 83 | if path.starts_with("dist/") { 84 | path = path.replace("dist/", ""); 85 | } 86 | 87 | StaticFile(path) 88 | } 89 | 90 | // Finally, we use a fallback route for anything that didn't match. 91 | async fn not_found() -> Html<&'static str> { 92 | Html("

404

Not Found

") 93 | } 94 | pub struct StaticFile(pub T); 95 | 96 | impl IntoResponse for StaticFile 97 | where 98 | T: Into, 99 | { 100 | fn into_response(self) -> Response { 101 | let path = self.0.into(); 102 | 103 | match Asset::get(path.as_str()) { 104 | Some(content) => { 105 | let mime = mime_guess::from_path(path).first_or_octet_stream(); 106 | ([(header::CONTENT_TYPE, mime.as_ref())], content.data).into_response() 107 | } 108 | None => (StatusCode::NOT_FOUND, "404 Not Found").into_response(), 109 | } 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /.github/workflows/release.yaml: -------------------------------------------------------------------------------- 1 | name: 'release' 2 | 3 | # This will trigger the action on each push to the `release` branch. 4 | on: 5 | push: 6 | tags: 7 | - '*' 8 | 9 | permissions: 10 | contents: write 11 | packages: write 12 | 13 | jobs: 14 | release: 15 | permissions: write-all 16 | name: ${{ matrix.platform.os_name }} with rust ${{ matrix.toolchain }} 17 | runs-on: ${{ matrix.platform.os }} 18 | strategy: 19 | fail-fast: false 20 | matrix: 21 | platform: 22 | - os_name: Linux-x86_64 23 | os: ubuntu-20.04 24 | target: x86_64-unknown-linux-musl 25 | bin: file-transfer 26 | name: file-transfer-Linux-x86_64-musl 27 | - os_name: Linux-aarch64 28 | os: ubuntu-20.04 29 | target: aarch64-unknown-linux-musl 30 | bin: file-transfer 31 | name: file-transfer-Linux-aarch64-musl 32 | - os_name: Windows-x86_64 33 | os: windows-latest 34 | target: x86_64-pc-windows-msvc 35 | bin: file-transfer.exe 36 | name: file-transfer-Windows-x86_64.exe 37 | - os_name: macOS-x86_64 38 | os: macOS-latest 39 | target: x86_64-apple-darwin 40 | bin: file-transfer 41 | name: file-transfer-Darwin-x86_64 42 | - os_name: macOS-aarch64 43 | os: macOS-latest 44 | target: aarch64-apple-darwin 45 | bin: file-transfer 46 | name: file-transfer-Darwin-aarch64 47 | toolchain: 48 | - stable 49 | 50 | steps: 51 | - uses: actions/checkout@v3 52 | - name: Cache cargo & target directories 53 | uses: Swatinem/rust-cache@v2 54 | - name: Install musl-tools on Linux 55 | run: sudo apt-get update --yes && sudo apt-get install --yes musl-tools 56 | if: contains(matrix.platform.name, 'musl') 57 | - name: Install Node.js 58 | uses: actions/setup-node@v3 59 | with: 60 | node-version: 16 61 | - uses: pnpm/action-setup@v2 62 | name: Install pnpm 63 | with: 64 | version: 7 65 | run_install: false 66 | - name: install frontend 67 | run: cd frontend && pnpm i --no-frozen-lockfile && pnpm build && cd .. 68 | 69 | - name: copy frontend 70 | run: cp -r frontend/dist/. backend/public 71 | - id: setup-rust 72 | if: matrix.platform.os_name == 'Windows-x86_64' 73 | name: setup rust 74 | uses: ningenMe/setup-rustup@v1.1.0 75 | with: 76 | rust-version: 1.75.0 77 | - name: Build for Windows 78 | if: matrix.platform.os_name == 'Windows-x86_64' 79 | run: cd backend && cargo build --target ${{ matrix.platform.target }} --release && cd .. 80 | - name: Build binary 81 | if: matrix.platform.os_name != 'Windows-x86_64' 82 | uses: houseabsolute/actions-rust-cross@v0 83 | with: 84 | command: "build" 85 | target: ${{ matrix.platform.target }} 86 | # toolchain: ${{ matrix.toolchain }} 87 | working-directory: backend 88 | args: "--locked --release" 89 | strip: true 90 | - name: Upload binaries to release 91 | uses: svenstaro/upload-release-action@v2 92 | with: 93 | repo_token: ${{ secrets.GITHUB_TOKEN }} 94 | file: backend/target/${{ matrix.platform.target }}/release/${{ matrix.platform.bin }} 95 | asset_name: ${{ matrix.platform.name }} 96 | tag: ${{ github.ref }} 97 | # - name: Set environment variables 98 | # shell: bash 99 | # run: | 100 | # cd backend 101 | # echo "CURRENT_VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2)" >> $GITHUB_ENV 102 | 103 | # - name: Package as archive 104 | # shell: bash 105 | # run: | 106 | # cd backend/target/${{ matrix.platform.target }}/release 107 | # if [[ "${{ matrix.platform.os }}" == "windows-latest" ]]; then 108 | # 7z a ../../../../${{ matrix.platform.name }} ${{ matrix.platform.bin }} 109 | # else 110 | # tar czvf ../../../../${{ matrix.platform.name }} ${{ matrix.platform.bin }} 111 | # fi 112 | # cd - 113 | # - name: Release 114 | # uses: softprops/action-gh-release@v1 115 | # with: 116 | # # note you'll typically need to create a personal access token 117 | # # with permissions to create releases in the other repo 118 | # draft: true 119 | # tag_name: ${{ env.CURRENT_VERSION }} 120 | # files: | 121 | # ${{ matrix.platform.name }} -------------------------------------------------------------------------------- /frontend/src/uploadPage.jsx: -------------------------------------------------------------------------------- 1 | import { useState, React, useEffect, useRef } from "react"; 2 | import axios from "axios"; 3 | import { getBaseUrl } from "./utli/axios.js"; 4 | 5 | export default function UploadPage() { 6 | const fileUpload = useRef(null); 7 | const [selectedFiles, setSelectedFiles] = useState([]); 8 | const [rootPath, setRootPath] = useState(""); 9 | const [percentCompleted, setPercentCompleted] = useState(0); 10 | const [isOpen, setIsOpen] = useState(false); 11 | 12 | const handleUpload = () => { 13 | fileUpload.current.click(); 14 | }; 15 | 16 | useEffect(() => { 17 | loadPage(); 18 | }, []); 19 | 20 | const loadPage = async () => { 21 | const { response_code, response_msg } = ( 22 | await axios({ 23 | url: "/rootPath", 24 | method: "GET", 25 | baseURL: getBaseUrl(), 26 | }) 27 | ).data; 28 | if (response_code === 0) { 29 | setRootPath(response_msg); 30 | } 31 | }; 32 | 33 | const uploadProfilePic = (e) => { 34 | const files = Array.from(e.target.files); 35 | setSelectedFiles(files); 36 | }; 37 | 38 | const handleDeleteOneFileButtonClick = (index) => { 39 | const newSelectedFiles = [...selectedFiles]; 40 | newSelectedFiles.splice(index, 1); 41 | setSelectedFiles(newSelectedFiles); 42 | }; 43 | 44 | const handleDeleAllFilesButtonClick = () => { 45 | setSelectedFiles([]); 46 | }; 47 | 48 | const handleUploadButtonClick = async () => { 49 | var bodyFormData = new FormData(); 50 | selectedFiles.map((item) => { 51 | bodyFormData.append("file", item); 52 | }); 53 | setIsOpen(true); 54 | const { response_code, response_msg } = ( 55 | await axios({ 56 | url: "/upload", 57 | method: "POST", 58 | data: bodyFormData, 59 | headers: { "Content-Type": "multipart/form-data" }, 60 | baseURL: getBaseUrl(), 61 | onUploadProgress: function (progressEvent) { 62 | let percentCompleted = Math.round( 63 | (progressEvent.loaded * 100) / progressEvent.total 64 | ); 65 | setPercentCompleted(percentCompleted); 66 | }, 67 | }) 68 | ).data; 69 | await new Promise((resolve) => setTimeout(resolve, 1000)); 70 | setIsOpen(false); 71 | setPercentCompleted(0); 72 | if (response_code === 0) { 73 | // Handle success 74 | } 75 | }; 76 | 77 | return ( 78 | <> 79 |
80 | 84 |
85 |

Upload Progress

86 |
87 | 92 |

93 | {percentCompleted} 94 | {"%"} 95 |

96 |
97 |
98 |
99 | 100 |
101 |

Current Root Path:  

102 |

{rootPath}

103 |
104 | 105 | {selectedFiles.length === 0 && ( 106 | <> 107 | 114 | 117 | 118 | )} 119 | 120 | {selectedFiles.length !== 0 && ( 121 |
122 |
123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | {selectedFiles.map((item, index) => ( 132 | 133 | 134 | 155 | 156 | ))} 157 | 158 |
NameAction
{item.name} 135 | 154 |
159 |
160 |
161 | 167 | 173 |
174 |
175 | )} 176 |
177 | 178 | ); 179 | } 180 | -------------------------------------------------------------------------------- /frontend/src/downloadPage.jsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | import { useNavigate, useSearchParams, useLocation } from "react-router-dom"; 3 | import axios from "axios"; 4 | import { getBaseUrl } from "./utli/axios.js"; 5 | 6 | export default function DownloadPage() { 7 | const navigate = useNavigate(); 8 | let [searchParams, setSearchParams] = useSearchParams(); 9 | const [percentCompleted, setPercentCompleted] = useState(0); 10 | const [isOpen, setIsOpen] = useState(false); 11 | 12 | const location = useLocation(); 13 | 14 | const [data, setData] = useState([]); 15 | 16 | useEffect(() => { 17 | loadPage(); 18 | }, []); 19 | 20 | useEffect(() => { 21 | loadPage(); 22 | }, [location]); 23 | 24 | const loadPage = async () => { 25 | let finalPath = ""; 26 | let path = searchParams.get("path"); 27 | if (path) { 28 | finalPath = "?path=" + path; 29 | } 30 | const { response_code, response_msg } = ( 31 | await axios({ 32 | url: "/path" + finalPath, 33 | method: "GET", 34 | baseURL: getBaseUrl(), 35 | }) 36 | ).data; 37 | 38 | if (response_code === 0) { 39 | const final = response_msg.sort((a, b) => (a.is_dir > b.is_dir ? -1 : 1)); 40 | setData(final); 41 | } 42 | }; 43 | 44 | const handleDownloadClick = async (pathname, isDir) => { 45 | if (isDir) { 46 | const path = 47 | searchParams.get("path") === null 48 | ? pathname 49 | : searchParams.get("path") + "," + pathname; 50 | navigate("/downloadPage?path=" + path); 51 | } else { 52 | const path = 53 | searchParams.get("path") === null 54 | ? pathname 55 | : searchParams.get("path") + "," + pathname; 56 | const downloadPath = "/download?path=" + path; 57 | setIsOpen(true); 58 | let response = await axios({ 59 | url: downloadPath, 60 | baseURL: getBaseUrl(), 61 | method: "GET", 62 | responseType: "blob", 63 | onDownloadProgress: (progressEvent) => { 64 | const percentCompleted = Math.round( 65 | (progressEvent.loaded * 100) / progressEvent.total 66 | ); 67 | setPercentCompleted(percentCompleted); 68 | }, 69 | }); 70 | const href = URL.createObjectURL(response.data); 71 | const link = document.createElement("a"); 72 | link.href = href; 73 | link.setAttribute("download", pathname); 74 | document.body.appendChild(link); 75 | link.click(); 76 | document.body.removeChild(link); 77 | URL.revokeObjectURL(href); 78 | await new Promise((resolve) => setTimeout(resolve, 1000)); 79 | setIsOpen(false); 80 | setPercentCompleted(0); 81 | } 82 | }; 83 | 84 | const handleReturnButtonClick = () => { 85 | const pathArray = searchParams.get("path").split(","); 86 | if (pathArray.length === 1) { 87 | navigate("/downloadPage"); 88 | } else { 89 | pathArray.pop(); 90 | const path = pathArray.join(","); 91 | navigate("/downloadPage?path=" + path); 92 | } 93 | }; 94 | 95 | return ( 96 |
97 | 101 |
102 |

Download Progress

103 |
104 | 109 |

110 | {percentCompleted} 111 | {"%"} 112 |

113 |
114 |
115 |
116 | 117 | {searchParams.get("path") && ( 118 |
122 |
123 | 135 | 136 | 137 | 138 | 139 |
140 |
141 |
Return To Previous Dir
142 |
143 |
144 | )} 145 | 146 | {data.map((item, index) => ( 147 |
handleDownloadClick(item.file_name, item.is_dir)} 151 | > 152 |
153 | {item.is_dir ? ( 154 | 166 | 167 | 168 | 169 | ) : ( 170 | 182 | 183 | 184 | 185 | 186 | )} 187 |
188 |
189 |
190 | {item.file_name.length < 20 191 | ? item.file_name 192 | : item.file_name.slice(0, 20) + "..."} 193 |
194 |
195 | {!item.is_dir && ( 196 | <> 197 |
{item.size}
198 |
{item.update_time}
199 | 200 | )} 201 |
202 |
203 |
204 | ))} 205 |
206 | ); 207 | } 208 | -------------------------------------------------------------------------------- /backend/src/service/file_service.rs: -------------------------------------------------------------------------------- 1 | use crate::vojo::base_response::BaseResponse; 2 | use crate::vojo::get_path_res::FileInfo; 3 | 4 | use axum::body::Body; 5 | use axum::{ 6 | body::Bytes, 7 | extract, 8 | extract::Request, 9 | extract::{Multipart, State}, 10 | http::StatusCode, 11 | response::Response, 12 | BoxError, 13 | }; 14 | use std::io; 15 | 16 | use axum::extract::Query; 17 | use chrono::offset::Utc; 18 | use chrono::DateTime; 19 | use futures::Stream; 20 | use futures::TryStreamExt; 21 | use human_bytes::human_bytes; 22 | 23 | use serde_derive::Deserialize; 24 | use sqlx::Pool; 25 | use sqlx::Row; 26 | use sqlx::Sqlite; 27 | use std::path::PathBuf; 28 | use std::vec; 29 | use tokio::fs::File; 30 | use tokio::io::BufWriter; 31 | use tokio::{self}; 32 | use tokio_util::io::StreamReader; 33 | use tower_http::services::fs::ServeFileSystemResponseBody; 34 | use tower_http::services::ServeFile; 35 | 36 | #[derive(Debug, Deserialize)] 37 | pub struct Params { 38 | path: Option, 39 | } 40 | 41 | pub async fn get_path( 42 | Query(params): Query, 43 | State(pool): State>, 44 | ) -> Result { 45 | let res = get_path_with_error(pool, params).await; 46 | let data = match res { 47 | Ok(r) => { 48 | let res = BaseResponse { 49 | response_code: 0, 50 | response_msg: r, 51 | }; 52 | serde_json::to_string(&res) 53 | } 54 | Err(e) => { 55 | let res = BaseResponse { 56 | response_code: 1, 57 | response_msg: e.to_string(), 58 | }; 59 | serde_json::to_string(&res) 60 | } 61 | } 62 | .unwrap_or("error convert".to_string()); 63 | Ok(data) 64 | } 65 | async fn get_path_with_error( 66 | pool: Pool, 67 | param: Params, 68 | ) -> Result, anyhow::Error> { 69 | let web_path = param.path.unwrap_or(String::from("/")); 70 | info!("webpath is {}", web_path); 71 | let sqlite_row = sqlx::query("select *from config").fetch_one(&pool).await?; 72 | let config_root_path = sqlite_row.get::("config_value"); 73 | let web_path_items = web_path.split(',').collect::(); 74 | let final_path = PathBuf::new().join(config_root_path).join(web_path_items); 75 | println!("final path is {}", final_path.display()); 76 | let mut files_in_dir = tokio::fs::read_dir(&final_path).await?; 77 | let mut files = vec![]; 78 | while let Some(entry) = files_in_dir.next_entry().await? { 79 | let meta_data = entry.metadata().await?; 80 | let size = human_bytes(meta_data.len() as u32); 81 | let modified_time: DateTime = meta_data.modified()?.into(); 82 | let file_info = FileInfo { 83 | file_name: entry 84 | .file_name() 85 | .to_str() 86 | .ok_or(anyhow!("failed to get file name"))? 87 | .to_string(), 88 | is_dir: entry.file_type().await?.is_dir(), 89 | size, 90 | update_time: modified_time.format("%Y-%m-%d %H:%M:%S").to_string(), 91 | }; 92 | files.push(file_info); 93 | } 94 | Ok(files) 95 | } 96 | pub async fn set_root_path( 97 | State(pool): State>, 98 | extract::Json(payload): extract::Json, 99 | ) -> Result { 100 | let res = set_root_path_with_error(pool, payload).await; 101 | let res = match res { 102 | Ok(()) => { 103 | let base_res = BaseResponse { 104 | response_code: 0, 105 | response_msg: String::from(""), 106 | }; 107 | serde_json::to_string(&base_res) 108 | } 109 | Err(e) => { 110 | let base_res = BaseResponse { 111 | response_code: 1, 112 | response_msg: e.to_string(), 113 | }; 114 | serde_json::to_string(&base_res) 115 | } 116 | } 117 | .unwrap_or(String::from("")); 118 | Ok(res) 119 | } 120 | 121 | async fn set_root_path_with_error(pool: Pool, param: Params) -> Result<(), anyhow::Error> { 122 | let root_path = param.path.ok_or(anyhow!(""))?; 123 | let _ = sqlx::query("delete from config").execute(&pool).await?; 124 | let _ = sqlx::query( 125 | "insert into config (config_key, config_value) values ('config_root_path', $1)", 126 | ) 127 | .bind(root_path.to_string()) 128 | .execute(&pool) 129 | .await?; 130 | Ok(()) 131 | } 132 | pub async fn download_file( 133 | Query(params): Query, 134 | State(pool): State>, 135 | ) -> Result, (StatusCode, String)> { 136 | let result = download_file_with_error(pool, params) 137 | .await 138 | .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()))?; 139 | Ok(result) 140 | } 141 | async fn download_file_with_error( 142 | pool: Pool, 143 | param: Params, 144 | ) -> Result, anyhow::Error> { 145 | let web_path_items = param.path.unwrap().split(",").collect::(); 146 | let sqlite_row = sqlx::query("select *from config").fetch_one(&pool).await?; 147 | let config_root_path = sqlite_row.get::("config_value"); 148 | let final_path = PathBuf::new().join(config_root_path).join(web_path_items); 149 | let req = Request::new(Body::empty()); 150 | 151 | let ss = ServeFile::new(final_path).try_call(req).await?; 152 | 153 | Ok(ss) 154 | } 155 | pub async fn get_root_path( 156 | State(pool): State>, 157 | ) -> Result { 158 | let res = get_root_path_with_error(pool).await; 159 | let data = match res { 160 | Ok(r) => { 161 | let res = BaseResponse { 162 | response_code: 0, 163 | response_msg: r, 164 | }; 165 | serde_json::to_string(&res) 166 | } 167 | Err(e) => { 168 | let res = BaseResponse { 169 | response_code: 1, 170 | response_msg: e.to_string(), 171 | }; 172 | serde_json::to_string(&res) 173 | } 174 | } 175 | .unwrap_or(String::from("")); 176 | Ok(data) 177 | } 178 | async fn get_root_path_with_error(pool: Pool) -> Result { 179 | let sqlite_row = sqlx::query("select *from config").fetch_one(&pool).await?; 180 | let config_root_path = sqlite_row.get::("config_value"); 181 | Ok(config_root_path) 182 | } 183 | pub async fn upload_file( 184 | State(pool): State>, 185 | multipart: Multipart, 186 | ) -> Result { 187 | info!("upload start"); 188 | let res = upload_file_with_error(multipart, pool).await; 189 | let res = match res { 190 | Ok(()) => { 191 | let base_res = BaseResponse { 192 | response_code: 0, 193 | response_msg: String::from(""), 194 | }; 195 | serde_json::to_string(&base_res) 196 | } 197 | Err(e) => { 198 | let base_res = BaseResponse { 199 | response_code: 1, 200 | response_msg: e.to_string(), 201 | }; 202 | serde_json::to_string(&base_res) 203 | } 204 | } 205 | .unwrap_or(String::from("")); 206 | Ok(res) 207 | } 208 | async fn upload_file_with_error( 209 | mut multipart: Multipart, 210 | pool: Pool, 211 | ) -> Result<(), anyhow::Error> { 212 | let sqlite_row = sqlx::query("select *from config").fetch_one(&pool).await?; 213 | let config_root_path = sqlite_row.get::("config_value"); 214 | while let Some(field) = multipart.next_field().await? { 215 | let file_name = field.file_name().unwrap().to_string(); 216 | let final_path = PathBuf::new() 217 | .join(config_root_path.clone()) 218 | .join(file_name) 219 | .to_str() 220 | .unwrap() 221 | .to_string(); 222 | info!("saving to {:?}", final_path); 223 | 224 | stream_to_file(&final_path, field) 225 | .await 226 | .map_err(|(a, b)| anyhow!("Status code is {}, message is {}", a, b))?; 227 | } 228 | 229 | Ok(()) 230 | } 231 | async fn stream_to_file(path: &str, stream: S) -> Result<(), (StatusCode, String)> 232 | where 233 | S: Stream>, 234 | E: Into, 235 | { 236 | async { 237 | let body_with_io_error = stream.map_err(|err| io::Error::new(io::ErrorKind::Other, err)); 238 | let body_reader = StreamReader::new(body_with_io_error); 239 | futures::pin_mut!(body_reader); 240 | 241 | let mut file = BufWriter::new(File::create(path).await?); 242 | 243 | tokio::io::copy(&mut body_reader, &mut file).await?; 244 | 245 | Ok::<_, io::Error>(()) 246 | } 247 | .await 248 | .map_err(|err| (StatusCode::INTERNAL_SERVER_ERROR, err.to_string())) 249 | } 250 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /backend/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "actix-codec" 7 | version = "0.5.1" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "617a8268e3537fe1d8c9ead925fca49ef6400927ee7bc26750e90ecee14ce4b8" 10 | dependencies = [ 11 | "bitflags 1.3.2", 12 | "bytes", 13 | "futures-core", 14 | "futures-sink", 15 | "memchr", 16 | "pin-project-lite", 17 | "tokio", 18 | "tokio-util", 19 | "tracing", 20 | ] 21 | 22 | [[package]] 23 | name = "actix-cors" 24 | version = "0.7.1" 25 | source = "registry+https://github.com/rust-lang/crates.io-index" 26 | checksum = "daa239b93927be1ff123eebada5a3ff23e89f0124ccb8609234e5103d5a5ae6d" 27 | dependencies = [ 28 | "actix-utils", 29 | "actix-web", 30 | "derive_more 2.0.1", 31 | "futures-util", 32 | "log", 33 | "once_cell", 34 | "smallvec", 35 | ] 36 | 37 | [[package]] 38 | name = "actix-http" 39 | version = "3.5.1" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | checksum = "129d4c88e98860e1758c5de288d1632b07970a16d59bdf7b8d66053d582bb71f" 42 | dependencies = [ 43 | "actix-codec", 44 | "actix-rt", 45 | "actix-service", 46 | "actix-utils", 47 | "ahash", 48 | "base64 0.21.5", 49 | "bitflags 2.4.1", 50 | "bytes", 51 | "bytestring", 52 | "derive_more 0.99.17", 53 | "encoding_rs", 54 | "futures-core", 55 | "http 0.2.11", 56 | "httparse", 57 | "httpdate", 58 | "itoa", 59 | "language-tags", 60 | "local-channel", 61 | "mime", 62 | "percent-encoding", 63 | "pin-project-lite", 64 | "rand", 65 | "sha1", 66 | "smallvec", 67 | "tokio", 68 | "tokio-util", 69 | "tracing", 70 | ] 71 | 72 | [[package]] 73 | name = "actix-router" 74 | version = "0.5.2" 75 | source = "registry+https://github.com/rust-lang/crates.io-index" 76 | checksum = "d22475596539443685426b6bdadb926ad0ecaefdfc5fb05e5e3441f15463c511" 77 | dependencies = [ 78 | "bytestring", 79 | "http 0.2.11", 80 | "regex", 81 | "serde", 82 | "tracing", 83 | ] 84 | 85 | [[package]] 86 | name = "actix-rt" 87 | version = "2.9.0" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "28f32d40287d3f402ae0028a9d54bef51af15c8769492826a69d28f81893151d" 90 | dependencies = [ 91 | "futures-core", 92 | "tokio", 93 | ] 94 | 95 | [[package]] 96 | name = "actix-server" 97 | version = "2.3.0" 98 | source = "registry+https://github.com/rust-lang/crates.io-index" 99 | checksum = "3eb13e7eef0423ea6eab0e59f6c72e7cb46d33691ad56a726b3cd07ddec2c2d4" 100 | dependencies = [ 101 | "actix-rt", 102 | "actix-service", 103 | "actix-utils", 104 | "futures-core", 105 | "futures-util", 106 | "mio 0.8.10", 107 | "socket2 0.5.5", 108 | "tokio", 109 | "tracing", 110 | ] 111 | 112 | [[package]] 113 | name = "actix-service" 114 | version = "2.0.2" 115 | source = "registry+https://github.com/rust-lang/crates.io-index" 116 | checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" 117 | dependencies = [ 118 | "futures-core", 119 | "paste", 120 | "pin-project-lite", 121 | ] 122 | 123 | [[package]] 124 | name = "actix-utils" 125 | version = "3.0.1" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" 128 | dependencies = [ 129 | "local-waker", 130 | "pin-project-lite", 131 | ] 132 | 133 | [[package]] 134 | name = "actix-web" 135 | version = "4.4.1" 136 | source = "registry+https://github.com/rust-lang/crates.io-index" 137 | checksum = "e43428f3bf11dee6d166b00ec2df4e3aa8cc1606aaa0b7433c146852e2f4e03b" 138 | dependencies = [ 139 | "actix-codec", 140 | "actix-http", 141 | "actix-router", 142 | "actix-rt", 143 | "actix-server", 144 | "actix-service", 145 | "actix-utils", 146 | "ahash", 147 | "bytes", 148 | "bytestring", 149 | "cfg-if", 150 | "derive_more 0.99.17", 151 | "encoding_rs", 152 | "futures-core", 153 | "futures-util", 154 | "itoa", 155 | "language-tags", 156 | "log", 157 | "mime", 158 | "once_cell", 159 | "pin-project-lite", 160 | "regex", 161 | "serde", 162 | "serde_json", 163 | "serde_urlencoded", 164 | "smallvec", 165 | "socket2 0.5.5", 166 | "time", 167 | "url", 168 | ] 169 | 170 | [[package]] 171 | name = "addr2line" 172 | version = "0.21.0" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 175 | dependencies = [ 176 | "gimli", 177 | ] 178 | 179 | [[package]] 180 | name = "adler" 181 | version = "1.0.2" 182 | source = "registry+https://github.com/rust-lang/crates.io-index" 183 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 184 | 185 | [[package]] 186 | name = "ahash" 187 | version = "0.8.7" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" 190 | dependencies = [ 191 | "cfg-if", 192 | "getrandom", 193 | "once_cell", 194 | "version_check", 195 | "zerocopy", 196 | ] 197 | 198 | [[package]] 199 | name = "aho-corasick" 200 | version = "1.1.2" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" 203 | dependencies = [ 204 | "memchr", 205 | ] 206 | 207 | [[package]] 208 | name = "allocator-api2" 209 | version = "0.2.16" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" 212 | 213 | [[package]] 214 | name = "android-tzdata" 215 | version = "0.1.1" 216 | source = "registry+https://github.com/rust-lang/crates.io-index" 217 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 218 | 219 | [[package]] 220 | name = "android_system_properties" 221 | version = "0.1.5" 222 | source = "registry+https://github.com/rust-lang/crates.io-index" 223 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 224 | dependencies = [ 225 | "libc", 226 | ] 227 | 228 | [[package]] 229 | name = "anstream" 230 | version = "0.6.20" 231 | source = "registry+https://github.com/rust-lang/crates.io-index" 232 | checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" 233 | dependencies = [ 234 | "anstyle", 235 | "anstyle-parse", 236 | "anstyle-query", 237 | "anstyle-wincon", 238 | "colorchoice", 239 | "is_terminal_polyfill", 240 | "utf8parse", 241 | ] 242 | 243 | [[package]] 244 | name = "anstyle" 245 | version = "1.0.11" 246 | source = "registry+https://github.com/rust-lang/crates.io-index" 247 | checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" 248 | 249 | [[package]] 250 | name = "anstyle-parse" 251 | version = "0.2.7" 252 | source = "registry+https://github.com/rust-lang/crates.io-index" 253 | checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" 254 | dependencies = [ 255 | "utf8parse", 256 | ] 257 | 258 | [[package]] 259 | name = "anstyle-query" 260 | version = "1.1.4" 261 | source = "registry+https://github.com/rust-lang/crates.io-index" 262 | checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" 263 | dependencies = [ 264 | "windows-sys 0.60.2", 265 | ] 266 | 267 | [[package]] 268 | name = "anstyle-wincon" 269 | version = "3.0.10" 270 | source = "registry+https://github.com/rust-lang/crates.io-index" 271 | checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" 272 | dependencies = [ 273 | "anstyle", 274 | "once_cell_polyfill", 275 | "windows-sys 0.60.2", 276 | ] 277 | 278 | [[package]] 279 | name = "anyhow" 280 | version = "1.0.99" 281 | source = "registry+https://github.com/rust-lang/crates.io-index" 282 | checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" 283 | 284 | [[package]] 285 | name = "atoi" 286 | version = "2.0.0" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 289 | dependencies = [ 290 | "num-traits", 291 | ] 292 | 293 | [[package]] 294 | name = "autocfg" 295 | version = "1.1.0" 296 | source = "registry+https://github.com/rust-lang/crates.io-index" 297 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 298 | 299 | [[package]] 300 | name = "axum" 301 | version = "0.8.4" 302 | source = "registry+https://github.com/rust-lang/crates.io-index" 303 | checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" 304 | dependencies = [ 305 | "axum-core", 306 | "bytes", 307 | "form_urlencoded", 308 | "futures-util", 309 | "http 1.0.0", 310 | "http-body", 311 | "http-body-util", 312 | "hyper", 313 | "hyper-util", 314 | "itoa", 315 | "matchit", 316 | "memchr", 317 | "mime", 318 | "multer", 319 | "percent-encoding", 320 | "pin-project-lite", 321 | "rustversion", 322 | "serde", 323 | "serde_json", 324 | "serde_path_to_error", 325 | "serde_urlencoded", 326 | "sync_wrapper", 327 | "tokio", 328 | "tower 0.5.2", 329 | "tower-layer", 330 | "tower-service", 331 | "tracing", 332 | ] 333 | 334 | [[package]] 335 | name = "axum-core" 336 | version = "0.5.2" 337 | source = "registry+https://github.com/rust-lang/crates.io-index" 338 | checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" 339 | dependencies = [ 340 | "bytes", 341 | "futures-core", 342 | "http 1.0.0", 343 | "http-body", 344 | "http-body-util", 345 | "mime", 346 | "pin-project-lite", 347 | "rustversion", 348 | "sync_wrapper", 349 | "tower-layer", 350 | "tower-service", 351 | "tracing", 352 | ] 353 | 354 | [[package]] 355 | name = "backtrace" 356 | version = "0.3.69" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" 359 | dependencies = [ 360 | "addr2line", 361 | "cc", 362 | "cfg-if", 363 | "libc", 364 | "miniz_oxide", 365 | "object", 366 | "rustc-demangle", 367 | ] 368 | 369 | [[package]] 370 | name = "base64" 371 | version = "0.21.5" 372 | source = "registry+https://github.com/rust-lang/crates.io-index" 373 | checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" 374 | 375 | [[package]] 376 | name = "base64" 377 | version = "0.22.1" 378 | source = "registry+https://github.com/rust-lang/crates.io-index" 379 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 380 | 381 | [[package]] 382 | name = "base64ct" 383 | version = "1.6.0" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 386 | 387 | [[package]] 388 | name = "bitflags" 389 | version = "1.3.2" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 392 | 393 | [[package]] 394 | name = "bitflags" 395 | version = "2.4.1" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" 398 | dependencies = [ 399 | "serde", 400 | ] 401 | 402 | [[package]] 403 | name = "block-buffer" 404 | version = "0.10.4" 405 | source = "registry+https://github.com/rust-lang/crates.io-index" 406 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 407 | dependencies = [ 408 | "generic-array", 409 | ] 410 | 411 | [[package]] 412 | name = "bumpalo" 413 | version = "3.14.0" 414 | source = "registry+https://github.com/rust-lang/crates.io-index" 415 | checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" 416 | 417 | [[package]] 418 | name = "byteorder" 419 | version = "1.5.0" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 422 | 423 | [[package]] 424 | name = "bytes" 425 | version = "1.10.1" 426 | source = "registry+https://github.com/rust-lang/crates.io-index" 427 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 428 | 429 | [[package]] 430 | name = "bytestring" 431 | version = "1.3.1" 432 | source = "registry+https://github.com/rust-lang/crates.io-index" 433 | checksum = "74d80203ea6b29df88012294f62733de21cfeab47f17b41af3a38bc30a03ee72" 434 | dependencies = [ 435 | "bytes", 436 | ] 437 | 438 | [[package]] 439 | name = "cc" 440 | version = "1.2.34" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "42bc4aea80032b7bf409b0bc7ccad88853858911b7713a8062fdc0623867bedc" 443 | dependencies = [ 444 | "shlex", 445 | ] 446 | 447 | [[package]] 448 | name = "cfg-if" 449 | version = "1.0.0" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 452 | 453 | [[package]] 454 | name = "chrono" 455 | version = "0.4.31" 456 | source = "registry+https://github.com/rust-lang/crates.io-index" 457 | checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" 458 | dependencies = [ 459 | "android-tzdata", 460 | "iana-time-zone", 461 | "js-sys", 462 | "num-traits", 463 | "wasm-bindgen", 464 | "windows-targets 0.48.5", 465 | ] 466 | 467 | [[package]] 468 | name = "colorchoice" 469 | version = "1.0.4" 470 | source = "registry+https://github.com/rust-lang/crates.io-index" 471 | checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" 472 | 473 | [[package]] 474 | name = "concurrent-queue" 475 | version = "2.5.0" 476 | source = "registry+https://github.com/rust-lang/crates.io-index" 477 | checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 478 | dependencies = [ 479 | "crossbeam-utils", 480 | ] 481 | 482 | [[package]] 483 | name = "console" 484 | version = "0.16.0" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "2e09ced7ebbccb63b4c65413d821f2e00ce54c5ca4514ddc6b3c892fdbcbc69d" 487 | dependencies = [ 488 | "encode_unicode", 489 | "libc", 490 | "once_cell", 491 | "unicode-width", 492 | "windows-sys 0.60.2", 493 | ] 494 | 495 | [[package]] 496 | name = "const-oid" 497 | version = "0.9.6" 498 | source = "registry+https://github.com/rust-lang/crates.io-index" 499 | checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 500 | 501 | [[package]] 502 | name = "convert_case" 503 | version = "0.4.0" 504 | source = "registry+https://github.com/rust-lang/crates.io-index" 505 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 506 | 507 | [[package]] 508 | name = "core-foundation-sys" 509 | version = "0.8.6" 510 | source = "registry+https://github.com/rust-lang/crates.io-index" 511 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 512 | 513 | [[package]] 514 | name = "cpufeatures" 515 | version = "0.2.12" 516 | source = "registry+https://github.com/rust-lang/crates.io-index" 517 | checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" 518 | dependencies = [ 519 | "libc", 520 | ] 521 | 522 | [[package]] 523 | name = "crc" 524 | version = "3.0.1" 525 | source = "registry+https://github.com/rust-lang/crates.io-index" 526 | checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" 527 | dependencies = [ 528 | "crc-catalog", 529 | ] 530 | 531 | [[package]] 532 | name = "crc-catalog" 533 | version = "2.4.0" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" 536 | 537 | [[package]] 538 | name = "crossbeam-queue" 539 | version = "0.3.10" 540 | source = "registry+https://github.com/rust-lang/crates.io-index" 541 | checksum = "adc6598521bb5a83d491e8c1fe51db7296019d2ca3cb93cc6c2a20369a4d78a2" 542 | dependencies = [ 543 | "cfg-if", 544 | "crossbeam-utils", 545 | ] 546 | 547 | [[package]] 548 | name = "crossbeam-utils" 549 | version = "0.8.18" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c" 552 | dependencies = [ 553 | "cfg-if", 554 | ] 555 | 556 | [[package]] 557 | name = "crypto-common" 558 | version = "0.1.6" 559 | source = "registry+https://github.com/rust-lang/crates.io-index" 560 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 561 | dependencies = [ 562 | "generic-array", 563 | "typenum", 564 | ] 565 | 566 | [[package]] 567 | name = "der" 568 | version = "0.7.8" 569 | source = "registry+https://github.com/rust-lang/crates.io-index" 570 | checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" 571 | dependencies = [ 572 | "const-oid", 573 | "pem-rfc7468", 574 | "zeroize", 575 | ] 576 | 577 | [[package]] 578 | name = "deranged" 579 | version = "0.4.0" 580 | source = "registry+https://github.com/rust-lang/crates.io-index" 581 | checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" 582 | dependencies = [ 583 | "powerfmt", 584 | ] 585 | 586 | [[package]] 587 | name = "derive_more" 588 | version = "0.99.17" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" 591 | dependencies = [ 592 | "convert_case", 593 | "proc-macro2", 594 | "quote", 595 | "rustc_version", 596 | "syn 1.0.109", 597 | ] 598 | 599 | [[package]] 600 | name = "derive_more" 601 | version = "2.0.1" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" 604 | dependencies = [ 605 | "derive_more-impl", 606 | ] 607 | 608 | [[package]] 609 | name = "derive_more-impl" 610 | version = "2.0.1" 611 | source = "registry+https://github.com/rust-lang/crates.io-index" 612 | checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" 613 | dependencies = [ 614 | "proc-macro2", 615 | "quote", 616 | "syn 2.0.106", 617 | "unicode-xid", 618 | ] 619 | 620 | [[package]] 621 | name = "digest" 622 | version = "0.10.7" 623 | source = "registry+https://github.com/rust-lang/crates.io-index" 624 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 625 | dependencies = [ 626 | "block-buffer", 627 | "const-oid", 628 | "crypto-common", 629 | "subtle", 630 | ] 631 | 632 | [[package]] 633 | name = "dirs" 634 | version = "6.0.0" 635 | source = "registry+https://github.com/rust-lang/crates.io-index" 636 | checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" 637 | dependencies = [ 638 | "dirs-sys", 639 | ] 640 | 641 | [[package]] 642 | name = "dirs-sys" 643 | version = "0.5.0" 644 | source = "registry+https://github.com/rust-lang/crates.io-index" 645 | checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" 646 | dependencies = [ 647 | "libc", 648 | "option-ext", 649 | "redox_users", 650 | "windows-sys 0.60.2", 651 | ] 652 | 653 | [[package]] 654 | name = "dotenvy" 655 | version = "0.15.7" 656 | source = "registry+https://github.com/rust-lang/crates.io-index" 657 | checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" 658 | 659 | [[package]] 660 | name = "either" 661 | version = "1.9.0" 662 | source = "registry+https://github.com/rust-lang/crates.io-index" 663 | checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" 664 | dependencies = [ 665 | "serde", 666 | ] 667 | 668 | [[package]] 669 | name = "encode_unicode" 670 | version = "1.0.0" 671 | source = "registry+https://github.com/rust-lang/crates.io-index" 672 | checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" 673 | 674 | [[package]] 675 | name = "encoding_rs" 676 | version = "0.8.33" 677 | source = "registry+https://github.com/rust-lang/crates.io-index" 678 | checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" 679 | dependencies = [ 680 | "cfg-if", 681 | ] 682 | 683 | [[package]] 684 | name = "env_filter" 685 | version = "0.1.3" 686 | source = "registry+https://github.com/rust-lang/crates.io-index" 687 | checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" 688 | dependencies = [ 689 | "log", 690 | "regex", 691 | ] 692 | 693 | [[package]] 694 | name = "env_logger" 695 | version = "0.11.8" 696 | source = "registry+https://github.com/rust-lang/crates.io-index" 697 | checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" 698 | dependencies = [ 699 | "anstream", 700 | "anstyle", 701 | "env_filter", 702 | "jiff", 703 | "log", 704 | ] 705 | 706 | [[package]] 707 | name = "equivalent" 708 | version = "1.0.1" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 711 | 712 | [[package]] 713 | name = "etcetera" 714 | version = "0.8.0" 715 | source = "registry+https://github.com/rust-lang/crates.io-index" 716 | checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" 717 | dependencies = [ 718 | "cfg-if", 719 | "home", 720 | "windows-sys 0.48.0", 721 | ] 722 | 723 | [[package]] 724 | name = "event-listener" 725 | version = "5.4.1" 726 | source = "registry+https://github.com/rust-lang/crates.io-index" 727 | checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" 728 | dependencies = [ 729 | "concurrent-queue", 730 | "parking", 731 | "pin-project-lite", 732 | ] 733 | 734 | [[package]] 735 | name = "file-transfer" 736 | version = "0.0.1" 737 | dependencies = [ 738 | "actix-cors", 739 | "anyhow", 740 | "axum", 741 | "bytes", 742 | "chrono", 743 | "console", 744 | "dirs", 745 | "env_logger", 746 | "futures", 747 | "human_bytes", 748 | "json", 749 | "libsqlite3-sys", 750 | "local-ip-address", 751 | "log", 752 | "mime_guess", 753 | "qrcode", 754 | "rust-embed", 755 | "serde", 756 | "serde_derive", 757 | "serde_json", 758 | "sqlx", 759 | "time", 760 | "tokio", 761 | "tokio-util", 762 | "tower-http", 763 | ] 764 | 765 | [[package]] 766 | name = "finl_unicode" 767 | version = "1.2.0" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" 770 | 771 | [[package]] 772 | name = "flume" 773 | version = "0.11.0" 774 | source = "registry+https://github.com/rust-lang/crates.io-index" 775 | checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" 776 | dependencies = [ 777 | "futures-core", 778 | "futures-sink", 779 | "spin 0.9.8", 780 | ] 781 | 782 | [[package]] 783 | name = "fnv" 784 | version = "1.0.7" 785 | source = "registry+https://github.com/rust-lang/crates.io-index" 786 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 787 | 788 | [[package]] 789 | name = "foldhash" 790 | version = "0.1.5" 791 | source = "registry+https://github.com/rust-lang/crates.io-index" 792 | checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 793 | 794 | [[package]] 795 | name = "form_urlencoded" 796 | version = "1.2.1" 797 | source = "registry+https://github.com/rust-lang/crates.io-index" 798 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 799 | dependencies = [ 800 | "percent-encoding", 801 | ] 802 | 803 | [[package]] 804 | name = "futures" 805 | version = "0.3.31" 806 | source = "registry+https://github.com/rust-lang/crates.io-index" 807 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 808 | dependencies = [ 809 | "futures-channel", 810 | "futures-core", 811 | "futures-executor", 812 | "futures-io", 813 | "futures-sink", 814 | "futures-task", 815 | "futures-util", 816 | ] 817 | 818 | [[package]] 819 | name = "futures-channel" 820 | version = "0.3.31" 821 | source = "registry+https://github.com/rust-lang/crates.io-index" 822 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 823 | dependencies = [ 824 | "futures-core", 825 | "futures-sink", 826 | ] 827 | 828 | [[package]] 829 | name = "futures-core" 830 | version = "0.3.31" 831 | source = "registry+https://github.com/rust-lang/crates.io-index" 832 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 833 | 834 | [[package]] 835 | name = "futures-executor" 836 | version = "0.3.31" 837 | source = "registry+https://github.com/rust-lang/crates.io-index" 838 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 839 | dependencies = [ 840 | "futures-core", 841 | "futures-task", 842 | "futures-util", 843 | ] 844 | 845 | [[package]] 846 | name = "futures-intrusive" 847 | version = "0.5.0" 848 | source = "registry+https://github.com/rust-lang/crates.io-index" 849 | checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" 850 | dependencies = [ 851 | "futures-core", 852 | "lock_api", 853 | "parking_lot", 854 | ] 855 | 856 | [[package]] 857 | name = "futures-io" 858 | version = "0.3.31" 859 | source = "registry+https://github.com/rust-lang/crates.io-index" 860 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 861 | 862 | [[package]] 863 | name = "futures-macro" 864 | version = "0.3.31" 865 | source = "registry+https://github.com/rust-lang/crates.io-index" 866 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 867 | dependencies = [ 868 | "proc-macro2", 869 | "quote", 870 | "syn 2.0.106", 871 | ] 872 | 873 | [[package]] 874 | name = "futures-sink" 875 | version = "0.3.31" 876 | source = "registry+https://github.com/rust-lang/crates.io-index" 877 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 878 | 879 | [[package]] 880 | name = "futures-task" 881 | version = "0.3.31" 882 | source = "registry+https://github.com/rust-lang/crates.io-index" 883 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 884 | 885 | [[package]] 886 | name = "futures-util" 887 | version = "0.3.31" 888 | source = "registry+https://github.com/rust-lang/crates.io-index" 889 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 890 | dependencies = [ 891 | "futures-channel", 892 | "futures-core", 893 | "futures-io", 894 | "futures-macro", 895 | "futures-sink", 896 | "futures-task", 897 | "memchr", 898 | "pin-project-lite", 899 | "pin-utils", 900 | "slab", 901 | ] 902 | 903 | [[package]] 904 | name = "generic-array" 905 | version = "0.14.7" 906 | source = "registry+https://github.com/rust-lang/crates.io-index" 907 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 908 | dependencies = [ 909 | "typenum", 910 | "version_check", 911 | ] 912 | 913 | [[package]] 914 | name = "getrandom" 915 | version = "0.2.11" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" 918 | dependencies = [ 919 | "cfg-if", 920 | "libc", 921 | "wasi", 922 | ] 923 | 924 | [[package]] 925 | name = "gimli" 926 | version = "0.28.1" 927 | source = "registry+https://github.com/rust-lang/crates.io-index" 928 | checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 929 | 930 | [[package]] 931 | name = "hashbrown" 932 | version = "0.14.3" 933 | source = "registry+https://github.com/rust-lang/crates.io-index" 934 | checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" 935 | 936 | [[package]] 937 | name = "hashbrown" 938 | version = "0.15.5" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 941 | dependencies = [ 942 | "allocator-api2", 943 | "equivalent", 944 | "foldhash", 945 | ] 946 | 947 | [[package]] 948 | name = "hashlink" 949 | version = "0.10.0" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" 952 | dependencies = [ 953 | "hashbrown 0.15.5", 954 | ] 955 | 956 | [[package]] 957 | name = "heck" 958 | version = "0.5.0" 959 | source = "registry+https://github.com/rust-lang/crates.io-index" 960 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 961 | 962 | [[package]] 963 | name = "hex" 964 | version = "0.4.3" 965 | source = "registry+https://github.com/rust-lang/crates.io-index" 966 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 967 | 968 | [[package]] 969 | name = "hkdf" 970 | version = "0.12.4" 971 | source = "registry+https://github.com/rust-lang/crates.io-index" 972 | checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" 973 | dependencies = [ 974 | "hmac", 975 | ] 976 | 977 | [[package]] 978 | name = "hmac" 979 | version = "0.12.1" 980 | source = "registry+https://github.com/rust-lang/crates.io-index" 981 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 982 | dependencies = [ 983 | "digest", 984 | ] 985 | 986 | [[package]] 987 | name = "home" 988 | version = "0.5.9" 989 | source = "registry+https://github.com/rust-lang/crates.io-index" 990 | checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" 991 | dependencies = [ 992 | "windows-sys 0.52.0", 993 | ] 994 | 995 | [[package]] 996 | name = "http" 997 | version = "0.2.11" 998 | source = "registry+https://github.com/rust-lang/crates.io-index" 999 | checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" 1000 | dependencies = [ 1001 | "bytes", 1002 | "fnv", 1003 | "itoa", 1004 | ] 1005 | 1006 | [[package]] 1007 | name = "http" 1008 | version = "1.0.0" 1009 | source = "registry+https://github.com/rust-lang/crates.io-index" 1010 | checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" 1011 | dependencies = [ 1012 | "bytes", 1013 | "fnv", 1014 | "itoa", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "http-body" 1019 | version = "1.0.0" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" 1022 | dependencies = [ 1023 | "bytes", 1024 | "http 1.0.0", 1025 | ] 1026 | 1027 | [[package]] 1028 | name = "http-body-util" 1029 | version = "0.1.0" 1030 | source = "registry+https://github.com/rust-lang/crates.io-index" 1031 | checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" 1032 | dependencies = [ 1033 | "bytes", 1034 | "futures-util", 1035 | "http 1.0.0", 1036 | "http-body", 1037 | "pin-project-lite", 1038 | ] 1039 | 1040 | [[package]] 1041 | name = "http-range-header" 1042 | version = "0.4.0" 1043 | source = "registry+https://github.com/rust-lang/crates.io-index" 1044 | checksum = "3ce4ef31cda248bbdb6e6820603b82dfcd9e833db65a43e997a0ccec777d11fe" 1045 | 1046 | [[package]] 1047 | name = "httparse" 1048 | version = "1.8.0" 1049 | source = "registry+https://github.com/rust-lang/crates.io-index" 1050 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 1051 | 1052 | [[package]] 1053 | name = "httpdate" 1054 | version = "1.0.3" 1055 | source = "registry+https://github.com/rust-lang/crates.io-index" 1056 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 1057 | 1058 | [[package]] 1059 | name = "human_bytes" 1060 | version = "0.4.3" 1061 | source = "registry+https://github.com/rust-lang/crates.io-index" 1062 | checksum = "91f255a4535024abf7640cb288260811fc14794f62b063652ed349f9a6c2348e" 1063 | 1064 | [[package]] 1065 | name = "hyper" 1066 | version = "1.1.0" 1067 | source = "registry+https://github.com/rust-lang/crates.io-index" 1068 | checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75" 1069 | dependencies = [ 1070 | "bytes", 1071 | "futures-channel", 1072 | "futures-util", 1073 | "http 1.0.0", 1074 | "http-body", 1075 | "httparse", 1076 | "httpdate", 1077 | "itoa", 1078 | "pin-project-lite", 1079 | "tokio", 1080 | ] 1081 | 1082 | [[package]] 1083 | name = "hyper-util" 1084 | version = "0.1.3" 1085 | source = "registry+https://github.com/rust-lang/crates.io-index" 1086 | checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" 1087 | dependencies = [ 1088 | "bytes", 1089 | "futures-util", 1090 | "http 1.0.0", 1091 | "http-body", 1092 | "hyper", 1093 | "pin-project-lite", 1094 | "socket2 0.5.5", 1095 | "tokio", 1096 | "tower 0.4.13", 1097 | "tower-service", 1098 | ] 1099 | 1100 | [[package]] 1101 | name = "iana-time-zone" 1102 | version = "0.1.59" 1103 | source = "registry+https://github.com/rust-lang/crates.io-index" 1104 | checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" 1105 | dependencies = [ 1106 | "android_system_properties", 1107 | "core-foundation-sys", 1108 | "iana-time-zone-haiku", 1109 | "js-sys", 1110 | "wasm-bindgen", 1111 | "windows-core", 1112 | ] 1113 | 1114 | [[package]] 1115 | name = "iana-time-zone-haiku" 1116 | version = "0.1.2" 1117 | source = "registry+https://github.com/rust-lang/crates.io-index" 1118 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1119 | dependencies = [ 1120 | "cc", 1121 | ] 1122 | 1123 | [[package]] 1124 | name = "idna" 1125 | version = "0.5.0" 1126 | source = "registry+https://github.com/rust-lang/crates.io-index" 1127 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 1128 | dependencies = [ 1129 | "unicode-bidi", 1130 | "unicode-normalization", 1131 | ] 1132 | 1133 | [[package]] 1134 | name = "indexmap" 1135 | version = "2.1.0" 1136 | source = "registry+https://github.com/rust-lang/crates.io-index" 1137 | checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" 1138 | dependencies = [ 1139 | "equivalent", 1140 | "hashbrown 0.14.3", 1141 | ] 1142 | 1143 | [[package]] 1144 | name = "io-uring" 1145 | version = "0.7.10" 1146 | source = "registry+https://github.com/rust-lang/crates.io-index" 1147 | checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" 1148 | dependencies = [ 1149 | "bitflags 2.4.1", 1150 | "cfg-if", 1151 | "libc", 1152 | ] 1153 | 1154 | [[package]] 1155 | name = "is_terminal_polyfill" 1156 | version = "1.70.1" 1157 | source = "registry+https://github.com/rust-lang/crates.io-index" 1158 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 1159 | 1160 | [[package]] 1161 | name = "itoa" 1162 | version = "1.0.10" 1163 | source = "registry+https://github.com/rust-lang/crates.io-index" 1164 | checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" 1165 | 1166 | [[package]] 1167 | name = "jiff" 1168 | version = "0.2.15" 1169 | source = "registry+https://github.com/rust-lang/crates.io-index" 1170 | checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" 1171 | dependencies = [ 1172 | "jiff-static", 1173 | "log", 1174 | "portable-atomic", 1175 | "portable-atomic-util", 1176 | "serde", 1177 | ] 1178 | 1179 | [[package]] 1180 | name = "jiff-static" 1181 | version = "0.2.15" 1182 | source = "registry+https://github.com/rust-lang/crates.io-index" 1183 | checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" 1184 | dependencies = [ 1185 | "proc-macro2", 1186 | "quote", 1187 | "syn 2.0.106", 1188 | ] 1189 | 1190 | [[package]] 1191 | name = "js-sys" 1192 | version = "0.3.66" 1193 | source = "registry+https://github.com/rust-lang/crates.io-index" 1194 | checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" 1195 | dependencies = [ 1196 | "wasm-bindgen", 1197 | ] 1198 | 1199 | [[package]] 1200 | name = "json" 1201 | version = "0.12.4" 1202 | source = "registry+https://github.com/rust-lang/crates.io-index" 1203 | checksum = "078e285eafdfb6c4b434e0d31e8cfcb5115b651496faca5749b88fafd4f23bfd" 1204 | 1205 | [[package]] 1206 | name = "language-tags" 1207 | version = "0.3.2" 1208 | source = "registry+https://github.com/rust-lang/crates.io-index" 1209 | checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" 1210 | 1211 | [[package]] 1212 | name = "lazy_static" 1213 | version = "1.4.0" 1214 | source = "registry+https://github.com/rust-lang/crates.io-index" 1215 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1216 | dependencies = [ 1217 | "spin 0.5.2", 1218 | ] 1219 | 1220 | [[package]] 1221 | name = "libc" 1222 | version = "0.2.175" 1223 | source = "registry+https://github.com/rust-lang/crates.io-index" 1224 | checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" 1225 | 1226 | [[package]] 1227 | name = "libm" 1228 | version = "0.2.8" 1229 | source = "registry+https://github.com/rust-lang/crates.io-index" 1230 | checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" 1231 | 1232 | [[package]] 1233 | name = "libredox" 1234 | version = "0.1.9" 1235 | source = "registry+https://github.com/rust-lang/crates.io-index" 1236 | checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" 1237 | dependencies = [ 1238 | "bitflags 2.4.1", 1239 | "libc", 1240 | ] 1241 | 1242 | [[package]] 1243 | name = "libsqlite3-sys" 1244 | version = "0.30.1" 1245 | source = "registry+https://github.com/rust-lang/crates.io-index" 1246 | checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" 1247 | dependencies = [ 1248 | "cc", 1249 | "pkg-config", 1250 | "vcpkg", 1251 | ] 1252 | 1253 | [[package]] 1254 | name = "local-channel" 1255 | version = "0.1.5" 1256 | source = "registry+https://github.com/rust-lang/crates.io-index" 1257 | checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" 1258 | dependencies = [ 1259 | "futures-core", 1260 | "futures-sink", 1261 | "local-waker", 1262 | ] 1263 | 1264 | [[package]] 1265 | name = "local-ip-address" 1266 | version = "0.6.5" 1267 | source = "registry+https://github.com/rust-lang/crates.io-index" 1268 | checksum = "656b3b27f8893f7bbf9485148ff9a65f019e3f33bd5cdc87c83cab16b3fd9ec8" 1269 | dependencies = [ 1270 | "libc", 1271 | "neli", 1272 | "thiserror", 1273 | "windows-sys 0.59.0", 1274 | ] 1275 | 1276 | [[package]] 1277 | name = "local-waker" 1278 | version = "0.1.4" 1279 | source = "registry+https://github.com/rust-lang/crates.io-index" 1280 | checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" 1281 | 1282 | [[package]] 1283 | name = "lock_api" 1284 | version = "0.4.11" 1285 | source = "registry+https://github.com/rust-lang/crates.io-index" 1286 | checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" 1287 | dependencies = [ 1288 | "autocfg", 1289 | "scopeguard", 1290 | ] 1291 | 1292 | [[package]] 1293 | name = "log" 1294 | version = "0.4.27" 1295 | source = "registry+https://github.com/rust-lang/crates.io-index" 1296 | checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 1297 | 1298 | [[package]] 1299 | name = "matchit" 1300 | version = "0.8.4" 1301 | source = "registry+https://github.com/rust-lang/crates.io-index" 1302 | checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" 1303 | 1304 | [[package]] 1305 | name = "md-5" 1306 | version = "0.10.6" 1307 | source = "registry+https://github.com/rust-lang/crates.io-index" 1308 | checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 1309 | dependencies = [ 1310 | "cfg-if", 1311 | "digest", 1312 | ] 1313 | 1314 | [[package]] 1315 | name = "memchr" 1316 | version = "2.7.1" 1317 | source = "registry+https://github.com/rust-lang/crates.io-index" 1318 | checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" 1319 | 1320 | [[package]] 1321 | name = "mime" 1322 | version = "0.3.17" 1323 | source = "registry+https://github.com/rust-lang/crates.io-index" 1324 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1325 | 1326 | [[package]] 1327 | name = "mime_guess" 1328 | version = "2.0.5" 1329 | source = "registry+https://github.com/rust-lang/crates.io-index" 1330 | checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" 1331 | dependencies = [ 1332 | "mime", 1333 | "unicase", 1334 | ] 1335 | 1336 | [[package]] 1337 | name = "miniz_oxide" 1338 | version = "0.7.1" 1339 | source = "registry+https://github.com/rust-lang/crates.io-index" 1340 | checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" 1341 | dependencies = [ 1342 | "adler", 1343 | ] 1344 | 1345 | [[package]] 1346 | name = "mio" 1347 | version = "0.8.10" 1348 | source = "registry+https://github.com/rust-lang/crates.io-index" 1349 | checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" 1350 | dependencies = [ 1351 | "libc", 1352 | "log", 1353 | "wasi", 1354 | "windows-sys 0.48.0", 1355 | ] 1356 | 1357 | [[package]] 1358 | name = "mio" 1359 | version = "1.0.4" 1360 | source = "registry+https://github.com/rust-lang/crates.io-index" 1361 | checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 1362 | dependencies = [ 1363 | "libc", 1364 | "wasi", 1365 | "windows-sys 0.59.0", 1366 | ] 1367 | 1368 | [[package]] 1369 | name = "multer" 1370 | version = "3.0.0" 1371 | source = "registry+https://github.com/rust-lang/crates.io-index" 1372 | checksum = "a15d522be0a9c3e46fd2632e272d178f56387bdb5c9fbb3a36c649062e9b5219" 1373 | dependencies = [ 1374 | "bytes", 1375 | "encoding_rs", 1376 | "futures-util", 1377 | "http 1.0.0", 1378 | "httparse", 1379 | "log", 1380 | "memchr", 1381 | "mime", 1382 | "spin 0.9.8", 1383 | "version_check", 1384 | ] 1385 | 1386 | [[package]] 1387 | name = "neli" 1388 | version = "0.6.4" 1389 | source = "registry+https://github.com/rust-lang/crates.io-index" 1390 | checksum = "1100229e06604150b3becd61a4965d5c70f3be1759544ea7274166f4be41ef43" 1391 | dependencies = [ 1392 | "byteorder", 1393 | "libc", 1394 | "log", 1395 | "neli-proc-macros", 1396 | ] 1397 | 1398 | [[package]] 1399 | name = "neli-proc-macros" 1400 | version = "0.1.3" 1401 | source = "registry+https://github.com/rust-lang/crates.io-index" 1402 | checksum = "c168194d373b1e134786274020dae7fc5513d565ea2ebb9bc9ff17ffb69106d4" 1403 | dependencies = [ 1404 | "either", 1405 | "proc-macro2", 1406 | "quote", 1407 | "serde", 1408 | "syn 1.0.109", 1409 | ] 1410 | 1411 | [[package]] 1412 | name = "num-bigint-dig" 1413 | version = "0.8.4" 1414 | source = "registry+https://github.com/rust-lang/crates.io-index" 1415 | checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" 1416 | dependencies = [ 1417 | "byteorder", 1418 | "lazy_static", 1419 | "libm", 1420 | "num-integer", 1421 | "num-iter", 1422 | "num-traits", 1423 | "rand", 1424 | "smallvec", 1425 | "zeroize", 1426 | ] 1427 | 1428 | [[package]] 1429 | name = "num-conv" 1430 | version = "0.1.0" 1431 | source = "registry+https://github.com/rust-lang/crates.io-index" 1432 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1433 | 1434 | [[package]] 1435 | name = "num-integer" 1436 | version = "0.1.45" 1437 | source = "registry+https://github.com/rust-lang/crates.io-index" 1438 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 1439 | dependencies = [ 1440 | "autocfg", 1441 | "num-traits", 1442 | ] 1443 | 1444 | [[package]] 1445 | name = "num-iter" 1446 | version = "0.1.43" 1447 | source = "registry+https://github.com/rust-lang/crates.io-index" 1448 | checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" 1449 | dependencies = [ 1450 | "autocfg", 1451 | "num-integer", 1452 | "num-traits", 1453 | ] 1454 | 1455 | [[package]] 1456 | name = "num-traits" 1457 | version = "0.2.17" 1458 | source = "registry+https://github.com/rust-lang/crates.io-index" 1459 | checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" 1460 | dependencies = [ 1461 | "autocfg", 1462 | "libm", 1463 | ] 1464 | 1465 | [[package]] 1466 | name = "object" 1467 | version = "0.32.2" 1468 | source = "registry+https://github.com/rust-lang/crates.io-index" 1469 | checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" 1470 | dependencies = [ 1471 | "memchr", 1472 | ] 1473 | 1474 | [[package]] 1475 | name = "once_cell" 1476 | version = "1.19.0" 1477 | source = "registry+https://github.com/rust-lang/crates.io-index" 1478 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 1479 | 1480 | [[package]] 1481 | name = "once_cell_polyfill" 1482 | version = "1.70.1" 1483 | source = "registry+https://github.com/rust-lang/crates.io-index" 1484 | checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" 1485 | 1486 | [[package]] 1487 | name = "option-ext" 1488 | version = "0.2.0" 1489 | source = "registry+https://github.com/rust-lang/crates.io-index" 1490 | checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 1491 | 1492 | [[package]] 1493 | name = "parking" 1494 | version = "2.2.1" 1495 | source = "registry+https://github.com/rust-lang/crates.io-index" 1496 | checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 1497 | 1498 | [[package]] 1499 | name = "parking_lot" 1500 | version = "0.12.1" 1501 | source = "registry+https://github.com/rust-lang/crates.io-index" 1502 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 1503 | dependencies = [ 1504 | "lock_api", 1505 | "parking_lot_core", 1506 | ] 1507 | 1508 | [[package]] 1509 | name = "parking_lot_core" 1510 | version = "0.9.9" 1511 | source = "registry+https://github.com/rust-lang/crates.io-index" 1512 | checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" 1513 | dependencies = [ 1514 | "cfg-if", 1515 | "libc", 1516 | "redox_syscall", 1517 | "smallvec", 1518 | "windows-targets 0.48.5", 1519 | ] 1520 | 1521 | [[package]] 1522 | name = "paste" 1523 | version = "1.0.14" 1524 | source = "registry+https://github.com/rust-lang/crates.io-index" 1525 | checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" 1526 | 1527 | [[package]] 1528 | name = "pem-rfc7468" 1529 | version = "0.7.0" 1530 | source = "registry+https://github.com/rust-lang/crates.io-index" 1531 | checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 1532 | dependencies = [ 1533 | "base64ct", 1534 | ] 1535 | 1536 | [[package]] 1537 | name = "percent-encoding" 1538 | version = "2.3.1" 1539 | source = "registry+https://github.com/rust-lang/crates.io-index" 1540 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1541 | 1542 | [[package]] 1543 | name = "pin-project" 1544 | version = "1.1.3" 1545 | source = "registry+https://github.com/rust-lang/crates.io-index" 1546 | checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" 1547 | dependencies = [ 1548 | "pin-project-internal", 1549 | ] 1550 | 1551 | [[package]] 1552 | name = "pin-project-internal" 1553 | version = "1.1.3" 1554 | source = "registry+https://github.com/rust-lang/crates.io-index" 1555 | checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" 1556 | dependencies = [ 1557 | "proc-macro2", 1558 | "quote", 1559 | "syn 2.0.106", 1560 | ] 1561 | 1562 | [[package]] 1563 | name = "pin-project-lite" 1564 | version = "0.2.13" 1565 | source = "registry+https://github.com/rust-lang/crates.io-index" 1566 | checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" 1567 | 1568 | [[package]] 1569 | name = "pin-utils" 1570 | version = "0.1.0" 1571 | source = "registry+https://github.com/rust-lang/crates.io-index" 1572 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1573 | 1574 | [[package]] 1575 | name = "pkcs1" 1576 | version = "0.7.5" 1577 | source = "registry+https://github.com/rust-lang/crates.io-index" 1578 | checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" 1579 | dependencies = [ 1580 | "der", 1581 | "pkcs8", 1582 | "spki", 1583 | ] 1584 | 1585 | [[package]] 1586 | name = "pkcs8" 1587 | version = "0.10.2" 1588 | source = "registry+https://github.com/rust-lang/crates.io-index" 1589 | checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 1590 | dependencies = [ 1591 | "der", 1592 | "spki", 1593 | ] 1594 | 1595 | [[package]] 1596 | name = "pkg-config" 1597 | version = "0.3.28" 1598 | source = "registry+https://github.com/rust-lang/crates.io-index" 1599 | checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" 1600 | 1601 | [[package]] 1602 | name = "portable-atomic" 1603 | version = "1.11.1" 1604 | source = "registry+https://github.com/rust-lang/crates.io-index" 1605 | checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" 1606 | 1607 | [[package]] 1608 | name = "portable-atomic-util" 1609 | version = "0.2.4" 1610 | source = "registry+https://github.com/rust-lang/crates.io-index" 1611 | checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" 1612 | dependencies = [ 1613 | "portable-atomic", 1614 | ] 1615 | 1616 | [[package]] 1617 | name = "powerfmt" 1618 | version = "0.2.0" 1619 | source = "registry+https://github.com/rust-lang/crates.io-index" 1620 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1621 | 1622 | [[package]] 1623 | name = "ppv-lite86" 1624 | version = "0.2.17" 1625 | source = "registry+https://github.com/rust-lang/crates.io-index" 1626 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 1627 | 1628 | [[package]] 1629 | name = "proc-macro2" 1630 | version = "1.0.101" 1631 | source = "registry+https://github.com/rust-lang/crates.io-index" 1632 | checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" 1633 | dependencies = [ 1634 | "unicode-ident", 1635 | ] 1636 | 1637 | [[package]] 1638 | name = "qrcode" 1639 | version = "0.14.1" 1640 | source = "registry+https://github.com/rust-lang/crates.io-index" 1641 | checksum = "d68782463e408eb1e668cf6152704bd856c78c5b6417adaee3203d8f4c1fc9ec" 1642 | 1643 | [[package]] 1644 | name = "quote" 1645 | version = "1.0.40" 1646 | source = "registry+https://github.com/rust-lang/crates.io-index" 1647 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1648 | dependencies = [ 1649 | "proc-macro2", 1650 | ] 1651 | 1652 | [[package]] 1653 | name = "rand" 1654 | version = "0.8.5" 1655 | source = "registry+https://github.com/rust-lang/crates.io-index" 1656 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1657 | dependencies = [ 1658 | "libc", 1659 | "rand_chacha", 1660 | "rand_core", 1661 | ] 1662 | 1663 | [[package]] 1664 | name = "rand_chacha" 1665 | version = "0.3.1" 1666 | source = "registry+https://github.com/rust-lang/crates.io-index" 1667 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1668 | dependencies = [ 1669 | "ppv-lite86", 1670 | "rand_core", 1671 | ] 1672 | 1673 | [[package]] 1674 | name = "rand_core" 1675 | version = "0.6.4" 1676 | source = "registry+https://github.com/rust-lang/crates.io-index" 1677 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1678 | dependencies = [ 1679 | "getrandom", 1680 | ] 1681 | 1682 | [[package]] 1683 | name = "redox_syscall" 1684 | version = "0.4.1" 1685 | source = "registry+https://github.com/rust-lang/crates.io-index" 1686 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 1687 | dependencies = [ 1688 | "bitflags 1.3.2", 1689 | ] 1690 | 1691 | [[package]] 1692 | name = "redox_users" 1693 | version = "0.5.2" 1694 | source = "registry+https://github.com/rust-lang/crates.io-index" 1695 | checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" 1696 | dependencies = [ 1697 | "getrandom", 1698 | "libredox", 1699 | "thiserror", 1700 | ] 1701 | 1702 | [[package]] 1703 | name = "regex" 1704 | version = "1.10.2" 1705 | source = "registry+https://github.com/rust-lang/crates.io-index" 1706 | checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" 1707 | dependencies = [ 1708 | "aho-corasick", 1709 | "memchr", 1710 | "regex-automata", 1711 | "regex-syntax", 1712 | ] 1713 | 1714 | [[package]] 1715 | name = "regex-automata" 1716 | version = "0.4.3" 1717 | source = "registry+https://github.com/rust-lang/crates.io-index" 1718 | checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" 1719 | dependencies = [ 1720 | "aho-corasick", 1721 | "memchr", 1722 | "regex-syntax", 1723 | ] 1724 | 1725 | [[package]] 1726 | name = "regex-syntax" 1727 | version = "0.8.2" 1728 | source = "registry+https://github.com/rust-lang/crates.io-index" 1729 | checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" 1730 | 1731 | [[package]] 1732 | name = "rsa" 1733 | version = "0.9.6" 1734 | source = "registry+https://github.com/rust-lang/crates.io-index" 1735 | checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" 1736 | dependencies = [ 1737 | "const-oid", 1738 | "digest", 1739 | "num-bigint-dig", 1740 | "num-integer", 1741 | "num-traits", 1742 | "pkcs1", 1743 | "pkcs8", 1744 | "rand_core", 1745 | "signature", 1746 | "spki", 1747 | "subtle", 1748 | "zeroize", 1749 | ] 1750 | 1751 | [[package]] 1752 | name = "rust-embed" 1753 | version = "8.7.2" 1754 | source = "registry+https://github.com/rust-lang/crates.io-index" 1755 | checksum = "025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a" 1756 | dependencies = [ 1757 | "rust-embed-impl", 1758 | "rust-embed-utils", 1759 | "walkdir", 1760 | ] 1761 | 1762 | [[package]] 1763 | name = "rust-embed-impl" 1764 | version = "8.7.2" 1765 | source = "registry+https://github.com/rust-lang/crates.io-index" 1766 | checksum = "6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c" 1767 | dependencies = [ 1768 | "proc-macro2", 1769 | "quote", 1770 | "rust-embed-utils", 1771 | "syn 2.0.106", 1772 | "walkdir", 1773 | ] 1774 | 1775 | [[package]] 1776 | name = "rust-embed-utils" 1777 | version = "8.7.2" 1778 | source = "registry+https://github.com/rust-lang/crates.io-index" 1779 | checksum = "f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594" 1780 | dependencies = [ 1781 | "sha2", 1782 | "walkdir", 1783 | ] 1784 | 1785 | [[package]] 1786 | name = "rustc-demangle" 1787 | version = "0.1.23" 1788 | source = "registry+https://github.com/rust-lang/crates.io-index" 1789 | checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 1790 | 1791 | [[package]] 1792 | name = "rustc_version" 1793 | version = "0.4.0" 1794 | source = "registry+https://github.com/rust-lang/crates.io-index" 1795 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 1796 | dependencies = [ 1797 | "semver", 1798 | ] 1799 | 1800 | [[package]] 1801 | name = "rustversion" 1802 | version = "1.0.14" 1803 | source = "registry+https://github.com/rust-lang/crates.io-index" 1804 | checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" 1805 | 1806 | [[package]] 1807 | name = "ryu" 1808 | version = "1.0.16" 1809 | source = "registry+https://github.com/rust-lang/crates.io-index" 1810 | checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" 1811 | 1812 | [[package]] 1813 | name = "same-file" 1814 | version = "1.0.6" 1815 | source = "registry+https://github.com/rust-lang/crates.io-index" 1816 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1817 | dependencies = [ 1818 | "winapi-util", 1819 | ] 1820 | 1821 | [[package]] 1822 | name = "scopeguard" 1823 | version = "1.2.0" 1824 | source = "registry+https://github.com/rust-lang/crates.io-index" 1825 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1826 | 1827 | [[package]] 1828 | name = "semver" 1829 | version = "1.0.21" 1830 | source = "registry+https://github.com/rust-lang/crates.io-index" 1831 | checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" 1832 | 1833 | [[package]] 1834 | name = "serde" 1835 | version = "1.0.219" 1836 | source = "registry+https://github.com/rust-lang/crates.io-index" 1837 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 1838 | dependencies = [ 1839 | "serde_derive", 1840 | ] 1841 | 1842 | [[package]] 1843 | name = "serde_derive" 1844 | version = "1.0.219" 1845 | source = "registry+https://github.com/rust-lang/crates.io-index" 1846 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 1847 | dependencies = [ 1848 | "proc-macro2", 1849 | "quote", 1850 | "syn 2.0.106", 1851 | ] 1852 | 1853 | [[package]] 1854 | name = "serde_json" 1855 | version = "1.0.143" 1856 | source = "registry+https://github.com/rust-lang/crates.io-index" 1857 | checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" 1858 | dependencies = [ 1859 | "itoa", 1860 | "memchr", 1861 | "ryu", 1862 | "serde", 1863 | ] 1864 | 1865 | [[package]] 1866 | name = "serde_path_to_error" 1867 | version = "0.1.15" 1868 | source = "registry+https://github.com/rust-lang/crates.io-index" 1869 | checksum = "ebd154a240de39fdebcf5775d2675c204d7c13cf39a4c697be6493c8e734337c" 1870 | dependencies = [ 1871 | "itoa", 1872 | "serde", 1873 | ] 1874 | 1875 | [[package]] 1876 | name = "serde_urlencoded" 1877 | version = "0.7.1" 1878 | source = "registry+https://github.com/rust-lang/crates.io-index" 1879 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1880 | dependencies = [ 1881 | "form_urlencoded", 1882 | "itoa", 1883 | "ryu", 1884 | "serde", 1885 | ] 1886 | 1887 | [[package]] 1888 | name = "sha1" 1889 | version = "0.10.6" 1890 | source = "registry+https://github.com/rust-lang/crates.io-index" 1891 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1892 | dependencies = [ 1893 | "cfg-if", 1894 | "cpufeatures", 1895 | "digest", 1896 | ] 1897 | 1898 | [[package]] 1899 | name = "sha2" 1900 | version = "0.10.8" 1901 | source = "registry+https://github.com/rust-lang/crates.io-index" 1902 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1903 | dependencies = [ 1904 | "cfg-if", 1905 | "cpufeatures", 1906 | "digest", 1907 | ] 1908 | 1909 | [[package]] 1910 | name = "shlex" 1911 | version = "1.3.0" 1912 | source = "registry+https://github.com/rust-lang/crates.io-index" 1913 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1914 | 1915 | [[package]] 1916 | name = "signal-hook-registry" 1917 | version = "1.4.1" 1918 | source = "registry+https://github.com/rust-lang/crates.io-index" 1919 | checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" 1920 | dependencies = [ 1921 | "libc", 1922 | ] 1923 | 1924 | [[package]] 1925 | name = "signature" 1926 | version = "2.2.0" 1927 | source = "registry+https://github.com/rust-lang/crates.io-index" 1928 | checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 1929 | dependencies = [ 1930 | "digest", 1931 | "rand_core", 1932 | ] 1933 | 1934 | [[package]] 1935 | name = "slab" 1936 | version = "0.4.9" 1937 | source = "registry+https://github.com/rust-lang/crates.io-index" 1938 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1939 | dependencies = [ 1940 | "autocfg", 1941 | ] 1942 | 1943 | [[package]] 1944 | name = "smallvec" 1945 | version = "1.11.2" 1946 | source = "registry+https://github.com/rust-lang/crates.io-index" 1947 | checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" 1948 | dependencies = [ 1949 | "serde", 1950 | ] 1951 | 1952 | [[package]] 1953 | name = "socket2" 1954 | version = "0.5.5" 1955 | source = "registry+https://github.com/rust-lang/crates.io-index" 1956 | checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" 1957 | dependencies = [ 1958 | "libc", 1959 | "windows-sys 0.48.0", 1960 | ] 1961 | 1962 | [[package]] 1963 | name = "socket2" 1964 | version = "0.6.0" 1965 | source = "registry+https://github.com/rust-lang/crates.io-index" 1966 | checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 1967 | dependencies = [ 1968 | "libc", 1969 | "windows-sys 0.59.0", 1970 | ] 1971 | 1972 | [[package]] 1973 | name = "spin" 1974 | version = "0.5.2" 1975 | source = "registry+https://github.com/rust-lang/crates.io-index" 1976 | checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 1977 | 1978 | [[package]] 1979 | name = "spin" 1980 | version = "0.9.8" 1981 | source = "registry+https://github.com/rust-lang/crates.io-index" 1982 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1983 | dependencies = [ 1984 | "lock_api", 1985 | ] 1986 | 1987 | [[package]] 1988 | name = "spki" 1989 | version = "0.7.3" 1990 | source = "registry+https://github.com/rust-lang/crates.io-index" 1991 | checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 1992 | dependencies = [ 1993 | "base64ct", 1994 | "der", 1995 | ] 1996 | 1997 | [[package]] 1998 | name = "sqlx" 1999 | version = "0.8.6" 2000 | source = "registry+https://github.com/rust-lang/crates.io-index" 2001 | checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" 2002 | dependencies = [ 2003 | "sqlx-core", 2004 | "sqlx-macros", 2005 | "sqlx-mysql", 2006 | "sqlx-postgres", 2007 | "sqlx-sqlite", 2008 | ] 2009 | 2010 | [[package]] 2011 | name = "sqlx-core" 2012 | version = "0.8.6" 2013 | source = "registry+https://github.com/rust-lang/crates.io-index" 2014 | checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" 2015 | dependencies = [ 2016 | "base64 0.22.1", 2017 | "bytes", 2018 | "crc", 2019 | "crossbeam-queue", 2020 | "either", 2021 | "event-listener", 2022 | "futures-core", 2023 | "futures-intrusive", 2024 | "futures-io", 2025 | "futures-util", 2026 | "hashbrown 0.15.5", 2027 | "hashlink", 2028 | "indexmap", 2029 | "log", 2030 | "memchr", 2031 | "once_cell", 2032 | "percent-encoding", 2033 | "serde", 2034 | "serde_json", 2035 | "sha2", 2036 | "smallvec", 2037 | "thiserror", 2038 | "tokio", 2039 | "tokio-stream", 2040 | "tracing", 2041 | "url", 2042 | ] 2043 | 2044 | [[package]] 2045 | name = "sqlx-macros" 2046 | version = "0.8.6" 2047 | source = "registry+https://github.com/rust-lang/crates.io-index" 2048 | checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" 2049 | dependencies = [ 2050 | "proc-macro2", 2051 | "quote", 2052 | "sqlx-core", 2053 | "sqlx-macros-core", 2054 | "syn 2.0.106", 2055 | ] 2056 | 2057 | [[package]] 2058 | name = "sqlx-macros-core" 2059 | version = "0.8.6" 2060 | source = "registry+https://github.com/rust-lang/crates.io-index" 2061 | checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" 2062 | dependencies = [ 2063 | "dotenvy", 2064 | "either", 2065 | "heck", 2066 | "hex", 2067 | "once_cell", 2068 | "proc-macro2", 2069 | "quote", 2070 | "serde", 2071 | "serde_json", 2072 | "sha2", 2073 | "sqlx-core", 2074 | "sqlx-mysql", 2075 | "sqlx-postgres", 2076 | "sqlx-sqlite", 2077 | "syn 2.0.106", 2078 | "tokio", 2079 | "url", 2080 | ] 2081 | 2082 | [[package]] 2083 | name = "sqlx-mysql" 2084 | version = "0.8.6" 2085 | source = "registry+https://github.com/rust-lang/crates.io-index" 2086 | checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" 2087 | dependencies = [ 2088 | "atoi", 2089 | "base64 0.22.1", 2090 | "bitflags 2.4.1", 2091 | "byteorder", 2092 | "bytes", 2093 | "crc", 2094 | "digest", 2095 | "dotenvy", 2096 | "either", 2097 | "futures-channel", 2098 | "futures-core", 2099 | "futures-io", 2100 | "futures-util", 2101 | "generic-array", 2102 | "hex", 2103 | "hkdf", 2104 | "hmac", 2105 | "itoa", 2106 | "log", 2107 | "md-5", 2108 | "memchr", 2109 | "once_cell", 2110 | "percent-encoding", 2111 | "rand", 2112 | "rsa", 2113 | "serde", 2114 | "sha1", 2115 | "sha2", 2116 | "smallvec", 2117 | "sqlx-core", 2118 | "stringprep", 2119 | "thiserror", 2120 | "tracing", 2121 | "whoami", 2122 | ] 2123 | 2124 | [[package]] 2125 | name = "sqlx-postgres" 2126 | version = "0.8.6" 2127 | source = "registry+https://github.com/rust-lang/crates.io-index" 2128 | checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" 2129 | dependencies = [ 2130 | "atoi", 2131 | "base64 0.22.1", 2132 | "bitflags 2.4.1", 2133 | "byteorder", 2134 | "crc", 2135 | "dotenvy", 2136 | "etcetera", 2137 | "futures-channel", 2138 | "futures-core", 2139 | "futures-util", 2140 | "hex", 2141 | "hkdf", 2142 | "hmac", 2143 | "home", 2144 | "itoa", 2145 | "log", 2146 | "md-5", 2147 | "memchr", 2148 | "once_cell", 2149 | "rand", 2150 | "serde", 2151 | "serde_json", 2152 | "sha2", 2153 | "smallvec", 2154 | "sqlx-core", 2155 | "stringprep", 2156 | "thiserror", 2157 | "tracing", 2158 | "whoami", 2159 | ] 2160 | 2161 | [[package]] 2162 | name = "sqlx-sqlite" 2163 | version = "0.8.6" 2164 | source = "registry+https://github.com/rust-lang/crates.io-index" 2165 | checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" 2166 | dependencies = [ 2167 | "atoi", 2168 | "flume", 2169 | "futures-channel", 2170 | "futures-core", 2171 | "futures-executor", 2172 | "futures-intrusive", 2173 | "futures-util", 2174 | "libsqlite3-sys", 2175 | "log", 2176 | "percent-encoding", 2177 | "serde", 2178 | "serde_urlencoded", 2179 | "sqlx-core", 2180 | "thiserror", 2181 | "tracing", 2182 | "url", 2183 | ] 2184 | 2185 | [[package]] 2186 | name = "stringprep" 2187 | version = "0.1.4" 2188 | source = "registry+https://github.com/rust-lang/crates.io-index" 2189 | checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" 2190 | dependencies = [ 2191 | "finl_unicode", 2192 | "unicode-bidi", 2193 | "unicode-normalization", 2194 | ] 2195 | 2196 | [[package]] 2197 | name = "subtle" 2198 | version = "2.5.0" 2199 | source = "registry+https://github.com/rust-lang/crates.io-index" 2200 | checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" 2201 | 2202 | [[package]] 2203 | name = "syn" 2204 | version = "1.0.109" 2205 | source = "registry+https://github.com/rust-lang/crates.io-index" 2206 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 2207 | dependencies = [ 2208 | "proc-macro2", 2209 | "quote", 2210 | "unicode-ident", 2211 | ] 2212 | 2213 | [[package]] 2214 | name = "syn" 2215 | version = "2.0.106" 2216 | source = "registry+https://github.com/rust-lang/crates.io-index" 2217 | checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" 2218 | dependencies = [ 2219 | "proc-macro2", 2220 | "quote", 2221 | "unicode-ident", 2222 | ] 2223 | 2224 | [[package]] 2225 | name = "sync_wrapper" 2226 | version = "1.0.2" 2227 | source = "registry+https://github.com/rust-lang/crates.io-index" 2228 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 2229 | 2230 | [[package]] 2231 | name = "thiserror" 2232 | version = "2.0.16" 2233 | source = "registry+https://github.com/rust-lang/crates.io-index" 2234 | checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" 2235 | dependencies = [ 2236 | "thiserror-impl", 2237 | ] 2238 | 2239 | [[package]] 2240 | name = "thiserror-impl" 2241 | version = "2.0.16" 2242 | source = "registry+https://github.com/rust-lang/crates.io-index" 2243 | checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" 2244 | dependencies = [ 2245 | "proc-macro2", 2246 | "quote", 2247 | "syn 2.0.106", 2248 | ] 2249 | 2250 | [[package]] 2251 | name = "time" 2252 | version = "0.3.41" 2253 | source = "registry+https://github.com/rust-lang/crates.io-index" 2254 | checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" 2255 | dependencies = [ 2256 | "deranged", 2257 | "itoa", 2258 | "num-conv", 2259 | "powerfmt", 2260 | "serde", 2261 | "time-core", 2262 | "time-macros", 2263 | ] 2264 | 2265 | [[package]] 2266 | name = "time-core" 2267 | version = "0.1.4" 2268 | source = "registry+https://github.com/rust-lang/crates.io-index" 2269 | checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" 2270 | 2271 | [[package]] 2272 | name = "time-macros" 2273 | version = "0.2.22" 2274 | source = "registry+https://github.com/rust-lang/crates.io-index" 2275 | checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" 2276 | dependencies = [ 2277 | "num-conv", 2278 | "time-core", 2279 | ] 2280 | 2281 | [[package]] 2282 | name = "tinyvec" 2283 | version = "1.6.0" 2284 | source = "registry+https://github.com/rust-lang/crates.io-index" 2285 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 2286 | dependencies = [ 2287 | "tinyvec_macros", 2288 | ] 2289 | 2290 | [[package]] 2291 | name = "tinyvec_macros" 2292 | version = "0.1.1" 2293 | source = "registry+https://github.com/rust-lang/crates.io-index" 2294 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2295 | 2296 | [[package]] 2297 | name = "tokio" 2298 | version = "1.47.1" 2299 | source = "registry+https://github.com/rust-lang/crates.io-index" 2300 | checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" 2301 | dependencies = [ 2302 | "backtrace", 2303 | "bytes", 2304 | "io-uring", 2305 | "libc", 2306 | "mio 1.0.4", 2307 | "parking_lot", 2308 | "pin-project-lite", 2309 | "signal-hook-registry", 2310 | "slab", 2311 | "socket2 0.6.0", 2312 | "tokio-macros", 2313 | "tracing", 2314 | "windows-sys 0.59.0", 2315 | ] 2316 | 2317 | [[package]] 2318 | name = "tokio-macros" 2319 | version = "2.5.0" 2320 | source = "registry+https://github.com/rust-lang/crates.io-index" 2321 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 2322 | dependencies = [ 2323 | "proc-macro2", 2324 | "quote", 2325 | "syn 2.0.106", 2326 | ] 2327 | 2328 | [[package]] 2329 | name = "tokio-stream" 2330 | version = "0.1.14" 2331 | source = "registry+https://github.com/rust-lang/crates.io-index" 2332 | checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" 2333 | dependencies = [ 2334 | "futures-core", 2335 | "pin-project-lite", 2336 | "tokio", 2337 | ] 2338 | 2339 | [[package]] 2340 | name = "tokio-util" 2341 | version = "0.7.16" 2342 | source = "registry+https://github.com/rust-lang/crates.io-index" 2343 | checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" 2344 | dependencies = [ 2345 | "bytes", 2346 | "futures-core", 2347 | "futures-io", 2348 | "futures-sink", 2349 | "futures-util", 2350 | "hashbrown 0.15.5", 2351 | "pin-project-lite", 2352 | "slab", 2353 | "tokio", 2354 | ] 2355 | 2356 | [[package]] 2357 | name = "tower" 2358 | version = "0.4.13" 2359 | source = "registry+https://github.com/rust-lang/crates.io-index" 2360 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 2361 | dependencies = [ 2362 | "futures-core", 2363 | "futures-util", 2364 | "pin-project", 2365 | "pin-project-lite", 2366 | "tokio", 2367 | "tower-layer", 2368 | "tower-service", 2369 | "tracing", 2370 | ] 2371 | 2372 | [[package]] 2373 | name = "tower" 2374 | version = "0.5.2" 2375 | source = "registry+https://github.com/rust-lang/crates.io-index" 2376 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 2377 | dependencies = [ 2378 | "futures-core", 2379 | "futures-util", 2380 | "pin-project-lite", 2381 | "sync_wrapper", 2382 | "tokio", 2383 | "tower-layer", 2384 | "tower-service", 2385 | "tracing", 2386 | ] 2387 | 2388 | [[package]] 2389 | name = "tower-http" 2390 | version = "0.6.6" 2391 | source = "registry+https://github.com/rust-lang/crates.io-index" 2392 | checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 2393 | dependencies = [ 2394 | "bitflags 2.4.1", 2395 | "bytes", 2396 | "futures-core", 2397 | "futures-util", 2398 | "http 1.0.0", 2399 | "http-body", 2400 | "http-body-util", 2401 | "http-range-header", 2402 | "httpdate", 2403 | "mime", 2404 | "mime_guess", 2405 | "percent-encoding", 2406 | "pin-project-lite", 2407 | "tokio", 2408 | "tokio-util", 2409 | "tower-layer", 2410 | "tower-service", 2411 | "tracing", 2412 | ] 2413 | 2414 | [[package]] 2415 | name = "tower-layer" 2416 | version = "0.3.3" 2417 | source = "registry+https://github.com/rust-lang/crates.io-index" 2418 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 2419 | 2420 | [[package]] 2421 | name = "tower-service" 2422 | version = "0.3.3" 2423 | source = "registry+https://github.com/rust-lang/crates.io-index" 2424 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 2425 | 2426 | [[package]] 2427 | name = "tracing" 2428 | version = "0.1.40" 2429 | source = "registry+https://github.com/rust-lang/crates.io-index" 2430 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 2431 | dependencies = [ 2432 | "log", 2433 | "pin-project-lite", 2434 | "tracing-attributes", 2435 | "tracing-core", 2436 | ] 2437 | 2438 | [[package]] 2439 | name = "tracing-attributes" 2440 | version = "0.1.27" 2441 | source = "registry+https://github.com/rust-lang/crates.io-index" 2442 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 2443 | dependencies = [ 2444 | "proc-macro2", 2445 | "quote", 2446 | "syn 2.0.106", 2447 | ] 2448 | 2449 | [[package]] 2450 | name = "tracing-core" 2451 | version = "0.1.32" 2452 | source = "registry+https://github.com/rust-lang/crates.io-index" 2453 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 2454 | dependencies = [ 2455 | "once_cell", 2456 | ] 2457 | 2458 | [[package]] 2459 | name = "typenum" 2460 | version = "1.17.0" 2461 | source = "registry+https://github.com/rust-lang/crates.io-index" 2462 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 2463 | 2464 | [[package]] 2465 | name = "unicase" 2466 | version = "2.7.0" 2467 | source = "registry+https://github.com/rust-lang/crates.io-index" 2468 | checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" 2469 | dependencies = [ 2470 | "version_check", 2471 | ] 2472 | 2473 | [[package]] 2474 | name = "unicode-bidi" 2475 | version = "0.3.14" 2476 | source = "registry+https://github.com/rust-lang/crates.io-index" 2477 | checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" 2478 | 2479 | [[package]] 2480 | name = "unicode-ident" 2481 | version = "1.0.12" 2482 | source = "registry+https://github.com/rust-lang/crates.io-index" 2483 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 2484 | 2485 | [[package]] 2486 | name = "unicode-normalization" 2487 | version = "0.1.22" 2488 | source = "registry+https://github.com/rust-lang/crates.io-index" 2489 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 2490 | dependencies = [ 2491 | "tinyvec", 2492 | ] 2493 | 2494 | [[package]] 2495 | name = "unicode-width" 2496 | version = "0.2.1" 2497 | source = "registry+https://github.com/rust-lang/crates.io-index" 2498 | checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" 2499 | 2500 | [[package]] 2501 | name = "unicode-xid" 2502 | version = "0.2.6" 2503 | source = "registry+https://github.com/rust-lang/crates.io-index" 2504 | checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 2505 | 2506 | [[package]] 2507 | name = "url" 2508 | version = "2.5.0" 2509 | source = "registry+https://github.com/rust-lang/crates.io-index" 2510 | checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" 2511 | dependencies = [ 2512 | "form_urlencoded", 2513 | "idna", 2514 | "percent-encoding", 2515 | ] 2516 | 2517 | [[package]] 2518 | name = "utf8parse" 2519 | version = "0.2.2" 2520 | source = "registry+https://github.com/rust-lang/crates.io-index" 2521 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 2522 | 2523 | [[package]] 2524 | name = "vcpkg" 2525 | version = "0.2.15" 2526 | source = "registry+https://github.com/rust-lang/crates.io-index" 2527 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2528 | 2529 | [[package]] 2530 | name = "version_check" 2531 | version = "0.9.4" 2532 | source = "registry+https://github.com/rust-lang/crates.io-index" 2533 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2534 | 2535 | [[package]] 2536 | name = "walkdir" 2537 | version = "2.4.0" 2538 | source = "registry+https://github.com/rust-lang/crates.io-index" 2539 | checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" 2540 | dependencies = [ 2541 | "same-file", 2542 | "winapi-util", 2543 | ] 2544 | 2545 | [[package]] 2546 | name = "wasi" 2547 | version = "0.11.0+wasi-snapshot-preview1" 2548 | source = "registry+https://github.com/rust-lang/crates.io-index" 2549 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2550 | 2551 | [[package]] 2552 | name = "wasm-bindgen" 2553 | version = "0.2.89" 2554 | source = "registry+https://github.com/rust-lang/crates.io-index" 2555 | checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" 2556 | dependencies = [ 2557 | "cfg-if", 2558 | "wasm-bindgen-macro", 2559 | ] 2560 | 2561 | [[package]] 2562 | name = "wasm-bindgen-backend" 2563 | version = "0.2.89" 2564 | source = "registry+https://github.com/rust-lang/crates.io-index" 2565 | checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" 2566 | dependencies = [ 2567 | "bumpalo", 2568 | "log", 2569 | "once_cell", 2570 | "proc-macro2", 2571 | "quote", 2572 | "syn 2.0.106", 2573 | "wasm-bindgen-shared", 2574 | ] 2575 | 2576 | [[package]] 2577 | name = "wasm-bindgen-macro" 2578 | version = "0.2.89" 2579 | source = "registry+https://github.com/rust-lang/crates.io-index" 2580 | checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" 2581 | dependencies = [ 2582 | "quote", 2583 | "wasm-bindgen-macro-support", 2584 | ] 2585 | 2586 | [[package]] 2587 | name = "wasm-bindgen-macro-support" 2588 | version = "0.2.89" 2589 | source = "registry+https://github.com/rust-lang/crates.io-index" 2590 | checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" 2591 | dependencies = [ 2592 | "proc-macro2", 2593 | "quote", 2594 | "syn 2.0.106", 2595 | "wasm-bindgen-backend", 2596 | "wasm-bindgen-shared", 2597 | ] 2598 | 2599 | [[package]] 2600 | name = "wasm-bindgen-shared" 2601 | version = "0.2.89" 2602 | source = "registry+https://github.com/rust-lang/crates.io-index" 2603 | checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" 2604 | 2605 | [[package]] 2606 | name = "whoami" 2607 | version = "1.4.1" 2608 | source = "registry+https://github.com/rust-lang/crates.io-index" 2609 | checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50" 2610 | 2611 | [[package]] 2612 | name = "winapi" 2613 | version = "0.3.9" 2614 | source = "registry+https://github.com/rust-lang/crates.io-index" 2615 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2616 | dependencies = [ 2617 | "winapi-i686-pc-windows-gnu", 2618 | "winapi-x86_64-pc-windows-gnu", 2619 | ] 2620 | 2621 | [[package]] 2622 | name = "winapi-i686-pc-windows-gnu" 2623 | version = "0.4.0" 2624 | source = "registry+https://github.com/rust-lang/crates.io-index" 2625 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2626 | 2627 | [[package]] 2628 | name = "winapi-util" 2629 | version = "0.1.6" 2630 | source = "registry+https://github.com/rust-lang/crates.io-index" 2631 | checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" 2632 | dependencies = [ 2633 | "winapi", 2634 | ] 2635 | 2636 | [[package]] 2637 | name = "winapi-x86_64-pc-windows-gnu" 2638 | version = "0.4.0" 2639 | source = "registry+https://github.com/rust-lang/crates.io-index" 2640 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2641 | 2642 | [[package]] 2643 | name = "windows-core" 2644 | version = "0.52.0" 2645 | source = "registry+https://github.com/rust-lang/crates.io-index" 2646 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 2647 | dependencies = [ 2648 | "windows-targets 0.52.6", 2649 | ] 2650 | 2651 | [[package]] 2652 | name = "windows-link" 2653 | version = "0.1.3" 2654 | source = "registry+https://github.com/rust-lang/crates.io-index" 2655 | checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 2656 | 2657 | [[package]] 2658 | name = "windows-sys" 2659 | version = "0.48.0" 2660 | source = "registry+https://github.com/rust-lang/crates.io-index" 2661 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2662 | dependencies = [ 2663 | "windows-targets 0.48.5", 2664 | ] 2665 | 2666 | [[package]] 2667 | name = "windows-sys" 2668 | version = "0.52.0" 2669 | source = "registry+https://github.com/rust-lang/crates.io-index" 2670 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2671 | dependencies = [ 2672 | "windows-targets 0.52.6", 2673 | ] 2674 | 2675 | [[package]] 2676 | name = "windows-sys" 2677 | version = "0.59.0" 2678 | source = "registry+https://github.com/rust-lang/crates.io-index" 2679 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2680 | dependencies = [ 2681 | "windows-targets 0.52.6", 2682 | ] 2683 | 2684 | [[package]] 2685 | name = "windows-sys" 2686 | version = "0.60.2" 2687 | source = "registry+https://github.com/rust-lang/crates.io-index" 2688 | checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 2689 | dependencies = [ 2690 | "windows-targets 0.53.3", 2691 | ] 2692 | 2693 | [[package]] 2694 | name = "windows-targets" 2695 | version = "0.48.5" 2696 | source = "registry+https://github.com/rust-lang/crates.io-index" 2697 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2698 | dependencies = [ 2699 | "windows_aarch64_gnullvm 0.48.5", 2700 | "windows_aarch64_msvc 0.48.5", 2701 | "windows_i686_gnu 0.48.5", 2702 | "windows_i686_msvc 0.48.5", 2703 | "windows_x86_64_gnu 0.48.5", 2704 | "windows_x86_64_gnullvm 0.48.5", 2705 | "windows_x86_64_msvc 0.48.5", 2706 | ] 2707 | 2708 | [[package]] 2709 | name = "windows-targets" 2710 | version = "0.52.6" 2711 | source = "registry+https://github.com/rust-lang/crates.io-index" 2712 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2713 | dependencies = [ 2714 | "windows_aarch64_gnullvm 0.52.6", 2715 | "windows_aarch64_msvc 0.52.6", 2716 | "windows_i686_gnu 0.52.6", 2717 | "windows_i686_gnullvm 0.52.6", 2718 | "windows_i686_msvc 0.52.6", 2719 | "windows_x86_64_gnu 0.52.6", 2720 | "windows_x86_64_gnullvm 0.52.6", 2721 | "windows_x86_64_msvc 0.52.6", 2722 | ] 2723 | 2724 | [[package]] 2725 | name = "windows-targets" 2726 | version = "0.53.3" 2727 | source = "registry+https://github.com/rust-lang/crates.io-index" 2728 | checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" 2729 | dependencies = [ 2730 | "windows-link", 2731 | "windows_aarch64_gnullvm 0.53.0", 2732 | "windows_aarch64_msvc 0.53.0", 2733 | "windows_i686_gnu 0.53.0", 2734 | "windows_i686_gnullvm 0.53.0", 2735 | "windows_i686_msvc 0.53.0", 2736 | "windows_x86_64_gnu 0.53.0", 2737 | "windows_x86_64_gnullvm 0.53.0", 2738 | "windows_x86_64_msvc 0.53.0", 2739 | ] 2740 | 2741 | [[package]] 2742 | name = "windows_aarch64_gnullvm" 2743 | version = "0.48.5" 2744 | source = "registry+https://github.com/rust-lang/crates.io-index" 2745 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2746 | 2747 | [[package]] 2748 | name = "windows_aarch64_gnullvm" 2749 | version = "0.52.6" 2750 | source = "registry+https://github.com/rust-lang/crates.io-index" 2751 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2752 | 2753 | [[package]] 2754 | name = "windows_aarch64_gnullvm" 2755 | version = "0.53.0" 2756 | source = "registry+https://github.com/rust-lang/crates.io-index" 2757 | checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 2758 | 2759 | [[package]] 2760 | name = "windows_aarch64_msvc" 2761 | version = "0.48.5" 2762 | source = "registry+https://github.com/rust-lang/crates.io-index" 2763 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2764 | 2765 | [[package]] 2766 | name = "windows_aarch64_msvc" 2767 | version = "0.52.6" 2768 | source = "registry+https://github.com/rust-lang/crates.io-index" 2769 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2770 | 2771 | [[package]] 2772 | name = "windows_aarch64_msvc" 2773 | version = "0.53.0" 2774 | source = "registry+https://github.com/rust-lang/crates.io-index" 2775 | checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 2776 | 2777 | [[package]] 2778 | name = "windows_i686_gnu" 2779 | version = "0.48.5" 2780 | source = "registry+https://github.com/rust-lang/crates.io-index" 2781 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2782 | 2783 | [[package]] 2784 | name = "windows_i686_gnu" 2785 | version = "0.52.6" 2786 | source = "registry+https://github.com/rust-lang/crates.io-index" 2787 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2788 | 2789 | [[package]] 2790 | name = "windows_i686_gnu" 2791 | version = "0.53.0" 2792 | source = "registry+https://github.com/rust-lang/crates.io-index" 2793 | checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 2794 | 2795 | [[package]] 2796 | name = "windows_i686_gnullvm" 2797 | version = "0.52.6" 2798 | source = "registry+https://github.com/rust-lang/crates.io-index" 2799 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2800 | 2801 | [[package]] 2802 | name = "windows_i686_gnullvm" 2803 | version = "0.53.0" 2804 | source = "registry+https://github.com/rust-lang/crates.io-index" 2805 | checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 2806 | 2807 | [[package]] 2808 | name = "windows_i686_msvc" 2809 | version = "0.48.5" 2810 | source = "registry+https://github.com/rust-lang/crates.io-index" 2811 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2812 | 2813 | [[package]] 2814 | name = "windows_i686_msvc" 2815 | version = "0.52.6" 2816 | source = "registry+https://github.com/rust-lang/crates.io-index" 2817 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2818 | 2819 | [[package]] 2820 | name = "windows_i686_msvc" 2821 | version = "0.53.0" 2822 | source = "registry+https://github.com/rust-lang/crates.io-index" 2823 | checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 2824 | 2825 | [[package]] 2826 | name = "windows_x86_64_gnu" 2827 | version = "0.48.5" 2828 | source = "registry+https://github.com/rust-lang/crates.io-index" 2829 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2830 | 2831 | [[package]] 2832 | name = "windows_x86_64_gnu" 2833 | version = "0.52.6" 2834 | source = "registry+https://github.com/rust-lang/crates.io-index" 2835 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2836 | 2837 | [[package]] 2838 | name = "windows_x86_64_gnu" 2839 | version = "0.53.0" 2840 | source = "registry+https://github.com/rust-lang/crates.io-index" 2841 | checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 2842 | 2843 | [[package]] 2844 | name = "windows_x86_64_gnullvm" 2845 | version = "0.48.5" 2846 | source = "registry+https://github.com/rust-lang/crates.io-index" 2847 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2848 | 2849 | [[package]] 2850 | name = "windows_x86_64_gnullvm" 2851 | version = "0.52.6" 2852 | source = "registry+https://github.com/rust-lang/crates.io-index" 2853 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2854 | 2855 | [[package]] 2856 | name = "windows_x86_64_gnullvm" 2857 | version = "0.53.0" 2858 | source = "registry+https://github.com/rust-lang/crates.io-index" 2859 | checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 2860 | 2861 | [[package]] 2862 | name = "windows_x86_64_msvc" 2863 | version = "0.48.5" 2864 | source = "registry+https://github.com/rust-lang/crates.io-index" 2865 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2866 | 2867 | [[package]] 2868 | name = "windows_x86_64_msvc" 2869 | version = "0.52.6" 2870 | source = "registry+https://github.com/rust-lang/crates.io-index" 2871 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2872 | 2873 | [[package]] 2874 | name = "windows_x86_64_msvc" 2875 | version = "0.53.0" 2876 | source = "registry+https://github.com/rust-lang/crates.io-index" 2877 | checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 2878 | 2879 | [[package]] 2880 | name = "zerocopy" 2881 | version = "0.7.32" 2882 | source = "registry+https://github.com/rust-lang/crates.io-index" 2883 | checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" 2884 | dependencies = [ 2885 | "zerocopy-derive", 2886 | ] 2887 | 2888 | [[package]] 2889 | name = "zerocopy-derive" 2890 | version = "0.7.32" 2891 | source = "registry+https://github.com/rust-lang/crates.io-index" 2892 | checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" 2893 | dependencies = [ 2894 | "proc-macro2", 2895 | "quote", 2896 | "syn 2.0.106", 2897 | ] 2898 | 2899 | [[package]] 2900 | name = "zeroize" 2901 | version = "1.7.0" 2902 | source = "registry+https://github.com/rust-lang/crates.io-index" 2903 | checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" 2904 | --------------------------------------------------------------------------------