├── .editorconfig ├── .eslintrc.cjs ├── .gitattributes ├── .github └── workflows │ └── main.yml ├── .gitignore ├── .vscode └── extensions.json ├── README.md ├── index.html ├── package-lock.json ├── package.json ├── preview.png ├── public └── favicon.svg ├── src-tauri ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── build.rs ├── checker-library │ ├── Cargo.toml │ └── src │ │ ├── error.rs │ │ └── lib.rs ├── icons │ ├── 128x128.png │ ├── 128x128@2x.png │ ├── 32x32.png │ ├── Square107x107Logo.png │ ├── Square142x142Logo.png │ ├── Square150x150Logo.png │ ├── Square284x284Logo.png │ ├── Square30x30Logo.png │ ├── Square310x310Logo.png │ ├── Square44x44Logo.png │ ├── Square71x71Logo.png │ ├── Square89x89Logo.png │ ├── StoreLogo.png │ ├── icon.icns │ ├── icon.ico │ └── icon.png ├── src │ └── main.rs └── tauri.conf.json ├── src ├── App.tsx ├── assets │ ├── dark-bg.jpg │ └── light-bg.jpg ├── components │ ├── CheckButton.tsx │ ├── DefaultProtocolSelect.tsx │ ├── DownloadButton.tsx │ ├── FileSelect.tsx │ ├── Log.tsx │ ├── Logs.tsx │ ├── PatternInput.tsx │ ├── ProxiesCard.tsx │ ├── SettingsModal.tsx │ ├── Shell.tsx │ ├── Stats.tsx │ ├── ThreadsInput.tsx │ ├── TimeoutInput.tsx │ ├── UrlInput.tsx │ └── Wrapper.tsx ├── context │ └── ProxiesContext.tsx ├── hooks │ ├── useFileSelect.ts │ └── useLogs.ts ├── main.tsx ├── store │ └── settings.ts └── vite-env.d.ts ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | trim_trailing_whitespace = true 7 | 8 | [*.{js,ts,json,yml}] 9 | charset = utf-8 10 | indent_style = space 11 | indent_size = 2 12 | 13 | [*.md] 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | plugins: ['@typescript-eslint'], 4 | extends: [ 5 | 'airbnb', 6 | 'airbnb-typescript', 7 | 'airbnb/hooks', 8 | 'plugin:@typescript-eslint/recommended', 9 | 'plugin:@typescript-eslint/recommended-requiring-type-checking', 10 | ], 11 | env: { 12 | node: true, 13 | browser: true, 14 | }, 15 | parser: '@typescript-eslint/parser', 16 | parserOptions: { 17 | project: './tsconfig.json', 18 | }, 19 | rules: { 20 | 'no-console': 'warn', 21 | 'arrow-parens': ['error', 'as-needed'], 22 | 'react/react-in-jsx-scope': 'off', 23 | 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], 24 | 'max-len': 'off', 25 | '@typescript-eslint/no-misused-promises': ['error', { 26 | checksVoidReturn: { 27 | attributes: false, 28 | }, 29 | }], 30 | 'object-curly-newline': ['error', { 31 | ObjectExpression: { consistent: true, multiline: true }, 32 | ObjectPattern: { consistent: true, multiline: true }, 33 | ImportDeclaration: 'never', 34 | ExportDeclaration: { multiline: true, minProperties: 3 }, 35 | }], 36 | }, 37 | }; 38 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | on: 3 | push: 4 | tags: 5 | - 'v*' 6 | workflow_dispatch: 7 | 8 | jobs: 9 | release: 10 | permissions: 11 | contents: write 12 | strategy: 13 | fail-fast: false 14 | matrix: 15 | platform: [macos-latest, ubuntu-20.04, windows-latest] 16 | runs-on: ${{ matrix.platform }} 17 | steps: 18 | - name: Checkout repository 19 | uses: actions/checkout@v3 20 | 21 | - name: Install dependencies (ubuntu only) 22 | if: matrix.platform == 'ubuntu-20.04' 23 | run: | 24 | sudo apt-get update 25 | sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev librsvg2-dev 26 | 27 | - name: Rust setup 28 | uses: dtolnay/rust-toolchain@stable 29 | 30 | - name: Rust cache 31 | uses: swatinem/rust-cache@v2 32 | with: 33 | workspaces: './src-tauri -> target' 34 | 35 | - name: Sync node version and setup cache 36 | uses: actions/setup-node@v3 37 | with: 38 | node-version: 'lts/*' 39 | cache: 'npm' 40 | 41 | - name: Install app dependencies and build web 42 | run: npm i 43 | 44 | - name: Build the app 45 | uses: tauri-apps/tauri-action@v0 46 | 47 | env: 48 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 49 | with: 50 | tagName: ${{ github.ref_name }} 51 | releaseName: 'v__VERSION__' 52 | releaseBody: 'See the assets to download and install this version.' 53 | releaseDraft: true 54 | prerelease: false 55 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"] 3 | } 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ProxyChecker 2 | 3 | ![Preview](https://github.com/quertc/ProxyChecker/blob/main/preview.png) 4 | 5 | A lightweight, customizable and user-friendly proxy checker built with [Tauri](https://tauri.app/) + [React](https://reactjs.org/) + [TypeScript](https://www.typescriptlang.org/). And just as importantly, you'll find an anime girl in the background, which adds a touch of personality to the app and makes your work less boring. 6 | 7 | ## Features 8 | 9 | - Supports any proxy patterns with any separators (e.g. `ip:port`, `ip:port@login:password`, etc.) 10 | - Customizable settings for proxy pattern (described above), default protocol, request url, timeout and threads 11 | - Beautiful logs, saving settings to a file, themes, and more (actually, that's all for now) 12 | 13 | ## Usage 14 | 15 | 1. Select a file containing your proxies 16 | 2. Utilize the settings to change the pattern, default protocol, request url, timeout and threads 17 | 3. Check your proxies with ease! 18 | 19 | ## Release 20 | 21 | You can download the latest version of the application on Windows, MacOS, or Ubuntu 20.04 in the [**releases**](https://github.com/quertc/ProxyChecker/releases) section of this repository. 22 | 23 | ## Note 24 | 25 | Very rarely, for some unknown reason, Windows Defender may block an application by seeing a virus in it. This is obviously a false positive (there are several [issues](https://github.com/tauri-apps/tauri/issues) in the tauri repository from other people on this random problem). If this happens, just ignore it and add it to Windows Defender exceptions, or run the application in an isolated environment if you want. 26 | 27 | If anyone knows how to get rid of this, create a new issue. Thanks! 28 | 29 | ## TODO 30 | 31 | - Improve error handling on the frontend 32 | - Handle errors when unwrapping mutexes 33 | - Improve performance and optimize the app 34 | - Add a selection of different delimiters in the file (not just \n) 35 | - Add the ability to drag and drop a file 36 | - Add wallpaper saving to cache 37 | - Refactor small things (comments) 38 | 39 | ## Recommended IDE Setup for development 40 | 41 | - [VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer) 42 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Proxy Checker 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "proxy-checker", 3 | "private": true, 4 | "version": "0.1.1", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc && vite build", 9 | "preview": "vite preview", 10 | "tauri": "tauri" 11 | }, 12 | "dependencies": { 13 | "@emotion/react": "^11.10.5", 14 | "@mantine/core": "^5.10.2", 15 | "@mantine/hooks": "^5.10.2", 16 | "@tabler/icons-react": "^2.1.2", 17 | "@tauri-apps/api": "^1.2.0", 18 | "react": "^18.2.0", 19 | "react-dom": "^18.2.0", 20 | "tauri-plugin-store-api": "github:tauri-apps/tauri-plugin-store" 21 | }, 22 | "devDependencies": { 23 | "@tauri-apps/cli": "^1.2.2", 24 | "@types/node": "^18.7.10", 25 | "@types/react": "^18.0.15", 26 | "@types/react-dom": "^18.0.6", 27 | "@typescript-eslint/eslint-plugin": "^5.49.0", 28 | "@typescript-eslint/parser": "^5.49.0", 29 | "@vitejs/plugin-react": "^3.0.0", 30 | "eslint": "^8.33.0", 31 | "eslint-config-airbnb": "^19.0.4", 32 | "eslint-config-airbnb-typescript": "^17.0.0", 33 | "eslint-plugin-import": "^2.27.5", 34 | "eslint-plugin-jsx-a11y": "^6.7.1", 35 | "eslint-plugin-react": "^7.32.2", 36 | "eslint-plugin-react-hooks": "^4.6.0", 37 | "typescript": "^4.6.4", 38 | "vite": "^4.0.0" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/preview.png -------------------------------------------------------------------------------- /public/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src-tauri/.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | /target/ 4 | -------------------------------------------------------------------------------- /src-tauri/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 = "adler" 7 | version = "1.0.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 10 | 11 | [[package]] 12 | name = "aho-corasick" 13 | version = "0.7.20" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" 16 | dependencies = [ 17 | "memchr", 18 | ] 19 | 20 | [[package]] 21 | name = "alloc-no-stdlib" 22 | version = "2.0.4" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 25 | 26 | [[package]] 27 | name = "alloc-stdlib" 28 | version = "0.2.2" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 31 | dependencies = [ 32 | "alloc-no-stdlib", 33 | ] 34 | 35 | [[package]] 36 | name = "anyhow" 37 | version = "1.0.68" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" 40 | 41 | [[package]] 42 | name = "atk" 43 | version = "0.15.1" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" 46 | dependencies = [ 47 | "atk-sys", 48 | "bitflags 1.3.2", 49 | "glib", 50 | "libc", 51 | ] 52 | 53 | [[package]] 54 | name = "atk-sys" 55 | version = "0.15.1" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" 58 | dependencies = [ 59 | "glib-sys", 60 | "gobject-sys", 61 | "libc", 62 | "system-deps 6.0.3", 63 | ] 64 | 65 | [[package]] 66 | name = "autocfg" 67 | version = "1.1.0" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 70 | 71 | [[package]] 72 | name = "base64" 73 | version = "0.13.1" 74 | source = "registry+https://github.com/rust-lang/crates.io-index" 75 | checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" 76 | 77 | [[package]] 78 | name = "base64" 79 | version = "0.21.0" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" 82 | 83 | [[package]] 84 | name = "bitflags" 85 | version = "1.3.2" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 88 | 89 | [[package]] 90 | name = "bitflags" 91 | version = "2.6.0" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 94 | 95 | [[package]] 96 | name = "block" 97 | version = "0.1.6" 98 | source = "registry+https://github.com/rust-lang/crates.io-index" 99 | checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" 100 | 101 | [[package]] 102 | name = "block-buffer" 103 | version = "0.10.3" 104 | source = "registry+https://github.com/rust-lang/crates.io-index" 105 | checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" 106 | dependencies = [ 107 | "generic-array", 108 | ] 109 | 110 | [[package]] 111 | name = "brotli" 112 | version = "3.3.4" 113 | source = "registry+https://github.com/rust-lang/crates.io-index" 114 | checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" 115 | dependencies = [ 116 | "alloc-no-stdlib", 117 | "alloc-stdlib", 118 | "brotli-decompressor", 119 | ] 120 | 121 | [[package]] 122 | name = "brotli-decompressor" 123 | version = "2.3.4" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" 126 | dependencies = [ 127 | "alloc-no-stdlib", 128 | "alloc-stdlib", 129 | ] 130 | 131 | [[package]] 132 | name = "bstr" 133 | version = "1.1.0" 134 | source = "registry+https://github.com/rust-lang/crates.io-index" 135 | checksum = "b45ea9b00a7b3f2988e9a65ad3917e62123c38dba709b666506207be96d1790b" 136 | dependencies = [ 137 | "memchr", 138 | "serde", 139 | ] 140 | 141 | [[package]] 142 | name = "bumpalo" 143 | version = "3.12.0" 144 | source = "registry+https://github.com/rust-lang/crates.io-index" 145 | checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" 146 | 147 | [[package]] 148 | name = "bytemuck" 149 | version = "1.13.0" 150 | source = "registry+https://github.com/rust-lang/crates.io-index" 151 | checksum = "c041d3eab048880cb0b86b256447da3f18859a163c3b8d8893f4e6368abe6393" 152 | 153 | [[package]] 154 | name = "byteorder" 155 | version = "1.4.3" 156 | source = "registry+https://github.com/rust-lang/crates.io-index" 157 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 158 | 159 | [[package]] 160 | name = "bytes" 161 | version = "1.3.0" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" 164 | 165 | [[package]] 166 | name = "cairo-rs" 167 | version = "0.15.12" 168 | source = "registry+https://github.com/rust-lang/crates.io-index" 169 | checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" 170 | dependencies = [ 171 | "bitflags 1.3.2", 172 | "cairo-sys-rs", 173 | "glib", 174 | "libc", 175 | "thiserror", 176 | ] 177 | 178 | [[package]] 179 | name = "cairo-sys-rs" 180 | version = "0.15.1" 181 | source = "registry+https://github.com/rust-lang/crates.io-index" 182 | checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" 183 | dependencies = [ 184 | "glib-sys", 185 | "libc", 186 | "system-deps 6.0.3", 187 | ] 188 | 189 | [[package]] 190 | name = "cargo_toml" 191 | version = "0.13.3" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "497049e9477329f8f6a559972ee42e117487d01d1e8c2cc9f836ea6fa23a9e1a" 194 | dependencies = [ 195 | "serde", 196 | "toml", 197 | ] 198 | 199 | [[package]] 200 | name = "cc" 201 | version = "1.0.79" 202 | source = "registry+https://github.com/rust-lang/crates.io-index" 203 | checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" 204 | 205 | [[package]] 206 | name = "cesu8" 207 | version = "1.1.0" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 210 | 211 | [[package]] 212 | name = "cfb" 213 | version = "0.6.1" 214 | source = "registry+https://github.com/rust-lang/crates.io-index" 215 | checksum = "74f89d248799e3f15f91b70917f65381062a01bb8e222700ea0e5a7ff9785f9c" 216 | dependencies = [ 217 | "byteorder", 218 | "uuid 0.8.2", 219 | ] 220 | 221 | [[package]] 222 | name = "cfg-expr" 223 | version = "0.9.1" 224 | source = "registry+https://github.com/rust-lang/crates.io-index" 225 | checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" 226 | dependencies = [ 227 | "smallvec", 228 | ] 229 | 230 | [[package]] 231 | name = "cfg-expr" 232 | version = "0.11.0" 233 | source = "registry+https://github.com/rust-lang/crates.io-index" 234 | checksum = "b0357a6402b295ca3a86bc148e84df46c02e41f41fef186bda662557ef6328aa" 235 | dependencies = [ 236 | "smallvec", 237 | ] 238 | 239 | [[package]] 240 | name = "cfg-if" 241 | version = "1.0.0" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 244 | 245 | [[package]] 246 | name = "checker-library" 247 | version = "0.1.1" 248 | dependencies = [ 249 | "futures", 250 | "itertools", 251 | "rayon", 252 | "regex", 253 | "reqwest", 254 | "serde", 255 | "serde_json", 256 | "thiserror", 257 | "tokio", 258 | ] 259 | 260 | [[package]] 261 | name = "cocoa" 262 | version = "0.24.1" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" 265 | dependencies = [ 266 | "bitflags 1.3.2", 267 | "block", 268 | "cocoa-foundation", 269 | "core-foundation", 270 | "core-graphics", 271 | "foreign-types", 272 | "libc", 273 | "objc", 274 | ] 275 | 276 | [[package]] 277 | name = "cocoa-foundation" 278 | version = "0.1.0" 279 | source = "registry+https://github.com/rust-lang/crates.io-index" 280 | checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" 281 | dependencies = [ 282 | "bitflags 1.3.2", 283 | "block", 284 | "core-foundation", 285 | "core-graphics-types", 286 | "foreign-types", 287 | "libc", 288 | "objc", 289 | ] 290 | 291 | [[package]] 292 | name = "color_quant" 293 | version = "1.1.0" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 296 | 297 | [[package]] 298 | name = "combine" 299 | version = "4.6.6" 300 | source = "registry+https://github.com/rust-lang/crates.io-index" 301 | checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" 302 | dependencies = [ 303 | "bytes", 304 | "memchr", 305 | ] 306 | 307 | [[package]] 308 | name = "convert_case" 309 | version = "0.4.0" 310 | source = "registry+https://github.com/rust-lang/crates.io-index" 311 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 312 | 313 | [[package]] 314 | name = "core-foundation" 315 | version = "0.9.3" 316 | source = "registry+https://github.com/rust-lang/crates.io-index" 317 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 318 | dependencies = [ 319 | "core-foundation-sys", 320 | "libc", 321 | ] 322 | 323 | [[package]] 324 | name = "core-foundation-sys" 325 | version = "0.8.3" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 328 | 329 | [[package]] 330 | name = "core-graphics" 331 | version = "0.22.3" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" 334 | dependencies = [ 335 | "bitflags 1.3.2", 336 | "core-foundation", 337 | "core-graphics-types", 338 | "foreign-types", 339 | "libc", 340 | ] 341 | 342 | [[package]] 343 | name = "core-graphics-types" 344 | version = "0.1.1" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" 347 | dependencies = [ 348 | "bitflags 1.3.2", 349 | "core-foundation", 350 | "foreign-types", 351 | "libc", 352 | ] 353 | 354 | [[package]] 355 | name = "cpufeatures" 356 | version = "0.2.5" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" 359 | dependencies = [ 360 | "libc", 361 | ] 362 | 363 | [[package]] 364 | name = "crc32fast" 365 | version = "1.3.2" 366 | source = "registry+https://github.com/rust-lang/crates.io-index" 367 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 368 | dependencies = [ 369 | "cfg-if", 370 | ] 371 | 372 | [[package]] 373 | name = "crossbeam-channel" 374 | version = "0.5.6" 375 | source = "registry+https://github.com/rust-lang/crates.io-index" 376 | checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" 377 | dependencies = [ 378 | "cfg-if", 379 | "crossbeam-utils", 380 | ] 381 | 382 | [[package]] 383 | name = "crossbeam-deque" 384 | version = "0.8.2" 385 | source = "registry+https://github.com/rust-lang/crates.io-index" 386 | checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" 387 | dependencies = [ 388 | "cfg-if", 389 | "crossbeam-epoch", 390 | "crossbeam-utils", 391 | ] 392 | 393 | [[package]] 394 | name = "crossbeam-epoch" 395 | version = "0.9.13" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" 398 | dependencies = [ 399 | "autocfg", 400 | "cfg-if", 401 | "crossbeam-utils", 402 | "memoffset 0.7.1", 403 | "scopeguard", 404 | ] 405 | 406 | [[package]] 407 | name = "crossbeam-utils" 408 | version = "0.8.14" 409 | source = "registry+https://github.com/rust-lang/crates.io-index" 410 | checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" 411 | dependencies = [ 412 | "cfg-if", 413 | ] 414 | 415 | [[package]] 416 | name = "crypto-common" 417 | version = "0.1.6" 418 | source = "registry+https://github.com/rust-lang/crates.io-index" 419 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 420 | dependencies = [ 421 | "generic-array", 422 | "typenum", 423 | ] 424 | 425 | [[package]] 426 | name = "cssparser" 427 | version = "0.27.2" 428 | source = "registry+https://github.com/rust-lang/crates.io-index" 429 | checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" 430 | dependencies = [ 431 | "cssparser-macros", 432 | "dtoa-short", 433 | "itoa 0.4.8", 434 | "matches", 435 | "phf 0.8.0", 436 | "proc-macro2", 437 | "quote", 438 | "smallvec", 439 | "syn", 440 | ] 441 | 442 | [[package]] 443 | name = "cssparser-macros" 444 | version = "0.6.0" 445 | source = "registry+https://github.com/rust-lang/crates.io-index" 446 | checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e" 447 | dependencies = [ 448 | "quote", 449 | "syn", 450 | ] 451 | 452 | [[package]] 453 | name = "ctor" 454 | version = "0.1.26" 455 | source = "registry+https://github.com/rust-lang/crates.io-index" 456 | checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" 457 | dependencies = [ 458 | "quote", 459 | "syn", 460 | ] 461 | 462 | [[package]] 463 | name = "cty" 464 | version = "0.2.2" 465 | source = "registry+https://github.com/rust-lang/crates.io-index" 466 | checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" 467 | 468 | [[package]] 469 | name = "darling" 470 | version = "0.13.4" 471 | source = "registry+https://github.com/rust-lang/crates.io-index" 472 | checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" 473 | dependencies = [ 474 | "darling_core", 475 | "darling_macro", 476 | ] 477 | 478 | [[package]] 479 | name = "darling_core" 480 | version = "0.13.4" 481 | source = "registry+https://github.com/rust-lang/crates.io-index" 482 | checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" 483 | dependencies = [ 484 | "fnv", 485 | "ident_case", 486 | "proc-macro2", 487 | "quote", 488 | "strsim", 489 | "syn", 490 | ] 491 | 492 | [[package]] 493 | name = "darling_macro" 494 | version = "0.13.4" 495 | source = "registry+https://github.com/rust-lang/crates.io-index" 496 | checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" 497 | dependencies = [ 498 | "darling_core", 499 | "quote", 500 | "syn", 501 | ] 502 | 503 | [[package]] 504 | name = "derive_more" 505 | version = "0.99.17" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" 508 | dependencies = [ 509 | "convert_case", 510 | "proc-macro2", 511 | "quote", 512 | "rustc_version 0.4.0", 513 | "syn", 514 | ] 515 | 516 | [[package]] 517 | name = "digest" 518 | version = "0.10.6" 519 | source = "registry+https://github.com/rust-lang/crates.io-index" 520 | checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" 521 | dependencies = [ 522 | "block-buffer", 523 | "crypto-common", 524 | ] 525 | 526 | [[package]] 527 | name = "dirs-next" 528 | version = "2.0.0" 529 | source = "registry+https://github.com/rust-lang/crates.io-index" 530 | checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" 531 | dependencies = [ 532 | "cfg-if", 533 | "dirs-sys-next", 534 | ] 535 | 536 | [[package]] 537 | name = "dirs-sys-next" 538 | version = "0.1.2" 539 | source = "registry+https://github.com/rust-lang/crates.io-index" 540 | checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" 541 | dependencies = [ 542 | "libc", 543 | "redox_users", 544 | "winapi", 545 | ] 546 | 547 | [[package]] 548 | name = "dispatch" 549 | version = "0.2.0" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" 552 | 553 | [[package]] 554 | name = "dtoa" 555 | version = "0.4.8" 556 | source = "registry+https://github.com/rust-lang/crates.io-index" 557 | checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" 558 | 559 | [[package]] 560 | name = "dtoa-short" 561 | version = "0.3.3" 562 | source = "registry+https://github.com/rust-lang/crates.io-index" 563 | checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6" 564 | dependencies = [ 565 | "dtoa", 566 | ] 567 | 568 | [[package]] 569 | name = "dunce" 570 | version = "1.0.3" 571 | source = "registry+https://github.com/rust-lang/crates.io-index" 572 | checksum = "0bd4b30a6560bbd9b4620f4de34c3f14f60848e58a9b7216801afcb4c7b31c3c" 573 | 574 | [[package]] 575 | name = "either" 576 | version = "1.8.1" 577 | source = "registry+https://github.com/rust-lang/crates.io-index" 578 | checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" 579 | 580 | [[package]] 581 | name = "embed_plist" 582 | version = "1.2.2" 583 | source = "registry+https://github.com/rust-lang/crates.io-index" 584 | checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" 585 | 586 | [[package]] 587 | name = "encoding_rs" 588 | version = "0.8.31" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" 591 | dependencies = [ 592 | "cfg-if", 593 | ] 594 | 595 | [[package]] 596 | name = "env_logger" 597 | version = "0.10.0" 598 | source = "registry+https://github.com/rust-lang/crates.io-index" 599 | checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" 600 | dependencies = [ 601 | "humantime", 602 | "is-terminal", 603 | "log", 604 | "regex", 605 | "termcolor", 606 | ] 607 | 608 | [[package]] 609 | name = "equivalent" 610 | version = "1.0.1" 611 | source = "registry+https://github.com/rust-lang/crates.io-index" 612 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 613 | 614 | [[package]] 615 | name = "errno" 616 | version = "0.3.9" 617 | source = "registry+https://github.com/rust-lang/crates.io-index" 618 | checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" 619 | dependencies = [ 620 | "libc", 621 | "windows-sys 0.52.0", 622 | ] 623 | 624 | [[package]] 625 | name = "fastrand" 626 | version = "1.8.0" 627 | source = "registry+https://github.com/rust-lang/crates.io-index" 628 | checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" 629 | dependencies = [ 630 | "instant", 631 | ] 632 | 633 | [[package]] 634 | name = "field-offset" 635 | version = "0.3.4" 636 | source = "registry+https://github.com/rust-lang/crates.io-index" 637 | checksum = "1e1c54951450cbd39f3dbcf1005ac413b49487dabf18a720ad2383eccfeffb92" 638 | dependencies = [ 639 | "memoffset 0.6.5", 640 | "rustc_version 0.3.3", 641 | ] 642 | 643 | [[package]] 644 | name = "filetime" 645 | version = "0.2.19" 646 | source = "registry+https://github.com/rust-lang/crates.io-index" 647 | checksum = "4e884668cd0c7480504233e951174ddc3b382f7c2666e3b7310b5c4e7b0c37f9" 648 | dependencies = [ 649 | "cfg-if", 650 | "libc", 651 | "redox_syscall", 652 | "windows-sys 0.42.0", 653 | ] 654 | 655 | [[package]] 656 | name = "flate2" 657 | version = "1.0.25" 658 | source = "registry+https://github.com/rust-lang/crates.io-index" 659 | checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" 660 | dependencies = [ 661 | "crc32fast", 662 | "miniz_oxide", 663 | ] 664 | 665 | [[package]] 666 | name = "fnv" 667 | version = "1.0.7" 668 | source = "registry+https://github.com/rust-lang/crates.io-index" 669 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 670 | 671 | [[package]] 672 | name = "foreign-types" 673 | version = "0.3.2" 674 | source = "registry+https://github.com/rust-lang/crates.io-index" 675 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 676 | dependencies = [ 677 | "foreign-types-shared", 678 | ] 679 | 680 | [[package]] 681 | name = "foreign-types-shared" 682 | version = "0.1.1" 683 | source = "registry+https://github.com/rust-lang/crates.io-index" 684 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 685 | 686 | [[package]] 687 | name = "form_urlencoded" 688 | version = "1.1.0" 689 | source = "registry+https://github.com/rust-lang/crates.io-index" 690 | checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" 691 | dependencies = [ 692 | "percent-encoding", 693 | ] 694 | 695 | [[package]] 696 | name = "futf" 697 | version = "0.1.5" 698 | source = "registry+https://github.com/rust-lang/crates.io-index" 699 | checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" 700 | dependencies = [ 701 | "mac", 702 | "new_debug_unreachable", 703 | ] 704 | 705 | [[package]] 706 | name = "futures" 707 | version = "0.3.25" 708 | source = "registry+https://github.com/rust-lang/crates.io-index" 709 | checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" 710 | dependencies = [ 711 | "futures-channel", 712 | "futures-core", 713 | "futures-executor", 714 | "futures-io", 715 | "futures-sink", 716 | "futures-task", 717 | "futures-util", 718 | ] 719 | 720 | [[package]] 721 | name = "futures-channel" 722 | version = "0.3.25" 723 | source = "registry+https://github.com/rust-lang/crates.io-index" 724 | checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" 725 | dependencies = [ 726 | "futures-core", 727 | "futures-sink", 728 | ] 729 | 730 | [[package]] 731 | name = "futures-core" 732 | version = "0.3.25" 733 | source = "registry+https://github.com/rust-lang/crates.io-index" 734 | checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" 735 | 736 | [[package]] 737 | name = "futures-executor" 738 | version = "0.3.25" 739 | source = "registry+https://github.com/rust-lang/crates.io-index" 740 | checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" 741 | dependencies = [ 742 | "futures-core", 743 | "futures-task", 744 | "futures-util", 745 | ] 746 | 747 | [[package]] 748 | name = "futures-io" 749 | version = "0.3.25" 750 | source = "registry+https://github.com/rust-lang/crates.io-index" 751 | checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" 752 | 753 | [[package]] 754 | name = "futures-macro" 755 | version = "0.3.25" 756 | source = "registry+https://github.com/rust-lang/crates.io-index" 757 | checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" 758 | dependencies = [ 759 | "proc-macro2", 760 | "quote", 761 | "syn", 762 | ] 763 | 764 | [[package]] 765 | name = "futures-sink" 766 | version = "0.3.25" 767 | source = "registry+https://github.com/rust-lang/crates.io-index" 768 | checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" 769 | 770 | [[package]] 771 | name = "futures-task" 772 | version = "0.3.25" 773 | source = "registry+https://github.com/rust-lang/crates.io-index" 774 | checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" 775 | 776 | [[package]] 777 | name = "futures-util" 778 | version = "0.3.25" 779 | source = "registry+https://github.com/rust-lang/crates.io-index" 780 | checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" 781 | dependencies = [ 782 | "futures-channel", 783 | "futures-core", 784 | "futures-io", 785 | "futures-macro", 786 | "futures-sink", 787 | "futures-task", 788 | "memchr", 789 | "pin-project-lite", 790 | "pin-utils", 791 | "slab", 792 | ] 793 | 794 | [[package]] 795 | name = "fxhash" 796 | version = "0.2.1" 797 | source = "registry+https://github.com/rust-lang/crates.io-index" 798 | checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" 799 | dependencies = [ 800 | "byteorder", 801 | ] 802 | 803 | [[package]] 804 | name = "gdk" 805 | version = "0.15.4" 806 | source = "registry+https://github.com/rust-lang/crates.io-index" 807 | checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" 808 | dependencies = [ 809 | "bitflags 1.3.2", 810 | "cairo-rs", 811 | "gdk-pixbuf", 812 | "gdk-sys", 813 | "gio", 814 | "glib", 815 | "libc", 816 | "pango", 817 | ] 818 | 819 | [[package]] 820 | name = "gdk-pixbuf" 821 | version = "0.15.11" 822 | source = "registry+https://github.com/rust-lang/crates.io-index" 823 | checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" 824 | dependencies = [ 825 | "bitflags 1.3.2", 826 | "gdk-pixbuf-sys", 827 | "gio", 828 | "glib", 829 | "libc", 830 | ] 831 | 832 | [[package]] 833 | name = "gdk-pixbuf-sys" 834 | version = "0.15.10" 835 | source = "registry+https://github.com/rust-lang/crates.io-index" 836 | checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" 837 | dependencies = [ 838 | "gio-sys", 839 | "glib-sys", 840 | "gobject-sys", 841 | "libc", 842 | "system-deps 6.0.3", 843 | ] 844 | 845 | [[package]] 846 | name = "gdk-sys" 847 | version = "0.15.1" 848 | source = "registry+https://github.com/rust-lang/crates.io-index" 849 | checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" 850 | dependencies = [ 851 | "cairo-sys-rs", 852 | "gdk-pixbuf-sys", 853 | "gio-sys", 854 | "glib-sys", 855 | "gobject-sys", 856 | "libc", 857 | "pango-sys", 858 | "pkg-config", 859 | "system-deps 6.0.3", 860 | ] 861 | 862 | [[package]] 863 | name = "gdkx11-sys" 864 | version = "0.15.1" 865 | source = "registry+https://github.com/rust-lang/crates.io-index" 866 | checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" 867 | dependencies = [ 868 | "gdk-sys", 869 | "glib-sys", 870 | "libc", 871 | "system-deps 6.0.3", 872 | "x11", 873 | ] 874 | 875 | [[package]] 876 | name = "generator" 877 | version = "0.7.2" 878 | source = "registry+https://github.com/rust-lang/crates.io-index" 879 | checksum = "d266041a359dfa931b370ef684cceb84b166beb14f7f0421f4a6a3d0c446d12e" 880 | dependencies = [ 881 | "cc", 882 | "libc", 883 | "log", 884 | "rustversion", 885 | "windows 0.39.0", 886 | ] 887 | 888 | [[package]] 889 | name = "generic-array" 890 | version = "0.14.6" 891 | source = "registry+https://github.com/rust-lang/crates.io-index" 892 | checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" 893 | dependencies = [ 894 | "typenum", 895 | "version_check", 896 | ] 897 | 898 | [[package]] 899 | name = "getrandom" 900 | version = "0.1.16" 901 | source = "registry+https://github.com/rust-lang/crates.io-index" 902 | checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" 903 | dependencies = [ 904 | "cfg-if", 905 | "libc", 906 | "wasi 0.9.0+wasi-snapshot-preview1", 907 | ] 908 | 909 | [[package]] 910 | name = "getrandom" 911 | version = "0.2.8" 912 | source = "registry+https://github.com/rust-lang/crates.io-index" 913 | checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" 914 | dependencies = [ 915 | "cfg-if", 916 | "libc", 917 | "wasi 0.11.0+wasi-snapshot-preview1", 918 | ] 919 | 920 | [[package]] 921 | name = "gio" 922 | version = "0.15.12" 923 | source = "registry+https://github.com/rust-lang/crates.io-index" 924 | checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" 925 | dependencies = [ 926 | "bitflags 1.3.2", 927 | "futures-channel", 928 | "futures-core", 929 | "futures-io", 930 | "gio-sys", 931 | "glib", 932 | "libc", 933 | "once_cell", 934 | "thiserror", 935 | ] 936 | 937 | [[package]] 938 | name = "gio-sys" 939 | version = "0.15.10" 940 | source = "registry+https://github.com/rust-lang/crates.io-index" 941 | checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" 942 | dependencies = [ 943 | "glib-sys", 944 | "gobject-sys", 945 | "libc", 946 | "system-deps 6.0.3", 947 | "winapi", 948 | ] 949 | 950 | [[package]] 951 | name = "glib" 952 | version = "0.15.12" 953 | source = "registry+https://github.com/rust-lang/crates.io-index" 954 | checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" 955 | dependencies = [ 956 | "bitflags 1.3.2", 957 | "futures-channel", 958 | "futures-core", 959 | "futures-executor", 960 | "futures-task", 961 | "glib-macros", 962 | "glib-sys", 963 | "gobject-sys", 964 | "libc", 965 | "once_cell", 966 | "smallvec", 967 | "thiserror", 968 | ] 969 | 970 | [[package]] 971 | name = "glib-macros" 972 | version = "0.15.11" 973 | source = "registry+https://github.com/rust-lang/crates.io-index" 974 | checksum = "25a68131a662b04931e71891fb14aaf65ee4b44d08e8abc10f49e77418c86c64" 975 | dependencies = [ 976 | "anyhow", 977 | "heck 0.4.0", 978 | "proc-macro-crate", 979 | "proc-macro-error", 980 | "proc-macro2", 981 | "quote", 982 | "syn", 983 | ] 984 | 985 | [[package]] 986 | name = "glib-sys" 987 | version = "0.15.10" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" 990 | dependencies = [ 991 | "libc", 992 | "system-deps 6.0.3", 993 | ] 994 | 995 | [[package]] 996 | name = "glob" 997 | version = "0.3.1" 998 | source = "registry+https://github.com/rust-lang/crates.io-index" 999 | checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" 1000 | 1001 | [[package]] 1002 | name = "globset" 1003 | version = "0.4.10" 1004 | source = "registry+https://github.com/rust-lang/crates.io-index" 1005 | checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" 1006 | dependencies = [ 1007 | "aho-corasick", 1008 | "bstr", 1009 | "fnv", 1010 | "log", 1011 | "regex", 1012 | ] 1013 | 1014 | [[package]] 1015 | name = "gobject-sys" 1016 | version = "0.15.10" 1017 | source = "registry+https://github.com/rust-lang/crates.io-index" 1018 | checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" 1019 | dependencies = [ 1020 | "glib-sys", 1021 | "libc", 1022 | "system-deps 6.0.3", 1023 | ] 1024 | 1025 | [[package]] 1026 | name = "gtk" 1027 | version = "0.15.5" 1028 | source = "registry+https://github.com/rust-lang/crates.io-index" 1029 | checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" 1030 | dependencies = [ 1031 | "atk", 1032 | "bitflags 1.3.2", 1033 | "cairo-rs", 1034 | "field-offset", 1035 | "futures-channel", 1036 | "gdk", 1037 | "gdk-pixbuf", 1038 | "gio", 1039 | "glib", 1040 | "gtk-sys", 1041 | "gtk3-macros", 1042 | "libc", 1043 | "once_cell", 1044 | "pango", 1045 | "pkg-config", 1046 | ] 1047 | 1048 | [[package]] 1049 | name = "gtk-sys" 1050 | version = "0.15.3" 1051 | source = "registry+https://github.com/rust-lang/crates.io-index" 1052 | checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" 1053 | dependencies = [ 1054 | "atk-sys", 1055 | "cairo-sys-rs", 1056 | "gdk-pixbuf-sys", 1057 | "gdk-sys", 1058 | "gio-sys", 1059 | "glib-sys", 1060 | "gobject-sys", 1061 | "libc", 1062 | "pango-sys", 1063 | "system-deps 6.0.3", 1064 | ] 1065 | 1066 | [[package]] 1067 | name = "gtk3-macros" 1068 | version = "0.15.4" 1069 | source = "registry+https://github.com/rust-lang/crates.io-index" 1070 | checksum = "24f518afe90c23fba585b2d7697856f9e6a7bbc62f65588035e66f6afb01a2e9" 1071 | dependencies = [ 1072 | "anyhow", 1073 | "proc-macro-crate", 1074 | "proc-macro-error", 1075 | "proc-macro2", 1076 | "quote", 1077 | "syn", 1078 | ] 1079 | 1080 | [[package]] 1081 | name = "h2" 1082 | version = "0.3.26" 1083 | source = "registry+https://github.com/rust-lang/crates.io-index" 1084 | checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 1085 | dependencies = [ 1086 | "bytes", 1087 | "fnv", 1088 | "futures-core", 1089 | "futures-sink", 1090 | "futures-util", 1091 | "http", 1092 | "indexmap 2.2.6", 1093 | "slab", 1094 | "tokio", 1095 | "tokio-util", 1096 | "tracing", 1097 | ] 1098 | 1099 | [[package]] 1100 | name = "hashbrown" 1101 | version = "0.12.3" 1102 | source = "registry+https://github.com/rust-lang/crates.io-index" 1103 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 1104 | 1105 | [[package]] 1106 | name = "hashbrown" 1107 | version = "0.14.5" 1108 | source = "registry+https://github.com/rust-lang/crates.io-index" 1109 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 1110 | 1111 | [[package]] 1112 | name = "heck" 1113 | version = "0.3.3" 1114 | source = "registry+https://github.com/rust-lang/crates.io-index" 1115 | checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" 1116 | dependencies = [ 1117 | "unicode-segmentation", 1118 | ] 1119 | 1120 | [[package]] 1121 | name = "heck" 1122 | version = "0.4.0" 1123 | source = "registry+https://github.com/rust-lang/crates.io-index" 1124 | checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" 1125 | 1126 | [[package]] 1127 | name = "hermit-abi" 1128 | version = "0.2.6" 1129 | source = "registry+https://github.com/rust-lang/crates.io-index" 1130 | checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" 1131 | dependencies = [ 1132 | "libc", 1133 | ] 1134 | 1135 | [[package]] 1136 | name = "html5ever" 1137 | version = "0.25.2" 1138 | source = "registry+https://github.com/rust-lang/crates.io-index" 1139 | checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" 1140 | dependencies = [ 1141 | "log", 1142 | "mac", 1143 | "markup5ever", 1144 | "proc-macro2", 1145 | "quote", 1146 | "syn", 1147 | ] 1148 | 1149 | [[package]] 1150 | name = "http" 1151 | version = "0.2.8" 1152 | source = "registry+https://github.com/rust-lang/crates.io-index" 1153 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" 1154 | dependencies = [ 1155 | "bytes", 1156 | "fnv", 1157 | "itoa 1.0.5", 1158 | ] 1159 | 1160 | [[package]] 1161 | name = "http-body" 1162 | version = "0.4.5" 1163 | source = "registry+https://github.com/rust-lang/crates.io-index" 1164 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 1165 | dependencies = [ 1166 | "bytes", 1167 | "http", 1168 | "pin-project-lite", 1169 | ] 1170 | 1171 | [[package]] 1172 | name = "http-range" 1173 | version = "0.1.5" 1174 | source = "registry+https://github.com/rust-lang/crates.io-index" 1175 | checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" 1176 | 1177 | [[package]] 1178 | name = "httparse" 1179 | version = "1.8.0" 1180 | source = "registry+https://github.com/rust-lang/crates.io-index" 1181 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 1182 | 1183 | [[package]] 1184 | name = "httpdate" 1185 | version = "1.0.2" 1186 | source = "registry+https://github.com/rust-lang/crates.io-index" 1187 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 1188 | 1189 | [[package]] 1190 | name = "humantime" 1191 | version = "2.1.0" 1192 | source = "registry+https://github.com/rust-lang/crates.io-index" 1193 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 1194 | 1195 | [[package]] 1196 | name = "hyper" 1197 | version = "0.14.23" 1198 | source = "registry+https://github.com/rust-lang/crates.io-index" 1199 | checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" 1200 | dependencies = [ 1201 | "bytes", 1202 | "futures-channel", 1203 | "futures-core", 1204 | "futures-util", 1205 | "h2", 1206 | "http", 1207 | "http-body", 1208 | "httparse", 1209 | "httpdate", 1210 | "itoa 1.0.5", 1211 | "pin-project-lite", 1212 | "socket2", 1213 | "tokio", 1214 | "tower-service", 1215 | "tracing", 1216 | "want", 1217 | ] 1218 | 1219 | [[package]] 1220 | name = "hyper-tls" 1221 | version = "0.5.0" 1222 | source = "registry+https://github.com/rust-lang/crates.io-index" 1223 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 1224 | dependencies = [ 1225 | "bytes", 1226 | "hyper", 1227 | "native-tls", 1228 | "tokio", 1229 | "tokio-native-tls", 1230 | ] 1231 | 1232 | [[package]] 1233 | name = "ico" 1234 | version = "0.2.0" 1235 | source = "registry+https://github.com/rust-lang/crates.io-index" 1236 | checksum = "031530fe562d8c8d71c0635013d6d155bbfe8ba0aa4b4d2d24ce8af6b71047bd" 1237 | dependencies = [ 1238 | "byteorder", 1239 | "png", 1240 | ] 1241 | 1242 | [[package]] 1243 | name = "ident_case" 1244 | version = "1.0.1" 1245 | source = "registry+https://github.com/rust-lang/crates.io-index" 1246 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1247 | 1248 | [[package]] 1249 | name = "idna" 1250 | version = "0.3.0" 1251 | source = "registry+https://github.com/rust-lang/crates.io-index" 1252 | checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" 1253 | dependencies = [ 1254 | "unicode-bidi", 1255 | "unicode-normalization", 1256 | ] 1257 | 1258 | [[package]] 1259 | name = "ignore" 1260 | version = "0.4.18" 1261 | source = "registry+https://github.com/rust-lang/crates.io-index" 1262 | checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d" 1263 | dependencies = [ 1264 | "crossbeam-utils", 1265 | "globset", 1266 | "lazy_static", 1267 | "log", 1268 | "memchr", 1269 | "regex", 1270 | "same-file", 1271 | "thread_local", 1272 | "walkdir", 1273 | "winapi-util", 1274 | ] 1275 | 1276 | [[package]] 1277 | name = "image" 1278 | version = "0.24.5" 1279 | source = "registry+https://github.com/rust-lang/crates.io-index" 1280 | checksum = "69b7ea949b537b0fd0af141fff8c77690f2ce96f4f41f042ccb6c69c6c965945" 1281 | dependencies = [ 1282 | "bytemuck", 1283 | "byteorder", 1284 | "color_quant", 1285 | "num-rational", 1286 | "num-traits", 1287 | ] 1288 | 1289 | [[package]] 1290 | name = "indexmap" 1291 | version = "1.9.2" 1292 | source = "registry+https://github.com/rust-lang/crates.io-index" 1293 | checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" 1294 | dependencies = [ 1295 | "autocfg", 1296 | "hashbrown 0.12.3", 1297 | ] 1298 | 1299 | [[package]] 1300 | name = "indexmap" 1301 | version = "2.2.6" 1302 | source = "registry+https://github.com/rust-lang/crates.io-index" 1303 | checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" 1304 | dependencies = [ 1305 | "equivalent", 1306 | "hashbrown 0.14.5", 1307 | ] 1308 | 1309 | [[package]] 1310 | name = "infer" 1311 | version = "0.7.0" 1312 | source = "registry+https://github.com/rust-lang/crates.io-index" 1313 | checksum = "20b2b533137b9cad970793453d4f921c2e91312a6d88b1085c07bc15fc51bb3b" 1314 | dependencies = [ 1315 | "cfb", 1316 | ] 1317 | 1318 | [[package]] 1319 | name = "instant" 1320 | version = "0.1.12" 1321 | source = "registry+https://github.com/rust-lang/crates.io-index" 1322 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 1323 | dependencies = [ 1324 | "cfg-if", 1325 | ] 1326 | 1327 | [[package]] 1328 | name = "io-lifetimes" 1329 | version = "1.0.4" 1330 | source = "registry+https://github.com/rust-lang/crates.io-index" 1331 | checksum = "e7d6c6f8c91b4b9ed43484ad1a938e393caf35960fce7f82a040497207bd8e9e" 1332 | dependencies = [ 1333 | "libc", 1334 | "windows-sys 0.42.0", 1335 | ] 1336 | 1337 | [[package]] 1338 | name = "ipnet" 1339 | version = "2.7.1" 1340 | source = "registry+https://github.com/rust-lang/crates.io-index" 1341 | checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" 1342 | 1343 | [[package]] 1344 | name = "is-terminal" 1345 | version = "0.4.2" 1346 | source = "registry+https://github.com/rust-lang/crates.io-index" 1347 | checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189" 1348 | dependencies = [ 1349 | "hermit-abi", 1350 | "io-lifetimes", 1351 | "rustix", 1352 | "windows-sys 0.42.0", 1353 | ] 1354 | 1355 | [[package]] 1356 | name = "itertools" 1357 | version = "0.10.5" 1358 | source = "registry+https://github.com/rust-lang/crates.io-index" 1359 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 1360 | dependencies = [ 1361 | "either", 1362 | ] 1363 | 1364 | [[package]] 1365 | name = "itoa" 1366 | version = "0.4.8" 1367 | source = "registry+https://github.com/rust-lang/crates.io-index" 1368 | checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" 1369 | 1370 | [[package]] 1371 | name = "itoa" 1372 | version = "1.0.5" 1373 | source = "registry+https://github.com/rust-lang/crates.io-index" 1374 | checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" 1375 | 1376 | [[package]] 1377 | name = "javascriptcore-rs" 1378 | version = "0.16.0" 1379 | source = "registry+https://github.com/rust-lang/crates.io-index" 1380 | checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" 1381 | dependencies = [ 1382 | "bitflags 1.3.2", 1383 | "glib", 1384 | "javascriptcore-rs-sys", 1385 | ] 1386 | 1387 | [[package]] 1388 | name = "javascriptcore-rs-sys" 1389 | version = "0.4.0" 1390 | source = "registry+https://github.com/rust-lang/crates.io-index" 1391 | checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" 1392 | dependencies = [ 1393 | "glib-sys", 1394 | "gobject-sys", 1395 | "libc", 1396 | "system-deps 5.0.0", 1397 | ] 1398 | 1399 | [[package]] 1400 | name = "jni" 1401 | version = "0.20.0" 1402 | source = "registry+https://github.com/rust-lang/crates.io-index" 1403 | checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" 1404 | dependencies = [ 1405 | "cesu8", 1406 | "combine", 1407 | "jni-sys", 1408 | "log", 1409 | "thiserror", 1410 | "walkdir", 1411 | ] 1412 | 1413 | [[package]] 1414 | name = "jni-sys" 1415 | version = "0.3.0" 1416 | source = "registry+https://github.com/rust-lang/crates.io-index" 1417 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 1418 | 1419 | [[package]] 1420 | name = "js-sys" 1421 | version = "0.3.60" 1422 | source = "registry+https://github.com/rust-lang/crates.io-index" 1423 | checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" 1424 | dependencies = [ 1425 | "wasm-bindgen", 1426 | ] 1427 | 1428 | [[package]] 1429 | name = "json-patch" 1430 | version = "0.2.7" 1431 | source = "registry+https://github.com/rust-lang/crates.io-index" 1432 | checksum = "eb3fa5a61630976fc4c353c70297f2e93f1930e3ccee574d59d618ccbd5154ce" 1433 | dependencies = [ 1434 | "serde", 1435 | "serde_json", 1436 | "treediff", 1437 | ] 1438 | 1439 | [[package]] 1440 | name = "kuchiki" 1441 | version = "0.8.1" 1442 | source = "registry+https://github.com/rust-lang/crates.io-index" 1443 | checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" 1444 | dependencies = [ 1445 | "cssparser", 1446 | "html5ever", 1447 | "matches", 1448 | "selectors", 1449 | ] 1450 | 1451 | [[package]] 1452 | name = "lazy_static" 1453 | version = "1.4.0" 1454 | source = "registry+https://github.com/rust-lang/crates.io-index" 1455 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1456 | 1457 | [[package]] 1458 | name = "libc" 1459 | version = "0.2.155" 1460 | source = "registry+https://github.com/rust-lang/crates.io-index" 1461 | checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" 1462 | 1463 | [[package]] 1464 | name = "line-wrap" 1465 | version = "0.1.1" 1466 | source = "registry+https://github.com/rust-lang/crates.io-index" 1467 | checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" 1468 | dependencies = [ 1469 | "safemem", 1470 | ] 1471 | 1472 | [[package]] 1473 | name = "linux-raw-sys" 1474 | version = "0.1.4" 1475 | source = "registry+https://github.com/rust-lang/crates.io-index" 1476 | checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" 1477 | 1478 | [[package]] 1479 | name = "lock_api" 1480 | version = "0.4.9" 1481 | source = "registry+https://github.com/rust-lang/crates.io-index" 1482 | checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" 1483 | dependencies = [ 1484 | "autocfg", 1485 | "scopeguard", 1486 | ] 1487 | 1488 | [[package]] 1489 | name = "log" 1490 | version = "0.4.17" 1491 | source = "registry+https://github.com/rust-lang/crates.io-index" 1492 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 1493 | dependencies = [ 1494 | "cfg-if", 1495 | ] 1496 | 1497 | [[package]] 1498 | name = "loom" 1499 | version = "0.5.6" 1500 | source = "registry+https://github.com/rust-lang/crates.io-index" 1501 | checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" 1502 | dependencies = [ 1503 | "cfg-if", 1504 | "generator", 1505 | "scoped-tls", 1506 | "serde", 1507 | "serde_json", 1508 | "tracing", 1509 | "tracing-subscriber", 1510 | ] 1511 | 1512 | [[package]] 1513 | name = "mac" 1514 | version = "0.1.1" 1515 | source = "registry+https://github.com/rust-lang/crates.io-index" 1516 | checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" 1517 | 1518 | [[package]] 1519 | name = "malloc_buf" 1520 | version = "0.0.6" 1521 | source = "registry+https://github.com/rust-lang/crates.io-index" 1522 | checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" 1523 | dependencies = [ 1524 | "libc", 1525 | ] 1526 | 1527 | [[package]] 1528 | name = "markup5ever" 1529 | version = "0.10.1" 1530 | source = "registry+https://github.com/rust-lang/crates.io-index" 1531 | checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" 1532 | dependencies = [ 1533 | "log", 1534 | "phf 0.8.0", 1535 | "phf_codegen", 1536 | "string_cache", 1537 | "string_cache_codegen", 1538 | "tendril", 1539 | ] 1540 | 1541 | [[package]] 1542 | name = "matchers" 1543 | version = "0.1.0" 1544 | source = "registry+https://github.com/rust-lang/crates.io-index" 1545 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1546 | dependencies = [ 1547 | "regex-automata", 1548 | ] 1549 | 1550 | [[package]] 1551 | name = "matches" 1552 | version = "0.1.10" 1553 | source = "registry+https://github.com/rust-lang/crates.io-index" 1554 | checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" 1555 | 1556 | [[package]] 1557 | name = "memchr" 1558 | version = "2.5.0" 1559 | source = "registry+https://github.com/rust-lang/crates.io-index" 1560 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 1561 | 1562 | [[package]] 1563 | name = "memoffset" 1564 | version = "0.6.5" 1565 | source = "registry+https://github.com/rust-lang/crates.io-index" 1566 | checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" 1567 | dependencies = [ 1568 | "autocfg", 1569 | ] 1570 | 1571 | [[package]] 1572 | name = "memoffset" 1573 | version = "0.7.1" 1574 | source = "registry+https://github.com/rust-lang/crates.io-index" 1575 | checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" 1576 | dependencies = [ 1577 | "autocfg", 1578 | ] 1579 | 1580 | [[package]] 1581 | name = "mime" 1582 | version = "0.3.16" 1583 | source = "registry+https://github.com/rust-lang/crates.io-index" 1584 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 1585 | 1586 | [[package]] 1587 | name = "miniz_oxide" 1588 | version = "0.6.2" 1589 | source = "registry+https://github.com/rust-lang/crates.io-index" 1590 | checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" 1591 | dependencies = [ 1592 | "adler", 1593 | ] 1594 | 1595 | [[package]] 1596 | name = "mio" 1597 | version = "0.8.11" 1598 | source = "registry+https://github.com/rust-lang/crates.io-index" 1599 | checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" 1600 | dependencies = [ 1601 | "libc", 1602 | "log", 1603 | "wasi 0.11.0+wasi-snapshot-preview1", 1604 | "windows-sys 0.48.0", 1605 | ] 1606 | 1607 | [[package]] 1608 | name = "native-tls" 1609 | version = "0.2.11" 1610 | source = "registry+https://github.com/rust-lang/crates.io-index" 1611 | checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" 1612 | dependencies = [ 1613 | "lazy_static", 1614 | "libc", 1615 | "log", 1616 | "openssl", 1617 | "openssl-probe", 1618 | "openssl-sys", 1619 | "schannel", 1620 | "security-framework", 1621 | "security-framework-sys", 1622 | "tempfile", 1623 | ] 1624 | 1625 | [[package]] 1626 | name = "ndk" 1627 | version = "0.6.0" 1628 | source = "registry+https://github.com/rust-lang/crates.io-index" 1629 | checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" 1630 | dependencies = [ 1631 | "bitflags 1.3.2", 1632 | "jni-sys", 1633 | "ndk-sys", 1634 | "num_enum", 1635 | "thiserror", 1636 | ] 1637 | 1638 | [[package]] 1639 | name = "ndk-context" 1640 | version = "0.1.1" 1641 | source = "registry+https://github.com/rust-lang/crates.io-index" 1642 | checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" 1643 | 1644 | [[package]] 1645 | name = "ndk-sys" 1646 | version = "0.3.0" 1647 | source = "registry+https://github.com/rust-lang/crates.io-index" 1648 | checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" 1649 | dependencies = [ 1650 | "jni-sys", 1651 | ] 1652 | 1653 | [[package]] 1654 | name = "new_debug_unreachable" 1655 | version = "1.0.4" 1656 | source = "registry+https://github.com/rust-lang/crates.io-index" 1657 | checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" 1658 | 1659 | [[package]] 1660 | name = "nodrop" 1661 | version = "0.1.14" 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" 1663 | checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" 1664 | 1665 | [[package]] 1666 | name = "nom8" 1667 | version = "0.2.0" 1668 | source = "registry+https://github.com/rust-lang/crates.io-index" 1669 | checksum = "ae01545c9c7fc4486ab7debaf2aad7003ac19431791868fb2e8066df97fad2f8" 1670 | dependencies = [ 1671 | "memchr", 1672 | ] 1673 | 1674 | [[package]] 1675 | name = "nu-ansi-term" 1676 | version = "0.46.0" 1677 | source = "registry+https://github.com/rust-lang/crates.io-index" 1678 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1679 | dependencies = [ 1680 | "overload", 1681 | "winapi", 1682 | ] 1683 | 1684 | [[package]] 1685 | name = "num-integer" 1686 | version = "0.1.45" 1687 | source = "registry+https://github.com/rust-lang/crates.io-index" 1688 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 1689 | dependencies = [ 1690 | "autocfg", 1691 | "num-traits", 1692 | ] 1693 | 1694 | [[package]] 1695 | name = "num-rational" 1696 | version = "0.4.1" 1697 | source = "registry+https://github.com/rust-lang/crates.io-index" 1698 | checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" 1699 | dependencies = [ 1700 | "autocfg", 1701 | "num-integer", 1702 | "num-traits", 1703 | ] 1704 | 1705 | [[package]] 1706 | name = "num-traits" 1707 | version = "0.2.15" 1708 | source = "registry+https://github.com/rust-lang/crates.io-index" 1709 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 1710 | dependencies = [ 1711 | "autocfg", 1712 | ] 1713 | 1714 | [[package]] 1715 | name = "num_cpus" 1716 | version = "1.15.0" 1717 | source = "registry+https://github.com/rust-lang/crates.io-index" 1718 | checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" 1719 | dependencies = [ 1720 | "hermit-abi", 1721 | "libc", 1722 | ] 1723 | 1724 | [[package]] 1725 | name = "num_enum" 1726 | version = "0.5.9" 1727 | source = "registry+https://github.com/rust-lang/crates.io-index" 1728 | checksum = "8d829733185c1ca374f17e52b762f24f535ec625d2cc1f070e34c8a9068f341b" 1729 | dependencies = [ 1730 | "num_enum_derive", 1731 | ] 1732 | 1733 | [[package]] 1734 | name = "num_enum_derive" 1735 | version = "0.5.9" 1736 | source = "registry+https://github.com/rust-lang/crates.io-index" 1737 | checksum = "2be1598bf1c313dcdd12092e3f1920f463462525a21b7b4e11b4168353d0123e" 1738 | dependencies = [ 1739 | "proc-macro-crate", 1740 | "proc-macro2", 1741 | "quote", 1742 | "syn", 1743 | ] 1744 | 1745 | [[package]] 1746 | name = "objc" 1747 | version = "0.2.7" 1748 | source = "registry+https://github.com/rust-lang/crates.io-index" 1749 | checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" 1750 | dependencies = [ 1751 | "malloc_buf", 1752 | "objc_exception", 1753 | ] 1754 | 1755 | [[package]] 1756 | name = "objc-foundation" 1757 | version = "0.1.1" 1758 | source = "registry+https://github.com/rust-lang/crates.io-index" 1759 | checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" 1760 | dependencies = [ 1761 | "block", 1762 | "objc", 1763 | "objc_id", 1764 | ] 1765 | 1766 | [[package]] 1767 | name = "objc_exception" 1768 | version = "0.1.2" 1769 | source = "registry+https://github.com/rust-lang/crates.io-index" 1770 | checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" 1771 | dependencies = [ 1772 | "cc", 1773 | ] 1774 | 1775 | [[package]] 1776 | name = "objc_id" 1777 | version = "0.1.1" 1778 | source = "registry+https://github.com/rust-lang/crates.io-index" 1779 | checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" 1780 | dependencies = [ 1781 | "objc", 1782 | ] 1783 | 1784 | [[package]] 1785 | name = "once_cell" 1786 | version = "1.17.0" 1787 | source = "registry+https://github.com/rust-lang/crates.io-index" 1788 | checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" 1789 | 1790 | [[package]] 1791 | name = "open" 1792 | version = "3.2.0" 1793 | source = "registry+https://github.com/rust-lang/crates.io-index" 1794 | checksum = "2078c0039e6a54a0c42c28faa984e115fb4c2d5bf2208f77d1961002df8576f8" 1795 | dependencies = [ 1796 | "pathdiff", 1797 | "windows-sys 0.42.0", 1798 | ] 1799 | 1800 | [[package]] 1801 | name = "openssl" 1802 | version = "0.10.66" 1803 | source = "registry+https://github.com/rust-lang/crates.io-index" 1804 | checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" 1805 | dependencies = [ 1806 | "bitflags 2.6.0", 1807 | "cfg-if", 1808 | "foreign-types", 1809 | "libc", 1810 | "once_cell", 1811 | "openssl-macros", 1812 | "openssl-sys", 1813 | ] 1814 | 1815 | [[package]] 1816 | name = "openssl-macros" 1817 | version = "0.1.0" 1818 | source = "registry+https://github.com/rust-lang/crates.io-index" 1819 | checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" 1820 | dependencies = [ 1821 | "proc-macro2", 1822 | "quote", 1823 | "syn", 1824 | ] 1825 | 1826 | [[package]] 1827 | name = "openssl-probe" 1828 | version = "0.1.5" 1829 | source = "registry+https://github.com/rust-lang/crates.io-index" 1830 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1831 | 1832 | [[package]] 1833 | name = "openssl-sys" 1834 | version = "0.9.103" 1835 | source = "registry+https://github.com/rust-lang/crates.io-index" 1836 | checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" 1837 | dependencies = [ 1838 | "cc", 1839 | "libc", 1840 | "pkg-config", 1841 | "vcpkg", 1842 | ] 1843 | 1844 | [[package]] 1845 | name = "overload" 1846 | version = "0.1.1" 1847 | source = "registry+https://github.com/rust-lang/crates.io-index" 1848 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 1849 | 1850 | [[package]] 1851 | name = "pango" 1852 | version = "0.15.10" 1853 | source = "registry+https://github.com/rust-lang/crates.io-index" 1854 | checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" 1855 | dependencies = [ 1856 | "bitflags 1.3.2", 1857 | "glib", 1858 | "libc", 1859 | "once_cell", 1860 | "pango-sys", 1861 | ] 1862 | 1863 | [[package]] 1864 | name = "pango-sys" 1865 | version = "0.15.10" 1866 | source = "registry+https://github.com/rust-lang/crates.io-index" 1867 | checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" 1868 | dependencies = [ 1869 | "glib-sys", 1870 | "gobject-sys", 1871 | "libc", 1872 | "system-deps 6.0.3", 1873 | ] 1874 | 1875 | [[package]] 1876 | name = "parking_lot" 1877 | version = "0.12.1" 1878 | source = "registry+https://github.com/rust-lang/crates.io-index" 1879 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 1880 | dependencies = [ 1881 | "lock_api", 1882 | "parking_lot_core", 1883 | ] 1884 | 1885 | [[package]] 1886 | name = "parking_lot_core" 1887 | version = "0.9.6" 1888 | source = "registry+https://github.com/rust-lang/crates.io-index" 1889 | checksum = "ba1ef8814b5c993410bb3adfad7a5ed269563e4a2f90c41f5d85be7fb47133bf" 1890 | dependencies = [ 1891 | "cfg-if", 1892 | "libc", 1893 | "redox_syscall", 1894 | "smallvec", 1895 | "windows-sys 0.42.0", 1896 | ] 1897 | 1898 | [[package]] 1899 | name = "paste" 1900 | version = "1.0.11" 1901 | source = "registry+https://github.com/rust-lang/crates.io-index" 1902 | checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" 1903 | 1904 | [[package]] 1905 | name = "pathdiff" 1906 | version = "0.2.1" 1907 | source = "registry+https://github.com/rust-lang/crates.io-index" 1908 | checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" 1909 | 1910 | [[package]] 1911 | name = "percent-encoding" 1912 | version = "2.2.0" 1913 | source = "registry+https://github.com/rust-lang/crates.io-index" 1914 | checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" 1915 | 1916 | [[package]] 1917 | name = "pest" 1918 | version = "2.5.4" 1919 | source = "registry+https://github.com/rust-lang/crates.io-index" 1920 | checksum = "4ab62d2fa33726dbe6321cc97ef96d8cde531e3eeaf858a058de53a8a6d40d8f" 1921 | dependencies = [ 1922 | "thiserror", 1923 | "ucd-trie", 1924 | ] 1925 | 1926 | [[package]] 1927 | name = "phf" 1928 | version = "0.8.0" 1929 | source = "registry+https://github.com/rust-lang/crates.io-index" 1930 | checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" 1931 | dependencies = [ 1932 | "phf_macros 0.8.0", 1933 | "phf_shared 0.8.0", 1934 | "proc-macro-hack", 1935 | ] 1936 | 1937 | [[package]] 1938 | name = "phf" 1939 | version = "0.10.1" 1940 | source = "registry+https://github.com/rust-lang/crates.io-index" 1941 | checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" 1942 | dependencies = [ 1943 | "phf_macros 0.10.0", 1944 | "phf_shared 0.10.0", 1945 | "proc-macro-hack", 1946 | ] 1947 | 1948 | [[package]] 1949 | name = "phf_codegen" 1950 | version = "0.8.0" 1951 | source = "registry+https://github.com/rust-lang/crates.io-index" 1952 | checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" 1953 | dependencies = [ 1954 | "phf_generator 0.8.0", 1955 | "phf_shared 0.8.0", 1956 | ] 1957 | 1958 | [[package]] 1959 | name = "phf_generator" 1960 | version = "0.8.0" 1961 | source = "registry+https://github.com/rust-lang/crates.io-index" 1962 | checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" 1963 | dependencies = [ 1964 | "phf_shared 0.8.0", 1965 | "rand 0.7.3", 1966 | ] 1967 | 1968 | [[package]] 1969 | name = "phf_generator" 1970 | version = "0.10.0" 1971 | source = "registry+https://github.com/rust-lang/crates.io-index" 1972 | checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" 1973 | dependencies = [ 1974 | "phf_shared 0.10.0", 1975 | "rand 0.8.5", 1976 | ] 1977 | 1978 | [[package]] 1979 | name = "phf_macros" 1980 | version = "0.8.0" 1981 | source = "registry+https://github.com/rust-lang/crates.io-index" 1982 | checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" 1983 | dependencies = [ 1984 | "phf_generator 0.8.0", 1985 | "phf_shared 0.8.0", 1986 | "proc-macro-hack", 1987 | "proc-macro2", 1988 | "quote", 1989 | "syn", 1990 | ] 1991 | 1992 | [[package]] 1993 | name = "phf_macros" 1994 | version = "0.10.0" 1995 | source = "registry+https://github.com/rust-lang/crates.io-index" 1996 | checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" 1997 | dependencies = [ 1998 | "phf_generator 0.10.0", 1999 | "phf_shared 0.10.0", 2000 | "proc-macro-hack", 2001 | "proc-macro2", 2002 | "quote", 2003 | "syn", 2004 | ] 2005 | 2006 | [[package]] 2007 | name = "phf_shared" 2008 | version = "0.8.0" 2009 | source = "registry+https://github.com/rust-lang/crates.io-index" 2010 | checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" 2011 | dependencies = [ 2012 | "siphasher", 2013 | ] 2014 | 2015 | [[package]] 2016 | name = "phf_shared" 2017 | version = "0.10.0" 2018 | source = "registry+https://github.com/rust-lang/crates.io-index" 2019 | checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" 2020 | dependencies = [ 2021 | "siphasher", 2022 | ] 2023 | 2024 | [[package]] 2025 | name = "pin-project-lite" 2026 | version = "0.2.9" 2027 | source = "registry+https://github.com/rust-lang/crates.io-index" 2028 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 2029 | 2030 | [[package]] 2031 | name = "pin-utils" 2032 | version = "0.1.0" 2033 | source = "registry+https://github.com/rust-lang/crates.io-index" 2034 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 2035 | 2036 | [[package]] 2037 | name = "pkg-config" 2038 | version = "0.3.26" 2039 | source = "registry+https://github.com/rust-lang/crates.io-index" 2040 | checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" 2041 | 2042 | [[package]] 2043 | name = "plist" 2044 | version = "1.4.0" 2045 | source = "registry+https://github.com/rust-lang/crates.io-index" 2046 | checksum = "5329b8f106a176ab0dce4aae5da86bfcb139bb74fb00882859e03745011f3635" 2047 | dependencies = [ 2048 | "base64 0.13.1", 2049 | "indexmap 1.9.2", 2050 | "line-wrap", 2051 | "quick-xml", 2052 | "serde", 2053 | "time", 2054 | ] 2055 | 2056 | [[package]] 2057 | name = "png" 2058 | version = "0.17.7" 2059 | source = "registry+https://github.com/rust-lang/crates.io-index" 2060 | checksum = "5d708eaf860a19b19ce538740d2b4bdeeb8337fa53f7738455e706623ad5c638" 2061 | dependencies = [ 2062 | "bitflags 1.3.2", 2063 | "crc32fast", 2064 | "flate2", 2065 | "miniz_oxide", 2066 | ] 2067 | 2068 | [[package]] 2069 | name = "ppv-lite86" 2070 | version = "0.2.17" 2071 | source = "registry+https://github.com/rust-lang/crates.io-index" 2072 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 2073 | 2074 | [[package]] 2075 | name = "precomputed-hash" 2076 | version = "0.1.1" 2077 | source = "registry+https://github.com/rust-lang/crates.io-index" 2078 | checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" 2079 | 2080 | [[package]] 2081 | name = "proc-macro-crate" 2082 | version = "1.3.0" 2083 | source = "registry+https://github.com/rust-lang/crates.io-index" 2084 | checksum = "66618389e4ec1c7afe67d51a9bf34ff9236480f8d51e7489b7d5ab0303c13f34" 2085 | dependencies = [ 2086 | "once_cell", 2087 | "toml_edit", 2088 | ] 2089 | 2090 | [[package]] 2091 | name = "proc-macro-error" 2092 | version = "1.0.4" 2093 | source = "registry+https://github.com/rust-lang/crates.io-index" 2094 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 2095 | dependencies = [ 2096 | "proc-macro-error-attr", 2097 | "proc-macro2", 2098 | "quote", 2099 | "syn", 2100 | "version_check", 2101 | ] 2102 | 2103 | [[package]] 2104 | name = "proc-macro-error-attr" 2105 | version = "1.0.4" 2106 | source = "registry+https://github.com/rust-lang/crates.io-index" 2107 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 2108 | dependencies = [ 2109 | "proc-macro2", 2110 | "quote", 2111 | "version_check", 2112 | ] 2113 | 2114 | [[package]] 2115 | name = "proc-macro-hack" 2116 | version = "0.5.20+deprecated" 2117 | source = "registry+https://github.com/rust-lang/crates.io-index" 2118 | checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" 2119 | 2120 | [[package]] 2121 | name = "proc-macro2" 2122 | version = "1.0.50" 2123 | source = "registry+https://github.com/rust-lang/crates.io-index" 2124 | checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" 2125 | dependencies = [ 2126 | "unicode-ident", 2127 | ] 2128 | 2129 | [[package]] 2130 | name = "proxy-checker" 2131 | version = "0.1.1" 2132 | dependencies = [ 2133 | "checker-library", 2134 | "env_logger", 2135 | "log", 2136 | "num_cpus", 2137 | "rayon", 2138 | "serde", 2139 | "serde_json", 2140 | "tauri", 2141 | "tauri-build", 2142 | "tauri-plugin-store", 2143 | "tokio", 2144 | "uuid 1.2.2", 2145 | ] 2146 | 2147 | [[package]] 2148 | name = "quick-xml" 2149 | version = "0.26.0" 2150 | source = "registry+https://github.com/rust-lang/crates.io-index" 2151 | checksum = "7f50b1c63b38611e7d4d7f68b82d3ad0cc71a2ad2e7f61fc10f1328d917c93cd" 2152 | dependencies = [ 2153 | "memchr", 2154 | ] 2155 | 2156 | [[package]] 2157 | name = "quote" 2158 | version = "1.0.23" 2159 | source = "registry+https://github.com/rust-lang/crates.io-index" 2160 | checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" 2161 | dependencies = [ 2162 | "proc-macro2", 2163 | ] 2164 | 2165 | [[package]] 2166 | name = "rand" 2167 | version = "0.7.3" 2168 | source = "registry+https://github.com/rust-lang/crates.io-index" 2169 | checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 2170 | dependencies = [ 2171 | "getrandom 0.1.16", 2172 | "libc", 2173 | "rand_chacha 0.2.2", 2174 | "rand_core 0.5.1", 2175 | "rand_hc", 2176 | "rand_pcg", 2177 | ] 2178 | 2179 | [[package]] 2180 | name = "rand" 2181 | version = "0.8.5" 2182 | source = "registry+https://github.com/rust-lang/crates.io-index" 2183 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 2184 | dependencies = [ 2185 | "libc", 2186 | "rand_chacha 0.3.1", 2187 | "rand_core 0.6.4", 2188 | ] 2189 | 2190 | [[package]] 2191 | name = "rand_chacha" 2192 | version = "0.2.2" 2193 | source = "registry+https://github.com/rust-lang/crates.io-index" 2194 | checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 2195 | dependencies = [ 2196 | "ppv-lite86", 2197 | "rand_core 0.5.1", 2198 | ] 2199 | 2200 | [[package]] 2201 | name = "rand_chacha" 2202 | version = "0.3.1" 2203 | source = "registry+https://github.com/rust-lang/crates.io-index" 2204 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 2205 | dependencies = [ 2206 | "ppv-lite86", 2207 | "rand_core 0.6.4", 2208 | ] 2209 | 2210 | [[package]] 2211 | name = "rand_core" 2212 | version = "0.5.1" 2213 | source = "registry+https://github.com/rust-lang/crates.io-index" 2214 | checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 2215 | dependencies = [ 2216 | "getrandom 0.1.16", 2217 | ] 2218 | 2219 | [[package]] 2220 | name = "rand_core" 2221 | version = "0.6.4" 2222 | source = "registry+https://github.com/rust-lang/crates.io-index" 2223 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 2224 | dependencies = [ 2225 | "getrandom 0.2.8", 2226 | ] 2227 | 2228 | [[package]] 2229 | name = "rand_hc" 2230 | version = "0.2.0" 2231 | source = "registry+https://github.com/rust-lang/crates.io-index" 2232 | checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 2233 | dependencies = [ 2234 | "rand_core 0.5.1", 2235 | ] 2236 | 2237 | [[package]] 2238 | name = "rand_pcg" 2239 | version = "0.2.1" 2240 | source = "registry+https://github.com/rust-lang/crates.io-index" 2241 | checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" 2242 | dependencies = [ 2243 | "rand_core 0.5.1", 2244 | ] 2245 | 2246 | [[package]] 2247 | name = "raw-window-handle" 2248 | version = "0.5.0" 2249 | source = "registry+https://github.com/rust-lang/crates.io-index" 2250 | checksum = "ed7e3d950b66e19e0c372f3fa3fbbcf85b1746b571f74e0c2af6042a5c93420a" 2251 | dependencies = [ 2252 | "cty", 2253 | ] 2254 | 2255 | [[package]] 2256 | name = "rayon" 2257 | version = "1.6.1" 2258 | source = "registry+https://github.com/rust-lang/crates.io-index" 2259 | checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7" 2260 | dependencies = [ 2261 | "either", 2262 | "rayon-core", 2263 | ] 2264 | 2265 | [[package]] 2266 | name = "rayon-core" 2267 | version = "1.10.2" 2268 | source = "registry+https://github.com/rust-lang/crates.io-index" 2269 | checksum = "356a0625f1954f730c0201cdab48611198dc6ce21f4acff55089b5a78e6e835b" 2270 | dependencies = [ 2271 | "crossbeam-channel", 2272 | "crossbeam-deque", 2273 | "crossbeam-utils", 2274 | "num_cpus", 2275 | ] 2276 | 2277 | [[package]] 2278 | name = "redox_syscall" 2279 | version = "0.2.16" 2280 | source = "registry+https://github.com/rust-lang/crates.io-index" 2281 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 2282 | dependencies = [ 2283 | "bitflags 1.3.2", 2284 | ] 2285 | 2286 | [[package]] 2287 | name = "redox_users" 2288 | version = "0.4.3" 2289 | source = "registry+https://github.com/rust-lang/crates.io-index" 2290 | checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" 2291 | dependencies = [ 2292 | "getrandom 0.2.8", 2293 | "redox_syscall", 2294 | "thiserror", 2295 | ] 2296 | 2297 | [[package]] 2298 | name = "regex" 2299 | version = "1.7.1" 2300 | source = "registry+https://github.com/rust-lang/crates.io-index" 2301 | checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" 2302 | dependencies = [ 2303 | "aho-corasick", 2304 | "memchr", 2305 | "regex-syntax", 2306 | ] 2307 | 2308 | [[package]] 2309 | name = "regex-automata" 2310 | version = "0.1.10" 2311 | source = "registry+https://github.com/rust-lang/crates.io-index" 2312 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 2313 | dependencies = [ 2314 | "regex-syntax", 2315 | ] 2316 | 2317 | [[package]] 2318 | name = "regex-syntax" 2319 | version = "0.6.28" 2320 | source = "registry+https://github.com/rust-lang/crates.io-index" 2321 | checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" 2322 | 2323 | [[package]] 2324 | name = "remove_dir_all" 2325 | version = "0.5.3" 2326 | source = "registry+https://github.com/rust-lang/crates.io-index" 2327 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 2328 | dependencies = [ 2329 | "winapi", 2330 | ] 2331 | 2332 | [[package]] 2333 | name = "reqwest" 2334 | version = "0.11.14" 2335 | source = "registry+https://github.com/rust-lang/crates.io-index" 2336 | checksum = "21eed90ec8570952d53b772ecf8f206aa1ec9a3d76b2521c56c42973f2d91ee9" 2337 | dependencies = [ 2338 | "base64 0.21.0", 2339 | "bytes", 2340 | "encoding_rs", 2341 | "futures-core", 2342 | "futures-util", 2343 | "h2", 2344 | "http", 2345 | "http-body", 2346 | "hyper", 2347 | "hyper-tls", 2348 | "ipnet", 2349 | "js-sys", 2350 | "log", 2351 | "mime", 2352 | "native-tls", 2353 | "once_cell", 2354 | "percent-encoding", 2355 | "pin-project-lite", 2356 | "serde", 2357 | "serde_json", 2358 | "serde_urlencoded", 2359 | "tokio", 2360 | "tokio-native-tls", 2361 | "tokio-socks", 2362 | "tower-service", 2363 | "url", 2364 | "wasm-bindgen", 2365 | "wasm-bindgen-futures", 2366 | "web-sys", 2367 | "winreg", 2368 | ] 2369 | 2370 | [[package]] 2371 | name = "rfd" 2372 | version = "0.10.0" 2373 | source = "registry+https://github.com/rust-lang/crates.io-index" 2374 | checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" 2375 | dependencies = [ 2376 | "block", 2377 | "dispatch", 2378 | "glib-sys", 2379 | "gobject-sys", 2380 | "gtk-sys", 2381 | "js-sys", 2382 | "lazy_static", 2383 | "log", 2384 | "objc", 2385 | "objc-foundation", 2386 | "objc_id", 2387 | "raw-window-handle", 2388 | "wasm-bindgen", 2389 | "wasm-bindgen-futures", 2390 | "web-sys", 2391 | "windows 0.37.0", 2392 | ] 2393 | 2394 | [[package]] 2395 | name = "rustc_version" 2396 | version = "0.3.3" 2397 | source = "registry+https://github.com/rust-lang/crates.io-index" 2398 | checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" 2399 | dependencies = [ 2400 | "semver 0.11.0", 2401 | ] 2402 | 2403 | [[package]] 2404 | name = "rustc_version" 2405 | version = "0.4.0" 2406 | source = "registry+https://github.com/rust-lang/crates.io-index" 2407 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 2408 | dependencies = [ 2409 | "semver 1.0.16", 2410 | ] 2411 | 2412 | [[package]] 2413 | name = "rustix" 2414 | version = "0.36.17" 2415 | source = "registry+https://github.com/rust-lang/crates.io-index" 2416 | checksum = "305efbd14fde4139eb501df5f136994bb520b033fa9fbdce287507dc23b8c7ed" 2417 | dependencies = [ 2418 | "bitflags 1.3.2", 2419 | "errno", 2420 | "io-lifetimes", 2421 | "libc", 2422 | "linux-raw-sys", 2423 | "windows-sys 0.45.0", 2424 | ] 2425 | 2426 | [[package]] 2427 | name = "rustversion" 2428 | version = "1.0.11" 2429 | source = "registry+https://github.com/rust-lang/crates.io-index" 2430 | checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70" 2431 | 2432 | [[package]] 2433 | name = "ryu" 2434 | version = "1.0.12" 2435 | source = "registry+https://github.com/rust-lang/crates.io-index" 2436 | checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" 2437 | 2438 | [[package]] 2439 | name = "safemem" 2440 | version = "0.3.3" 2441 | source = "registry+https://github.com/rust-lang/crates.io-index" 2442 | checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" 2443 | 2444 | [[package]] 2445 | name = "same-file" 2446 | version = "1.0.6" 2447 | source = "registry+https://github.com/rust-lang/crates.io-index" 2448 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 2449 | dependencies = [ 2450 | "winapi-util", 2451 | ] 2452 | 2453 | [[package]] 2454 | name = "schannel" 2455 | version = "0.1.21" 2456 | source = "registry+https://github.com/rust-lang/crates.io-index" 2457 | checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" 2458 | dependencies = [ 2459 | "windows-sys 0.42.0", 2460 | ] 2461 | 2462 | [[package]] 2463 | name = "scoped-tls" 2464 | version = "1.0.1" 2465 | source = "registry+https://github.com/rust-lang/crates.io-index" 2466 | checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 2467 | 2468 | [[package]] 2469 | name = "scopeguard" 2470 | version = "1.1.0" 2471 | source = "registry+https://github.com/rust-lang/crates.io-index" 2472 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 2473 | 2474 | [[package]] 2475 | name = "security-framework" 2476 | version = "2.8.2" 2477 | source = "registry+https://github.com/rust-lang/crates.io-index" 2478 | checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" 2479 | dependencies = [ 2480 | "bitflags 1.3.2", 2481 | "core-foundation", 2482 | "core-foundation-sys", 2483 | "libc", 2484 | "security-framework-sys", 2485 | ] 2486 | 2487 | [[package]] 2488 | name = "security-framework-sys" 2489 | version = "2.8.0" 2490 | source = "registry+https://github.com/rust-lang/crates.io-index" 2491 | checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" 2492 | dependencies = [ 2493 | "core-foundation-sys", 2494 | "libc", 2495 | ] 2496 | 2497 | [[package]] 2498 | name = "selectors" 2499 | version = "0.22.0" 2500 | source = "registry+https://github.com/rust-lang/crates.io-index" 2501 | checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" 2502 | dependencies = [ 2503 | "bitflags 1.3.2", 2504 | "cssparser", 2505 | "derive_more", 2506 | "fxhash", 2507 | "log", 2508 | "matches", 2509 | "phf 0.8.0", 2510 | "phf_codegen", 2511 | "precomputed-hash", 2512 | "servo_arc", 2513 | "smallvec", 2514 | "thin-slice", 2515 | ] 2516 | 2517 | [[package]] 2518 | name = "semver" 2519 | version = "0.11.0" 2520 | source = "registry+https://github.com/rust-lang/crates.io-index" 2521 | checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" 2522 | dependencies = [ 2523 | "semver-parser", 2524 | ] 2525 | 2526 | [[package]] 2527 | name = "semver" 2528 | version = "1.0.16" 2529 | source = "registry+https://github.com/rust-lang/crates.io-index" 2530 | checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" 2531 | dependencies = [ 2532 | "serde", 2533 | ] 2534 | 2535 | [[package]] 2536 | name = "semver-parser" 2537 | version = "0.10.2" 2538 | source = "registry+https://github.com/rust-lang/crates.io-index" 2539 | checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" 2540 | dependencies = [ 2541 | "pest", 2542 | ] 2543 | 2544 | [[package]] 2545 | name = "serde" 2546 | version = "1.0.152" 2547 | source = "registry+https://github.com/rust-lang/crates.io-index" 2548 | checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" 2549 | dependencies = [ 2550 | "serde_derive", 2551 | ] 2552 | 2553 | [[package]] 2554 | name = "serde_derive" 2555 | version = "1.0.152" 2556 | source = "registry+https://github.com/rust-lang/crates.io-index" 2557 | checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" 2558 | dependencies = [ 2559 | "proc-macro2", 2560 | "quote", 2561 | "syn", 2562 | ] 2563 | 2564 | [[package]] 2565 | name = "serde_json" 2566 | version = "1.0.91" 2567 | source = "registry+https://github.com/rust-lang/crates.io-index" 2568 | checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" 2569 | dependencies = [ 2570 | "itoa 1.0.5", 2571 | "ryu", 2572 | "serde", 2573 | ] 2574 | 2575 | [[package]] 2576 | name = "serde_repr" 2577 | version = "0.1.10" 2578 | source = "registry+https://github.com/rust-lang/crates.io-index" 2579 | checksum = "9a5ec9fa74a20ebbe5d9ac23dac1fc96ba0ecfe9f50f2843b52e537b10fbcb4e" 2580 | dependencies = [ 2581 | "proc-macro2", 2582 | "quote", 2583 | "syn", 2584 | ] 2585 | 2586 | [[package]] 2587 | name = "serde_urlencoded" 2588 | version = "0.7.1" 2589 | source = "registry+https://github.com/rust-lang/crates.io-index" 2590 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 2591 | dependencies = [ 2592 | "form_urlencoded", 2593 | "itoa 1.0.5", 2594 | "ryu", 2595 | "serde", 2596 | ] 2597 | 2598 | [[package]] 2599 | name = "serde_with" 2600 | version = "1.14.0" 2601 | source = "registry+https://github.com/rust-lang/crates.io-index" 2602 | checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" 2603 | dependencies = [ 2604 | "serde", 2605 | "serde_with_macros", 2606 | ] 2607 | 2608 | [[package]] 2609 | name = "serde_with_macros" 2610 | version = "1.5.2" 2611 | source = "registry+https://github.com/rust-lang/crates.io-index" 2612 | checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" 2613 | dependencies = [ 2614 | "darling", 2615 | "proc-macro2", 2616 | "quote", 2617 | "syn", 2618 | ] 2619 | 2620 | [[package]] 2621 | name = "serialize-to-javascript" 2622 | version = "0.1.1" 2623 | source = "registry+https://github.com/rust-lang/crates.io-index" 2624 | checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" 2625 | dependencies = [ 2626 | "serde", 2627 | "serde_json", 2628 | "serialize-to-javascript-impl", 2629 | ] 2630 | 2631 | [[package]] 2632 | name = "serialize-to-javascript-impl" 2633 | version = "0.1.1" 2634 | source = "registry+https://github.com/rust-lang/crates.io-index" 2635 | checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" 2636 | dependencies = [ 2637 | "proc-macro2", 2638 | "quote", 2639 | "syn", 2640 | ] 2641 | 2642 | [[package]] 2643 | name = "servo_arc" 2644 | version = "0.1.1" 2645 | source = "registry+https://github.com/rust-lang/crates.io-index" 2646 | checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" 2647 | dependencies = [ 2648 | "nodrop", 2649 | "stable_deref_trait", 2650 | ] 2651 | 2652 | [[package]] 2653 | name = "sha2" 2654 | version = "0.10.6" 2655 | source = "registry+https://github.com/rust-lang/crates.io-index" 2656 | checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" 2657 | dependencies = [ 2658 | "cfg-if", 2659 | "cpufeatures", 2660 | "digest", 2661 | ] 2662 | 2663 | [[package]] 2664 | name = "sharded-slab" 2665 | version = "0.1.4" 2666 | source = "registry+https://github.com/rust-lang/crates.io-index" 2667 | checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" 2668 | dependencies = [ 2669 | "lazy_static", 2670 | ] 2671 | 2672 | [[package]] 2673 | name = "signal-hook-registry" 2674 | version = "1.4.0" 2675 | source = "registry+https://github.com/rust-lang/crates.io-index" 2676 | checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" 2677 | dependencies = [ 2678 | "libc", 2679 | ] 2680 | 2681 | [[package]] 2682 | name = "siphasher" 2683 | version = "0.3.10" 2684 | source = "registry+https://github.com/rust-lang/crates.io-index" 2685 | checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" 2686 | 2687 | [[package]] 2688 | name = "slab" 2689 | version = "0.4.7" 2690 | source = "registry+https://github.com/rust-lang/crates.io-index" 2691 | checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" 2692 | dependencies = [ 2693 | "autocfg", 2694 | ] 2695 | 2696 | [[package]] 2697 | name = "smallvec" 2698 | version = "1.10.0" 2699 | source = "registry+https://github.com/rust-lang/crates.io-index" 2700 | checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" 2701 | 2702 | [[package]] 2703 | name = "socket2" 2704 | version = "0.4.7" 2705 | source = "registry+https://github.com/rust-lang/crates.io-index" 2706 | checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" 2707 | dependencies = [ 2708 | "libc", 2709 | "winapi", 2710 | ] 2711 | 2712 | [[package]] 2713 | name = "soup2" 2714 | version = "0.2.1" 2715 | source = "registry+https://github.com/rust-lang/crates.io-index" 2716 | checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" 2717 | dependencies = [ 2718 | "bitflags 1.3.2", 2719 | "gio", 2720 | "glib", 2721 | "libc", 2722 | "once_cell", 2723 | "soup2-sys", 2724 | ] 2725 | 2726 | [[package]] 2727 | name = "soup2-sys" 2728 | version = "0.2.0" 2729 | source = "registry+https://github.com/rust-lang/crates.io-index" 2730 | checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" 2731 | dependencies = [ 2732 | "bitflags 1.3.2", 2733 | "gio-sys", 2734 | "glib-sys", 2735 | "gobject-sys", 2736 | "libc", 2737 | "system-deps 5.0.0", 2738 | ] 2739 | 2740 | [[package]] 2741 | name = "stable_deref_trait" 2742 | version = "1.2.0" 2743 | source = "registry+https://github.com/rust-lang/crates.io-index" 2744 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2745 | 2746 | [[package]] 2747 | name = "state" 2748 | version = "0.5.3" 2749 | source = "registry+https://github.com/rust-lang/crates.io-index" 2750 | checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" 2751 | dependencies = [ 2752 | "loom", 2753 | ] 2754 | 2755 | [[package]] 2756 | name = "string_cache" 2757 | version = "0.8.4" 2758 | source = "registry+https://github.com/rust-lang/crates.io-index" 2759 | checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08" 2760 | dependencies = [ 2761 | "new_debug_unreachable", 2762 | "once_cell", 2763 | "parking_lot", 2764 | "phf_shared 0.10.0", 2765 | "precomputed-hash", 2766 | "serde", 2767 | ] 2768 | 2769 | [[package]] 2770 | name = "string_cache_codegen" 2771 | version = "0.5.2" 2772 | source = "registry+https://github.com/rust-lang/crates.io-index" 2773 | checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" 2774 | dependencies = [ 2775 | "phf_generator 0.10.0", 2776 | "phf_shared 0.10.0", 2777 | "proc-macro2", 2778 | "quote", 2779 | ] 2780 | 2781 | [[package]] 2782 | name = "strsim" 2783 | version = "0.10.0" 2784 | source = "registry+https://github.com/rust-lang/crates.io-index" 2785 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 2786 | 2787 | [[package]] 2788 | name = "syn" 2789 | version = "1.0.107" 2790 | source = "registry+https://github.com/rust-lang/crates.io-index" 2791 | checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" 2792 | dependencies = [ 2793 | "proc-macro2", 2794 | "quote", 2795 | "unicode-ident", 2796 | ] 2797 | 2798 | [[package]] 2799 | name = "system-deps" 2800 | version = "5.0.0" 2801 | source = "registry+https://github.com/rust-lang/crates.io-index" 2802 | checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" 2803 | dependencies = [ 2804 | "cfg-expr 0.9.1", 2805 | "heck 0.3.3", 2806 | "pkg-config", 2807 | "toml", 2808 | "version-compare 0.0.11", 2809 | ] 2810 | 2811 | [[package]] 2812 | name = "system-deps" 2813 | version = "6.0.3" 2814 | source = "registry+https://github.com/rust-lang/crates.io-index" 2815 | checksum = "2955b1fe31e1fa2fbd1976b71cc69a606d7d4da16f6de3333d0c92d51419aeff" 2816 | dependencies = [ 2817 | "cfg-expr 0.11.0", 2818 | "heck 0.4.0", 2819 | "pkg-config", 2820 | "toml", 2821 | "version-compare 0.1.1", 2822 | ] 2823 | 2824 | [[package]] 2825 | name = "tao" 2826 | version = "0.15.8" 2827 | source = "registry+https://github.com/rust-lang/crates.io-index" 2828 | checksum = "ac8e6399427c8494f9849b58694754d7cc741293348a6836b6c8d2c5aa82d8e6" 2829 | dependencies = [ 2830 | "bitflags 1.3.2", 2831 | "cairo-rs", 2832 | "cc", 2833 | "cocoa", 2834 | "core-foundation", 2835 | "core-graphics", 2836 | "crossbeam-channel", 2837 | "dispatch", 2838 | "gdk", 2839 | "gdk-pixbuf", 2840 | "gdk-sys", 2841 | "gdkx11-sys", 2842 | "gio", 2843 | "glib", 2844 | "glib-sys", 2845 | "gtk", 2846 | "image", 2847 | "instant", 2848 | "jni", 2849 | "lazy_static", 2850 | "libc", 2851 | "log", 2852 | "ndk", 2853 | "ndk-context", 2854 | "ndk-sys", 2855 | "objc", 2856 | "once_cell", 2857 | "parking_lot", 2858 | "paste", 2859 | "png", 2860 | "raw-window-handle", 2861 | "scopeguard", 2862 | "serde", 2863 | "unicode-segmentation", 2864 | "uuid 1.2.2", 2865 | "windows 0.39.0", 2866 | "windows-implement", 2867 | "x11-dl", 2868 | ] 2869 | 2870 | [[package]] 2871 | name = "tar" 2872 | version = "0.4.38" 2873 | source = "registry+https://github.com/rust-lang/crates.io-index" 2874 | checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" 2875 | dependencies = [ 2876 | "filetime", 2877 | "libc", 2878 | "xattr", 2879 | ] 2880 | 2881 | [[package]] 2882 | name = "tauri" 2883 | version = "1.2.5" 2884 | source = "registry+https://github.com/rust-lang/crates.io-index" 2885 | checksum = "e3a1fe72365a6d860fddf3403934649a5157b2bbb6f0b50dd3a8858cd1a22412" 2886 | dependencies = [ 2887 | "anyhow", 2888 | "cocoa", 2889 | "dirs-next", 2890 | "embed_plist", 2891 | "encoding_rs", 2892 | "flate2", 2893 | "futures-util", 2894 | "glib", 2895 | "glob", 2896 | "gtk", 2897 | "heck 0.4.0", 2898 | "http", 2899 | "ignore", 2900 | "objc", 2901 | "once_cell", 2902 | "open", 2903 | "percent-encoding", 2904 | "rand 0.8.5", 2905 | "raw-window-handle", 2906 | "regex", 2907 | "rfd", 2908 | "semver 1.0.16", 2909 | "serde", 2910 | "serde_json", 2911 | "serde_repr", 2912 | "serialize-to-javascript", 2913 | "state", 2914 | "tar", 2915 | "tauri-macros", 2916 | "tauri-runtime", 2917 | "tauri-runtime-wry", 2918 | "tauri-utils", 2919 | "tempfile", 2920 | "thiserror", 2921 | "tokio", 2922 | "url", 2923 | "uuid 1.2.2", 2924 | "webkit2gtk", 2925 | "webview2-com", 2926 | "windows 0.39.0", 2927 | ] 2928 | 2929 | [[package]] 2930 | name = "tauri-build" 2931 | version = "1.2.1" 2932 | source = "registry+https://github.com/rust-lang/crates.io-index" 2933 | checksum = "8807c85d656b2b93927c19fe5a5f1f1f348f96c2de8b90763b3c2d561511f9b4" 2934 | dependencies = [ 2935 | "anyhow", 2936 | "cargo_toml", 2937 | "heck 0.4.0", 2938 | "json-patch", 2939 | "semver 1.0.16", 2940 | "serde_json", 2941 | "tauri-utils", 2942 | "winres", 2943 | ] 2944 | 2945 | [[package]] 2946 | name = "tauri-codegen" 2947 | version = "1.2.1" 2948 | source = "registry+https://github.com/rust-lang/crates.io-index" 2949 | checksum = "14388d484b6b1b5dc0f6a7d6cc6433b3b230bec85eaa576adcdf3f9fafa49251" 2950 | dependencies = [ 2951 | "base64 0.13.1", 2952 | "brotli", 2953 | "ico", 2954 | "json-patch", 2955 | "plist", 2956 | "png", 2957 | "proc-macro2", 2958 | "quote", 2959 | "regex", 2960 | "semver 1.0.16", 2961 | "serde", 2962 | "serde_json", 2963 | "sha2", 2964 | "tauri-utils", 2965 | "thiserror", 2966 | "time", 2967 | "uuid 1.2.2", 2968 | "walkdir", 2969 | ] 2970 | 2971 | [[package]] 2972 | name = "tauri-macros" 2973 | version = "1.2.1" 2974 | source = "registry+https://github.com/rust-lang/crates.io-index" 2975 | checksum = "069319e5ecbe653a799b94b0690d9f9bf5d00f7b1d3989aa331c524d4e354075" 2976 | dependencies = [ 2977 | "heck 0.4.0", 2978 | "proc-macro2", 2979 | "quote", 2980 | "syn", 2981 | "tauri-codegen", 2982 | "tauri-utils", 2983 | ] 2984 | 2985 | [[package]] 2986 | name = "tauri-plugin-store" 2987 | version = "0.0.0" 2988 | source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#a32008965b5cf060cc04e1e143dd221ce410715d" 2989 | dependencies = [ 2990 | "log", 2991 | "serde", 2992 | "serde_json", 2993 | "tauri", 2994 | "thiserror", 2995 | ] 2996 | 2997 | [[package]] 2998 | name = "tauri-runtime" 2999 | version = "0.12.2" 3000 | source = "registry+https://github.com/rust-lang/crates.io-index" 3001 | checksum = "dc36898ad4acb6c381878acf903c320a36cf29b68b74f6e791d6045b6557128c" 3002 | dependencies = [ 3003 | "gtk", 3004 | "http", 3005 | "http-range", 3006 | "rand 0.8.5", 3007 | "raw-window-handle", 3008 | "serde", 3009 | "serde_json", 3010 | "tauri-utils", 3011 | "thiserror", 3012 | "url", 3013 | "uuid 1.2.2", 3014 | "webview2-com", 3015 | "windows 0.39.0", 3016 | ] 3017 | 3018 | [[package]] 3019 | name = "tauri-runtime-wry" 3020 | version = "0.12.3" 3021 | source = "registry+https://github.com/rust-lang/crates.io-index" 3022 | checksum = "e2ebc22bc5566ba33310744fadd86709fa591ed163491b165855474523ac1aab" 3023 | dependencies = [ 3024 | "cocoa", 3025 | "gtk", 3026 | "percent-encoding", 3027 | "rand 0.8.5", 3028 | "raw-window-handle", 3029 | "tauri-runtime", 3030 | "tauri-utils", 3031 | "url", 3032 | "uuid 1.2.2", 3033 | "webkit2gtk", 3034 | "webview2-com", 3035 | "windows 0.39.0", 3036 | "wry", 3037 | ] 3038 | 3039 | [[package]] 3040 | name = "tauri-utils" 3041 | version = "1.2.1" 3042 | source = "registry+https://github.com/rust-lang/crates.io-index" 3043 | checksum = "5abbc109a6eb45127956ffcc26ef0e875d160150ac16cfa45d26a6b2871686f1" 3044 | dependencies = [ 3045 | "brotli", 3046 | "ctor", 3047 | "glob", 3048 | "heck 0.4.0", 3049 | "html5ever", 3050 | "infer", 3051 | "json-patch", 3052 | "kuchiki", 3053 | "memchr", 3054 | "phf 0.10.1", 3055 | "proc-macro2", 3056 | "quote", 3057 | "semver 1.0.16", 3058 | "serde", 3059 | "serde_json", 3060 | "serde_with", 3061 | "thiserror", 3062 | "url", 3063 | "walkdir", 3064 | "windows 0.39.0", 3065 | ] 3066 | 3067 | [[package]] 3068 | name = "tempfile" 3069 | version = "3.3.0" 3070 | source = "registry+https://github.com/rust-lang/crates.io-index" 3071 | checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" 3072 | dependencies = [ 3073 | "cfg-if", 3074 | "fastrand", 3075 | "libc", 3076 | "redox_syscall", 3077 | "remove_dir_all", 3078 | "winapi", 3079 | ] 3080 | 3081 | [[package]] 3082 | name = "tendril" 3083 | version = "0.4.3" 3084 | source = "registry+https://github.com/rust-lang/crates.io-index" 3085 | checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" 3086 | dependencies = [ 3087 | "futf", 3088 | "mac", 3089 | "utf-8", 3090 | ] 3091 | 3092 | [[package]] 3093 | name = "termcolor" 3094 | version = "1.2.0" 3095 | source = "registry+https://github.com/rust-lang/crates.io-index" 3096 | checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" 3097 | dependencies = [ 3098 | "winapi-util", 3099 | ] 3100 | 3101 | [[package]] 3102 | name = "thin-slice" 3103 | version = "0.1.1" 3104 | source = "registry+https://github.com/rust-lang/crates.io-index" 3105 | checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" 3106 | 3107 | [[package]] 3108 | name = "thiserror" 3109 | version = "1.0.38" 3110 | source = "registry+https://github.com/rust-lang/crates.io-index" 3111 | checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" 3112 | dependencies = [ 3113 | "thiserror-impl", 3114 | ] 3115 | 3116 | [[package]] 3117 | name = "thiserror-impl" 3118 | version = "1.0.38" 3119 | source = "registry+https://github.com/rust-lang/crates.io-index" 3120 | checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" 3121 | dependencies = [ 3122 | "proc-macro2", 3123 | "quote", 3124 | "syn", 3125 | ] 3126 | 3127 | [[package]] 3128 | name = "thread_local" 3129 | version = "1.1.4" 3130 | source = "registry+https://github.com/rust-lang/crates.io-index" 3131 | checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" 3132 | dependencies = [ 3133 | "once_cell", 3134 | ] 3135 | 3136 | [[package]] 3137 | name = "time" 3138 | version = "0.3.17" 3139 | source = "registry+https://github.com/rust-lang/crates.io-index" 3140 | checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" 3141 | dependencies = [ 3142 | "itoa 1.0.5", 3143 | "serde", 3144 | "time-core", 3145 | "time-macros", 3146 | ] 3147 | 3148 | [[package]] 3149 | name = "time-core" 3150 | version = "0.1.0" 3151 | source = "registry+https://github.com/rust-lang/crates.io-index" 3152 | checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" 3153 | 3154 | [[package]] 3155 | name = "time-macros" 3156 | version = "0.2.6" 3157 | source = "registry+https://github.com/rust-lang/crates.io-index" 3158 | checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" 3159 | dependencies = [ 3160 | "time-core", 3161 | ] 3162 | 3163 | [[package]] 3164 | name = "tinyvec" 3165 | version = "1.6.0" 3166 | source = "registry+https://github.com/rust-lang/crates.io-index" 3167 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 3168 | dependencies = [ 3169 | "tinyvec_macros", 3170 | ] 3171 | 3172 | [[package]] 3173 | name = "tinyvec_macros" 3174 | version = "0.1.0" 3175 | source = "registry+https://github.com/rust-lang/crates.io-index" 3176 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 3177 | 3178 | [[package]] 3179 | name = "tokio" 3180 | version = "1.24.2" 3181 | source = "registry+https://github.com/rust-lang/crates.io-index" 3182 | checksum = "597a12a59981d9e3c38d216785b0c37399f6e415e8d0712047620f189371b0bb" 3183 | dependencies = [ 3184 | "autocfg", 3185 | "bytes", 3186 | "libc", 3187 | "memchr", 3188 | "mio", 3189 | "num_cpus", 3190 | "parking_lot", 3191 | "pin-project-lite", 3192 | "signal-hook-registry", 3193 | "socket2", 3194 | "tokio-macros", 3195 | "windows-sys 0.42.0", 3196 | ] 3197 | 3198 | [[package]] 3199 | name = "tokio-macros" 3200 | version = "1.8.2" 3201 | source = "registry+https://github.com/rust-lang/crates.io-index" 3202 | checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" 3203 | dependencies = [ 3204 | "proc-macro2", 3205 | "quote", 3206 | "syn", 3207 | ] 3208 | 3209 | [[package]] 3210 | name = "tokio-native-tls" 3211 | version = "0.3.0" 3212 | source = "registry+https://github.com/rust-lang/crates.io-index" 3213 | checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" 3214 | dependencies = [ 3215 | "native-tls", 3216 | "tokio", 3217 | ] 3218 | 3219 | [[package]] 3220 | name = "tokio-socks" 3221 | version = "0.5.1" 3222 | source = "registry+https://github.com/rust-lang/crates.io-index" 3223 | checksum = "51165dfa029d2a65969413a6cc96f354b86b464498702f174a4efa13608fd8c0" 3224 | dependencies = [ 3225 | "either", 3226 | "futures-util", 3227 | "thiserror", 3228 | "tokio", 3229 | ] 3230 | 3231 | [[package]] 3232 | name = "tokio-util" 3233 | version = "0.7.4" 3234 | source = "registry+https://github.com/rust-lang/crates.io-index" 3235 | checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" 3236 | dependencies = [ 3237 | "bytes", 3238 | "futures-core", 3239 | "futures-sink", 3240 | "pin-project-lite", 3241 | "tokio", 3242 | "tracing", 3243 | ] 3244 | 3245 | [[package]] 3246 | name = "toml" 3247 | version = "0.5.11" 3248 | source = "registry+https://github.com/rust-lang/crates.io-index" 3249 | checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" 3250 | dependencies = [ 3251 | "serde", 3252 | ] 3253 | 3254 | [[package]] 3255 | name = "toml_datetime" 3256 | version = "0.5.1" 3257 | source = "registry+https://github.com/rust-lang/crates.io-index" 3258 | checksum = "4553f467ac8e3d374bc9a177a26801e5d0f9b211aa1673fb137a403afd1c9cf5" 3259 | 3260 | [[package]] 3261 | name = "toml_edit" 3262 | version = "0.18.1" 3263 | source = "registry+https://github.com/rust-lang/crates.io-index" 3264 | checksum = "56c59d8dd7d0dcbc6428bf7aa2f0e823e26e43b3c9aca15bbc9475d23e5fa12b" 3265 | dependencies = [ 3266 | "indexmap 1.9.2", 3267 | "nom8", 3268 | "toml_datetime", 3269 | ] 3270 | 3271 | [[package]] 3272 | name = "tower-service" 3273 | version = "0.3.2" 3274 | source = "registry+https://github.com/rust-lang/crates.io-index" 3275 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 3276 | 3277 | [[package]] 3278 | name = "tracing" 3279 | version = "0.1.37" 3280 | source = "registry+https://github.com/rust-lang/crates.io-index" 3281 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 3282 | dependencies = [ 3283 | "cfg-if", 3284 | "pin-project-lite", 3285 | "tracing-attributes", 3286 | "tracing-core", 3287 | ] 3288 | 3289 | [[package]] 3290 | name = "tracing-attributes" 3291 | version = "0.1.23" 3292 | source = "registry+https://github.com/rust-lang/crates.io-index" 3293 | checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" 3294 | dependencies = [ 3295 | "proc-macro2", 3296 | "quote", 3297 | "syn", 3298 | ] 3299 | 3300 | [[package]] 3301 | name = "tracing-core" 3302 | version = "0.1.30" 3303 | source = "registry+https://github.com/rust-lang/crates.io-index" 3304 | checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" 3305 | dependencies = [ 3306 | "once_cell", 3307 | "valuable", 3308 | ] 3309 | 3310 | [[package]] 3311 | name = "tracing-log" 3312 | version = "0.1.3" 3313 | source = "registry+https://github.com/rust-lang/crates.io-index" 3314 | checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" 3315 | dependencies = [ 3316 | "lazy_static", 3317 | "log", 3318 | "tracing-core", 3319 | ] 3320 | 3321 | [[package]] 3322 | name = "tracing-subscriber" 3323 | version = "0.3.16" 3324 | source = "registry+https://github.com/rust-lang/crates.io-index" 3325 | checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" 3326 | dependencies = [ 3327 | "matchers", 3328 | "nu-ansi-term", 3329 | "once_cell", 3330 | "regex", 3331 | "sharded-slab", 3332 | "smallvec", 3333 | "thread_local", 3334 | "tracing", 3335 | "tracing-core", 3336 | "tracing-log", 3337 | ] 3338 | 3339 | [[package]] 3340 | name = "treediff" 3341 | version = "3.0.2" 3342 | source = "registry+https://github.com/rust-lang/crates.io-index" 3343 | checksum = "761e8d5ad7ce14bb82b7e61ccc0ca961005a275a060b9644a2431aa11553c2ff" 3344 | dependencies = [ 3345 | "serde_json", 3346 | ] 3347 | 3348 | [[package]] 3349 | name = "try-lock" 3350 | version = "0.2.4" 3351 | source = "registry+https://github.com/rust-lang/crates.io-index" 3352 | checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" 3353 | 3354 | [[package]] 3355 | name = "typenum" 3356 | version = "1.16.0" 3357 | source = "registry+https://github.com/rust-lang/crates.io-index" 3358 | checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" 3359 | 3360 | [[package]] 3361 | name = "ucd-trie" 3362 | version = "0.1.5" 3363 | source = "registry+https://github.com/rust-lang/crates.io-index" 3364 | checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" 3365 | 3366 | [[package]] 3367 | name = "unicode-bidi" 3368 | version = "0.3.10" 3369 | source = "registry+https://github.com/rust-lang/crates.io-index" 3370 | checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" 3371 | 3372 | [[package]] 3373 | name = "unicode-ident" 3374 | version = "1.0.6" 3375 | source = "registry+https://github.com/rust-lang/crates.io-index" 3376 | checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" 3377 | 3378 | [[package]] 3379 | name = "unicode-normalization" 3380 | version = "0.1.22" 3381 | source = "registry+https://github.com/rust-lang/crates.io-index" 3382 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 3383 | dependencies = [ 3384 | "tinyvec", 3385 | ] 3386 | 3387 | [[package]] 3388 | name = "unicode-segmentation" 3389 | version = "1.10.0" 3390 | source = "registry+https://github.com/rust-lang/crates.io-index" 3391 | checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" 3392 | 3393 | [[package]] 3394 | name = "url" 3395 | version = "2.3.1" 3396 | source = "registry+https://github.com/rust-lang/crates.io-index" 3397 | checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" 3398 | dependencies = [ 3399 | "form_urlencoded", 3400 | "idna", 3401 | "percent-encoding", 3402 | "serde", 3403 | ] 3404 | 3405 | [[package]] 3406 | name = "utf-8" 3407 | version = "0.7.6" 3408 | source = "registry+https://github.com/rust-lang/crates.io-index" 3409 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 3410 | 3411 | [[package]] 3412 | name = "uuid" 3413 | version = "0.8.2" 3414 | source = "registry+https://github.com/rust-lang/crates.io-index" 3415 | checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" 3416 | 3417 | [[package]] 3418 | name = "uuid" 3419 | version = "1.2.2" 3420 | source = "registry+https://github.com/rust-lang/crates.io-index" 3421 | checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" 3422 | dependencies = [ 3423 | "getrandom 0.2.8", 3424 | "rand 0.8.5", 3425 | "serde", 3426 | ] 3427 | 3428 | [[package]] 3429 | name = "valuable" 3430 | version = "0.1.0" 3431 | source = "registry+https://github.com/rust-lang/crates.io-index" 3432 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 3433 | 3434 | [[package]] 3435 | name = "vcpkg" 3436 | version = "0.2.15" 3437 | source = "registry+https://github.com/rust-lang/crates.io-index" 3438 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 3439 | 3440 | [[package]] 3441 | name = "version-compare" 3442 | version = "0.0.11" 3443 | source = "registry+https://github.com/rust-lang/crates.io-index" 3444 | checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" 3445 | 3446 | [[package]] 3447 | name = "version-compare" 3448 | version = "0.1.1" 3449 | source = "registry+https://github.com/rust-lang/crates.io-index" 3450 | checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" 3451 | 3452 | [[package]] 3453 | name = "version_check" 3454 | version = "0.9.4" 3455 | source = "registry+https://github.com/rust-lang/crates.io-index" 3456 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 3457 | 3458 | [[package]] 3459 | name = "walkdir" 3460 | version = "2.3.2" 3461 | source = "registry+https://github.com/rust-lang/crates.io-index" 3462 | checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" 3463 | dependencies = [ 3464 | "same-file", 3465 | "winapi", 3466 | "winapi-util", 3467 | ] 3468 | 3469 | [[package]] 3470 | name = "want" 3471 | version = "0.3.0" 3472 | source = "registry+https://github.com/rust-lang/crates.io-index" 3473 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 3474 | dependencies = [ 3475 | "log", 3476 | "try-lock", 3477 | ] 3478 | 3479 | [[package]] 3480 | name = "wasi" 3481 | version = "0.9.0+wasi-snapshot-preview1" 3482 | source = "registry+https://github.com/rust-lang/crates.io-index" 3483 | checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 3484 | 3485 | [[package]] 3486 | name = "wasi" 3487 | version = "0.11.0+wasi-snapshot-preview1" 3488 | source = "registry+https://github.com/rust-lang/crates.io-index" 3489 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 3490 | 3491 | [[package]] 3492 | name = "wasm-bindgen" 3493 | version = "0.2.83" 3494 | source = "registry+https://github.com/rust-lang/crates.io-index" 3495 | checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" 3496 | dependencies = [ 3497 | "cfg-if", 3498 | "wasm-bindgen-macro", 3499 | ] 3500 | 3501 | [[package]] 3502 | name = "wasm-bindgen-backend" 3503 | version = "0.2.83" 3504 | source = "registry+https://github.com/rust-lang/crates.io-index" 3505 | checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" 3506 | dependencies = [ 3507 | "bumpalo", 3508 | "log", 3509 | "once_cell", 3510 | "proc-macro2", 3511 | "quote", 3512 | "syn", 3513 | "wasm-bindgen-shared", 3514 | ] 3515 | 3516 | [[package]] 3517 | name = "wasm-bindgen-futures" 3518 | version = "0.4.33" 3519 | source = "registry+https://github.com/rust-lang/crates.io-index" 3520 | checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" 3521 | dependencies = [ 3522 | "cfg-if", 3523 | "js-sys", 3524 | "wasm-bindgen", 3525 | "web-sys", 3526 | ] 3527 | 3528 | [[package]] 3529 | name = "wasm-bindgen-macro" 3530 | version = "0.2.83" 3531 | source = "registry+https://github.com/rust-lang/crates.io-index" 3532 | checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" 3533 | dependencies = [ 3534 | "quote", 3535 | "wasm-bindgen-macro-support", 3536 | ] 3537 | 3538 | [[package]] 3539 | name = "wasm-bindgen-macro-support" 3540 | version = "0.2.83" 3541 | source = "registry+https://github.com/rust-lang/crates.io-index" 3542 | checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" 3543 | dependencies = [ 3544 | "proc-macro2", 3545 | "quote", 3546 | "syn", 3547 | "wasm-bindgen-backend", 3548 | "wasm-bindgen-shared", 3549 | ] 3550 | 3551 | [[package]] 3552 | name = "wasm-bindgen-shared" 3553 | version = "0.2.83" 3554 | source = "registry+https://github.com/rust-lang/crates.io-index" 3555 | checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" 3556 | 3557 | [[package]] 3558 | name = "web-sys" 3559 | version = "0.3.60" 3560 | source = "registry+https://github.com/rust-lang/crates.io-index" 3561 | checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" 3562 | dependencies = [ 3563 | "js-sys", 3564 | "wasm-bindgen", 3565 | ] 3566 | 3567 | [[package]] 3568 | name = "webkit2gtk" 3569 | version = "0.18.2" 3570 | source = "registry+https://github.com/rust-lang/crates.io-index" 3571 | checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" 3572 | dependencies = [ 3573 | "bitflags 1.3.2", 3574 | "cairo-rs", 3575 | "gdk", 3576 | "gdk-sys", 3577 | "gio", 3578 | "gio-sys", 3579 | "glib", 3580 | "glib-sys", 3581 | "gobject-sys", 3582 | "gtk", 3583 | "gtk-sys", 3584 | "javascriptcore-rs", 3585 | "libc", 3586 | "once_cell", 3587 | "soup2", 3588 | "webkit2gtk-sys", 3589 | ] 3590 | 3591 | [[package]] 3592 | name = "webkit2gtk-sys" 3593 | version = "0.18.0" 3594 | source = "registry+https://github.com/rust-lang/crates.io-index" 3595 | checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" 3596 | dependencies = [ 3597 | "atk-sys", 3598 | "bitflags 1.3.2", 3599 | "cairo-sys-rs", 3600 | "gdk-pixbuf-sys", 3601 | "gdk-sys", 3602 | "gio-sys", 3603 | "glib-sys", 3604 | "gobject-sys", 3605 | "gtk-sys", 3606 | "javascriptcore-rs-sys", 3607 | "libc", 3608 | "pango-sys", 3609 | "pkg-config", 3610 | "soup2-sys", 3611 | "system-deps 6.0.3", 3612 | ] 3613 | 3614 | [[package]] 3615 | name = "webview2-com" 3616 | version = "0.19.1" 3617 | source = "registry+https://github.com/rust-lang/crates.io-index" 3618 | checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" 3619 | dependencies = [ 3620 | "webview2-com-macros", 3621 | "webview2-com-sys", 3622 | "windows 0.39.0", 3623 | "windows-implement", 3624 | ] 3625 | 3626 | [[package]] 3627 | name = "webview2-com-macros" 3628 | version = "0.6.0" 3629 | source = "registry+https://github.com/rust-lang/crates.io-index" 3630 | checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" 3631 | dependencies = [ 3632 | "proc-macro2", 3633 | "quote", 3634 | "syn", 3635 | ] 3636 | 3637 | [[package]] 3638 | name = "webview2-com-sys" 3639 | version = "0.19.0" 3640 | source = "registry+https://github.com/rust-lang/crates.io-index" 3641 | checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" 3642 | dependencies = [ 3643 | "regex", 3644 | "serde", 3645 | "serde_json", 3646 | "thiserror", 3647 | "windows 0.39.0", 3648 | "windows-bindgen", 3649 | "windows-metadata", 3650 | ] 3651 | 3652 | [[package]] 3653 | name = "winapi" 3654 | version = "0.3.9" 3655 | source = "registry+https://github.com/rust-lang/crates.io-index" 3656 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 3657 | dependencies = [ 3658 | "winapi-i686-pc-windows-gnu", 3659 | "winapi-x86_64-pc-windows-gnu", 3660 | ] 3661 | 3662 | [[package]] 3663 | name = "winapi-i686-pc-windows-gnu" 3664 | version = "0.4.0" 3665 | source = "registry+https://github.com/rust-lang/crates.io-index" 3666 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3667 | 3668 | [[package]] 3669 | name = "winapi-util" 3670 | version = "0.1.5" 3671 | source = "registry+https://github.com/rust-lang/crates.io-index" 3672 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 3673 | dependencies = [ 3674 | "winapi", 3675 | ] 3676 | 3677 | [[package]] 3678 | name = "winapi-x86_64-pc-windows-gnu" 3679 | version = "0.4.0" 3680 | source = "registry+https://github.com/rust-lang/crates.io-index" 3681 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3682 | 3683 | [[package]] 3684 | name = "windows" 3685 | version = "0.37.0" 3686 | source = "registry+https://github.com/rust-lang/crates.io-index" 3687 | checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" 3688 | dependencies = [ 3689 | "windows_aarch64_msvc 0.37.0", 3690 | "windows_i686_gnu 0.37.0", 3691 | "windows_i686_msvc 0.37.0", 3692 | "windows_x86_64_gnu 0.37.0", 3693 | "windows_x86_64_msvc 0.37.0", 3694 | ] 3695 | 3696 | [[package]] 3697 | name = "windows" 3698 | version = "0.39.0" 3699 | source = "registry+https://github.com/rust-lang/crates.io-index" 3700 | checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" 3701 | dependencies = [ 3702 | "windows-implement", 3703 | "windows_aarch64_msvc 0.39.0", 3704 | "windows_i686_gnu 0.39.0", 3705 | "windows_i686_msvc 0.39.0", 3706 | "windows_x86_64_gnu 0.39.0", 3707 | "windows_x86_64_msvc 0.39.0", 3708 | ] 3709 | 3710 | [[package]] 3711 | name = "windows-bindgen" 3712 | version = "0.39.0" 3713 | source = "registry+https://github.com/rust-lang/crates.io-index" 3714 | checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" 3715 | dependencies = [ 3716 | "windows-metadata", 3717 | "windows-tokens", 3718 | ] 3719 | 3720 | [[package]] 3721 | name = "windows-implement" 3722 | version = "0.39.0" 3723 | source = "registry+https://github.com/rust-lang/crates.io-index" 3724 | checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" 3725 | dependencies = [ 3726 | "syn", 3727 | "windows-tokens", 3728 | ] 3729 | 3730 | [[package]] 3731 | name = "windows-metadata" 3732 | version = "0.39.0" 3733 | source = "registry+https://github.com/rust-lang/crates.io-index" 3734 | checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" 3735 | 3736 | [[package]] 3737 | name = "windows-sys" 3738 | version = "0.42.0" 3739 | source = "registry+https://github.com/rust-lang/crates.io-index" 3740 | checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" 3741 | dependencies = [ 3742 | "windows_aarch64_gnullvm 0.42.1", 3743 | "windows_aarch64_msvc 0.42.1", 3744 | "windows_i686_gnu 0.42.1", 3745 | "windows_i686_msvc 0.42.1", 3746 | "windows_x86_64_gnu 0.42.1", 3747 | "windows_x86_64_gnullvm 0.42.1", 3748 | "windows_x86_64_msvc 0.42.1", 3749 | ] 3750 | 3751 | [[package]] 3752 | name = "windows-sys" 3753 | version = "0.45.0" 3754 | source = "registry+https://github.com/rust-lang/crates.io-index" 3755 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 3756 | dependencies = [ 3757 | "windows-targets 0.42.1", 3758 | ] 3759 | 3760 | [[package]] 3761 | name = "windows-sys" 3762 | version = "0.48.0" 3763 | source = "registry+https://github.com/rust-lang/crates.io-index" 3764 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 3765 | dependencies = [ 3766 | "windows-targets 0.48.5", 3767 | ] 3768 | 3769 | [[package]] 3770 | name = "windows-sys" 3771 | version = "0.52.0" 3772 | source = "registry+https://github.com/rust-lang/crates.io-index" 3773 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 3774 | dependencies = [ 3775 | "windows-targets 0.52.6", 3776 | ] 3777 | 3778 | [[package]] 3779 | name = "windows-targets" 3780 | version = "0.42.1" 3781 | source = "registry+https://github.com/rust-lang/crates.io-index" 3782 | checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" 3783 | dependencies = [ 3784 | "windows_aarch64_gnullvm 0.42.1", 3785 | "windows_aarch64_msvc 0.42.1", 3786 | "windows_i686_gnu 0.42.1", 3787 | "windows_i686_msvc 0.42.1", 3788 | "windows_x86_64_gnu 0.42.1", 3789 | "windows_x86_64_gnullvm 0.42.1", 3790 | "windows_x86_64_msvc 0.42.1", 3791 | ] 3792 | 3793 | [[package]] 3794 | name = "windows-targets" 3795 | version = "0.48.5" 3796 | source = "registry+https://github.com/rust-lang/crates.io-index" 3797 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 3798 | dependencies = [ 3799 | "windows_aarch64_gnullvm 0.48.5", 3800 | "windows_aarch64_msvc 0.48.5", 3801 | "windows_i686_gnu 0.48.5", 3802 | "windows_i686_msvc 0.48.5", 3803 | "windows_x86_64_gnu 0.48.5", 3804 | "windows_x86_64_gnullvm 0.48.5", 3805 | "windows_x86_64_msvc 0.48.5", 3806 | ] 3807 | 3808 | [[package]] 3809 | name = "windows-targets" 3810 | version = "0.52.6" 3811 | source = "registry+https://github.com/rust-lang/crates.io-index" 3812 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 3813 | dependencies = [ 3814 | "windows_aarch64_gnullvm 0.52.6", 3815 | "windows_aarch64_msvc 0.52.6", 3816 | "windows_i686_gnu 0.52.6", 3817 | "windows_i686_gnullvm", 3818 | "windows_i686_msvc 0.52.6", 3819 | "windows_x86_64_gnu 0.52.6", 3820 | "windows_x86_64_gnullvm 0.52.6", 3821 | "windows_x86_64_msvc 0.52.6", 3822 | ] 3823 | 3824 | [[package]] 3825 | name = "windows-tokens" 3826 | version = "0.39.0" 3827 | source = "registry+https://github.com/rust-lang/crates.io-index" 3828 | checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" 3829 | 3830 | [[package]] 3831 | name = "windows_aarch64_gnullvm" 3832 | version = "0.42.1" 3833 | source = "registry+https://github.com/rust-lang/crates.io-index" 3834 | checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" 3835 | 3836 | [[package]] 3837 | name = "windows_aarch64_gnullvm" 3838 | version = "0.48.5" 3839 | source = "registry+https://github.com/rust-lang/crates.io-index" 3840 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 3841 | 3842 | [[package]] 3843 | name = "windows_aarch64_gnullvm" 3844 | version = "0.52.6" 3845 | source = "registry+https://github.com/rust-lang/crates.io-index" 3846 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 3847 | 3848 | [[package]] 3849 | name = "windows_aarch64_msvc" 3850 | version = "0.37.0" 3851 | source = "registry+https://github.com/rust-lang/crates.io-index" 3852 | checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" 3853 | 3854 | [[package]] 3855 | name = "windows_aarch64_msvc" 3856 | version = "0.39.0" 3857 | source = "registry+https://github.com/rust-lang/crates.io-index" 3858 | checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" 3859 | 3860 | [[package]] 3861 | name = "windows_aarch64_msvc" 3862 | version = "0.42.1" 3863 | source = "registry+https://github.com/rust-lang/crates.io-index" 3864 | checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" 3865 | 3866 | [[package]] 3867 | name = "windows_aarch64_msvc" 3868 | version = "0.48.5" 3869 | source = "registry+https://github.com/rust-lang/crates.io-index" 3870 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 3871 | 3872 | [[package]] 3873 | name = "windows_aarch64_msvc" 3874 | version = "0.52.6" 3875 | source = "registry+https://github.com/rust-lang/crates.io-index" 3876 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 3877 | 3878 | [[package]] 3879 | name = "windows_i686_gnu" 3880 | version = "0.37.0" 3881 | source = "registry+https://github.com/rust-lang/crates.io-index" 3882 | checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" 3883 | 3884 | [[package]] 3885 | name = "windows_i686_gnu" 3886 | version = "0.39.0" 3887 | source = "registry+https://github.com/rust-lang/crates.io-index" 3888 | checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" 3889 | 3890 | [[package]] 3891 | name = "windows_i686_gnu" 3892 | version = "0.42.1" 3893 | source = "registry+https://github.com/rust-lang/crates.io-index" 3894 | checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" 3895 | 3896 | [[package]] 3897 | name = "windows_i686_gnu" 3898 | version = "0.48.5" 3899 | source = "registry+https://github.com/rust-lang/crates.io-index" 3900 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 3901 | 3902 | [[package]] 3903 | name = "windows_i686_gnu" 3904 | version = "0.52.6" 3905 | source = "registry+https://github.com/rust-lang/crates.io-index" 3906 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 3907 | 3908 | [[package]] 3909 | name = "windows_i686_gnullvm" 3910 | version = "0.52.6" 3911 | source = "registry+https://github.com/rust-lang/crates.io-index" 3912 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 3913 | 3914 | [[package]] 3915 | name = "windows_i686_msvc" 3916 | version = "0.37.0" 3917 | source = "registry+https://github.com/rust-lang/crates.io-index" 3918 | checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" 3919 | 3920 | [[package]] 3921 | name = "windows_i686_msvc" 3922 | version = "0.39.0" 3923 | source = "registry+https://github.com/rust-lang/crates.io-index" 3924 | checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" 3925 | 3926 | [[package]] 3927 | name = "windows_i686_msvc" 3928 | version = "0.42.1" 3929 | source = "registry+https://github.com/rust-lang/crates.io-index" 3930 | checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" 3931 | 3932 | [[package]] 3933 | name = "windows_i686_msvc" 3934 | version = "0.48.5" 3935 | source = "registry+https://github.com/rust-lang/crates.io-index" 3936 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 3937 | 3938 | [[package]] 3939 | name = "windows_i686_msvc" 3940 | version = "0.52.6" 3941 | source = "registry+https://github.com/rust-lang/crates.io-index" 3942 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 3943 | 3944 | [[package]] 3945 | name = "windows_x86_64_gnu" 3946 | version = "0.37.0" 3947 | source = "registry+https://github.com/rust-lang/crates.io-index" 3948 | checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" 3949 | 3950 | [[package]] 3951 | name = "windows_x86_64_gnu" 3952 | version = "0.39.0" 3953 | source = "registry+https://github.com/rust-lang/crates.io-index" 3954 | checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" 3955 | 3956 | [[package]] 3957 | name = "windows_x86_64_gnu" 3958 | version = "0.42.1" 3959 | source = "registry+https://github.com/rust-lang/crates.io-index" 3960 | checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" 3961 | 3962 | [[package]] 3963 | name = "windows_x86_64_gnu" 3964 | version = "0.48.5" 3965 | source = "registry+https://github.com/rust-lang/crates.io-index" 3966 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 3967 | 3968 | [[package]] 3969 | name = "windows_x86_64_gnu" 3970 | version = "0.52.6" 3971 | source = "registry+https://github.com/rust-lang/crates.io-index" 3972 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 3973 | 3974 | [[package]] 3975 | name = "windows_x86_64_gnullvm" 3976 | version = "0.42.1" 3977 | source = "registry+https://github.com/rust-lang/crates.io-index" 3978 | checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" 3979 | 3980 | [[package]] 3981 | name = "windows_x86_64_gnullvm" 3982 | version = "0.48.5" 3983 | source = "registry+https://github.com/rust-lang/crates.io-index" 3984 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 3985 | 3986 | [[package]] 3987 | name = "windows_x86_64_gnullvm" 3988 | version = "0.52.6" 3989 | source = "registry+https://github.com/rust-lang/crates.io-index" 3990 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 3991 | 3992 | [[package]] 3993 | name = "windows_x86_64_msvc" 3994 | version = "0.37.0" 3995 | source = "registry+https://github.com/rust-lang/crates.io-index" 3996 | checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" 3997 | 3998 | [[package]] 3999 | name = "windows_x86_64_msvc" 4000 | version = "0.39.0" 4001 | source = "registry+https://github.com/rust-lang/crates.io-index" 4002 | checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" 4003 | 4004 | [[package]] 4005 | name = "windows_x86_64_msvc" 4006 | version = "0.42.1" 4007 | source = "registry+https://github.com/rust-lang/crates.io-index" 4008 | checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" 4009 | 4010 | [[package]] 4011 | name = "windows_x86_64_msvc" 4012 | version = "0.48.5" 4013 | source = "registry+https://github.com/rust-lang/crates.io-index" 4014 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 4015 | 4016 | [[package]] 4017 | name = "windows_x86_64_msvc" 4018 | version = "0.52.6" 4019 | source = "registry+https://github.com/rust-lang/crates.io-index" 4020 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 4021 | 4022 | [[package]] 4023 | name = "winreg" 4024 | version = "0.10.1" 4025 | source = "registry+https://github.com/rust-lang/crates.io-index" 4026 | checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" 4027 | dependencies = [ 4028 | "winapi", 4029 | ] 4030 | 4031 | [[package]] 4032 | name = "winres" 4033 | version = "0.1.12" 4034 | source = "registry+https://github.com/rust-lang/crates.io-index" 4035 | checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c" 4036 | dependencies = [ 4037 | "toml", 4038 | ] 4039 | 4040 | [[package]] 4041 | name = "wry" 4042 | version = "0.23.4" 4043 | source = "registry+https://github.com/rust-lang/crates.io-index" 4044 | checksum = "4c1ad8e2424f554cc5bdebe8aa374ef5b433feff817aebabca0389961fc7ef98" 4045 | dependencies = [ 4046 | "base64 0.13.1", 4047 | "block", 4048 | "cocoa", 4049 | "core-graphics", 4050 | "crossbeam-channel", 4051 | "dunce", 4052 | "gdk", 4053 | "gio", 4054 | "glib", 4055 | "gtk", 4056 | "html5ever", 4057 | "http", 4058 | "kuchiki", 4059 | "libc", 4060 | "log", 4061 | "objc", 4062 | "objc_id", 4063 | "once_cell", 4064 | "serde", 4065 | "serde_json", 4066 | "sha2", 4067 | "soup2", 4068 | "tao", 4069 | "thiserror", 4070 | "url", 4071 | "webkit2gtk", 4072 | "webkit2gtk-sys", 4073 | "webview2-com", 4074 | "windows 0.39.0", 4075 | "windows-implement", 4076 | ] 4077 | 4078 | [[package]] 4079 | name = "x11" 4080 | version = "2.21.0" 4081 | source = "registry+https://github.com/rust-lang/crates.io-index" 4082 | checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" 4083 | dependencies = [ 4084 | "libc", 4085 | "pkg-config", 4086 | ] 4087 | 4088 | [[package]] 4089 | name = "x11-dl" 4090 | version = "2.21.0" 4091 | source = "registry+https://github.com/rust-lang/crates.io-index" 4092 | checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" 4093 | dependencies = [ 4094 | "libc", 4095 | "once_cell", 4096 | "pkg-config", 4097 | ] 4098 | 4099 | [[package]] 4100 | name = "xattr" 4101 | version = "0.2.3" 4102 | source = "registry+https://github.com/rust-lang/crates.io-index" 4103 | checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" 4104 | dependencies = [ 4105 | "libc", 4106 | ] 4107 | -------------------------------------------------------------------------------- /src-tauri/Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | 3 | [package] 4 | name = "proxy-checker" 5 | version = "0.1.1" 6 | description = "A Tauri App" 7 | authors = ["you"] 8 | license = "" 9 | repository = "" 10 | edition = "2021" 11 | rust-version = "1.57" 12 | 13 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 14 | 15 | [profile.release] 16 | panic = "abort" # Strip expensive panic clean-up logic 17 | codegen-units = 1 # Compile crates one after another so the compiler can optimize better 18 | lto = true # Enables link to optimizations 19 | opt-level = "z" # Optimize for binary size 20 | strip = true # Remove debug symbols 21 | 22 | [build-dependencies] 23 | tauri-build = { version = "1.2", features = [] } 24 | 25 | [workspace.dependencies] 26 | serde_json = "1.0" 27 | serde = { version = "1.0", features = ["derive"] } 28 | tokio = { version = "1.24.2", features = ["full"] } 29 | rayon = "1.6.1" 30 | 31 | [dependencies] 32 | checker-library = { path = "checker-library" } 33 | serde_json = "1.0" 34 | serde = { version = "1.0", features = ["derive"] } 35 | tauri = { version = "1.2", features = ["dialog-open", "dialog-save", "fs-read-file", "fs-write-file", "shell-open"] } 36 | tauri-plugin-store = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" } 37 | tokio = { version = "1.24.2", features = ["full"] } 38 | log = "0.4.17" 39 | env_logger = "0.10.0" 40 | rayon = "1.6.1" 41 | num_cpus = "1.15.0" 42 | uuid = { version = "1.2.2", features = ["v4", "fast-rng", "serde"] } 43 | 44 | [features] 45 | # by default Tauri runs in production mode 46 | # when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL 47 | default = ["custom-protocol"] 48 | # this feature is used used for production builds where `devPath` points to the filesystem 49 | # DO NOT remove this 50 | custom-protocol = ["tauri/custom-protocol"] 51 | -------------------------------------------------------------------------------- /src-tauri/build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | tauri_build::build() 3 | } 4 | -------------------------------------------------------------------------------- /src-tauri/checker-library/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "checker-library" 3 | version = "0.1.1" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | serde_json.workspace = true 10 | serde.workspace = true 11 | tokio.workspace = true 12 | rayon.workspace = true 13 | futures = "0.3.25" 14 | itertools = "0.10.5" 15 | regex = "1.7.1" 16 | reqwest = { version = "0.11.14", features = ["json", "socks"] } 17 | thiserror = "1.0.38" 18 | -------------------------------------------------------------------------------- /src-tauri/checker-library/src/error.rs: -------------------------------------------------------------------------------- 1 | use thiserror::Error; 2 | 3 | pub type Result = std::result::Result; 4 | 5 | #[derive(Error, Debug)] 6 | pub enum ProxyCheckerError { 7 | #[error("given invalid expression for Regex::new(re: &str)")] 8 | Regex(#[from] regex::Error), 9 | #[error("proxy '{proxy}' does not match pattern '{pattern}'")] 10 | RegexPatternMismatch { proxy: String, pattern: String }, 11 | #[error("ip is a required field for '{0}'")] 12 | RegexMissingIp(String), 13 | #[error("port is a required field for '{0}'")] 14 | RegexMissingPort(String), 15 | // Or just #[error(transparent)] 16 | #[error("request processing error: '{0}'")] 17 | Reqwest(#[from] reqwest::Error), 18 | } 19 | -------------------------------------------------------------------------------- /src-tauri/checker-library/src/lib.rs: -------------------------------------------------------------------------------- 1 | mod error; 2 | 3 | use error::{ProxyCheckerError, Result}; 4 | use itertools::Itertools; 5 | use rayon::prelude::*; 6 | use regex::Regex; 7 | use serde::Serialize; 8 | use tokio::sync::Semaphore; 9 | 10 | use std::fmt; 11 | use std::sync::{Arc, Mutex}; 12 | use std::time::{Duration, Instant}; 13 | 14 | #[derive(Clone, Serialize)] 15 | pub enum EventStatus { 16 | Success, 17 | Error, 18 | } 19 | 20 | #[derive(Clone)] 21 | #[cfg_attr(test, derive(Debug, PartialEq))] 22 | pub struct Proxy { 23 | // Perhaps it's better to make `protocol` as enum 24 | protocol: String, 25 | login: Option, 26 | password: Option, 27 | ip: String, 28 | port: String, 29 | pattern: String, 30 | } 31 | 32 | impl Proxy { 33 | fn new>( 34 | protocol: T, 35 | login: Option, 36 | password: Option, 37 | ip: T, 38 | port: T, 39 | pattern: T, 40 | ) -> Self { 41 | Self { 42 | protocol: protocol.into(), 43 | login: login.map(|l| l.into()), 44 | password: password.map(|p| p.into()), 45 | ip: ip.into(), 46 | port: port.into(), 47 | pattern: pattern.into(), 48 | } 49 | } 50 | 51 | fn protocol(&self) -> &str { 52 | &self.protocol 53 | } 54 | 55 | fn login(&self) -> Option<&str> { 56 | self.login.as_deref() 57 | } 58 | 59 | fn password(&self) -> Option<&str> { 60 | self.password.as_deref() 61 | } 62 | 63 | fn ip(&self) -> &str { 64 | &self.ip 65 | } 66 | 67 | fn port(&self) -> &str { 68 | &self.port 69 | } 70 | 71 | fn pattern(&self) -> &str { 72 | &self.pattern 73 | } 74 | 75 | fn from_string(pattern: &str, proxy: &str, default_protocol: &str) -> Result { 76 | // It might be better to throw `ProxyCheckerError::Regex` not in an event 77 | let re = Regex::new(&build_regex(pattern))?; 78 | let caps = re 79 | .captures(proxy) 80 | .ok_or(ProxyCheckerError::RegexPatternMismatch { 81 | proxy: proxy.to_owned(), 82 | pattern: pattern.to_owned(), 83 | })?; 84 | 85 | Ok(Self::new( 86 | caps.name("protocol") 87 | .map_or(default_protocol, |m| m.as_str()), 88 | caps.name("login").map(|m| m.as_str()), 89 | caps.name("password").map(|m| m.as_str()), 90 | caps.name("ip") 91 | .ok_or(ProxyCheckerError::RegexMissingIp(proxy.to_owned()))? 92 | .as_str(), 93 | caps.name("port") 94 | .ok_or(ProxyCheckerError::RegexMissingPort(proxy.to_owned()))? 95 | .as_str(), 96 | pattern, 97 | )) 98 | } 99 | 100 | fn get_reqwest_proxy(&self) -> Result { 101 | let mut proxy = reqwest::Proxy::all(format!( 102 | "{}://{}:{}", 103 | self.protocol(), 104 | self.ip(), 105 | self.port() 106 | ))?; 107 | 108 | if let (Some(login), Some(password)) = (self.login(), self.password()) { 109 | proxy = proxy.basic_auth(login, password); 110 | } 111 | 112 | Ok(proxy) 113 | } 114 | 115 | async fn send_request(self, url: &str, timeout: u64) -> Result { 116 | let proxy = self.get_reqwest_proxy()?; 117 | 118 | let client = reqwest::Client::builder() 119 | .proxy(proxy) 120 | .timeout(Duration::from_millis(timeout)) 121 | .build()?; 122 | 123 | let start = Instant::now(); 124 | 125 | client.get(url).send().await?; 126 | 127 | Ok(ProxyWithLatency::new(self, start.elapsed())) 128 | } 129 | } 130 | 131 | impl fmt::Display for Proxy { 132 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 133 | let string = self 134 | .pattern() 135 | .replace("protocol", self.protocol()) 136 | // It doesn't affect anything, but `unwrap_or_default` is not the best solution (match is better) 137 | .replace("login", self.login().unwrap_or_default()) 138 | .replace("password", self.password().unwrap_or_default()) 139 | .replace("ip", self.ip()) 140 | .replace("port", self.port()); 141 | write!(f, "{string}") 142 | } 143 | } 144 | 145 | struct ProxyWithLatency { 146 | proxy: Proxy, 147 | latancy: Duration, 148 | } 149 | 150 | impl ProxyWithLatency { 151 | fn new(proxy: Proxy, latancy: Duration) -> Self { 152 | Self { proxy, latancy } 153 | } 154 | } 155 | 156 | fn build_regex(pattern: &str) -> String { 157 | pattern 158 | .replace("protocol", r"(?P\w+)") 159 | .replace("login", r"(?P[^:@]+)") 160 | .replace("password", r"(?P[^:@]+)") 161 | .replace( 162 | "ip", 163 | r"(?P(?:\d{1,3}\.){3}\d{1,3}|(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,})", 164 | ) 165 | .replace("port", r"(?P\d+)") 166 | } 167 | 168 | pub fn parse_and_filter_proxies( 169 | proxies: String, 170 | pattern: String, 171 | default_protocol: String, 172 | event_handler: F, 173 | ) -> (Vec, usize) 174 | where 175 | F: Fn(EventStatus, String) + Sync, 176 | { 177 | let lines = proxies 178 | .trim() 179 | .lines() 180 | .map(str::trim) 181 | .unique() 182 | .collect::>(); 183 | 184 | let proxies = lines 185 | .into_par_iter() 186 | .filter_map(|proxy| { 187 | Proxy::from_string(&pattern, proxy, &default_protocol) 188 | .map_err(|e| event_handler(EventStatus::Error, format!("Error parsing proxy: {e}"))) 189 | .ok() 190 | }) 191 | .collect::>(); 192 | 193 | let length = proxies.len(); 194 | 195 | (proxies, length) 196 | } 197 | 198 | pub async fn check_proxies( 199 | proxies: Vec, 200 | url: String, 201 | timeout: u64, 202 | event_handler: F, 203 | threads: usize, 204 | ) -> Vec 205 | where 206 | F: Fn(EventStatus, String) + Send + 'static, 207 | { 208 | let event_handler = Arc::new(Mutex::new(event_handler)); 209 | let sem = Arc::new(Semaphore::new(threads)); 210 | let mut tasks = vec![]; 211 | 212 | for proxy in proxies { 213 | let permit = Arc::clone(&sem).acquire_owned().await; 214 | let proxy_string = proxy.to_string(); 215 | let url = url.clone(); 216 | let event_handler = event_handler.clone(); 217 | 218 | tasks.push(tokio::spawn(async move { 219 | let _permit = permit; 220 | 221 | match proxy.send_request(&url, timeout).await { 222 | Ok(proxy) => { 223 | event_handler.lock().unwrap()( 224 | EventStatus::Success, 225 | format!("Success: {proxy_string} ({} ms)", proxy.latancy.as_millis()), 226 | ); 227 | Ok(proxy) 228 | } 229 | Err(err) => { 230 | event_handler.lock().unwrap()( 231 | EventStatus::Error, 232 | format!("Error: {proxy_string} ({err})"), 233 | ); 234 | Err(err) 235 | } 236 | } 237 | })) 238 | } 239 | 240 | let result = futures::future::join_all(tasks).await; 241 | 242 | // This can be refactored 243 | result 244 | .into_iter() 245 | .filter_map(|join_result| match join_result { 246 | Ok(Ok(proxy)) => Some(proxy), 247 | _ => None, 248 | }) 249 | .sorted_by_key(|proxy| proxy.latancy) 250 | .map(|proxy| proxy.proxy.to_string()) 251 | .collect::>() 252 | } 253 | 254 | #[cfg(test)] 255 | mod tests { 256 | use super::*; 257 | 258 | fn setup() -> Vec { 259 | vec![ 260 | Proxy::new( 261 | "http", 262 | Some("test"), 263 | Some("test"), 264 | "1.1.1.1", 265 | "80", 266 | "protocol://login:password@ip:port", 267 | ), 268 | Proxy::new("http", None, None, "1.1.1.1", "80", "protocol://ip:port"), 269 | Proxy::new("socks5", None, None, "1.1.1.1", "80", "ip:port"), 270 | Proxy::new( 271 | "http", 272 | Some("test"), 273 | Some("test"), 274 | "example.com", 275 | "80", 276 | "ip:port:login:password", 277 | ), 278 | ] 279 | } 280 | 281 | #[test] 282 | fn test_proxy_new() { 283 | let proxies = setup(); 284 | 285 | let expected_proxy0 = Proxy { 286 | protocol: "http".to_owned(), 287 | login: Some("test".to_owned()), 288 | password: Some("test".to_owned()), 289 | ip: "1.1.1.1".to_owned(), 290 | port: "80".to_owned(), 291 | pattern: "protocol://login:password@ip:port".to_owned(), 292 | }; 293 | 294 | assert_eq!(proxies[0], expected_proxy0); 295 | 296 | let expected_proxy1 = Proxy { 297 | protocol: "http".to_owned(), 298 | login: None, 299 | password: None, 300 | ip: "1.1.1.1".to_owned(), 301 | port: "80".to_owned(), 302 | pattern: "protocol://ip:port".to_owned(), 303 | }; 304 | 305 | assert_eq!(proxies[1], expected_proxy1); 306 | 307 | let expected_proxy2 = Proxy { 308 | protocol: "socks5".to_owned(), 309 | login: None, 310 | password: None, 311 | ip: "1.1.1.1".to_owned(), 312 | port: "80".to_owned(), 313 | pattern: "ip:port".to_owned(), 314 | }; 315 | 316 | assert_eq!(proxies[2], expected_proxy2); 317 | 318 | let expected_proxy3 = Proxy { 319 | protocol: "http".to_owned(), 320 | login: Some("test".to_owned()), 321 | password: Some("test".to_owned()), 322 | ip: "example.com".to_owned(), 323 | port: "80".to_owned(), 324 | pattern: "ip:port:login:password".to_owned(), 325 | }; 326 | 327 | assert_eq!(proxies[3], expected_proxy3); 328 | } 329 | 330 | #[test] 331 | fn test_proxy_from_string() { 332 | let proxies = setup(); 333 | 334 | let test_cases = vec![ 335 | ( 336 | "protocol://login:password@ip:port", 337 | "http://test:test@1.1.1.1:80", 338 | "http", 339 | proxies[0].clone(), 340 | ), 341 | ( 342 | "protocol://ip:port", 343 | "http://1.1.1.1:80", 344 | "http", 345 | proxies[1].clone(), 346 | ), 347 | ("ip:port", "1.1.1.1:80", "socks5", proxies[2].clone()), 348 | ( 349 | "ip:port:login:password", 350 | "example.com:80:test:test", 351 | "http", 352 | proxies[3].clone(), 353 | ), 354 | ]; 355 | 356 | for (pattern, proxy_string, default_protocol, expected_proxy) in test_cases { 357 | let proxy = Proxy::from_string(pattern, proxy_string, default_protocol).unwrap(); 358 | assert_eq!(proxy, expected_proxy); 359 | } 360 | } 361 | 362 | #[test] 363 | fn test_proxy_to_string() { 364 | let proxies = setup(); 365 | let expected = vec![ 366 | "http://test:test@1.1.1.1:80", 367 | "http://1.1.1.1:80", 368 | "1.1.1.1:80", 369 | "example.com:80:test:test", 370 | ]; 371 | 372 | for (proxy, expected) in proxies.into_iter().zip(expected.into_iter()) { 373 | assert_eq!(proxy.to_string(), *expected); 374 | } 375 | } 376 | 377 | fn emit_new_log_event(status: EventStatus, message: String) { 378 | match status { 379 | EventStatus::Success => println!("{}", message), 380 | EventStatus::Error => eprintln!("{}", message), 381 | }; 382 | } 383 | 384 | #[test] 385 | fn test_parse_and_filter_proxies() { 386 | let proxies = "1.1.1.1:80\n2.2.2.2:80".to_owned(); 387 | let pattern = "ip:port".to_owned(); 388 | let default_protocol = "http".to_owned(); 389 | 390 | let (proxies, length) = 391 | parse_and_filter_proxies(proxies, pattern, default_protocol, emit_new_log_event); 392 | 393 | let expected_proxy0 = Proxy::new("http", None, None, "1.1.1.1", "80", "ip:port"); 394 | let expected_proxy1 = Proxy::new("http", None, None, "2.2.2.2", "80", "ip:port"); 395 | 396 | assert_eq!(proxies[0], expected_proxy0); 397 | assert_eq!(proxies[1], expected_proxy1); 398 | assert_eq!(length, 2); 399 | } 400 | 401 | #[tokio::test] 402 | async fn test_check_proxies() { 403 | let proxies = setup().into_iter().take(3).collect::>(); 404 | let url = "http://example.com".to_owned(); 405 | let timeout = 5000; 406 | let threads = 250; 407 | 408 | let results = check_proxies(proxies, url, timeout, emit_new_log_event, threads).await; 409 | 410 | assert_eq!(results.len(), 2); 411 | } 412 | } 413 | -------------------------------------------------------------------------------- /src-tauri/icons/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/src-tauri/icons/128x128.png -------------------------------------------------------------------------------- /src-tauri/icons/128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/src-tauri/icons/128x128@2x.png -------------------------------------------------------------------------------- /src-tauri/icons/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/src-tauri/icons/32x32.png -------------------------------------------------------------------------------- /src-tauri/icons/Square107x107Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/src-tauri/icons/Square107x107Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square142x142Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/src-tauri/icons/Square142x142Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square150x150Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/src-tauri/icons/Square150x150Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square284x284Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/src-tauri/icons/Square284x284Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square30x30Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/src-tauri/icons/Square30x30Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square310x310Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/src-tauri/icons/Square310x310Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square44x44Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/src-tauri/icons/Square44x44Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square71x71Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/src-tauri/icons/Square71x71Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square89x89Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/src-tauri/icons/Square89x89Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/src-tauri/icons/StoreLogo.png -------------------------------------------------------------------------------- /src-tauri/icons/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/src-tauri/icons/icon.icns -------------------------------------------------------------------------------- /src-tauri/icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/src-tauri/icons/icon.ico -------------------------------------------------------------------------------- /src-tauri/icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/src-tauri/icons/icon.png -------------------------------------------------------------------------------- /src-tauri/src/main.rs: -------------------------------------------------------------------------------- 1 | #![cfg_attr( 2 | all(not(debug_assertions), target_os = "windows"), 3 | windows_subsystem = "windows" 4 | )] 5 | 6 | use checker_library::{check_proxies, parse_and_filter_proxies, EventStatus, Proxy}; 7 | use log::{error, info}; 8 | use serde::Serialize; 9 | use uuid::Uuid; 10 | 11 | use std::cmp; 12 | use std::sync::{Arc, Mutex}; 13 | 14 | #[derive(Clone, Serialize)] 15 | struct LogPayload { 16 | key: Uuid, 17 | status: EventStatus, 18 | message: String, 19 | } 20 | 21 | impl LogPayload { 22 | fn new(status: EventStatus, message: String) -> Self { 23 | Self { 24 | key: Uuid::new_v4(), 25 | status, 26 | message, 27 | } 28 | } 29 | } 30 | 31 | struct Proxies(Arc>>); 32 | struct WorkingProxies(Mutex>); 33 | 34 | #[tauri::command] 35 | fn parse_and_filter_proxies_command( 36 | window: tauri::Window, 37 | state: tauri::State, 38 | proxies: String, 39 | pattern: String, 40 | default_protocol: String, 41 | ) -> usize { 42 | let (proxies, length) = 43 | parse_and_filter_proxies(proxies, pattern, default_protocol, |status, message| { 44 | emit_new_log_event(&window, status, message); 45 | }); 46 | 47 | *state.0.lock().unwrap() = proxies; 48 | 49 | length 50 | } 51 | 52 | #[tauri::command] 53 | async fn check_proxies_command( 54 | window: tauri::Window, 55 | state: tauri::State<'_, Proxies>, 56 | success: tauri::State<'_, WorkingProxies>, 57 | url: String, 58 | timeout: u64, 59 | threads: usize, 60 | ) -> Result<(), ()> { 61 | let proxies = state.0.lock().unwrap().to_vec(); 62 | 63 | let result = check_proxies(proxies, url, timeout, move |status, message| { 64 | emit_new_log_event(&window, status, message); 65 | }, threads) 66 | .await; 67 | 68 | *success.0.lock().unwrap() = result; 69 | 70 | Ok(()) 71 | } 72 | 73 | fn emit_new_log_event(window: &tauri::Window, status: EventStatus, message: String) { 74 | match status { 75 | EventStatus::Success => info!("{}", message), 76 | EventStatus::Error => error!("{}", message), 77 | }; 78 | 79 | if let Err(err) = window.emit("new-log", Some(LogPayload::new(status, message))) { 80 | error!("Error emitting new-log event: {}", err) 81 | } 82 | } 83 | 84 | #[tauri::command] 85 | async fn download_proxies_command(success: tauri::State<'_, WorkingProxies>) -> Result { 86 | let proxies = success.0.lock().unwrap(); 87 | let proxies = proxies.join("\n"); 88 | 89 | Ok(proxies) 90 | } 91 | 92 | fn main() { 93 | env_logger::init(); 94 | // Half of the threads are used to reduce the CPU load 95 | let num_threads = cmp::max(1, num_cpus::get() / 2); 96 | 97 | rayon::ThreadPoolBuilder::new() 98 | .num_threads(num_threads) 99 | .build_global() 100 | .unwrap(); 101 | 102 | tauri::Builder::default() 103 | .manage(Proxies(Arc::new(Mutex::new(Vec::new())))) 104 | .manage(WorkingProxies(Mutex::new(Vec::new()))) 105 | .invoke_handler(tauri::generate_handler![ 106 | parse_and_filter_proxies_command, 107 | check_proxies_command, 108 | download_proxies_command, 109 | ]) 110 | .plugin(tauri_plugin_store::Builder::default().build()) 111 | .run(tauri::generate_context!()) 112 | .expect("error while running tauri application"); 113 | } 114 | -------------------------------------------------------------------------------- /src-tauri/tauri.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": { 3 | "beforeDevCommand": "npm run dev", 4 | "beforeBuildCommand": "npm run build", 5 | "devPath": "http://localhost:1420", 6 | "distDir": "../dist" 7 | }, 8 | "package": { 9 | "productName": "proxy-checker", 10 | "version": "0.1.1" 11 | }, 12 | "tauri": { 13 | "allowlist": { 14 | "all": false, 15 | "dialog": { 16 | "open": true, 17 | "save": true 18 | }, 19 | "fs": { 20 | "readFile": true, 21 | "writeFile": true 22 | }, 23 | "shell": { 24 | "open": "^https://github.com/" 25 | } 26 | }, 27 | "bundle": { 28 | "active": true, 29 | "category": "DeveloperTool", 30 | "copyright": "", 31 | "deb": { 32 | "depends": [] 33 | }, 34 | "externalBin": [], 35 | "icon": [ 36 | "icons/32x32.png", 37 | "icons/128x128.png", 38 | "icons/128x128@2x.png", 39 | "icons/icon.icns", 40 | "icons/icon.ico" 41 | ], 42 | "identifier": "proxy-checker", 43 | "longDescription": "", 44 | "macOS": { 45 | "entitlements": null, 46 | "exceptionDomain": "", 47 | "frameworks": [], 48 | "providerShortName": null, 49 | "signingIdentity": null 50 | }, 51 | "resources": [], 52 | "shortDescription": "", 53 | "targets": "all", 54 | "windows": { 55 | "certificateThumbprint": null, 56 | "digestAlgorithm": "sha256", 57 | "timestampUrl": "" 58 | } 59 | }, 60 | "security": { 61 | "csp": null 62 | }, 63 | "updater": { 64 | "active": false 65 | }, 66 | "windows": [ 67 | { 68 | "fullscreen": false, 69 | "height": 720, 70 | "resizable": true, 71 | "title": "Proxy Checker", 72 | "width": 1280 73 | } 74 | ] 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import { Grid } from '@mantine/core'; 2 | import Wrapper from './components/Wrapper'; 3 | import Shell from './components/Shell'; 4 | import ProxiesCard from './components/ProxiesCard'; 5 | import Stats from './components/Stats'; 6 | import Logs from './components/Logs'; 7 | import { ProxiesState } from './context/ProxiesContext'; 8 | 9 | function App() { 10 | return ( 11 | 12 | 13 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | ); 32 | } 33 | 34 | export default App; 35 | -------------------------------------------------------------------------------- /src/assets/dark-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/src/assets/dark-bg.jpg -------------------------------------------------------------------------------- /src/assets/light-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quertc/ProxyChecker/26b0626e7298ef3eb68a50a3f92ecdf478c52f07/src/assets/light-bg.jpg -------------------------------------------------------------------------------- /src/components/CheckButton.tsx: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | import { Button } from '@mantine/core'; 3 | import { invoke } from '@tauri-apps/api/tauri'; 4 | import { ProxiesContext } from '../context/ProxiesContext'; 5 | 6 | function CheckButton() { 7 | const { url, timeout, threads, path, total, isCheckLoading, isDownloadLoading, setWork, setLogs, setIsDownloadLoading } = useContext(ProxiesContext); 8 | 9 | // Move this to the hook (for other components too) 10 | async function checkProxies() { 11 | try { 12 | setIsDownloadLoading(true); 13 | setWork(0); 14 | setLogs([]); 15 | await invoke('check_proxies_command', { url, timeout, threads }); 16 | setIsDownloadLoading(false); 17 | } catch (e) { 18 | console.error(e); 19 | setIsDownloadLoading(false); 20 | } 21 | } 22 | 23 | return ( 24 | 34 | ); 35 | } 36 | 37 | export default CheckButton; 38 | -------------------------------------------------------------------------------- /src/components/DefaultProtocolSelect.tsx: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | import { MantineNumberSize, Select } from '@mantine/core'; 3 | import { IconShieldLock, IconChevronDown } from '@tabler/icons-react'; 4 | import { ProxiesContext } from '../context/ProxiesContext'; 5 | 6 | interface DefaultProtocolSelectProps { 7 | mt: MantineNumberSize; 8 | } 9 | 10 | function DefaultProtocolSelect({ mt }: DefaultProtocolSelectProps) { 11 | const { pattern, defaultProtocol, setDefaultProtocol } = useContext(ProxiesContext); 12 | 13 | const data = [ 14 | { label: 'Http', value: 'http' }, 15 | { label: 'Https', value: 'https' }, 16 | { label: 'Socks4 (currently not supported)', value: 'socks4', disabled: true }, 17 | { label: 'Socks5', value: 'socks5' }, 18 | ]; 19 | 20 | return ( 21 | } 24 | styles={{ 25 | input: { 26 | lineHeight: 'normal', 27 | }, 28 | }} 29 | onClick={selectFile} 30 | > 31 | ({ 32 | color: getColor(theme), 33 | })} 34 | > 35 | {isError ? 'Error during file selection' : path || 'Select .txt file with proxies'} 36 | 37 | 38 | ); 39 | } 40 | 41 | export default FileSelect; 42 | -------------------------------------------------------------------------------- /src/components/Log.tsx: -------------------------------------------------------------------------------- 1 | import { Text, Code } from '@mantine/core'; 2 | import { LogPayload } from '../hooks/useLogs'; 3 | 4 | function Log({ status, message }: LogPayload) { 5 | return ( 6 | 7 | $ 8 | {' '} 9 | {message} 10 | 11 | ); 12 | } 13 | 14 | export default Log; 15 | -------------------------------------------------------------------------------- /src/components/Logs.tsx: -------------------------------------------------------------------------------- 1 | import { useRef, useEffect } from 'react'; 2 | import { Card, Divider, Text } from '@mantine/core'; 3 | import { useLogs } from '../hooks/useLogs'; 4 | import Log from './Log'; 5 | 6 | function Logs() { 7 | const { logs, isError } = useLogs(); 8 | const cardRef = useRef(null); 9 | const bottomRef = useRef(null); 10 | 11 | const scrollToBottom = () => { 12 | if (cardRef.current && bottomRef.current) { 13 | const { scrollHeight, clientHeight } = cardRef.current; 14 | if (scrollHeight > clientHeight) { 15 | bottomRef.current.scrollIntoView({ behavior: 'smooth' }); 16 | } 17 | } 18 | }; 19 | 20 | useEffect(() => { 21 | scrollToBottom(); 22 | }, [logs]); 23 | 24 | return ( 25 | 33 | Logs} /> 34 | {logs.length === 0 && !isError && No logs yet} 35 | {isError && Error listening to new-log event} 36 | {logs.map(log => ( 37 | 38 | ))} 39 |
40 | 41 | ); 42 | } 43 | 44 | export default Logs; 45 | -------------------------------------------------------------------------------- /src/components/PatternInput.tsx: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | import { TextInput, Tooltip } from '@mantine/core'; 3 | import { IconGrain, IconAlertCircle } from '@tabler/icons-react'; 4 | import { ProxiesContext } from '../context/ProxiesContext'; 5 | 6 | function PatternInput() { 7 | const { pattern, setPattern } = useContext(ProxiesContext); 8 | 9 | return ( 10 | setPattern(event.currentTarget.value)} 16 | icon={} 17 | error={!pattern ? 'Pattern is required' : undefined} 18 | rightSection={( 19 | 27 |
28 | 29 |
30 |
31 | )} 32 | /> 33 | ); 34 | } 35 | 36 | export default PatternInput; 37 | -------------------------------------------------------------------------------- /src/components/ProxiesCard.tsx: -------------------------------------------------------------------------------- 1 | import { MantineNumberSize, Paper, SimpleGrid } from '@mantine/core'; 2 | import FileSelect from './FileSelect'; 3 | import SettingsModal from './SettingsModal'; 4 | import CheckButton from './CheckButton'; 5 | 6 | interface ProxiesCardProps { 7 | mb: MantineNumberSize; 8 | } 9 | 10 | function ProxiesCard({ mb }: ProxiesCardProps) { 11 | return ( 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | ); 20 | } 21 | 22 | export default ProxiesCard; 23 | -------------------------------------------------------------------------------- /src/components/SettingsModal.tsx: -------------------------------------------------------------------------------- 1 | import { useContext, useState } from 'react'; 2 | import { useMantineTheme, Modal, Button } from '@mantine/core'; 3 | import { ProxiesContext } from '../context/ProxiesContext'; 4 | import settings from '../store/settings'; 5 | import PatternInput from './PatternInput'; 6 | import DefaultProtocolSelect from './DefaultProtocolSelect'; 7 | import UrlInput from './UrlInput'; 8 | import TimeoutInput from './TimeoutInput'; 9 | import ThreadsInput from './ThreadsInput'; 10 | 11 | function SettingsModal() { 12 | const [opened, setOpened] = useState(false); 13 | const { pattern, defaultProtocol, url, timeout } = useContext(ProxiesContext); 14 | const theme = useMantineTheme(); 15 | 16 | async function saveSettings() { 17 | try { 18 | await settings.set('proxies-settings', { 19 | pattern, 20 | defaultProtocol, 21 | url, 22 | timeout, 23 | }); 24 | 25 | setOpened(false); 26 | } catch (e) { 27 | console.error(e); 28 | } 29 | } 30 | 31 | return ( 32 | <> 33 | setOpened(false)} 37 | centered 38 | shadow="md" 39 | overlayColor={theme.colorScheme === 'dark' ? theme.colors.dark[9] : theme.colors.gray[2]} 40 | overlayOpacity={0.6} 41 | overlayBlur={3} 42 | > 43 | 44 | 45 | 46 | 47 | 48 | 58 | 59 | 60 | 61 | 62 | ); 63 | } 64 | 65 | export default SettingsModal; 66 | -------------------------------------------------------------------------------- /src/components/Shell.tsx: -------------------------------------------------------------------------------- 1 | import { useMantineColorScheme, AppShell, Header, Group, Button, ActionIcon } from '@mantine/core'; 2 | import { IconBrandGithub, IconSun, IconMoonStars } from '@tabler/icons-react'; 3 | import PackageJson from '../../package.json'; 4 | import DarkBg from '../assets/dark-bg.jpg'; 5 | import LightBg from '../assets/light-bg.jpg'; 6 | 7 | interface ShellProps { 8 | children: React.ReactNode; 9 | } 10 | 11 | function Shell({ children }: ShellProps) { 12 | const colorSchemeContext = useMantineColorScheme(); 13 | const appName = `ProxyChecker v${PackageJson.version}`; 14 | 15 | return ( 16 | 20 | 21 | 24 | colorSchemeContext.toggleColorScheme()} 26 | variant="default" 27 | size="lg" 28 | sx={theme => ({ 29 | backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[0], 30 | color: theme.colorScheme === 'dark' ? theme.colors.yellow[4] : theme.colors.blue[6], 31 | })} 32 | > 33 | {colorSchemeContext.colorScheme === 'dark' ? : } 34 | 35 | 36 | 37 | )} 38 | styles={theme => ({ 39 | body: { 40 | backgroundImage: `url(${theme.colorScheme === 'dark' ? DarkBg : LightBg})`, 41 | backgroundPosition: 'center', 42 | backgroundSize: 'cover', 43 | backgroundRepeat: 'no-repeat', 44 | minWidth: '100vw', 45 | minHeight: '100vh', 46 | }, 47 | })} 48 | > 49 | {children} 50 | 51 | ); 52 | } 53 | 54 | export default Shell; 55 | -------------------------------------------------------------------------------- /src/components/Stats.tsx: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | import { Paper, Text, Progress } from '@mantine/core'; 3 | import { ProxiesContext } from '../context/ProxiesContext'; 4 | import DownloadButton from './DownloadButton'; 5 | 6 | function Stats() { 7 | const { total, work } = useContext(ProxiesContext); 8 | 9 | const getPercentage = () => (work / total) * 100; 10 | 11 | const getColor = () => { 12 | const percentage = getPercentage() || 0; 13 | 14 | if (percentage < 20) return 'red'; 15 | if (percentage < 40) return 'orange'; 16 | if (percentage < 60) return 'yellow'; 17 | if (percentage < 80) return 'teal'; 18 | 19 | return 'green'; 20 | }; 21 | 22 | return ( 23 | 24 | 25 | Working proxies 26 | 27 | 28 | {work} 29 | {' / '} 30 | {total} 31 | 32 | 33 | 34 | 35 | ); 36 | } 37 | 38 | export default Stats; 39 | -------------------------------------------------------------------------------- /src/components/ThreadsInput.tsx: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | import { MantineNumberSize, NumberInput } from '@mantine/core'; 3 | import { IconCpu } from '@tabler/icons-react'; 4 | import { ProxiesContext } from '../context/ProxiesContext'; 5 | 6 | interface DefaultProtocolSelectProps { 7 | mt: MantineNumberSize; 8 | } 9 | 10 | function ThreadsInput({ mt }: DefaultProtocolSelectProps) { 11 | const { threads, setThreads } = useContext(ProxiesContext); 12 | 13 | return ( 14 | } 22 | withAsterisk 23 | mt={mt} 24 | error={!threads ? 'Threads is required' : undefined} 25 | /> 26 | ); 27 | } 28 | 29 | export default ThreadsInput; 30 | -------------------------------------------------------------------------------- /src/components/TimeoutInput.tsx: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | import { MantineNumberSize, NumberInput } from '@mantine/core'; 3 | import { IconClock } from '@tabler/icons-react'; 4 | import { ProxiesContext } from '../context/ProxiesContext'; 5 | 6 | interface DefaultProtocolSelectProps { 7 | mt: MantineNumberSize; 8 | } 9 | 10 | function TimeoutInput({ mt }: DefaultProtocolSelectProps) { 11 | const { timeout, setTimeout } = useContext(ProxiesContext); 12 | 13 | return ( 14 | } 23 | withAsterisk 24 | mt={mt} 25 | error={!timeout ? 'Timeout is required' : undefined} 26 | /> 27 | ); 28 | } 29 | 30 | export default TimeoutInput; 31 | -------------------------------------------------------------------------------- /src/components/UrlInput.tsx: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | import { MantineNumberSize, TextInput } from '@mantine/core'; 3 | import { IconLink } from '@tabler/icons-react'; 4 | import { ProxiesContext } from '../context/ProxiesContext'; 5 | 6 | interface DefaultProtocolSelectProps { 7 | mt: MantineNumberSize; 8 | } 9 | 10 | function UrlInput({ mt }: DefaultProtocolSelectProps) { 11 | const { url, setUrl } = useContext(ProxiesContext); 12 | 13 | return ( 14 | setUrl(event.currentTarget.value)} 20 | icon={} 21 | mt={mt} 22 | error={!url ? 'Request url is required' : undefined} 23 | /> 24 | ); 25 | } 26 | 27 | export default UrlInput; 28 | -------------------------------------------------------------------------------- /src/components/Wrapper.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from 'react'; 2 | import { ColorScheme, ColorSchemeProvider, MantineProvider } from '@mantine/core'; 3 | import store from '../store/settings'; 4 | 5 | interface WrapperProps { 6 | children: React.ReactNode; 7 | } 8 | 9 | interface ConfigStore { 10 | theme: string; 11 | } 12 | 13 | function Wrapper({ children }: WrapperProps) { 14 | const [colorScheme, setColorScheme] = useState('dark'); 15 | 16 | const toggleColorScheme = async (value?: ColorScheme) => { 17 | try { 18 | const theme = value || (colorScheme === 'dark' ? 'light' : 'dark'); 19 | await store.set('config', { theme }); 20 | setColorScheme(theme); 21 | } catch (e) { 22 | console.error(e); 23 | } 24 | }; 25 | 26 | function getConfigValues(): Promise { 27 | return store.get('config'); 28 | } 29 | 30 | useEffect(() => { 31 | getConfigValues() 32 | .then(config => { 33 | if (config) { 34 | setColorScheme(config.theme as ColorScheme); 35 | } 36 | }) 37 | .catch(err => console.error(err)); 38 | }, []); 39 | 40 | return ( 41 | 42 | 43 | {children} 44 | 45 | 46 | ); 47 | } 48 | 49 | export default Wrapper; 50 | -------------------------------------------------------------------------------- /src/context/ProxiesContext.tsx: -------------------------------------------------------------------------------- 1 | import { createContext, useState, useEffect, useMemo } from 'react'; 2 | import store from '../store/settings'; 3 | 4 | interface ProxiesContextProps { 5 | pattern: string; 6 | defaultProtocol: DefaultProtocolOrNull; 7 | url: string; 8 | timeout: number; 9 | threads: number; 10 | path: string; 11 | total: number; 12 | work: number; 13 | logs: LogPayload[]; 14 | isCheckLoading: boolean, 15 | isDownloadLoading: boolean, 16 | setPattern: (pattern: string) => void; 17 | setDefaultProtocol: (defaultProtocol: DefaultProtocol) => void; 18 | setUrl: (url: string) => void; 19 | setTimeout: (timeout: number) => void; 20 | setThreads: (threads: number) => void; 21 | setPath: (path: string) => void; 22 | setTotal: (total: number) => void; 23 | setWork: React.Dispatch>; 24 | setLogs: React.Dispatch>; 25 | setIsCheckLoading: (isCheckLoading: boolean) => void; 26 | setIsDownloadLoading: (isDownloadLoading: boolean) => void; 27 | } 28 | 29 | export interface LogPayload { 30 | key: string, 31 | status: 'Success' | 'Error'; 32 | message: string; 33 | } 34 | 35 | export type DefaultProtocol = 'http' | 'https' | 'socks4' | 'socks5'; 36 | type DefaultProtocolOrNull = DefaultProtocol | null; 37 | 38 | export const ProxiesContext = createContext({} as ProxiesContextProps); 39 | 40 | interface ProxiesSettingsStore { 41 | pattern: string; 42 | defaultProtocol: DefaultProtocol; 43 | url: string; 44 | timeout: number; 45 | threads: number; 46 | } 47 | 48 | interface ProxiesStateProps { 49 | children: React.ReactNode; 50 | } 51 | 52 | export function ProxiesState({ children }: ProxiesStateProps) { 53 | const [pattern, setPattern] = useState(''); 54 | const [defaultProtocol, setDefaultProtocol] = useState(null); 55 | const [url, setUrl] = useState(''); 56 | const [timeout, setTimeout] = useState(0); 57 | const [threads, setThreads] = useState(0); 58 | const [path, setPath] = useState(''); 59 | const [total, setTotal] = useState(0); 60 | const [work, setWork] = useState(0); 61 | const [logs, setLogs] = useState([]); 62 | const [isCheckLoading, setIsCheckLoading] = useState(false); 63 | const [isDownloadLoading, setIsDownloadLoading] = useState(false); 64 | 65 | function getSettingsValues(): Promise { 66 | return store.get('proxies-settings'); 67 | } 68 | 69 | useEffect(() => { 70 | getSettingsValues() 71 | .then(settings => { 72 | setPattern(settings?.pattern ?? 'protocol://login:password@ip:port'); 73 | setDefaultProtocol(settings?.defaultProtocol ?? 'http'); 74 | setUrl(settings?.url ?? 'https://api.ipify.org/'); 75 | setTimeout(settings?.timeout ?? 10000); 76 | setThreads(settings?.threads ?? 500); 77 | }) 78 | .catch(console.error); 79 | }, []); 80 | 81 | const value = useMemo(() => ({ 82 | pattern, 83 | defaultProtocol, 84 | url, 85 | timeout, 86 | threads, 87 | path, 88 | total, 89 | work, 90 | logs, 91 | isCheckLoading, 92 | isDownloadLoading, 93 | setPattern, 94 | setDefaultProtocol, 95 | setUrl, 96 | setTimeout, 97 | setThreads, 98 | setPath, 99 | setTotal, 100 | setWork, 101 | setLogs, 102 | setIsCheckLoading, 103 | setIsDownloadLoading, 104 | }), [pattern, defaultProtocol, url, timeout, threads, path, total, work, logs, isCheckLoading, isDownloadLoading]); 105 | 106 | return ( 107 | 108 | {children} 109 | 110 | ); 111 | } 112 | -------------------------------------------------------------------------------- /src/hooks/useFileSelect.ts: -------------------------------------------------------------------------------- 1 | import { useContext, useState } from 'react'; 2 | import { open } from '@tauri-apps/api/dialog'; 3 | import { readTextFile } from '@tauri-apps/api/fs'; 4 | import { invoke } from '@tauri-apps/api/tauri'; 5 | import { ProxiesContext } from '../context/ProxiesContext'; 6 | 7 | function useFileSelect() { 8 | const { pattern, defaultProtocol, path, setPath, setTotal, setWork, setLogs, setIsCheckLoading } = useContext(ProxiesContext); 9 | const [isError, setIsError] = useState(false); 10 | 11 | async function selectFile() { 12 | try { 13 | const selected = await open({ 14 | title: 'Select text file with proxies', 15 | filters: [{ 16 | name: 'Text', 17 | extensions: ['txt'], 18 | }], 19 | }); 20 | 21 | if (selected !== null && !Array.isArray(selected)) { 22 | setIsCheckLoading(true); 23 | setPath(selected); 24 | const proxies = await readTextFile(selected); 25 | const total = await invoke('parse_and_filter_proxies_command', { proxies, pattern, defaultProtocol }); 26 | setTotal(total); 27 | setWork(0); 28 | setLogs([]); 29 | setIsCheckLoading(false); 30 | } 31 | } catch (e) { 32 | setIsError(true); 33 | setIsCheckLoading(false); 34 | } 35 | } 36 | 37 | return { selectFile, path, isError }; 38 | } 39 | 40 | export default useFileSelect; 41 | -------------------------------------------------------------------------------- /src/hooks/useLogs.ts: -------------------------------------------------------------------------------- 1 | import { useContext, useState, useEffect } from 'react'; 2 | import { listen } from '@tauri-apps/api/event'; 3 | import { LogPayload as ContextLogPayload, ProxiesContext } from '../context/ProxiesContext'; 4 | 5 | export type LogPayload = ContextLogPayload; 6 | 7 | export function useLogs() { 8 | const { logs, setWork, setLogs } = useContext(ProxiesContext); 9 | const [isError, setIsError] = useState(false); 10 | 11 | useEffect(() => { 12 | async function handleLog() { 13 | await listen('new-log', ({ payload }) => { 14 | setLogs(prev => [...prev, payload]); 15 | 16 | if (payload.status === 'Success') { 17 | setWork((prev: number) => prev + 1); 18 | } 19 | }); 20 | } 21 | 22 | handleLog().catch(() => setIsError(true)); 23 | }, [setWork, setLogs]); 24 | 25 | // Maybe it's better to stop listening to the event when the component is unmounted 26 | 27 | return { logs, isError }; 28 | } 29 | -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import ReactDOM from 'react-dom/client'; 2 | import App from './App'; 3 | 4 | ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( 5 | , 6 | ); 7 | -------------------------------------------------------------------------------- /src/store/settings.ts: -------------------------------------------------------------------------------- 1 | import { Store } from 'tauri-plugin-store-api'; 2 | 3 | export default new Store('.settings.dat'); 4 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 6 | "allowJs": false, 7 | "skipLibCheck": true, 8 | "esModuleInterop": false, 9 | "allowSyntheticDefaultImports": true, 10 | "strict": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "module": "ESNext", 13 | "moduleResolution": "Node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "jsx": "react-jsx" 18 | }, 19 | "include": ["src", ".eslintrc.cjs", "vite.config.ts"], 20 | "references": [{ "path": "./tsconfig.node.json" }] 21 | } 22 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "allowSyntheticDefaultImports": true 7 | }, 8 | "include": ["vite.config.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import react from '@vitejs/plugin-react'; 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | 8 | // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` 9 | // prevent vite from obscuring rust errors 10 | clearScreen: false, 11 | // tauri expects a fixed port, fail if that port is not available 12 | server: { 13 | port: 1420, 14 | strictPort: true, 15 | }, 16 | // to make use of `TAURI_DEBUG` and other env variables 17 | // https://tauri.studio/v1/api/config#buildconfig.beforedevcommand 18 | envPrefix: ['VITE_', 'TAURI_'], 19 | build: { 20 | // Tauri supports es2021 21 | target: process.env.TAURI_PLATFORM === 'windows' ? 'chrome105' : 'safari13', 22 | // don't minify for debug builds 23 | minify: !process.env.TAURI_DEBUG ? 'esbuild' : false, 24 | // produce sourcemaps for debug builds 25 | sourcemap: !!process.env.TAURI_DEBUG, 26 | }, 27 | }); 28 | --------------------------------------------------------------------------------