├── .cargo └── config.toml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── cdn-ip-tester-derive ├── Cargo.lock ├── Cargo.toml └── src │ └── lib.rs ├── cf-v4.txt ├── cf-v6.txt ├── get-cf-ip.py ├── get-data.sh ├── img ├── struct.png └── struct.vsdx ├── ip-tester.toml ├── outbound-template.json ├── rust-toolchain.toml ├── sing-box-template.json ├── src ├── cache.rs ├── config.rs ├── data.rs ├── error.rs ├── lib.rs ├── main.rs └── template.rs └── tests └── ip_cidr_test.rs /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [env] 2 | CC_x86_64-unknown-linux-musl = "gcc" 3 | 4 | [build] 5 | #target = ["x86_64-unknown-linux-gnu", "x86_64-unknown-linux-musl", "x86_64-pc-windows-msvc"] 6 | 7 | [target.x86_64-unknown-linux-musl] 8 | #linker = "rust-lld" 9 | 10 | 11 | [target.x86_64-pc-windows-msvc] 12 | #linker = "rust-lld" 13 | 14 | #fn main() { 15 | #println!("cargo:rerun-if-changed=build.rs"); 16 | #println!("cargo:rerun-if-changed=dynamiclist"); 17 | # 18 | #} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | **/target 2 | sing-box 3 | sing-box.exe 4 | .idea 5 | /release 6 | /data -------------------------------------------------------------------------------- /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 = "addr2line" 7 | version = "0.21.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.1.2" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "anstream" 31 | version = "0.6.5" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" 34 | dependencies = [ 35 | "anstyle", 36 | "anstyle-parse", 37 | "anstyle-query", 38 | "anstyle-wincon", 39 | "colorchoice", 40 | "utf8parse", 41 | ] 42 | 43 | [[package]] 44 | name = "anstyle" 45 | version = "1.0.4" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" 48 | 49 | [[package]] 50 | name = "anstyle-parse" 51 | version = "0.2.3" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" 54 | dependencies = [ 55 | "utf8parse", 56 | ] 57 | 58 | [[package]] 59 | name = "anstyle-query" 60 | version = "1.0.2" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" 63 | dependencies = [ 64 | "windows-sys 0.52.0", 65 | ] 66 | 67 | [[package]] 68 | name = "anstyle-wincon" 69 | version = "3.0.2" 70 | source = "registry+https://github.com/rust-lang/crates.io-index" 71 | checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" 72 | dependencies = [ 73 | "anstyle", 74 | "windows-sys 0.52.0", 75 | ] 76 | 77 | [[package]] 78 | name = "anyhow" 79 | version = "1.0.77" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "c9d19de80eff169429ac1e9f48fffb163916b448a44e8e046186232046d9e1f9" 82 | 83 | [[package]] 84 | name = "autocfg" 85 | version = "1.1.0" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 88 | 89 | [[package]] 90 | name = "backtrace" 91 | version = "0.3.69" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" 94 | dependencies = [ 95 | "addr2line", 96 | "cc", 97 | "cfg-if", 98 | "libc", 99 | "miniz_oxide", 100 | "object", 101 | "rustc-demangle", 102 | ] 103 | 104 | [[package]] 105 | name = "base64" 106 | version = "0.21.0" 107 | source = "registry+https://github.com/rust-lang/crates.io-index" 108 | checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" 109 | 110 | [[package]] 111 | name = "bitflags" 112 | version = "1.3.2" 113 | source = "registry+https://github.com/rust-lang/crates.io-index" 114 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 115 | 116 | [[package]] 117 | name = "bumpalo" 118 | version = "3.12.0" 119 | source = "registry+https://github.com/rust-lang/crates.io-index" 120 | checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" 121 | 122 | [[package]] 123 | name = "bytes" 124 | version = "1.4.0" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" 127 | 128 | [[package]] 129 | name = "cc" 130 | version = "1.0.83" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" 133 | dependencies = [ 134 | "libc", 135 | ] 136 | 137 | [[package]] 138 | name = "cdn-ip-tester" 139 | version = "0.2.1" 140 | dependencies = [ 141 | "anyhow", 142 | "cdn-ip-tester-derive", 143 | "cidr", 144 | "clap", 145 | "indicatif", 146 | "lazy_static", 147 | "log", 148 | "pretty_env_logger", 149 | "regex", 150 | "reqwest", 151 | "serde", 152 | "serde_json", 153 | "thiserror", 154 | "tokio", 155 | "toml", 156 | "url", 157 | ] 158 | 159 | [[package]] 160 | name = "cdn-ip-tester-derive" 161 | version = "0.1.0" 162 | dependencies = [ 163 | "proc-macro2", 164 | "quote", 165 | "syn 2.0.43", 166 | ] 167 | 168 | [[package]] 169 | name = "cfg-if" 170 | version = "1.0.0" 171 | source = "registry+https://github.com/rust-lang/crates.io-index" 172 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 173 | 174 | [[package]] 175 | name = "cidr" 176 | version = "0.2.2" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | checksum = "8d18b093eba54c9aaa1e3784d4361eb2ba944cf7d0a932a830132238f483e8d8" 179 | 180 | [[package]] 181 | name = "clap" 182 | version = "4.4.11" 183 | source = "registry+https://github.com/rust-lang/crates.io-index" 184 | checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2" 185 | dependencies = [ 186 | "clap_builder", 187 | "clap_derive", 188 | ] 189 | 190 | [[package]] 191 | name = "clap_builder" 192 | version = "4.4.11" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb" 195 | dependencies = [ 196 | "anstream", 197 | "anstyle", 198 | "clap_lex", 199 | "strsim", 200 | ] 201 | 202 | [[package]] 203 | name = "clap_derive" 204 | version = "4.4.7" 205 | source = "registry+https://github.com/rust-lang/crates.io-index" 206 | checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" 207 | dependencies = [ 208 | "heck", 209 | "proc-macro2", 210 | "quote", 211 | "syn 2.0.43", 212 | ] 213 | 214 | [[package]] 215 | name = "clap_lex" 216 | version = "0.6.0" 217 | source = "registry+https://github.com/rust-lang/crates.io-index" 218 | checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" 219 | 220 | [[package]] 221 | name = "colorchoice" 222 | version = "1.0.0" 223 | source = "registry+https://github.com/rust-lang/crates.io-index" 224 | checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" 225 | 226 | [[package]] 227 | name = "console" 228 | version = "0.15.5" 229 | source = "registry+https://github.com/rust-lang/crates.io-index" 230 | checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60" 231 | dependencies = [ 232 | "encode_unicode", 233 | "lazy_static", 234 | "libc", 235 | "unicode-width", 236 | "windows-sys 0.42.0", 237 | ] 238 | 239 | [[package]] 240 | name = "core-foundation" 241 | version = "0.9.4" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 244 | dependencies = [ 245 | "core-foundation-sys", 246 | "libc", 247 | ] 248 | 249 | [[package]] 250 | name = "core-foundation-sys" 251 | version = "0.8.6" 252 | source = "registry+https://github.com/rust-lang/crates.io-index" 253 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 254 | 255 | [[package]] 256 | name = "either" 257 | version = "1.8.1" 258 | source = "registry+https://github.com/rust-lang/crates.io-index" 259 | checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" 260 | 261 | [[package]] 262 | name = "encode_unicode" 263 | version = "0.3.6" 264 | source = "registry+https://github.com/rust-lang/crates.io-index" 265 | checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" 266 | 267 | [[package]] 268 | name = "encoding_rs" 269 | version = "0.8.32" 270 | source = "registry+https://github.com/rust-lang/crates.io-index" 271 | checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" 272 | dependencies = [ 273 | "cfg-if", 274 | ] 275 | 276 | [[package]] 277 | name = "env_logger" 278 | version = "0.10.1" 279 | source = "registry+https://github.com/rust-lang/crates.io-index" 280 | checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" 281 | dependencies = [ 282 | "humantime", 283 | "is-terminal", 284 | "log", 285 | "regex", 286 | "termcolor", 287 | ] 288 | 289 | [[package]] 290 | name = "equivalent" 291 | version = "1.0.1" 292 | source = "registry+https://github.com/rust-lang/crates.io-index" 293 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 294 | 295 | [[package]] 296 | name = "errno" 297 | version = "0.2.8" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" 300 | dependencies = [ 301 | "errno-dragonfly", 302 | "libc", 303 | "winapi", 304 | ] 305 | 306 | [[package]] 307 | name = "errno-dragonfly" 308 | version = "0.1.2" 309 | source = "registry+https://github.com/rust-lang/crates.io-index" 310 | checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" 311 | dependencies = [ 312 | "cc", 313 | "libc", 314 | ] 315 | 316 | [[package]] 317 | name = "fnv" 318 | version = "1.0.7" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 321 | 322 | [[package]] 323 | name = "form_urlencoded" 324 | version = "1.2.1" 325 | source = "registry+https://github.com/rust-lang/crates.io-index" 326 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 327 | dependencies = [ 328 | "percent-encoding", 329 | ] 330 | 331 | [[package]] 332 | name = "futures-channel" 333 | version = "0.3.26" 334 | source = "registry+https://github.com/rust-lang/crates.io-index" 335 | checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" 336 | dependencies = [ 337 | "futures-core", 338 | ] 339 | 340 | [[package]] 341 | name = "futures-core" 342 | version = "0.3.26" 343 | source = "registry+https://github.com/rust-lang/crates.io-index" 344 | checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" 345 | 346 | [[package]] 347 | name = "futures-sink" 348 | version = "0.3.26" 349 | source = "registry+https://github.com/rust-lang/crates.io-index" 350 | checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364" 351 | 352 | [[package]] 353 | name = "futures-task" 354 | version = "0.3.26" 355 | source = "registry+https://github.com/rust-lang/crates.io-index" 356 | checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" 357 | 358 | [[package]] 359 | name = "futures-util" 360 | version = "0.3.26" 361 | source = "registry+https://github.com/rust-lang/crates.io-index" 362 | checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" 363 | dependencies = [ 364 | "futures-core", 365 | "futures-task", 366 | "pin-project-lite", 367 | "pin-utils", 368 | ] 369 | 370 | [[package]] 371 | name = "getrandom" 372 | version = "0.2.11" 373 | source = "registry+https://github.com/rust-lang/crates.io-index" 374 | checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" 375 | dependencies = [ 376 | "cfg-if", 377 | "libc", 378 | "wasi", 379 | ] 380 | 381 | [[package]] 382 | name = "gimli" 383 | version = "0.28.1" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 386 | 387 | [[package]] 388 | name = "h2" 389 | version = "0.3.16" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d" 392 | dependencies = [ 393 | "bytes", 394 | "fnv", 395 | "futures-core", 396 | "futures-sink", 397 | "futures-util", 398 | "http", 399 | "indexmap 1.9.2", 400 | "slab", 401 | "tokio", 402 | "tokio-util", 403 | "tracing", 404 | ] 405 | 406 | [[package]] 407 | name = "hashbrown" 408 | version = "0.12.3" 409 | source = "registry+https://github.com/rust-lang/crates.io-index" 410 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 411 | 412 | [[package]] 413 | name = "hashbrown" 414 | version = "0.14.3" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" 417 | 418 | [[package]] 419 | name = "heck" 420 | version = "0.4.1" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 423 | 424 | [[package]] 425 | name = "hermit-abi" 426 | version = "0.2.6" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" 429 | dependencies = [ 430 | "libc", 431 | ] 432 | 433 | [[package]] 434 | name = "hermit-abi" 435 | version = "0.3.1" 436 | source = "registry+https://github.com/rust-lang/crates.io-index" 437 | checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" 438 | 439 | [[package]] 440 | name = "http" 441 | version = "0.2.9" 442 | source = "registry+https://github.com/rust-lang/crates.io-index" 443 | checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" 444 | dependencies = [ 445 | "bytes", 446 | "fnv", 447 | "itoa", 448 | ] 449 | 450 | [[package]] 451 | name = "http-body" 452 | version = "0.4.5" 453 | source = "registry+https://github.com/rust-lang/crates.io-index" 454 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 455 | dependencies = [ 456 | "bytes", 457 | "http", 458 | "pin-project-lite", 459 | ] 460 | 461 | [[package]] 462 | name = "httparse" 463 | version = "1.8.0" 464 | source = "registry+https://github.com/rust-lang/crates.io-index" 465 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 466 | 467 | [[package]] 468 | name = "httpdate" 469 | version = "1.0.2" 470 | source = "registry+https://github.com/rust-lang/crates.io-index" 471 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 472 | 473 | [[package]] 474 | name = "humantime" 475 | version = "2.1.0" 476 | source = "registry+https://github.com/rust-lang/crates.io-index" 477 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 478 | 479 | [[package]] 480 | name = "hyper" 481 | version = "0.14.24" 482 | source = "registry+https://github.com/rust-lang/crates.io-index" 483 | checksum = "5e011372fa0b68db8350aa7a248930ecc7839bf46d8485577d69f117a75f164c" 484 | dependencies = [ 485 | "bytes", 486 | "futures-channel", 487 | "futures-core", 488 | "futures-util", 489 | "h2", 490 | "http", 491 | "http-body", 492 | "httparse", 493 | "httpdate", 494 | "itoa", 495 | "pin-project-lite", 496 | "socket2 0.4.7", 497 | "tokio", 498 | "tower-service", 499 | "tracing", 500 | "want", 501 | ] 502 | 503 | [[package]] 504 | name = "hyper-rustls" 505 | version = "0.24.2" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" 508 | dependencies = [ 509 | "futures-util", 510 | "http", 511 | "hyper", 512 | "rustls", 513 | "tokio", 514 | "tokio-rustls", 515 | ] 516 | 517 | [[package]] 518 | name = "idna" 519 | version = "0.5.0" 520 | source = "registry+https://github.com/rust-lang/crates.io-index" 521 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 522 | dependencies = [ 523 | "unicode-bidi", 524 | "unicode-normalization", 525 | ] 526 | 527 | [[package]] 528 | name = "indexmap" 529 | version = "1.9.2" 530 | source = "registry+https://github.com/rust-lang/crates.io-index" 531 | checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" 532 | dependencies = [ 533 | "autocfg", 534 | "hashbrown 0.12.3", 535 | ] 536 | 537 | [[package]] 538 | name = "indexmap" 539 | version = "2.1.0" 540 | source = "registry+https://github.com/rust-lang/crates.io-index" 541 | checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" 542 | dependencies = [ 543 | "equivalent", 544 | "hashbrown 0.14.3", 545 | ] 546 | 547 | [[package]] 548 | name = "indicatif" 549 | version = "0.17.7" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "fb28741c9db9a713d93deb3bb9515c20788cef5815265bee4980e87bde7e0f25" 552 | dependencies = [ 553 | "console", 554 | "instant", 555 | "number_prefix", 556 | "portable-atomic", 557 | "unicode-width", 558 | ] 559 | 560 | [[package]] 561 | name = "instant" 562 | version = "0.1.12" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 565 | dependencies = [ 566 | "cfg-if", 567 | ] 568 | 569 | [[package]] 570 | name = "io-lifetimes" 571 | version = "1.0.6" 572 | source = "registry+https://github.com/rust-lang/crates.io-index" 573 | checksum = "cfa919a82ea574332e2de6e74b4c36e74d41982b335080fa59d4ef31be20fdf3" 574 | dependencies = [ 575 | "libc", 576 | "windows-sys 0.45.0", 577 | ] 578 | 579 | [[package]] 580 | name = "ipnet" 581 | version = "2.7.1" 582 | source = "registry+https://github.com/rust-lang/crates.io-index" 583 | checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" 584 | 585 | [[package]] 586 | name = "is-terminal" 587 | version = "0.4.4" 588 | source = "registry+https://github.com/rust-lang/crates.io-index" 589 | checksum = "21b6b32576413a8e69b90e952e4a026476040d81017b80445deda5f2d3921857" 590 | dependencies = [ 591 | "hermit-abi 0.3.1", 592 | "io-lifetimes", 593 | "rustix", 594 | "windows-sys 0.45.0", 595 | ] 596 | 597 | [[package]] 598 | name = "itoa" 599 | version = "1.0.5" 600 | source = "registry+https://github.com/rust-lang/crates.io-index" 601 | checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" 602 | 603 | [[package]] 604 | name = "js-sys" 605 | version = "0.3.61" 606 | source = "registry+https://github.com/rust-lang/crates.io-index" 607 | checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" 608 | dependencies = [ 609 | "wasm-bindgen", 610 | ] 611 | 612 | [[package]] 613 | name = "lazy_static" 614 | version = "1.4.0" 615 | source = "registry+https://github.com/rust-lang/crates.io-index" 616 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 617 | 618 | [[package]] 619 | name = "libc" 620 | version = "0.2.151" 621 | source = "registry+https://github.com/rust-lang/crates.io-index" 622 | checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" 623 | 624 | [[package]] 625 | name = "linux-raw-sys" 626 | version = "0.1.4" 627 | source = "registry+https://github.com/rust-lang/crates.io-index" 628 | checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" 629 | 630 | [[package]] 631 | name = "lock_api" 632 | version = "0.4.9" 633 | source = "registry+https://github.com/rust-lang/crates.io-index" 634 | checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" 635 | dependencies = [ 636 | "autocfg", 637 | "scopeguard", 638 | ] 639 | 640 | [[package]] 641 | name = "log" 642 | version = "0.4.20" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" 645 | 646 | [[package]] 647 | name = "memchr" 648 | version = "2.6.4" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" 651 | 652 | [[package]] 653 | name = "mime" 654 | version = "0.3.16" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 657 | 658 | [[package]] 659 | name = "miniz_oxide" 660 | version = "0.7.1" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" 663 | dependencies = [ 664 | "adler", 665 | ] 666 | 667 | [[package]] 668 | name = "mio" 669 | version = "0.8.10" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" 672 | dependencies = [ 673 | "libc", 674 | "wasi", 675 | "windows-sys 0.48.0", 676 | ] 677 | 678 | [[package]] 679 | name = "num_cpus" 680 | version = "1.15.0" 681 | source = "registry+https://github.com/rust-lang/crates.io-index" 682 | checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" 683 | dependencies = [ 684 | "hermit-abi 0.2.6", 685 | "libc", 686 | ] 687 | 688 | [[package]] 689 | name = "number_prefix" 690 | version = "0.4.0" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" 693 | 694 | [[package]] 695 | name = "object" 696 | version = "0.32.2" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" 699 | dependencies = [ 700 | "memchr", 701 | ] 702 | 703 | [[package]] 704 | name = "once_cell" 705 | version = "1.17.1" 706 | source = "registry+https://github.com/rust-lang/crates.io-index" 707 | checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" 708 | 709 | [[package]] 710 | name = "parking_lot" 711 | version = "0.12.1" 712 | source = "registry+https://github.com/rust-lang/crates.io-index" 713 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 714 | dependencies = [ 715 | "lock_api", 716 | "parking_lot_core", 717 | ] 718 | 719 | [[package]] 720 | name = "parking_lot_core" 721 | version = "0.9.7" 722 | source = "registry+https://github.com/rust-lang/crates.io-index" 723 | checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" 724 | dependencies = [ 725 | "cfg-if", 726 | "libc", 727 | "redox_syscall", 728 | "smallvec", 729 | "windows-sys 0.45.0", 730 | ] 731 | 732 | [[package]] 733 | name = "percent-encoding" 734 | version = "2.3.1" 735 | source = "registry+https://github.com/rust-lang/crates.io-index" 736 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 737 | 738 | [[package]] 739 | name = "pin-project-lite" 740 | version = "0.2.13" 741 | source = "registry+https://github.com/rust-lang/crates.io-index" 742 | checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" 743 | 744 | [[package]] 745 | name = "pin-utils" 746 | version = "0.1.0" 747 | source = "registry+https://github.com/rust-lang/crates.io-index" 748 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 749 | 750 | [[package]] 751 | name = "portable-atomic" 752 | version = "1.6.0" 753 | source = "registry+https://github.com/rust-lang/crates.io-index" 754 | checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" 755 | 756 | [[package]] 757 | name = "pretty_env_logger" 758 | version = "0.5.0" 759 | source = "registry+https://github.com/rust-lang/crates.io-index" 760 | checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" 761 | dependencies = [ 762 | "env_logger", 763 | "log", 764 | ] 765 | 766 | [[package]] 767 | name = "proc-macro2" 768 | version = "1.0.71" 769 | source = "registry+https://github.com/rust-lang/crates.io-index" 770 | checksum = "75cb1540fadbd5b8fbccc4dddad2734eba435053f725621c070711a14bb5f4b8" 771 | dependencies = [ 772 | "unicode-ident", 773 | ] 774 | 775 | [[package]] 776 | name = "quote" 777 | version = "1.0.33" 778 | source = "registry+https://github.com/rust-lang/crates.io-index" 779 | checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" 780 | dependencies = [ 781 | "proc-macro2", 782 | ] 783 | 784 | [[package]] 785 | name = "redox_syscall" 786 | version = "0.2.16" 787 | source = "registry+https://github.com/rust-lang/crates.io-index" 788 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 789 | dependencies = [ 790 | "bitflags", 791 | ] 792 | 793 | [[package]] 794 | name = "regex" 795 | version = "1.10.2" 796 | source = "registry+https://github.com/rust-lang/crates.io-index" 797 | checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" 798 | dependencies = [ 799 | "aho-corasick", 800 | "memchr", 801 | "regex-automata", 802 | "regex-syntax", 803 | ] 804 | 805 | [[package]] 806 | name = "regex-automata" 807 | version = "0.4.3" 808 | source = "registry+https://github.com/rust-lang/crates.io-index" 809 | checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" 810 | dependencies = [ 811 | "aho-corasick", 812 | "memchr", 813 | "regex-syntax", 814 | ] 815 | 816 | [[package]] 817 | name = "regex-syntax" 818 | version = "0.8.2" 819 | source = "registry+https://github.com/rust-lang/crates.io-index" 820 | checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" 821 | 822 | [[package]] 823 | name = "reqwest" 824 | version = "0.11.23" 825 | source = "registry+https://github.com/rust-lang/crates.io-index" 826 | checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" 827 | dependencies = [ 828 | "base64", 829 | "bytes", 830 | "encoding_rs", 831 | "futures-core", 832 | "futures-util", 833 | "h2", 834 | "http", 835 | "http-body", 836 | "hyper", 837 | "hyper-rustls", 838 | "ipnet", 839 | "js-sys", 840 | "log", 841 | "mime", 842 | "once_cell", 843 | "percent-encoding", 844 | "pin-project-lite", 845 | "rustls", 846 | "rustls-pemfile", 847 | "serde", 848 | "serde_json", 849 | "serde_urlencoded", 850 | "system-configuration", 851 | "tokio", 852 | "tokio-rustls", 853 | "tokio-socks", 854 | "tower-service", 855 | "url", 856 | "wasm-bindgen", 857 | "wasm-bindgen-futures", 858 | "web-sys", 859 | "webpki-roots", 860 | "winreg", 861 | ] 862 | 863 | [[package]] 864 | name = "ring" 865 | version = "0.16.20" 866 | source = "registry+https://github.com/rust-lang/crates.io-index" 867 | checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" 868 | dependencies = [ 869 | "cc", 870 | "libc", 871 | "once_cell", 872 | "spin 0.5.2", 873 | "untrusted 0.7.1", 874 | "web-sys", 875 | "winapi", 876 | ] 877 | 878 | [[package]] 879 | name = "ring" 880 | version = "0.17.7" 881 | source = "registry+https://github.com/rust-lang/crates.io-index" 882 | checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" 883 | dependencies = [ 884 | "cc", 885 | "getrandom", 886 | "libc", 887 | "spin 0.9.8", 888 | "untrusted 0.9.0", 889 | "windows-sys 0.48.0", 890 | ] 891 | 892 | [[package]] 893 | name = "rustc-demangle" 894 | version = "0.1.23" 895 | source = "registry+https://github.com/rust-lang/crates.io-index" 896 | checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 897 | 898 | [[package]] 899 | name = "rustix" 900 | version = "0.36.9" 901 | source = "registry+https://github.com/rust-lang/crates.io-index" 902 | checksum = "fd5c6ff11fecd55b40746d1995a02f2eb375bf8c00d192d521ee09f42bef37bc" 903 | dependencies = [ 904 | "bitflags", 905 | "errno", 906 | "io-lifetimes", 907 | "libc", 908 | "linux-raw-sys", 909 | "windows-sys 0.45.0", 910 | ] 911 | 912 | [[package]] 913 | name = "rustls" 914 | version = "0.21.10" 915 | source = "registry+https://github.com/rust-lang/crates.io-index" 916 | checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" 917 | dependencies = [ 918 | "log", 919 | "ring 0.17.7", 920 | "rustls-webpki", 921 | "sct", 922 | ] 923 | 924 | [[package]] 925 | name = "rustls-pemfile" 926 | version = "1.0.2" 927 | source = "registry+https://github.com/rust-lang/crates.io-index" 928 | checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" 929 | dependencies = [ 930 | "base64", 931 | ] 932 | 933 | [[package]] 934 | name = "rustls-webpki" 935 | version = "0.101.7" 936 | source = "registry+https://github.com/rust-lang/crates.io-index" 937 | checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" 938 | dependencies = [ 939 | "ring 0.17.7", 940 | "untrusted 0.9.0", 941 | ] 942 | 943 | [[package]] 944 | name = "ryu" 945 | version = "1.0.12" 946 | source = "registry+https://github.com/rust-lang/crates.io-index" 947 | checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" 948 | 949 | [[package]] 950 | name = "scopeguard" 951 | version = "1.1.0" 952 | source = "registry+https://github.com/rust-lang/crates.io-index" 953 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 954 | 955 | [[package]] 956 | name = "sct" 957 | version = "0.7.0" 958 | source = "registry+https://github.com/rust-lang/crates.io-index" 959 | checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" 960 | dependencies = [ 961 | "ring 0.16.20", 962 | "untrusted 0.7.1", 963 | ] 964 | 965 | [[package]] 966 | name = "serde" 967 | version = "1.0.193" 968 | source = "registry+https://github.com/rust-lang/crates.io-index" 969 | checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" 970 | dependencies = [ 971 | "serde_derive", 972 | ] 973 | 974 | [[package]] 975 | name = "serde_derive" 976 | version = "1.0.193" 977 | source = "registry+https://github.com/rust-lang/crates.io-index" 978 | checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" 979 | dependencies = [ 980 | "proc-macro2", 981 | "quote", 982 | "syn 2.0.43", 983 | ] 984 | 985 | [[package]] 986 | name = "serde_json" 987 | version = "1.0.108" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" 990 | dependencies = [ 991 | "itoa", 992 | "ryu", 993 | "serde", 994 | ] 995 | 996 | [[package]] 997 | name = "serde_spanned" 998 | version = "0.6.5" 999 | source = "registry+https://github.com/rust-lang/crates.io-index" 1000 | checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" 1001 | dependencies = [ 1002 | "serde", 1003 | ] 1004 | 1005 | [[package]] 1006 | name = "serde_urlencoded" 1007 | version = "0.7.1" 1008 | source = "registry+https://github.com/rust-lang/crates.io-index" 1009 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1010 | dependencies = [ 1011 | "form_urlencoded", 1012 | "itoa", 1013 | "ryu", 1014 | "serde", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "signal-hook-registry" 1019 | version = "1.4.1" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" 1022 | dependencies = [ 1023 | "libc", 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "slab" 1028 | version = "0.4.8" 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" 1030 | checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" 1031 | dependencies = [ 1032 | "autocfg", 1033 | ] 1034 | 1035 | [[package]] 1036 | name = "smallvec" 1037 | version = "1.10.0" 1038 | source = "registry+https://github.com/rust-lang/crates.io-index" 1039 | checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" 1040 | 1041 | [[package]] 1042 | name = "socket2" 1043 | version = "0.4.7" 1044 | source = "registry+https://github.com/rust-lang/crates.io-index" 1045 | checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" 1046 | dependencies = [ 1047 | "libc", 1048 | "winapi", 1049 | ] 1050 | 1051 | [[package]] 1052 | name = "socket2" 1053 | version = "0.5.5" 1054 | source = "registry+https://github.com/rust-lang/crates.io-index" 1055 | checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" 1056 | dependencies = [ 1057 | "libc", 1058 | "windows-sys 0.48.0", 1059 | ] 1060 | 1061 | [[package]] 1062 | name = "spin" 1063 | version = "0.5.2" 1064 | source = "registry+https://github.com/rust-lang/crates.io-index" 1065 | checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 1066 | 1067 | [[package]] 1068 | name = "spin" 1069 | version = "0.9.8" 1070 | source = "registry+https://github.com/rust-lang/crates.io-index" 1071 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1072 | 1073 | [[package]] 1074 | name = "strsim" 1075 | version = "0.10.0" 1076 | source = "registry+https://github.com/rust-lang/crates.io-index" 1077 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 1078 | 1079 | [[package]] 1080 | name = "syn" 1081 | version = "1.0.109" 1082 | source = "registry+https://github.com/rust-lang/crates.io-index" 1083 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1084 | dependencies = [ 1085 | "proc-macro2", 1086 | "quote", 1087 | "unicode-ident", 1088 | ] 1089 | 1090 | [[package]] 1091 | name = "syn" 1092 | version = "2.0.43" 1093 | source = "registry+https://github.com/rust-lang/crates.io-index" 1094 | checksum = "ee659fb5f3d355364e1f3e5bc10fb82068efbf824a1e9d1c9504244a6469ad53" 1095 | dependencies = [ 1096 | "proc-macro2", 1097 | "quote", 1098 | "unicode-ident", 1099 | ] 1100 | 1101 | [[package]] 1102 | name = "system-configuration" 1103 | version = "0.5.1" 1104 | source = "registry+https://github.com/rust-lang/crates.io-index" 1105 | checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" 1106 | dependencies = [ 1107 | "bitflags", 1108 | "core-foundation", 1109 | "system-configuration-sys", 1110 | ] 1111 | 1112 | [[package]] 1113 | name = "system-configuration-sys" 1114 | version = "0.5.0" 1115 | source = "registry+https://github.com/rust-lang/crates.io-index" 1116 | checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" 1117 | dependencies = [ 1118 | "core-foundation-sys", 1119 | "libc", 1120 | ] 1121 | 1122 | [[package]] 1123 | name = "termcolor" 1124 | version = "1.2.0" 1125 | source = "registry+https://github.com/rust-lang/crates.io-index" 1126 | checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" 1127 | dependencies = [ 1128 | "winapi-util", 1129 | ] 1130 | 1131 | [[package]] 1132 | name = "thiserror" 1133 | version = "1.0.52" 1134 | source = "registry+https://github.com/rust-lang/crates.io-index" 1135 | checksum = "83a48fd946b02c0a526b2e9481c8e2a17755e47039164a86c4070446e3a4614d" 1136 | dependencies = [ 1137 | "thiserror-impl", 1138 | ] 1139 | 1140 | [[package]] 1141 | name = "thiserror-impl" 1142 | version = "1.0.52" 1143 | source = "registry+https://github.com/rust-lang/crates.io-index" 1144 | checksum = "e7fbe9b594d6568a6a1443250a7e67d80b74e1e96f6d1715e1e21cc1888291d3" 1145 | dependencies = [ 1146 | "proc-macro2", 1147 | "quote", 1148 | "syn 2.0.43", 1149 | ] 1150 | 1151 | [[package]] 1152 | name = "tinyvec" 1153 | version = "1.6.0" 1154 | source = "registry+https://github.com/rust-lang/crates.io-index" 1155 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 1156 | dependencies = [ 1157 | "tinyvec_macros", 1158 | ] 1159 | 1160 | [[package]] 1161 | name = "tinyvec_macros" 1162 | version = "0.1.1" 1163 | source = "registry+https://github.com/rust-lang/crates.io-index" 1164 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1165 | 1166 | [[package]] 1167 | name = "tokio" 1168 | version = "1.35.1" 1169 | source = "registry+https://github.com/rust-lang/crates.io-index" 1170 | checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" 1171 | dependencies = [ 1172 | "backtrace", 1173 | "bytes", 1174 | "libc", 1175 | "mio", 1176 | "num_cpus", 1177 | "parking_lot", 1178 | "pin-project-lite", 1179 | "signal-hook-registry", 1180 | "socket2 0.5.5", 1181 | "tokio-macros", 1182 | "windows-sys 0.48.0", 1183 | ] 1184 | 1185 | [[package]] 1186 | name = "tokio-macros" 1187 | version = "2.2.0" 1188 | source = "registry+https://github.com/rust-lang/crates.io-index" 1189 | checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" 1190 | dependencies = [ 1191 | "proc-macro2", 1192 | "quote", 1193 | "syn 2.0.43", 1194 | ] 1195 | 1196 | [[package]] 1197 | name = "tokio-rustls" 1198 | version = "0.24.1" 1199 | source = "registry+https://github.com/rust-lang/crates.io-index" 1200 | checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" 1201 | dependencies = [ 1202 | "rustls", 1203 | "tokio", 1204 | ] 1205 | 1206 | [[package]] 1207 | name = "tokio-socks" 1208 | version = "0.5.1" 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" 1210 | checksum = "51165dfa029d2a65969413a6cc96f354b86b464498702f174a4efa13608fd8c0" 1211 | dependencies = [ 1212 | "either", 1213 | "futures-util", 1214 | "thiserror", 1215 | "tokio", 1216 | ] 1217 | 1218 | [[package]] 1219 | name = "tokio-util" 1220 | version = "0.7.7" 1221 | source = "registry+https://github.com/rust-lang/crates.io-index" 1222 | checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" 1223 | dependencies = [ 1224 | "bytes", 1225 | "futures-core", 1226 | "futures-sink", 1227 | "pin-project-lite", 1228 | "tokio", 1229 | "tracing", 1230 | ] 1231 | 1232 | [[package]] 1233 | name = "toml" 1234 | version = "0.8.8" 1235 | source = "registry+https://github.com/rust-lang/crates.io-index" 1236 | checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" 1237 | dependencies = [ 1238 | "serde", 1239 | "serde_spanned", 1240 | "toml_datetime", 1241 | "toml_edit", 1242 | ] 1243 | 1244 | [[package]] 1245 | name = "toml_datetime" 1246 | version = "0.6.5" 1247 | source = "registry+https://github.com/rust-lang/crates.io-index" 1248 | checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" 1249 | dependencies = [ 1250 | "serde", 1251 | ] 1252 | 1253 | [[package]] 1254 | name = "toml_edit" 1255 | version = "0.21.0" 1256 | source = "registry+https://github.com/rust-lang/crates.io-index" 1257 | checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" 1258 | dependencies = [ 1259 | "indexmap 2.1.0", 1260 | "serde", 1261 | "serde_spanned", 1262 | "toml_datetime", 1263 | "winnow", 1264 | ] 1265 | 1266 | [[package]] 1267 | name = "tower-service" 1268 | version = "0.3.2" 1269 | source = "registry+https://github.com/rust-lang/crates.io-index" 1270 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 1271 | 1272 | [[package]] 1273 | name = "tracing" 1274 | version = "0.1.37" 1275 | source = "registry+https://github.com/rust-lang/crates.io-index" 1276 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 1277 | dependencies = [ 1278 | "cfg-if", 1279 | "pin-project-lite", 1280 | "tracing-core", 1281 | ] 1282 | 1283 | [[package]] 1284 | name = "tracing-core" 1285 | version = "0.1.30" 1286 | source = "registry+https://github.com/rust-lang/crates.io-index" 1287 | checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" 1288 | dependencies = [ 1289 | "once_cell", 1290 | ] 1291 | 1292 | [[package]] 1293 | name = "try-lock" 1294 | version = "0.2.4" 1295 | source = "registry+https://github.com/rust-lang/crates.io-index" 1296 | checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" 1297 | 1298 | [[package]] 1299 | name = "unicode-bidi" 1300 | version = "0.3.10" 1301 | source = "registry+https://github.com/rust-lang/crates.io-index" 1302 | checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" 1303 | 1304 | [[package]] 1305 | name = "unicode-ident" 1306 | version = "1.0.6" 1307 | source = "registry+https://github.com/rust-lang/crates.io-index" 1308 | checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" 1309 | 1310 | [[package]] 1311 | name = "unicode-normalization" 1312 | version = "0.1.22" 1313 | source = "registry+https://github.com/rust-lang/crates.io-index" 1314 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 1315 | dependencies = [ 1316 | "tinyvec", 1317 | ] 1318 | 1319 | [[package]] 1320 | name = "unicode-width" 1321 | version = "0.1.10" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" 1324 | 1325 | [[package]] 1326 | name = "untrusted" 1327 | version = "0.7.1" 1328 | source = "registry+https://github.com/rust-lang/crates.io-index" 1329 | checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" 1330 | 1331 | [[package]] 1332 | name = "untrusted" 1333 | version = "0.9.0" 1334 | source = "registry+https://github.com/rust-lang/crates.io-index" 1335 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 1336 | 1337 | [[package]] 1338 | name = "url" 1339 | version = "2.5.0" 1340 | source = "registry+https://github.com/rust-lang/crates.io-index" 1341 | checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" 1342 | dependencies = [ 1343 | "form_urlencoded", 1344 | "idna", 1345 | "percent-encoding", 1346 | ] 1347 | 1348 | [[package]] 1349 | name = "utf8parse" 1350 | version = "0.2.1" 1351 | source = "registry+https://github.com/rust-lang/crates.io-index" 1352 | checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" 1353 | 1354 | [[package]] 1355 | name = "want" 1356 | version = "0.3.0" 1357 | source = "registry+https://github.com/rust-lang/crates.io-index" 1358 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 1359 | dependencies = [ 1360 | "log", 1361 | "try-lock", 1362 | ] 1363 | 1364 | [[package]] 1365 | name = "wasi" 1366 | version = "0.11.0+wasi-snapshot-preview1" 1367 | source = "registry+https://github.com/rust-lang/crates.io-index" 1368 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1369 | 1370 | [[package]] 1371 | name = "wasm-bindgen" 1372 | version = "0.2.84" 1373 | source = "registry+https://github.com/rust-lang/crates.io-index" 1374 | checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" 1375 | dependencies = [ 1376 | "cfg-if", 1377 | "wasm-bindgen-macro", 1378 | ] 1379 | 1380 | [[package]] 1381 | name = "wasm-bindgen-backend" 1382 | version = "0.2.84" 1383 | source = "registry+https://github.com/rust-lang/crates.io-index" 1384 | checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" 1385 | dependencies = [ 1386 | "bumpalo", 1387 | "log", 1388 | "once_cell", 1389 | "proc-macro2", 1390 | "quote", 1391 | "syn 1.0.109", 1392 | "wasm-bindgen-shared", 1393 | ] 1394 | 1395 | [[package]] 1396 | name = "wasm-bindgen-futures" 1397 | version = "0.4.34" 1398 | source = "registry+https://github.com/rust-lang/crates.io-index" 1399 | checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" 1400 | dependencies = [ 1401 | "cfg-if", 1402 | "js-sys", 1403 | "wasm-bindgen", 1404 | "web-sys", 1405 | ] 1406 | 1407 | [[package]] 1408 | name = "wasm-bindgen-macro" 1409 | version = "0.2.84" 1410 | source = "registry+https://github.com/rust-lang/crates.io-index" 1411 | checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" 1412 | dependencies = [ 1413 | "quote", 1414 | "wasm-bindgen-macro-support", 1415 | ] 1416 | 1417 | [[package]] 1418 | name = "wasm-bindgen-macro-support" 1419 | version = "0.2.84" 1420 | source = "registry+https://github.com/rust-lang/crates.io-index" 1421 | checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" 1422 | dependencies = [ 1423 | "proc-macro2", 1424 | "quote", 1425 | "syn 1.0.109", 1426 | "wasm-bindgen-backend", 1427 | "wasm-bindgen-shared", 1428 | ] 1429 | 1430 | [[package]] 1431 | name = "wasm-bindgen-shared" 1432 | version = "0.2.84" 1433 | source = "registry+https://github.com/rust-lang/crates.io-index" 1434 | checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" 1435 | 1436 | [[package]] 1437 | name = "web-sys" 1438 | version = "0.3.61" 1439 | source = "registry+https://github.com/rust-lang/crates.io-index" 1440 | checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" 1441 | dependencies = [ 1442 | "js-sys", 1443 | "wasm-bindgen", 1444 | ] 1445 | 1446 | [[package]] 1447 | name = "webpki-roots" 1448 | version = "0.25.3" 1449 | source = "registry+https://github.com/rust-lang/crates.io-index" 1450 | checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" 1451 | 1452 | [[package]] 1453 | name = "winapi" 1454 | version = "0.3.9" 1455 | source = "registry+https://github.com/rust-lang/crates.io-index" 1456 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1457 | dependencies = [ 1458 | "winapi-i686-pc-windows-gnu", 1459 | "winapi-x86_64-pc-windows-gnu", 1460 | ] 1461 | 1462 | [[package]] 1463 | name = "winapi-i686-pc-windows-gnu" 1464 | version = "0.4.0" 1465 | source = "registry+https://github.com/rust-lang/crates.io-index" 1466 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1467 | 1468 | [[package]] 1469 | name = "winapi-util" 1470 | version = "0.1.5" 1471 | source = "registry+https://github.com/rust-lang/crates.io-index" 1472 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 1473 | dependencies = [ 1474 | "winapi", 1475 | ] 1476 | 1477 | [[package]] 1478 | name = "winapi-x86_64-pc-windows-gnu" 1479 | version = "0.4.0" 1480 | source = "registry+https://github.com/rust-lang/crates.io-index" 1481 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1482 | 1483 | [[package]] 1484 | name = "windows-sys" 1485 | version = "0.42.0" 1486 | source = "registry+https://github.com/rust-lang/crates.io-index" 1487 | checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" 1488 | dependencies = [ 1489 | "windows_aarch64_gnullvm 0.42.1", 1490 | "windows_aarch64_msvc 0.42.1", 1491 | "windows_i686_gnu 0.42.1", 1492 | "windows_i686_msvc 0.42.1", 1493 | "windows_x86_64_gnu 0.42.1", 1494 | "windows_x86_64_gnullvm 0.42.1", 1495 | "windows_x86_64_msvc 0.42.1", 1496 | ] 1497 | 1498 | [[package]] 1499 | name = "windows-sys" 1500 | version = "0.45.0" 1501 | source = "registry+https://github.com/rust-lang/crates.io-index" 1502 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 1503 | dependencies = [ 1504 | "windows-targets 0.42.1", 1505 | ] 1506 | 1507 | [[package]] 1508 | name = "windows-sys" 1509 | version = "0.48.0" 1510 | source = "registry+https://github.com/rust-lang/crates.io-index" 1511 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 1512 | dependencies = [ 1513 | "windows-targets 0.48.5", 1514 | ] 1515 | 1516 | [[package]] 1517 | name = "windows-sys" 1518 | version = "0.52.0" 1519 | source = "registry+https://github.com/rust-lang/crates.io-index" 1520 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1521 | dependencies = [ 1522 | "windows-targets 0.52.0", 1523 | ] 1524 | 1525 | [[package]] 1526 | name = "windows-targets" 1527 | version = "0.42.1" 1528 | source = "registry+https://github.com/rust-lang/crates.io-index" 1529 | checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" 1530 | dependencies = [ 1531 | "windows_aarch64_gnullvm 0.42.1", 1532 | "windows_aarch64_msvc 0.42.1", 1533 | "windows_i686_gnu 0.42.1", 1534 | "windows_i686_msvc 0.42.1", 1535 | "windows_x86_64_gnu 0.42.1", 1536 | "windows_x86_64_gnullvm 0.42.1", 1537 | "windows_x86_64_msvc 0.42.1", 1538 | ] 1539 | 1540 | [[package]] 1541 | name = "windows-targets" 1542 | version = "0.48.5" 1543 | source = "registry+https://github.com/rust-lang/crates.io-index" 1544 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 1545 | dependencies = [ 1546 | "windows_aarch64_gnullvm 0.48.5", 1547 | "windows_aarch64_msvc 0.48.5", 1548 | "windows_i686_gnu 0.48.5", 1549 | "windows_i686_msvc 0.48.5", 1550 | "windows_x86_64_gnu 0.48.5", 1551 | "windows_x86_64_gnullvm 0.48.5", 1552 | "windows_x86_64_msvc 0.48.5", 1553 | ] 1554 | 1555 | [[package]] 1556 | name = "windows-targets" 1557 | version = "0.52.0" 1558 | source = "registry+https://github.com/rust-lang/crates.io-index" 1559 | checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" 1560 | dependencies = [ 1561 | "windows_aarch64_gnullvm 0.52.0", 1562 | "windows_aarch64_msvc 0.52.0", 1563 | "windows_i686_gnu 0.52.0", 1564 | "windows_i686_msvc 0.52.0", 1565 | "windows_x86_64_gnu 0.52.0", 1566 | "windows_x86_64_gnullvm 0.52.0", 1567 | "windows_x86_64_msvc 0.52.0", 1568 | ] 1569 | 1570 | [[package]] 1571 | name = "windows_aarch64_gnullvm" 1572 | version = "0.42.1" 1573 | source = "registry+https://github.com/rust-lang/crates.io-index" 1574 | checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" 1575 | 1576 | [[package]] 1577 | name = "windows_aarch64_gnullvm" 1578 | version = "0.48.5" 1579 | source = "registry+https://github.com/rust-lang/crates.io-index" 1580 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 1581 | 1582 | [[package]] 1583 | name = "windows_aarch64_gnullvm" 1584 | version = "0.52.0" 1585 | source = "registry+https://github.com/rust-lang/crates.io-index" 1586 | checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" 1587 | 1588 | [[package]] 1589 | name = "windows_aarch64_msvc" 1590 | version = "0.42.1" 1591 | source = "registry+https://github.com/rust-lang/crates.io-index" 1592 | checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" 1593 | 1594 | [[package]] 1595 | name = "windows_aarch64_msvc" 1596 | version = "0.48.5" 1597 | source = "registry+https://github.com/rust-lang/crates.io-index" 1598 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 1599 | 1600 | [[package]] 1601 | name = "windows_aarch64_msvc" 1602 | version = "0.52.0" 1603 | source = "registry+https://github.com/rust-lang/crates.io-index" 1604 | checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" 1605 | 1606 | [[package]] 1607 | name = "windows_i686_gnu" 1608 | version = "0.42.1" 1609 | source = "registry+https://github.com/rust-lang/crates.io-index" 1610 | checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" 1611 | 1612 | [[package]] 1613 | name = "windows_i686_gnu" 1614 | version = "0.48.5" 1615 | source = "registry+https://github.com/rust-lang/crates.io-index" 1616 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 1617 | 1618 | [[package]] 1619 | name = "windows_i686_gnu" 1620 | version = "0.52.0" 1621 | source = "registry+https://github.com/rust-lang/crates.io-index" 1622 | checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" 1623 | 1624 | [[package]] 1625 | name = "windows_i686_msvc" 1626 | version = "0.42.1" 1627 | source = "registry+https://github.com/rust-lang/crates.io-index" 1628 | checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" 1629 | 1630 | [[package]] 1631 | name = "windows_i686_msvc" 1632 | version = "0.48.5" 1633 | source = "registry+https://github.com/rust-lang/crates.io-index" 1634 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 1635 | 1636 | [[package]] 1637 | name = "windows_i686_msvc" 1638 | version = "0.52.0" 1639 | source = "registry+https://github.com/rust-lang/crates.io-index" 1640 | checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" 1641 | 1642 | [[package]] 1643 | name = "windows_x86_64_gnu" 1644 | version = "0.42.1" 1645 | source = "registry+https://github.com/rust-lang/crates.io-index" 1646 | checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" 1647 | 1648 | [[package]] 1649 | name = "windows_x86_64_gnu" 1650 | version = "0.48.5" 1651 | source = "registry+https://github.com/rust-lang/crates.io-index" 1652 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 1653 | 1654 | [[package]] 1655 | name = "windows_x86_64_gnu" 1656 | version = "0.52.0" 1657 | source = "registry+https://github.com/rust-lang/crates.io-index" 1658 | checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" 1659 | 1660 | [[package]] 1661 | name = "windows_x86_64_gnullvm" 1662 | version = "0.42.1" 1663 | source = "registry+https://github.com/rust-lang/crates.io-index" 1664 | checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" 1665 | 1666 | [[package]] 1667 | name = "windows_x86_64_gnullvm" 1668 | version = "0.48.5" 1669 | source = "registry+https://github.com/rust-lang/crates.io-index" 1670 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 1671 | 1672 | [[package]] 1673 | name = "windows_x86_64_gnullvm" 1674 | version = "0.52.0" 1675 | source = "registry+https://github.com/rust-lang/crates.io-index" 1676 | checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" 1677 | 1678 | [[package]] 1679 | name = "windows_x86_64_msvc" 1680 | version = "0.42.1" 1681 | source = "registry+https://github.com/rust-lang/crates.io-index" 1682 | checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" 1683 | 1684 | [[package]] 1685 | name = "windows_x86_64_msvc" 1686 | version = "0.48.5" 1687 | source = "registry+https://github.com/rust-lang/crates.io-index" 1688 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 1689 | 1690 | [[package]] 1691 | name = "windows_x86_64_msvc" 1692 | version = "0.52.0" 1693 | source = "registry+https://github.com/rust-lang/crates.io-index" 1694 | checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" 1695 | 1696 | [[package]] 1697 | name = "winnow" 1698 | version = "0.5.30" 1699 | source = "registry+https://github.com/rust-lang/crates.io-index" 1700 | checksum = "9b5c3db89721d50d0e2a673f5043fc4722f76dcc352d7b1ab8b8288bed4ed2c5" 1701 | dependencies = [ 1702 | "memchr", 1703 | ] 1704 | 1705 | [[package]] 1706 | name = "winreg" 1707 | version = "0.50.0" 1708 | source = "registry+https://github.com/rust-lang/crates.io-index" 1709 | checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" 1710 | dependencies = [ 1711 | "cfg-if", 1712 | "windows-sys 0.48.0", 1713 | ] 1714 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "cdn-ip-tester" 3 | version = "0.2.1" 4 | edition = "2021" 5 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 6 | [lib] 7 | 8 | [profile.release] 9 | codegen-units = 1 10 | strip = true 11 | opt-level = "z" # Optimize for size. 12 | lto = true 13 | panic = "abort" 14 | 15 | 16 | [dependencies] 17 | serde_json = "1.0.108" 18 | reqwest = { version = "0.11.23", features = ["json", "socks", "rustls-tls"], default-features = false } 19 | tokio = { version = "1.35.1", features = ["full"] } 20 | toml = "0.8.8" 21 | log = "0.4.20" 22 | pretty_env_logger = "0.5.0" 23 | serde = { version = "1.0.193", features = ["derive"] } 24 | anyhow = "1.0.77" 25 | regex = "1.10.2" 26 | lazy_static = "1.4.0" 27 | indicatif = "0.17.7" 28 | clap = { version = "4.4.11", features = ["derive"] } 29 | thiserror = "1.0.52" 30 | cidr = "0.2.2" 31 | url = "2.5.0" 32 | cdn-ip-tester-derive = { path = "cdn-ip-tester-derive" } 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Mozilla Public License Version 2.0 2 | ================================== 3 | 4 | 1. Definitions 5 | -------------- 6 | 7 | 1.1. "Contributor" 8 | means each individual or legal entity that creates, contributes to 9 | the creation of, or owns Covered Software. 10 | 11 | 1.2. "Contributor Version" 12 | means the combination of the Contributions of others (if any) used 13 | by a Contributor and that particular Contributor's Contribution. 14 | 15 | 1.3. "Contribution" 16 | means Covered Software of a particular Contributor. 17 | 18 | 1.4. "Covered Software" 19 | means Source Code Form to which the initial Contributor has attached 20 | the notice in Exhibit A, the Executable Form of such Source Code 21 | Form, and Modifications of such Source Code Form, in each case 22 | including portions thereof. 23 | 24 | 1.5. "Incompatible With Secondary Licenses" 25 | means 26 | 27 | (a) that the initial Contributor has attached the notice described 28 | in Exhibit B to the Covered Software; or 29 | 30 | (b) that the Covered Software was made available under the terms of 31 | version 1.1 or earlier of the License, but not also under the 32 | terms of a Secondary License. 33 | 34 | 1.6. "Executable Form" 35 | means any form of the work other than Source Code Form. 36 | 37 | 1.7. "Larger Work" 38 | means a work that combines Covered Software with other material, in 39 | a separate file or files, that is not Covered Software. 40 | 41 | 1.8. "License" 42 | means this document. 43 | 44 | 1.9. "Licensable" 45 | means having the right to grant, to the maximum extent possible, 46 | whether at the time of the initial grant or subsequently, any and 47 | all of the rights conveyed by this License. 48 | 49 | 1.10. "Modifications" 50 | means any of the following: 51 | 52 | (a) any file in Source Code Form that results from an addition to, 53 | deletion from, or modification of the contents of Covered 54 | Software; or 55 | 56 | (b) any new file in Source Code Form that contains any Covered 57 | Software. 58 | 59 | 1.11. "Patent Claims" of a Contributor 60 | means any patent claim(s), including without limitation, method, 61 | process, and apparatus claims, in any patent Licensable by such 62 | Contributor that would be infringed, but for the grant of the 63 | License, by the making, using, selling, offering for sale, having 64 | made, import, or transfer of either its Contributions or its 65 | Contributor Version. 66 | 67 | 1.12. "Secondary License" 68 | means either the GNU General Public License, Version 2.0, the GNU 69 | Lesser General Public License, Version 2.1, the GNU Affero General 70 | Public License, Version 3.0, or any later versions of those 71 | licenses. 72 | 73 | 1.13. "Source Code Form" 74 | means the form of the work preferred for making modifications. 75 | 76 | 1.14. "You" (or "Your") 77 | means an individual or a legal entity exercising rights under this 78 | License. For legal entities, "You" includes any entity that 79 | controls, is controlled by, or is under common control with You. For 80 | purposes of this definition, "control" means (a) the power, direct 81 | or indirect, to cause the direction or management of such entity, 82 | whether by contract or otherwise, or (b) ownership of more than 83 | fifty percent (50%) of the outstanding shares or beneficial 84 | ownership of such entity. 85 | 86 | 2. License Grants and Conditions 87 | -------------------------------- 88 | 89 | 2.1. Grants 90 | 91 | Each Contributor hereby grants You a world-wide, royalty-free, 92 | non-exclusive license: 93 | 94 | (a) under intellectual property rights (other than patent or trademark) 95 | Licensable by such Contributor to use, reproduce, make available, 96 | modify, display, perform, distribute, and otherwise exploit its 97 | Contributions, either on an unmodified basis, with Modifications, or 98 | as part of a Larger Work; and 99 | 100 | (b) under Patent Claims of such Contributor to make, use, sell, offer 101 | for sale, have made, import, and otherwise transfer either its 102 | Contributions or its Contributor Version. 103 | 104 | 2.2. Effective Date 105 | 106 | The licenses granted in Section 2.1 with respect to any Contribution 107 | become effective for each Contribution on the date the Contributor first 108 | distributes such Contribution. 109 | 110 | 2.3. Limitations on Grant Scope 111 | 112 | The licenses granted in this Section 2 are the only rights granted under 113 | this License. No additional rights or licenses will be implied from the 114 | distribution or licensing of Covered Software under this License. 115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a 116 | Contributor: 117 | 118 | (a) for any code that a Contributor has removed from Covered Software; 119 | or 120 | 121 | (b) for infringements caused by: (i) Your and any other third party's 122 | modifications of Covered Software, or (ii) the combination of its 123 | Contributions with other software (except as part of its Contributor 124 | Version); or 125 | 126 | (c) under Patent Claims infringed by Covered Software in the absence of 127 | its Contributions. 128 | 129 | This License does not grant any rights in the trademarks, service marks, 130 | or logos of any Contributor (except as may be necessary to comply with 131 | the notice requirements in Section 3.4). 132 | 133 | 2.4. Subsequent Licenses 134 | 135 | No Contributor makes additional grants as a result of Your choice to 136 | distribute the Covered Software under a subsequent version of this 137 | License (see Section 10.2) or under the terms of a Secondary License (if 138 | permitted under the terms of Section 3.3). 139 | 140 | 2.5. Representation 141 | 142 | Each Contributor represents that the Contributor believes its 143 | Contributions are its original creation(s) or it has sufficient rights 144 | to grant the rights to its Contributions conveyed by this License. 145 | 146 | 2.6. Fair Use 147 | 148 | This License is not intended to limit any rights You have under 149 | applicable copyright doctrines of fair use, fair dealing, or other 150 | equivalents. 151 | 152 | 2.7. Conditions 153 | 154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 155 | in Section 2.1. 156 | 157 | 3. Responsibilities 158 | ------------------- 159 | 160 | 3.1. Distribution of Source Form 161 | 162 | All distribution of Covered Software in Source Code Form, including any 163 | Modifications that You create or to which You contribute, must be under 164 | the terms of this License. You must inform recipients that the Source 165 | Code Form of the Covered Software is governed by the terms of this 166 | License, and how they can obtain a copy of this License. You may not 167 | attempt to alter or restrict the recipients' rights in the Source Code 168 | Form. 169 | 170 | 3.2. Distribution of Executable Form 171 | 172 | If You distribute Covered Software in Executable Form then: 173 | 174 | (a) such Covered Software must also be made available in Source Code 175 | Form, as described in Section 3.1, and You must inform recipients of 176 | the Executable Form how they can obtain a copy of such Source Code 177 | Form by reasonable means in a timely manner, at a charge no more 178 | than the cost of distribution to the recipient; and 179 | 180 | (b) You may distribute such Executable Form under the terms of this 181 | License, or sublicense it under different terms, provided that the 182 | license for the Executable Form does not attempt to limit or alter 183 | the recipients' rights in the Source Code Form under this License. 184 | 185 | 3.3. Distribution of a Larger Work 186 | 187 | You may create and distribute a Larger Work under terms of Your choice, 188 | provided that You also comply with the requirements of this License for 189 | the Covered Software. If the Larger Work is a combination of Covered 190 | Software with a work governed by one or more Secondary Licenses, and the 191 | Covered Software is not Incompatible With Secondary Licenses, this 192 | License permits You to additionally distribute such Covered Software 193 | under the terms of such Secondary License(s), so that the recipient of 194 | the Larger Work may, at their option, further distribute the Covered 195 | Software under the terms of either this License or such Secondary 196 | License(s). 197 | 198 | 3.4. Notices 199 | 200 | You may not remove or alter the substance of any license notices 201 | (including copyright notices, patent notices, disclaimers of warranty, 202 | or limitations of liability) contained within the Source Code Form of 203 | the Covered Software, except that You may alter any license notices to 204 | the extent required to remedy known factual inaccuracies. 205 | 206 | 3.5. Application of Additional Terms 207 | 208 | You may choose to offer, and to charge a fee for, warranty, support, 209 | indemnity or liability obligations to one or more recipients of Covered 210 | Software. However, You may do so only on Your own behalf, and not on 211 | behalf of any Contributor. You must make it absolutely clear that any 212 | such warranty, support, indemnity, or liability obligation is offered by 213 | You alone, and You hereby agree to indemnify every Contributor for any 214 | liability incurred by such Contributor as a result of warranty, support, 215 | indemnity or liability terms You offer. You may include additional 216 | disclaimers of warranty and limitations of liability specific to any 217 | jurisdiction. 218 | 219 | 4. Inability to Comply Due to Statute or Regulation 220 | --------------------------------------------------- 221 | 222 | If it is impossible for You to comply with any of the terms of this 223 | License with respect to some or all of the Covered Software due to 224 | statute, judicial order, or regulation then You must: (a) comply with 225 | the terms of this License to the maximum extent possible; and (b) 226 | describe the limitations and the code they affect. Such description must 227 | be placed in a text file included with all distributions of the Covered 228 | Software under this License. Except to the extent prohibited by statute 229 | or regulation, such description must be sufficiently detailed for a 230 | recipient of ordinary skill to be able to understand it. 231 | 232 | 5. Termination 233 | -------------- 234 | 235 | 5.1. The rights granted under this License will terminate automatically 236 | if You fail to comply with any of its terms. However, if You become 237 | compliant, then the rights granted under this License from a particular 238 | Contributor are reinstated (a) provisionally, unless and until such 239 | Contributor explicitly and finally terminates Your grants, and (b) on an 240 | ongoing basis, if such Contributor fails to notify You of the 241 | non-compliance by some reasonable means prior to 60 days after You have 242 | come back into compliance. Moreover, Your grants from a particular 243 | Contributor are reinstated on an ongoing basis if such Contributor 244 | notifies You of the non-compliance by some reasonable means, this is the 245 | first time You have received notice of non-compliance with this License 246 | from such Contributor, and You become compliant prior to 30 days after 247 | Your receipt of the notice. 248 | 249 | 5.2. If You initiate litigation against any entity by asserting a patent 250 | infringement claim (excluding declaratory judgment actions, 251 | counter-claims, and cross-claims) alleging that a Contributor Version 252 | directly or indirectly infringes any patent, then the rights granted to 253 | You by any and all Contributors for the Covered Software under Section 254 | 2.1 of this License shall terminate. 255 | 256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 257 | end user license agreements (excluding distributors and resellers) which 258 | have been validly granted by You or Your distributors under this License 259 | prior to termination shall survive termination. 260 | 261 | ************************************************************************ 262 | * * 263 | * 6. Disclaimer of Warranty * 264 | * ------------------------- * 265 | * * 266 | * Covered Software is provided under this License on an "as is" * 267 | * basis, without warranty of any kind, either expressed, implied, or * 268 | * statutory, including, without limitation, warranties that the * 269 | * Covered Software is free of defects, merchantable, fit for a * 270 | * particular purpose or non-infringing. The entire risk as to the * 271 | * quality and performance of the Covered Software is with You. * 272 | * Should any Covered Software prove defective in any respect, You * 273 | * (not any Contributor) assume the cost of any necessary servicing, * 274 | * repair, or correction. This disclaimer of warranty constitutes an * 275 | * essential part of this License. No use of any Covered Software is * 276 | * authorized under this License except under this disclaimer. * 277 | * * 278 | ************************************************************************ 279 | 280 | ************************************************************************ 281 | * * 282 | * 7. Limitation of Liability * 283 | * -------------------------- * 284 | * * 285 | * Under no circumstances and under no legal theory, whether tort * 286 | * (including negligence), contract, or otherwise, shall any * 287 | * Contributor, or anyone who distributes Covered Software as * 288 | * permitted above, be liable to You for any direct, indirect, * 289 | * special, incidental, or consequential damages of any character * 290 | * including, without limitation, damages for lost profits, loss of * 291 | * goodwill, work stoppage, computer failure or malfunction, or any * 292 | * and all other commercial damages or losses, even if such party * 293 | * shall have been informed of the possibility of such damages. This * 294 | * limitation of liability shall not apply to liability for death or * 295 | * personal injury resulting from such party's negligence to the * 296 | * extent applicable law prohibits such limitation. Some * 297 | * jurisdictions do not allow the exclusion or limitation of * 298 | * incidental or consequential damages, so this exclusion and * 299 | * limitation may not apply to You. * 300 | * * 301 | ************************************************************************ 302 | 303 | 8. Litigation 304 | ------------- 305 | 306 | Any litigation relating to this License may be brought only in the 307 | courts of a jurisdiction where the defendant maintains its principal 308 | place of business and such litigation shall be governed by laws of that 309 | jurisdiction, without reference to its conflict-of-law provisions. 310 | Nothing in this Section shall prevent a party's ability to bring 311 | cross-claims or counter-claims. 312 | 313 | 9. Miscellaneous 314 | ---------------- 315 | 316 | This License represents the complete agreement concerning the subject 317 | matter hereof. If any provision of this License is held to be 318 | unenforceable, such provision shall be reformed only to the extent 319 | necessary to make it enforceable. Any law or regulation which provides 320 | that the language of a contract shall be construed against the drafter 321 | shall not be used to construe this License against a Contributor. 322 | 323 | 10. Versions of the License 324 | --------------------------- 325 | 326 | 10.1. New Versions 327 | 328 | Mozilla Foundation is the license steward. Except as provided in Section 329 | 10.3, no one other than the license steward has the right to modify or 330 | publish new versions of this License. Each version will be given a 331 | distinguishing version number. 332 | 333 | 10.2. Effect of New Versions 334 | 335 | You may distribute the Covered Software under the terms of the version 336 | of the License under which You originally received the Covered Software, 337 | or under the terms of any subsequent version published by the license 338 | steward. 339 | 340 | 10.3. Modified Versions 341 | 342 | If you create software not governed by this License, and you want to 343 | create a new license for such software, you may create and use a 344 | modified version of this License if you rename the license and remove 345 | any references to the name of the license steward (except to note that 346 | such modified license differs from this License). 347 | 348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary 349 | Licenses 350 | 351 | If You choose to distribute Source Code Form that is Incompatible With 352 | Secondary Licenses under the terms of this version of the License, the 353 | notice described in Exhibit B of this License must be attached. 354 | 355 | Exhibit A - Source Code Form License Notice 356 | ------------------------------------------- 357 | 358 | This Source Code Form is subject to the terms of the Mozilla Public 359 | License, v. 2.0. If a copy of the MPL was not distributed with this 360 | file, You can obtain one at http://mozilla.org/MPL/2.0/. 361 | 362 | If it is not possible or desirable to put the notice in a particular 363 | file, then You may include the notice in a location (such as a LICENSE 364 | file in a relevant directory) where a recipient would be likely to look 365 | for such a notice. 366 | 367 | You may add additional accurate notices of copyright ownership. 368 | 369 | Exhibit B - "Incompatible With Secondary Licenses" Notice 370 | --------------------------------------------------------- 371 | 372 | This Source Code Form is "Incompatible With Secondary Licenses", as 373 | defined by the Mozilla Public License, v. 2.0. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cdn-ip-tester 2 | 3 | 查找适合自己当前网络环境的优选 CDN Anycast IP 4 | 5 | ## 使用申明 6 | 7 | 本项目侧重于研究任播技术中丢包率与网速的相互关系,仅供学习使用 8 | 9 | 禁止使用范围准则如下 10 | 11 | a) 相关机构提示网页有威胁的,有非法信息提示的网站。 12 | 13 | b)医院类型网站(流产,皮肤病,性病等医院),未获得卫生部资质的网站。 14 | 15 | c)网站主体内容含有色情(视频交友,一夜情交友)、违法(办假证,贩卖仿真枪)、封建迷信、游戏私服、游戏外挂、网赚、两性、美女贴图和动漫贴图(尺度过大)、赌博(含贩卖赌博工具。)、博彩等内容。 16 | 17 | d)网站存在恶意流氓广告(存在非法内容视频链接,非法网页内容链接)。 18 | 19 | e)网站存在任何破坏或试图破坏网络安全的行为,以病毒、木马、恶意代码、钓鱼等方式,试图对网站、网络相关软硬件进行恶意扫描、非法侵入系统、非法获取数据等内容。 20 | 21 | f)网站内容存在版权风险的网站(视频,小说,音乐等网站)。 22 | 23 | g)网站含有药品销售、保健品销售,但未取得资质的,或严重夸大药效事实。 24 | 25 | h)网站主要业务为向非法网站提供支付、交易平台、担保,代理外国金融理财(炒股,炒现货,炒黄金)等服务的网站。 26 | 27 | i)网站中大量存在影响社会和谐稳定的内容的网站(涉嫌攻击国家,攻击领导人,攻击人民,言论煽动性质网站)。 28 | 29 | j)网站内容含有国家相关法律法规不允许的其他内容。 30 | 31 | k)网站内容含有VPN,网络代理等内容。 32 | 33 | l) 通过技术手段或非技术手段干扰Cloudflare所有产品正常运营的网站。 34 | 35 | m)网站内容为发布虚假不实消息行为,或侵害了他人的合法权益行为的网站。 36 | 37 | n) 获取网站内容需要通过登录等方式,无法直接查看造成内容无法审核的网站。 38 | 39 | o) 提供影视、软件和应用等下载服务的网站。 40 | 41 | ## 项目说明 42 | 43 | 本项目依托 [sing-box](https://github.com/SagerNet/sing-box),用于测试本机经过 cdn 后到达服务器的整体延迟 44 | 45 | 与 better-cloudflare-ip 的不同: 46 | 47 | better-cloudflare-ip 测试的是 **本机->cf** 的延迟 48 | cdn-ip-tester 测试的是 **本机->cf->服务器** 的延迟 49 | 50 | 需要将 sing-box 的可执行文件放到当前目录下 51 | 52 | ## 原理 53 | 54 | 根据提供的 cdn 网段,自动生成 sing-box 的配置文件,形成多个 socks5 的代理,随后自动使用 socks5 55 | 代理访问 `http://{domain}{path}` 并将返回结果与 `{body}` 进行比较,同时计算总时间记为 rtt 56 | 57 | ![原理图](./img/struct.png) 58 | 59 | ## 命令行参数 60 | 61 | + `--ignore-body-warning` 忽略 body 不匹配的警告信息 62 | + `--ip-file` 输入的 ip 列表 63 | + `--subnet-count` 测试前 `subnet_count` 个子网,默认为 0,表示测试所有子网 64 | + `--no-cache` 忽略 cache 开始新的测试 65 | + `--data-dir` 默认为 `data` 66 | + `--auto-skip` 自动跳过看起来不会有结果的 ip 段,判断标准:当 `current_subnet_start` 大于等于 `enable_threshold` 时,若是该 67 | ip 段一个合法的结果都没有,则直接跳过该 ip 段 68 | + `--enable-threshold` 结合 `auto-skip` 使用, 默认为 5 69 | 70 | ## 模板文件 71 | 72 | 存储位置为 `data/{filename}` 73 | 74 | ### sing-box-template.json 75 | 76 | sing-box 的模板,cdn-ip-tester 会自动以该文件为模板,向 `inbounds`,`outbounds` 与 `rules` 77 | 中添加配置后生成 `sing-box-test-config.json` 78 | 79 | ### outbound-template.json 80 | 81 | sing-box outbound 的模板, cdn-ip-tester 会自动为其添加 `tag` 和 `server` 后合并进 sing-box 82 | template,`outbound-template.json` 为 trojan+ws+0rtt 的配置样例 83 | 84 | ## 配置文件 85 | 86 | 存储位置为 `data/{filename}` 87 | 88 | ### ip-tester.toml 89 | 90 | cdn-ip-tester 的配置文件 91 | 92 | ```toml 93 | port_base = 31000 # 本机监听的最小端口值 94 | max_connection_count = 50 # 同时测试的最大连接数 95 | server_url = "http://127.0.0.1/" # 远程 url 96 | cdn_url = "" # cdn url, 为空表示直接访问 cdn 的 ip 97 | listen_ip = "127.0.0.2" # 绑定的本机 ip 98 | max_rtt = 800 # 最大延迟,超时后的结果会被自动丢弃 99 | server_res_body = "" # {server_url} 的返回结果需要包含 {server_res_body}, 为空则表示忽略返回结果检查 100 | cdn_res_body = "error code: 1003" # {server_url} 的返回结果需要包含 {cdn_res_body},为空则表示忽略返回结果检查 101 | max_subnet_len = 256 # 子网内最多选取多少个 ip 102 | ``` 103 | 104 | ## 缓存文件 105 | 106 | 存储位置为 `data/{filename}` 107 | 108 | ### result.txt 109 | 110 | 其中存储了延迟测试的结果,如果该文件存在每次运行时都会自动加载其中的数据 111 | 112 | ### result_cache.toml 113 | 114 | 其中存储了延迟测试的进度,如果该文件存在每次运行时都会自动加载其中的数据 115 | 116 | ## 元数据 117 | 118 | ### get-cf-ip.py 119 | 120 | 从 https://bgp.he.net/ 自动获取属于 cf 的网段,并写入 `cf-v4.txt`, `cf-v6.txt` 121 | 122 | ### cf-v4.txt 123 | 124 | cloudflare 的 ipv4 网段 125 | 126 | ### cf-v6.txt 127 | 128 | cloudflare 的 ipv6 网段 129 | 130 | ## 测试顺序 131 | 132 | 按子网顺序依次测试,每个子网轮流测试一个,然后循环到第一个子网,每个子网最多选取 {max_subnet_len} 个 IP,若是子网的 IP 数大于 133 | {max_subnet_len},则随机选取(**WIP**) 134 | {max_subnet_len} 个 IP 135 | 136 | ## 使用方式 137 | 138 | 1. 获取可执行文件 cdn-ip-tester (从 release 获取或者自己编译) 139 | 2. 下载对应的 sing-box 可执行文件 140 | 3. 获取对应的元数据,模板,配置文件,并放入对应的数据目录(默认为 141 | data):`outbound-template.json`,`sing-box-template.json`,`ip-tester.toml` 142 | 4. 根据 `outbound-template.json` 编写自己的 `outbound-template.json` 143 | 5. 修改 `ip-tester.toml` 以适配自己的服务器 144 | 6. ./cdn-ip-tester --ip-file cf-v4.txt --auto-skip 145 | 146 | 注:上文的获取 sing-box 和获取数据(第 3,4 步)在 amd64 linux 下可以通过执行 bash 指令完成: 147 | 148 | ```bash 149 | sh -c "$(curl -fsSL https://raw.githubusercontent.com/plusls/cdn-ip-tester/master/get-data.sh)" 150 | ``` 151 | 152 | ## 引用声明 153 | 154 | 本项目参考了 https://github.com/badafans/better-cloudflare-ip 155 | 156 | 对于 Cloudflare ASN https://bgp.he.net/AS13335 ,Cloudflare IP Ranges 来自 https://www.cloudflare.com/zh-cn/ips/ -------------------------------------------------------------------------------- /cdn-ip-tester-derive/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 = "cdn-ip-tester-derive" 7 | version = "0.1.0" 8 | dependencies = [ 9 | "proc-macro2", 10 | "quote", 11 | "syn", 12 | ] 13 | 14 | [[package]] 15 | name = "proc-macro2" 16 | version = "1.0.51" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" 19 | dependencies = [ 20 | "unicode-ident", 21 | ] 22 | 23 | [[package]] 24 | name = "quote" 25 | version = "1.0.23" 26 | source = "registry+https://github.com/rust-lang/crates.io-index" 27 | checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" 28 | dependencies = [ 29 | "proc-macro2", 30 | ] 31 | 32 | [[package]] 33 | name = "syn" 34 | version = "1.0.109" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 37 | dependencies = [ 38 | "proc-macro2", 39 | "quote", 40 | "unicode-ident", 41 | ] 42 | 43 | [[package]] 44 | name = "unicode-ident" 45 | version = "1.0.8" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" 48 | -------------------------------------------------------------------------------- /cdn-ip-tester-derive/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "cdn-ip-tester-derive" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | [lib] 8 | proc-macro = true 9 | 10 | [dependencies] 11 | syn = "2.0.43" 12 | quote = "1.0.33" 13 | proc-macro2 = "1.0.71" -------------------------------------------------------------------------------- /cdn-ip-tester-derive/src/lib.rs: -------------------------------------------------------------------------------- 1 | 2 | use proc_macro::TokenStream; 3 | 4 | use proc_macro2::TokenStream as TokenStream2; 5 | use quote::quote; 6 | use syn::parse_macro_input; 7 | use syn::DeriveInput; 8 | 9 | #[proc_macro_derive(JsonLoadable)] 10 | pub fn derive_json_loadable(input: TokenStream) -> TokenStream { 11 | let mut input = parse_macro_input!(input as DeriveInput); 12 | expand_derive_json_loadable(&mut input) 13 | .unwrap_or_else(to_compile_errors) 14 | .into() 15 | } 16 | 17 | #[proc_macro_derive(TomlLoadable)] 18 | pub fn derive_toml_loadable(input: TokenStream) -> TokenStream { 19 | let mut input = parse_macro_input!(input as DeriveInput); 20 | expand_derive_toml_loadable(&mut input) 21 | .unwrap_or_else(to_compile_errors) 22 | .into() 23 | } 24 | 25 | #[proc_macro_derive(JsonSavable)] 26 | pub fn derive_json_savable(input: TokenStream) -> TokenStream { 27 | let mut input = parse_macro_input!(input as DeriveInput); 28 | expand_derive_json_savable(&mut input) 29 | .unwrap_or_else(to_compile_errors) 30 | .into() 31 | } 32 | 33 | #[proc_macro_derive(TomlSavable)] 34 | pub fn derive_toml_savable(input: TokenStream) -> TokenStream { 35 | let mut input = parse_macro_input!(input as DeriveInput); 36 | expand_derive_toml_savable(&mut input) 37 | .unwrap_or_else(to_compile_errors) 38 | .into() 39 | } 40 | 41 | fn to_compile_errors(errors: Vec) -> proc_macro2::TokenStream { 42 | let compile_errors = errors.iter().map(syn::Error::to_compile_error); 43 | quote!(#(#compile_errors)*) 44 | } 45 | 46 | fn expand_derive_json_loadable(input: &mut DeriveInput) -> Result> { 47 | let name = &input.ident; 48 | let gen = quote! { 49 | impl crate::data::Loadable for #name { 50 | fn from_str(s: &str) -> crate::error::Result { 51 | Ok(serde_json::from_str(s).map_err(crate::error::DeserializedError::from)?) 52 | } 53 | } 54 | }; 55 | Ok(gen) 56 | } 57 | 58 | fn expand_derive_toml_loadable(input: &mut DeriveInput) -> Result> { 59 | let name = &input.ident; 60 | let gen = quote! { 61 | impl crate::data::Loadable for #name { 62 | fn from_str(s: &str) -> crate::error::Result { 63 | Ok(toml::from_str(s).map_err(crate::error::DeserializedError::from)?) 64 | } 65 | } 66 | }; 67 | Ok(gen) 68 | } 69 | 70 | fn expand_derive_toml_savable(input: &mut DeriveInput) -> Result> { 71 | let name = &input.ident; 72 | let gen = quote! { 73 | impl crate::data::Savable for #name { 74 | fn to_string(&self) -> crate::error::Result { 75 | Ok(toml::to_string(self).map_err(crate::error::SerializedError::from)?) 76 | } 77 | } 78 | }; 79 | Ok(gen) 80 | } 81 | 82 | fn expand_derive_json_savable(input: &mut DeriveInput) -> Result> { 83 | let name = &input.ident; 84 | let gen = quote! { 85 | impl crate::data::Savable for #name { 86 | fn to_string(&self) -> crate::error::Result { 87 | Ok(serde_json::to_string(self).map_err(crate::error::SerializedError::from)?) 88 | } 89 | } 90 | }; 91 | Ok(gen) 92 | } 93 | -------------------------------------------------------------------------------- /cf-v4.txt: -------------------------------------------------------------------------------- 1 | 8.17.207.0/24 2 | 8.48.131.0/24 3 | 103.31.4.0/22 4 | 104.30.0.0/24 5 | 162.159.79.0/24 6 | 172.69.209.0/24 7 | 172.71.18.0/24 8 | 172.71.91.0/24 9 | 172.71.136.0/24 10 | 173.245.60.0/23 11 | 198.41.128.0/24 12 | 198.41.130.0/24 13 | 198.41.132.0/22 14 | 198.41.136.0/22 15 | 5.226.179.0/24 16 | 5.226.181.0/24 17 | 8.12.10.0/24 18 | 12.221.133.0/24 19 | 23.141.168.0/24 20 | 23.178.112.0/24 21 | 23.247.163.0/24 22 | 31.43.179.0/24 23 | 38.67.242.0/24 24 | 45.8.104.0/22 25 | 45.8.211.0/24 26 | 45.12.30.0/23 27 | 45.14.174.0/24 28 | 45.80.111.0/24 29 | 45.84.59.0/24 30 | 45.85.118.0/23 31 | 45.87.175.0/24 32 | 45.94.169.0/24 33 | 45.95.241.0/24 34 | 45.131.4.0/22 35 | 45.131.208.0/22 36 | 45.133.247.0/24 37 | 45.137.99.0/24 38 | 45.142.120.0/24 39 | 45.145.28.0/24 40 | 45.145.29.0/24 41 | 45.158.56.0/24 42 | 45.159.216.0/22 43 | 64.21.2.0/24 44 | 65.205.150.0/24 45 | 66.81.247.0/24 46 | 66.81.255.0/24 47 | 67.131.109.0/24 48 | 72.52.113.0/24 49 | 80.94.83.0/24 50 | 89.47.56.0/23 51 | 89.116.250.0/24 52 | 89.207.18.0/24 53 | 91.192.106.0/23 54 | 91.193.58.0/23 55 | 91.195.110.0/24 56 | 91.199.81.0/24 57 | 91.221.116.0/24 58 | 93.114.64.0/23 59 | 95.214.178.0/23 60 | 103.11.212.0/24 61 | 103.11.214.0/24 62 | 103.79.228.0/23 63 | 103.112.176.0/24 64 | 103.121.59.0/24 65 | 103.156.22.0/23 66 | 103.160.204.0/24 67 | 103.168.172.0/24 68 | 103.169.142.0/24 69 | 103.172.110.0/23 70 | 103.204.13.0/24 71 | 103.244.116.0/22 72 | 104.234.158.0/24 73 | 104.254.140.0/24 74 | 108.165.216.0/24 75 | 123.253.174.0/24 76 | 141.11.194.0/23 77 | 141.193.213.0/24 78 | 146.19.22.0/24 79 | 147.78.121.0/24 80 | 147.78.140.0/24 81 | 147.185.161.0/24 82 | 154.51.129.0/24 83 | 154.51.160.0/24 84 | 154.83.2.0/24 85 | 154.83.22.0/23 86 | 154.83.30.0/23 87 | 154.84.14.0/23 88 | 154.84.16.0/21 89 | 154.84.24.0/22 90 | 154.84.175.0/24 91 | 154.85.8.0/22 92 | 154.85.99.0/24 93 | 154.94.8.0/23 94 | 154.219.2.0/23 95 | 156.237.4.0/23 96 | 156.238.14.0/23 97 | 156.238.18.0/23 98 | 156.239.152.0/22 99 | 159.112.235.0/24 100 | 159.246.55.0/24 101 | 160.153.0.0/24 102 | 162.44.104.0/22 103 | 164.38.155.0/24 104 | 167.1.148.0/24 105 | 167.1.150.0/24 106 | 168.100.6.0/24 107 | 170.114.45.0/24 108 | 170.114.46.0/24 109 | 170.114.52.0/24 110 | 172.83.72.0/24 111 | 172.83.73.0/24 112 | 172.83.76.0/24 113 | 174.136.134.0/24 114 | 176.126.206.0/23 115 | 185.7.190.0/23 116 | 185.18.250.0/24 117 | 185.38.135.0/24 118 | 185.59.218.0/24 119 | 185.67.124.0/24 120 | 185.72.49.0/24 121 | 185.109.21.0/24 122 | 185.135.9.0/24 123 | 185.148.104.0/24 124 | 185.148.105.0/24 125 | 185.148.106.0/24 126 | 185.148.107.0/24 127 | 185.162.228.0/23 128 | 185.162.230.0/23 129 | 185.170.166.0/24 130 | 185.173.35.0/24 131 | 185.174.138.0/24 132 | 185.176.24.0/24 133 | 185.176.26.0/24 134 | 185.193.28.0/23 135 | 185.193.30.0/23 136 | 185.201.139.0/24 137 | 185.207.92.0/24 138 | 185.209.154.0/24 139 | 185.213.240.0/24 140 | 185.213.243.0/24 141 | 185.221.160.0/24 142 | 185.234.22.0/24 143 | 185.238.228.0/24 144 | 185.244.106.0/24 145 | 188.42.88.0/24 146 | 188.42.89.0/24 147 | 188.244.122.0/24 148 | 191.101.251.0/24 149 | 192.65.217.0/24 150 | 192.133.11.0/24 151 | 193.9.49.0/24 152 | 193.16.63.0/24 153 | 193.17.206.0/24 154 | 193.67.144.0/24 155 | 193.188.14.0/24 156 | 193.227.99.0/24 157 | 194.1.194.0/24 158 | 194.36.49.0/24 159 | 194.36.55.0/24 160 | 194.36.216.0/24 161 | 194.36.217.0/24 162 | 194.36.218.0/24 163 | 194.36.219.0/24 164 | 194.40.240.0/24 165 | 194.40.241.0/24 166 | 194.53.53.0/24 167 | 194.87.58.0/23 168 | 194.152.44.0/24 169 | 194.169.194.0/24 170 | 195.85.23.0/24 171 | 195.85.59.0/24 172 | 195.137.167.0/24 173 | 195.245.221.0/24 174 | 196.13.241.0/24 175 | 196.207.45.0/24 176 | 198.96.214.0/24 177 | 199.60.103.0/24 178 | 199.181.197.0/24 179 | 199.212.90.0/24 180 | 202.82.250.0/24 181 | 203.13.32.0/24 182 | 203.17.126.0/24 183 | 203.19.222.0/24 184 | 203.22.223.0/24 185 | 203.23.103.0/24 186 | 203.23.104.0/24 187 | 203.23.106.0/24 188 | 203.24.102.0/24 189 | 203.24.103.0/24 190 | 203.24.108.0/24 191 | 203.24.109.0/24 192 | 203.28.8.0/24 193 | 203.28.9.0/24 194 | 203.29.52.0/24 195 | 203.29.53.0/24 196 | 203.29.54.0/23 197 | 203.30.188.0/22 198 | 203.32.120.0/23 199 | 203.34.28.0/24 200 | 203.34.80.0/24 201 | 203.55.107.0/24 202 | 203.89.5.0/24 203 | 203.107.173.0/24 204 | 203.193.21.0/24 205 | 204.62.141.0/24 206 | 204.68.111.0/24 207 | 204.209.72.0/24 208 | 204.209.73.0/24 209 | 205.233.181.0/24 210 | 206.196.23.0/24 211 | 207.189.149.0/24 212 | 208.100.60.0/24 213 | 212.24.127.0/24 214 | 212.110.134.0/23 215 | 212.239.86.0/24 216 | 216.116.134.0/24 217 | 216.120.180.0/23 218 | 185.122.0.0/24 219 | 141.101.64.0/24 220 | 141.101.91.0/24 221 | 172.71.32.0/19 222 | 198.41.148.0/22 223 | 198.41.148.0/24 224 | 198.41.152.0/22 225 | 198.41.245.0/24 226 | 198.41.252.0/24 227 | 198.41.253.0/24 228 | 198.41.255.0/24 229 | 185.212.144.0/24 230 | 1.0.0.0/24 231 | 1.1.1.0/24 232 | 8.6.144.0/24 233 | 8.6.145.0/24 234 | 8.6.146.0/24 235 | 8.9.231.0/24 236 | 8.10.148.0/24 237 | 8.14.199.0/24 238 | 8.14.201.0/24 239 | 8.14.202.0/24 240 | 8.14.203.0/24 241 | 8.14.204.0/24 242 | 8.17.205.0/24 243 | 8.17.206.0/24 244 | 8.18.50.0/24 245 | 8.18.113.0/24 246 | 8.18.194.0/24 247 | 8.18.195.0/24 248 | 8.18.196.0/24 249 | 8.19.8.0/24 250 | 8.20.100.0/24 251 | 8.20.101.0/24 252 | 8.20.103.0/24 253 | 8.20.122.0/24 254 | 8.20.123.0/24 255 | 8.20.124.0/24 256 | 8.20.125.0/24 257 | 8.20.126.0/24 258 | 8.20.253.0/24 259 | 8.21.8.0/24 260 | 8.21.9.0/24 261 | 8.21.10.0/24 262 | 8.21.13.0/24 263 | 8.21.110.0/24 264 | 8.21.111.0/24 265 | 8.21.239.0/24 266 | 8.23.139.0/24 267 | 8.23.240.0/24 268 | 8.24.87.0/24 269 | 8.24.242.0/24 270 | 8.24.243.0/24 271 | 8.24.244.0/24 272 | 8.25.96.0/24 273 | 8.25.97.0/24 274 | 8.25.249.0/24 275 | 8.26.180.0/24 276 | 8.26.182.0/24 277 | 8.27.64.0/24 278 | 8.27.66.0/24 279 | 8.27.67.0/24 280 | 8.27.68.0/24 281 | 8.27.69.0/24 282 | 8.27.79.0/24 283 | 8.28.20.0/24 284 | 8.28.82.0/24 285 | 8.28.126.0/24 286 | 8.28.213.0/24 287 | 8.29.105.0/24 288 | 8.29.230.0/24 289 | 8.29.231.0/24 290 | 8.30.234.0/24 291 | 8.31.2.0/24 292 | 8.31.161.0/24 293 | 8.34.69.0/24 294 | 8.34.70.0/24 295 | 8.34.71.0/24 296 | 8.34.200.0/24 297 | 8.34.201.0/24 298 | 8.34.202.0/24 299 | 8.35.57.0/24 300 | 8.35.58.0/24 301 | 8.35.59.0/24 302 | 8.35.149.0/24 303 | 8.35.211.0/24 304 | 8.36.216.0/24 305 | 8.36.217.0/24 306 | 8.36.218.0/24 307 | 8.36.219.0/24 308 | 8.36.220.0/24 309 | 8.37.41.0/24 310 | 8.37.43.0/24 311 | 8.38.147.0/24 312 | 8.38.148.0/24 313 | 8.38.149.0/24 314 | 8.38.172.0/24 315 | 8.39.6.0/24 316 | 8.39.18.0/24 317 | 8.39.125.0/24 318 | 8.39.126.0/24 319 | 8.39.201.0/24 320 | 8.39.202.0/24 321 | 8.39.203.0/24 322 | 8.39.204.0/24 323 | 8.39.205.0/24 324 | 8.39.206.0/24 325 | 8.39.207.0/24 326 | 8.39.212.0/24 327 | 8.39.213.0/24 328 | 8.39.214.0/24 329 | 8.39.215.0/24 330 | 8.40.26.0/24 331 | 8.40.27.0/24 332 | 8.40.28.0/24 333 | 8.40.29.0/24 334 | 8.40.30.0/24 335 | 8.40.31.0/24 336 | 8.40.107.0/24 337 | 8.40.111.0/24 338 | 8.40.140.0/24 339 | 8.41.5.0/24 340 | 8.41.6.0/24 341 | 8.41.7.0/24 342 | 8.41.36.0/24 343 | 8.41.37.0/24 344 | 8.42.51.0/24 345 | 8.42.52.0/24 346 | 8.42.54.0/24 347 | 8.42.55.0/24 348 | 8.42.161.0/24 349 | 8.42.164.0/24 350 | 8.42.172.0/24 351 | 8.42.245.0/24 352 | 8.43.121.0/24 353 | 8.43.122.0/24 354 | 8.43.123.0/24 355 | 8.43.224.0/24 356 | 8.43.225.0/24 357 | 8.43.226.0/24 358 | 8.44.0.0/24 359 | 8.44.1.0/24 360 | 8.44.2.0/24 361 | 8.44.3.0/24 362 | 8.44.6.0/24 363 | 8.44.58.0/24 364 | 8.44.60.0/24 365 | 8.44.61.0/24 366 | 8.44.62.0/24 367 | 8.44.63.0/24 368 | 8.45.41.0/24 369 | 8.45.43.0/24 370 | 8.45.44.0/24 371 | 8.45.45.0/24 372 | 8.45.46.0/24 373 | 8.45.47.0/24 374 | 8.45.97.0/24 375 | 8.45.101.0/24 376 | 8.45.102.0/24 377 | 8.45.108.0/24 378 | 8.45.111.0/24 379 | 8.45.144.0/24 380 | 8.45.145.0/24 381 | 8.45.146.0/24 382 | 8.45.147.0/24 383 | 8.46.113.0/24 384 | 8.46.114.0/24 385 | 8.46.115.0/24 386 | 8.46.117.0/24 387 | 8.46.118.0/24 388 | 8.46.119.0/24 389 | 8.47.9.0/24 390 | 8.47.12.0/24 391 | 8.47.13.0/24 392 | 8.47.14.0/24 393 | 8.47.15.0/24 394 | 8.47.69.0/24 395 | 8.47.71.0/24 396 | 8.48.130.0/24 397 | 8.48.132.0/24 398 | 8.48.133.0/24 399 | 8.48.134.0/24 400 | 23.227.37.0/24 401 | 23.227.38.0/23 402 | 23.227.60.0/24 403 | 64.68.192.0/24 404 | 65.110.63.0/24 405 | 66.235.200.0/24 406 | 68.67.65.0/24 407 | 91.234.214.0/24 408 | 103.21.244.0/24 409 | 103.22.200.0/24 410 | 103.22.201.0/24 411 | 103.22.202.0/24 412 | 103.22.203.0/24 413 | 103.81.228.0/24 414 | 104.16.0.0/12 415 | 104.16.0.0/20 416 | 104.16.16.0/20 417 | 104.16.32.0/20 418 | 104.16.48.0/20 419 | 104.16.64.0/20 420 | 104.16.80.0/20 421 | 104.16.96.0/20 422 | 104.16.112.0/20 423 | 104.16.128.0/20 424 | 104.16.144.0/20 425 | 104.16.160.0/20 426 | 104.16.176.0/20 427 | 104.16.192.0/20 428 | 104.16.208.0/20 429 | 104.16.224.0/20 430 | 104.16.240.0/20 431 | 104.17.0.0/20 432 | 104.17.16.0/20 433 | 104.17.32.0/20 434 | 104.17.48.0/20 435 | 104.17.64.0/20 436 | 104.17.80.0/20 437 | 104.17.96.0/20 438 | 104.17.112.0/20 439 | 104.17.128.0/20 440 | 104.17.144.0/20 441 | 104.17.160.0/20 442 | 104.17.176.0/20 443 | 104.17.192.0/20 444 | 104.17.208.0/20 445 | 104.17.224.0/20 446 | 104.17.240.0/20 447 | 104.18.0.0/20 448 | 104.18.16.0/20 449 | 104.18.32.0/19 450 | 104.18.32.0/20 451 | 104.18.32.0/24 452 | 104.18.33.0/24 453 | 104.18.34.0/24 454 | 104.18.35.0/24 455 | 104.18.36.0/24 456 | 104.18.37.0/24 457 | 104.18.38.0/24 458 | 104.18.39.0/24 459 | 104.18.40.0/24 460 | 104.18.41.0/24 461 | 104.18.42.0/24 462 | 104.18.43.0/24 463 | 104.18.44.0/24 464 | 104.18.45.0/24 465 | 104.18.46.0/24 466 | 104.18.47.0/24 467 | 104.18.48.0/24 468 | 104.18.49.0/24 469 | 104.18.50.0/24 470 | 104.18.51.0/24 471 | 104.18.52.0/24 472 | 104.18.53.0/24 473 | 104.18.54.0/24 474 | 104.18.55.0/24 475 | 104.18.56.0/24 476 | 104.18.57.0/24 477 | 104.18.58.0/24 478 | 104.18.59.0/24 479 | 104.18.60.0/24 480 | 104.18.61.0/24 481 | 104.18.62.0/24 482 | 104.18.63.0/24 483 | 104.18.64.0/20 484 | 104.18.80.0/20 485 | 104.18.96.0/20 486 | 104.18.112.0/20 487 | 104.18.128.0/20 488 | 104.18.144.0/20 489 | 104.18.160.0/20 490 | 104.18.176.0/20 491 | 104.18.192.0/20 492 | 104.18.208.0/20 493 | 104.18.224.0/20 494 | 104.18.240.0/20 495 | 104.19.0.0/20 496 | 104.19.16.0/20 497 | 104.19.32.0/20 498 | 104.19.48.0/20 499 | 104.19.64.0/20 500 | 104.19.80.0/20 501 | 104.19.96.0/20 502 | 104.19.112.0/20 503 | 104.19.128.0/20 504 | 104.19.144.0/20 505 | 104.19.160.0/20 506 | 104.19.176.0/20 507 | 104.19.192.0/20 508 | 104.19.208.0/20 509 | 104.19.224.0/20 510 | 104.19.240.0/20 511 | 104.20.0.0/20 512 | 104.20.16.0/20 513 | 104.20.32.0/20 514 | 104.20.48.0/20 515 | 104.20.64.0/20 516 | 104.20.80.0/20 517 | 104.20.96.0/20 518 | 104.20.112.0/20 519 | 104.20.128.0/20 520 | 104.20.144.0/20 521 | 104.20.160.0/20 522 | 104.20.176.0/20 523 | 104.20.192.0/20 524 | 104.20.208.0/20 525 | 104.20.224.0/20 526 | 104.20.240.0/20 527 | 104.21.0.0/19 528 | 104.21.0.0/20 529 | 104.21.16.0/20 530 | 104.21.32.0/19 531 | 104.21.32.0/20 532 | 104.21.48.0/20 533 | 104.21.64.0/19 534 | 104.21.64.0/20 535 | 104.21.80.0/20 536 | 104.21.96.0/19 537 | 104.21.96.0/20 538 | 104.21.112.0/20 539 | 104.21.192.0/19 540 | 104.21.192.0/20 541 | 104.21.208.0/20 542 | 104.21.224.0/20 543 | 104.22.0.0/20 544 | 104.22.16.0/20 545 | 104.22.32.0/20 546 | 104.22.48.0/20 547 | 104.22.64.0/20 548 | 104.23.96.0/20 549 | 104.23.112.0/20 550 | 104.23.128.0/20 551 | 104.24.0.0/20 552 | 104.24.16.0/20 553 | 104.24.32.0/20 554 | 104.24.48.0/20 555 | 104.24.64.0/20 556 | 104.24.80.0/20 557 | 104.24.128.0/20 558 | 104.24.144.0/20 559 | 104.24.160.0/20 560 | 104.24.176.0/20 561 | 104.24.192.0/20 562 | 104.24.208.0/20 563 | 104.24.224.0/20 564 | 104.24.240.0/20 565 | 104.25.0.0/20 566 | 104.25.16.0/20 567 | 104.25.32.0/20 568 | 104.25.48.0/20 569 | 104.25.64.0/20 570 | 104.25.80.0/20 571 | 104.25.96.0/20 572 | 104.25.112.0/20 573 | 104.25.128.0/20 574 | 104.25.144.0/20 575 | 104.25.160.0/20 576 | 104.25.176.0/20 577 | 104.25.192.0/20 578 | 104.25.208.0/20 579 | 104.25.224.0/20 580 | 104.25.240.0/20 581 | 104.26.0.0/20 582 | 104.27.0.0/20 583 | 104.27.16.0/20 584 | 104.27.32.0/20 585 | 104.27.48.0/20 586 | 104.27.64.0/20 587 | 104.27.80.0/20 588 | 104.27.96.0/20 589 | 104.27.112.0/20 590 | 104.27.192.0/20 591 | 104.28.0.0/19 592 | 104.28.0.0/20 593 | 104.28.0.0/24 594 | 104.28.1.0/24 595 | 104.28.2.0/24 596 | 104.28.3.0/24 597 | 104.28.4.0/24 598 | 104.28.6.0/24 599 | 104.28.7.0/24 600 | 104.28.8.0/24 601 | 104.28.9.0/24 602 | 104.28.10.0/24 603 | 104.28.11.0/24 604 | 104.28.12.0/24 605 | 104.28.13.0/24 606 | 104.28.14.0/24 607 | 104.28.15.0/24 608 | 104.28.16.0/20 609 | 104.28.16.0/24 610 | 104.28.17.0/24 611 | 104.28.18.0/24 612 | 104.28.19.0/24 613 | 104.28.20.0/24 614 | 104.28.21.0/24 615 | 104.28.22.0/24 616 | 104.28.23.0/24 617 | 104.28.24.0/24 618 | 104.28.25.0/24 619 | 104.28.26.0/24 620 | 104.28.27.0/24 621 | 104.28.28.0/24 622 | 104.28.29.0/24 623 | 104.28.30.0/24 624 | 104.28.31.0/24 625 | 104.28.32.0/19 626 | 104.28.32.0/20 627 | 104.28.32.0/24 628 | 104.28.33.0/24 629 | 104.28.34.0/24 630 | 104.28.35.0/24 631 | 104.28.36.0/24 632 | 104.28.37.0/24 633 | 104.28.38.0/24 634 | 104.28.39.0/24 635 | 104.28.40.0/24 636 | 104.28.41.0/24 637 | 104.28.42.0/24 638 | 104.28.43.0/24 639 | 104.28.44.0/24 640 | 104.28.45.0/24 641 | 104.28.46.0/24 642 | 104.28.47.0/24 643 | 104.28.48.0/20 644 | 104.28.48.0/24 645 | 104.28.49.0/24 646 | 104.28.50.0/24 647 | 104.28.51.0/24 648 | 104.28.52.0/24 649 | 104.28.53.0/24 650 | 104.28.54.0/24 651 | 104.28.55.0/24 652 | 104.28.56.0/24 653 | 104.28.57.0/24 654 | 104.28.58.0/24 655 | 104.28.59.0/24 656 | 104.28.60.0/24 657 | 104.28.61.0/24 658 | 104.28.62.0/24 659 | 104.28.63.0/24 660 | 104.28.64.0/19 661 | 104.28.64.0/20 662 | 104.28.64.0/24 663 | 104.28.65.0/24 664 | 104.28.66.0/24 665 | 104.28.67.0/24 666 | 104.28.68.0/24 667 | 104.28.69.0/24 668 | 104.28.70.0/24 669 | 104.28.71.0/24 670 | 104.28.72.0/24 671 | 104.28.73.0/24 672 | 104.28.74.0/24 673 | 104.28.75.0/24 674 | 104.28.76.0/24 675 | 104.28.77.0/24 676 | 104.28.78.0/24 677 | 104.28.79.0/24 678 | 104.28.80.0/20 679 | 104.28.80.0/24 680 | 104.28.81.0/24 681 | 104.28.82.0/24 682 | 104.28.83.0/24 683 | 104.28.84.0/24 684 | 104.28.85.0/24 685 | 104.28.86.0/24 686 | 104.28.87.0/24 687 | 104.28.88.0/24 688 | 104.28.89.0/24 689 | 104.28.90.0/24 690 | 104.28.91.0/24 691 | 104.28.92.0/24 692 | 104.28.93.0/24 693 | 104.28.94.0/24 694 | 104.28.95.0/24 695 | 104.28.96.0/19 696 | 104.28.96.0/20 697 | 104.28.96.0/24 698 | 104.28.97.0/24 699 | 104.28.98.0/24 700 | 104.28.99.0/24 701 | 104.28.100.0/24 702 | 104.28.101.0/24 703 | 104.28.102.0/24 704 | 104.28.103.0/24 705 | 104.28.104.0/24 706 | 104.28.105.0/24 707 | 104.28.106.0/24 708 | 104.28.107.0/24 709 | 104.28.108.0/24 710 | 104.28.109.0/24 711 | 104.28.110.0/24 712 | 104.28.111.0/24 713 | 104.28.112.0/20 714 | 104.28.112.0/24 715 | 104.28.113.0/24 716 | 104.28.114.0/24 717 | 104.28.115.0/24 718 | 104.28.116.0/24 719 | 104.28.117.0/24 720 | 104.28.118.0/24 721 | 104.28.119.0/24 722 | 104.28.120.0/24 723 | 104.28.121.0/24 724 | 104.28.122.0/24 725 | 104.28.123.0/24 726 | 104.28.124.0/24 727 | 104.28.125.0/24 728 | 104.28.126.0/24 729 | 104.28.127.0/24 730 | 104.28.128.0/19 731 | 104.28.128.0/20 732 | 104.28.128.0/24 733 | 104.28.129.0/24 734 | 104.28.130.0/24 735 | 104.28.131.0/24 736 | 104.28.132.0/24 737 | 104.28.133.0/24 738 | 104.28.134.0/24 739 | 104.28.135.0/24 740 | 104.28.144.0/20 741 | 104.28.144.0/24 742 | 104.28.145.0/24 743 | 104.28.146.0/24 744 | 104.28.147.0/24 745 | 104.28.148.0/24 746 | 104.28.149.0/24 747 | 104.28.150.0/24 748 | 104.28.151.0/24 749 | 104.28.152.0/24 750 | 104.28.153.0/24 751 | 104.28.154.0/24 752 | 104.28.155.0/24 753 | 104.28.156.0/24 754 | 104.28.157.0/24 755 | 104.28.158.0/24 756 | 104.28.159.0/24 757 | 104.28.160.0/19 758 | 104.28.160.0/20 759 | 104.28.176.0/20 760 | 104.28.192.0/19 761 | 104.28.192.0/20 762 | 104.28.192.0/24 763 | 104.28.193.0/24 764 | 104.28.194.0/24 765 | 104.28.195.0/24 766 | 104.28.196.0/24 767 | 104.28.197.0/24 768 | 104.28.198.0/24 769 | 104.28.199.0/24 770 | 104.28.200.0/24 771 | 104.28.201.0/24 772 | 104.28.202.0/24 773 | 104.28.203.0/24 774 | 104.28.204.0/24 775 | 104.28.205.0/24 776 | 104.28.206.0/24 777 | 104.28.207.0/24 778 | 104.28.208.0/20 779 | 104.28.208.0/24 780 | 104.28.209.0/24 781 | 104.28.210.0/24 782 | 104.28.211.0/24 783 | 104.28.212.0/24 784 | 104.28.213.0/24 785 | 104.28.214.0/24 786 | 104.28.215.0/24 787 | 104.28.216.0/24 788 | 104.28.217.0/24 789 | 104.28.218.0/24 790 | 104.28.219.0/24 791 | 104.28.220.0/24 792 | 104.28.221.0/24 793 | 104.28.222.0/24 794 | 104.28.223.0/24 795 | 104.28.224.0/19 796 | 104.28.224.0/20 797 | 104.28.224.0/24 798 | 104.28.225.0/24 799 | 104.28.226.0/24 800 | 104.28.227.0/24 801 | 104.28.228.0/24 802 | 104.28.229.0/24 803 | 104.28.230.0/24 804 | 104.28.231.0/24 805 | 104.28.232.0/24 806 | 104.28.233.0/24 807 | 104.28.234.0/24 808 | 104.28.235.0/24 809 | 104.28.236.0/24 810 | 104.28.237.0/24 811 | 104.28.238.0/24 812 | 104.28.239.0/24 813 | 104.28.240.0/20 814 | 104.28.240.0/24 815 | 104.28.241.0/24 816 | 104.28.242.0/24 817 | 104.28.243.0/24 818 | 104.28.244.0/24 819 | 104.28.245.0/24 820 | 104.28.246.0/24 821 | 104.28.247.0/24 822 | 104.28.248.0/24 823 | 104.28.249.0/24 824 | 104.28.250.0/24 825 | 104.28.251.0/24 826 | 104.28.252.0/24 827 | 104.28.253.0/24 828 | 104.28.254.0/24 829 | 104.28.255.0/24 830 | 104.29.0.0/24 831 | 104.29.1.0/24 832 | 104.29.2.0/24 833 | 104.29.3.0/24 834 | 104.29.4.0/24 835 | 104.29.5.0/24 836 | 104.29.6.0/24 837 | 104.29.7.0/24 838 | 104.29.8.0/24 839 | 104.29.9.0/24 840 | 104.29.10.0/24 841 | 104.29.11.0/24 842 | 104.29.12.0/24 843 | 104.29.13.0/24 844 | 104.29.14.0/24 845 | 104.29.15.0/24 846 | 104.29.16.0/24 847 | 104.29.17.0/24 848 | 104.29.18.0/24 849 | 104.29.19.0/24 850 | 104.29.20.0/24 851 | 104.29.21.0/24 852 | 104.29.22.0/24 853 | 104.29.23.0/24 854 | 104.29.24.0/24 855 | 104.29.25.0/24 856 | 104.29.26.0/24 857 | 104.29.27.0/24 858 | 104.29.28.0/24 859 | 104.29.29.0/24 860 | 104.29.30.0/24 861 | 104.29.31.0/24 862 | 104.29.32.0/24 863 | 104.29.33.0/24 864 | 104.29.34.0/24 865 | 104.29.35.0/24 866 | 104.29.36.0/24 867 | 104.29.37.0/24 868 | 104.29.38.0/24 869 | 104.29.39.0/24 870 | 104.29.40.0/24 871 | 104.29.41.0/24 872 | 104.29.42.0/24 873 | 104.29.43.0/24 874 | 104.29.44.0/24 875 | 104.29.45.0/24 876 | 104.29.46.0/24 877 | 104.29.47.0/24 878 | 104.29.48.0/24 879 | 104.29.49.0/24 880 | 104.29.50.0/24 881 | 104.29.53.0/24 882 | 104.29.54.0/24 883 | 104.29.55.0/24 884 | 104.29.56.0/24 885 | 104.29.57.0/24 886 | 104.29.58.0/24 887 | 104.29.59.0/24 888 | 104.29.60.0/24 889 | 104.29.61.0/24 890 | 104.29.63.0/24 891 | 104.29.65.0/24 892 | 104.29.66.0/24 893 | 104.29.67.0/24 894 | 104.29.68.0/24 895 | 104.29.69.0/24 896 | 104.29.70.0/24 897 | 104.29.71.0/24 898 | 104.29.72.0/24 899 | 104.29.73.0/24 900 | 104.29.76.0/24 901 | 104.29.77.0/24 902 | 104.29.78.0/24 903 | 104.29.79.0/24 904 | 104.29.80.0/24 905 | 104.29.81.0/24 906 | 104.29.82.0/24 907 | 104.29.83.0/24 908 | 104.29.84.0/24 909 | 104.29.85.0/24 910 | 104.29.86.0/24 911 | 104.29.87.0/24 912 | 104.29.88.0/24 913 | 104.29.89.0/24 914 | 104.29.90.0/24 915 | 104.29.91.0/24 916 | 104.29.92.0/24 917 | 104.29.93.0/24 918 | 104.29.94.0/24 919 | 104.29.96.0/24 920 | 104.29.97.0/24 921 | 104.29.98.0/24 922 | 104.29.99.0/24 923 | 104.29.100.0/24 924 | 104.29.101.0/24 925 | 104.29.102.0/24 926 | 104.29.103.0/24 927 | 104.29.104.0/24 928 | 104.29.105.0/24 929 | 104.29.106.0/24 930 | 104.30.1.0/24 931 | 104.30.2.0/24 932 | 104.30.3.0/24 933 | 104.30.4.0/24 934 | 104.30.5.0/24 935 | 104.31.16.0/23 936 | 108.162.192.0/20 937 | 108.162.192.0/24 938 | 108.162.193.0/24 939 | 108.162.194.0/24 940 | 108.162.195.0/24 941 | 108.162.196.0/24 942 | 108.162.198.0/24 943 | 108.162.210.0/24 944 | 108.162.211.0/24 945 | 108.162.212.0/24 946 | 108.162.213.0/24 947 | 108.162.216.0/24 948 | 108.162.217.0/24 949 | 108.162.218.0/24 950 | 108.162.226.0/24 951 | 108.162.227.0/24 952 | 108.162.235.0/24 953 | 108.162.236.0/24 954 | 108.162.237.0/24 955 | 108.162.238.0/24 956 | 108.162.239.0/24 957 | 108.162.240.0/24 958 | 108.162.241.0/24 959 | 108.162.242.0/24 960 | 108.162.243.0/24 961 | 108.162.244.0/24 962 | 108.162.245.0/24 963 | 108.162.246.0/24 964 | 108.162.247.0/24 965 | 108.162.248.0/24 966 | 108.162.249.0/24 967 | 108.162.250.0/24 968 | 108.162.252.0/24 969 | 108.162.253.0/24 970 | 108.162.254.0/24 971 | 141.101.65.0/24 972 | 141.101.66.0/24 973 | 141.101.67.0/24 974 | 141.101.68.0/24 975 | 141.101.69.0/24 976 | 141.101.70.0/24 977 | 141.101.71.0/24 978 | 141.101.72.0/24 979 | 141.101.73.0/24 980 | 141.101.74.0/24 981 | 141.101.75.0/24 982 | 141.101.76.0/23 983 | 141.101.82.0/24 984 | 141.101.83.0/24 985 | 141.101.84.0/24 986 | 141.101.85.0/24 987 | 141.101.86.0/24 988 | 141.101.87.0/24 989 | 141.101.90.0/24 990 | 141.101.92.0/24 991 | 141.101.93.0/24 992 | 141.101.94.0/24 993 | 141.101.95.0/24 994 | 141.101.96.0/24 995 | 141.101.97.0/24 996 | 141.101.98.0/24 997 | 141.101.99.0/24 998 | 141.101.100.0/24 999 | 141.101.108.0/24 1000 | 141.101.109.0/24 1001 | 141.101.110.0/24 1002 | 141.101.112.0/20 1003 | 141.101.112.0/23 1004 | 141.101.114.0/23 1005 | 141.101.120.0/22 1006 | 162.158.0.0/22 1007 | 162.158.4.0/24 1008 | 162.158.5.0/24 1009 | 162.158.8.0/24 1010 | 162.158.9.0/24 1011 | 162.158.10.0/24 1012 | 162.158.11.0/24 1013 | 162.158.12.0/24 1014 | 162.158.16.0/22 1015 | 162.158.20.0/22 1016 | 162.158.20.0/24 1017 | 162.158.21.0/24 1018 | 162.158.22.0/24 1019 | 162.158.23.0/24 1020 | 162.158.24.0/23 1021 | 162.158.25.0/24 1022 | 162.158.26.0/24 1023 | 162.158.27.0/24 1024 | 162.158.28.0/24 1025 | 162.158.29.0/24 1026 | 162.158.30.0/24 1027 | 162.158.31.0/24 1028 | 162.158.32.0/22 1029 | 162.158.36.0/24 1030 | 162.158.37.0/24 1031 | 162.158.38.0/24 1032 | 162.158.39.0/24 1033 | 162.158.40.0/24 1034 | 162.158.41.0/24 1035 | 162.158.42.0/24 1036 | 162.158.43.0/24 1037 | 162.158.44.0/24 1038 | 162.158.48.0/24 1039 | 162.158.51.0/24 1040 | 162.158.52.0/22 1041 | 162.158.56.0/24 1042 | 162.158.57.0/24 1043 | 162.158.58.0/24 1044 | 162.158.59.0/24 1045 | 162.158.60.0/24 1046 | 162.158.61.0/24 1047 | 162.158.62.0/24 1048 | 162.158.63.0/24 1049 | 162.158.72.0/24 1050 | 162.158.73.0/24 1051 | 162.158.74.0/24 1052 | 162.158.75.0/24 1053 | 162.158.76.0/22 1054 | 162.158.80.0/24 1055 | 162.158.81.0/24 1056 | 162.158.82.0/24 1057 | 162.158.84.0/22 1058 | 162.158.88.0/24 1059 | 162.158.89.0/24 1060 | 162.158.90.0/24 1061 | 162.158.91.0/24 1062 | 162.158.92.0/24 1063 | 162.158.93.0/24 1064 | 162.158.94.0/24 1065 | 162.158.95.0/24 1066 | 162.158.96.0/24 1067 | 162.158.97.0/24 1068 | 162.158.98.0/24 1069 | 162.158.99.0/24 1070 | 162.158.100.0/24 1071 | 162.158.101.0/24 1072 | 162.158.102.0/24 1073 | 162.158.103.0/24 1074 | 162.158.104.0/24 1075 | 162.158.105.0/24 1076 | 162.158.106.0/24 1077 | 162.158.107.0/24 1078 | 162.158.108.0/24 1079 | 162.158.109.0/24 1080 | 162.158.110.0/24 1081 | 162.158.111.0/24 1082 | 162.158.112.0/24 1083 | 162.158.113.0/24 1084 | 162.158.114.0/24 1085 | 162.158.116.0/24 1086 | 162.158.117.0/24 1087 | 162.158.118.0/24 1088 | 162.158.119.0/24 1089 | 162.158.124.0/22 1090 | 162.158.128.0/22 1091 | 162.158.132.0/24 1092 | 162.158.133.0/24 1093 | 162.158.134.0/24 1094 | 162.158.135.0/24 1095 | 162.158.136.0/22 1096 | 162.158.140.0/24 1097 | 162.158.141.0/24 1098 | 162.158.142.0/24 1099 | 162.158.143.0/24 1100 | 162.158.144.0/24 1101 | 162.158.145.0/24 1102 | 162.158.146.0/24 1103 | 162.158.147.0/24 1104 | 162.158.148.0/24 1105 | 162.158.149.0/24 1106 | 162.158.150.0/24 1107 | 162.158.151.0/24 1108 | 162.158.152.0/24 1109 | 162.158.153.0/24 1110 | 162.158.154.0/24 1111 | 162.158.155.0/24 1112 | 162.158.156.0/24 1113 | 162.158.157.0/24 1114 | 162.158.158.0/24 1115 | 162.158.159.0/24 1116 | 162.158.160.0/24 1117 | 162.158.161.0/24 1118 | 162.158.162.0/24 1119 | 162.158.163.0/24 1120 | 162.158.164.0/24 1121 | 162.158.165.0/24 1122 | 162.158.166.0/24 1123 | 162.158.167.0/24 1124 | 162.158.168.0/24 1125 | 162.158.169.0/24 1126 | 162.158.170.0/24 1127 | 162.158.171.0/24 1128 | 162.158.172.0/24 1129 | 162.158.173.0/24 1130 | 162.158.174.0/24 1131 | 162.158.175.0/24 1132 | 162.158.176.0/24 1133 | 162.158.178.0/24 1134 | 162.158.179.0/24 1135 | 162.158.180.0/22 1136 | 162.158.184.0/24 1137 | 162.158.185.0/24 1138 | 162.158.186.0/24 1139 | 162.158.187.0/24 1140 | 162.158.188.0/24 1141 | 162.158.189.0/24 1142 | 162.158.190.0/24 1143 | 162.158.191.0/24 1144 | 162.158.192.0/24 1145 | 162.158.193.0/24 1146 | 162.158.194.0/24 1147 | 162.158.195.0/24 1148 | 162.158.196.0/24 1149 | 162.158.198.0/24 1150 | 162.158.199.0/24 1151 | 162.158.200.0/22 1152 | 162.158.204.0/23 1153 | 162.158.206.0/24 1154 | 162.158.207.0/24 1155 | 162.158.208.0/22 1156 | 162.158.212.0/24 1157 | 162.158.214.0/24 1158 | 162.158.215.0/24 1159 | 162.158.216.0/23 1160 | 162.158.218.0/23 1161 | 162.158.220.0/22 1162 | 162.158.224.0/24 1163 | 162.158.225.0/24 1164 | 162.158.226.0/23 1165 | 162.158.228.0/24 1166 | 162.158.232.0/23 1167 | 162.158.234.0/23 1168 | 162.158.236.0/22 1169 | 162.158.240.0/22 1170 | 162.158.244.0/23 1171 | 162.158.248.0/23 1172 | 162.158.250.0/23 1173 | 162.158.253.0/24 1174 | 162.158.254.0/24 1175 | 162.158.255.0/24 1176 | 162.159.0.0/20 1177 | 162.159.0.0/24 1178 | 162.159.1.0/24 1179 | 162.159.2.0/24 1180 | 162.159.3.0/24 1181 | 162.159.4.0/24 1182 | 162.159.5.0/24 1183 | 162.159.6.0/24 1184 | 162.159.7.0/24 1185 | 162.159.8.0/24 1186 | 162.159.9.0/24 1187 | 162.159.10.0/24 1188 | 162.159.11.0/24 1189 | 162.159.12.0/24 1190 | 162.159.13.0/24 1191 | 162.159.14.0/24 1192 | 162.159.15.0/24 1193 | 162.159.16.0/20 1194 | 162.159.16.0/24 1195 | 162.159.17.0/24 1196 | 162.159.18.0/24 1197 | 162.159.19.0/24 1198 | 162.159.20.0/24 1199 | 162.159.21.0/24 1200 | 162.159.22.0/24 1201 | 162.159.23.0/24 1202 | 162.159.24.0/24 1203 | 162.159.25.0/24 1204 | 162.159.26.0/24 1205 | 162.159.27.0/24 1206 | 162.159.28.0/24 1207 | 162.159.29.0/24 1208 | 162.159.30.0/24 1209 | 162.159.31.0/24 1210 | 162.159.32.0/20 1211 | 162.159.32.0/23 1212 | 162.159.34.0/23 1213 | 162.159.36.0/24 1214 | 162.159.40.0/23 1215 | 162.159.42.0/23 1216 | 162.159.46.0/24 1217 | 162.159.48.0/20 1218 | 162.159.58.0/24 1219 | 162.159.60.0/24 1220 | 162.159.64.0/20 1221 | 162.159.128.0/17 1222 | 162.159.128.0/19 1223 | 162.159.160.0/24 1224 | 162.159.192.0/22 1225 | 162.159.192.0/24 1226 | 162.159.193.0/24 1227 | 162.159.194.0/24 1228 | 162.159.195.0/24 1229 | 162.159.196.0/24 1230 | 162.159.200.0/24 1231 | 162.159.201.0/24 1232 | 162.159.202.0/24 1233 | 162.159.204.0/24 1234 | 162.159.205.0/24 1235 | 162.159.240.0/20 1236 | 162.251.82.0/24 1237 | 172.64.0.0/16 1238 | 172.64.32.0/20 1239 | 172.64.32.0/24 1240 | 172.64.33.0/24 1241 | 172.64.34.0/24 1242 | 172.64.35.0/24 1243 | 172.64.36.0/23 1244 | 172.64.38.0/24 1245 | 172.64.40.0/24 1246 | 172.64.48.0/20 1247 | 172.64.52.0/24 1248 | 172.64.53.0/24 1249 | 172.64.64.0/20 1250 | 172.64.68.0/24 1251 | 172.64.69.0/24 1252 | 172.64.80.0/20 1253 | 172.64.96.0/20 1254 | 172.64.128.0/20 1255 | 172.64.144.0/24 1256 | 172.64.145.0/24 1257 | 172.64.146.0/24 1258 | 172.64.147.0/24 1259 | 172.64.148.0/24 1260 | 172.64.149.0/24 1261 | 172.64.150.0/24 1262 | 172.64.151.0/24 1263 | 172.64.152.0/24 1264 | 172.64.153.0/24 1265 | 172.64.154.0/24 1266 | 172.64.155.0/24 1267 | 172.64.156.0/24 1268 | 172.64.157.0/24 1269 | 172.64.158.0/24 1270 | 172.64.159.0/24 1271 | 172.64.160.0/20 1272 | 172.64.192.0/20 1273 | 172.64.228.0/24 1274 | 172.64.236.0/24 1275 | 172.64.237.0/24 1276 | 172.64.238.0/24 1277 | 172.64.239.0/24 1278 | 172.64.240.0/20 1279 | 172.65.0.0/19 1280 | 172.65.0.0/20 1281 | 172.65.16.0/20 1282 | 172.65.32.0/19 1283 | 172.65.32.0/20 1284 | 172.65.48.0/20 1285 | 172.65.64.0/20 1286 | 172.65.80.0/20 1287 | 172.65.96.0/20 1288 | 172.65.112.0/20 1289 | 172.65.128.0/20 1290 | 172.65.144.0/20 1291 | 172.65.160.0/20 1292 | 172.65.176.0/20 1293 | 172.65.192.0/20 1294 | 172.65.208.0/20 1295 | 172.65.224.0/20 1296 | 172.65.240.0/20 1297 | 172.66.0.0/22 1298 | 172.66.40.0/21 1299 | 172.67.0.0/20 1300 | 172.67.16.0/20 1301 | 172.67.32.0/20 1302 | 172.67.48.0/20 1303 | 172.67.64.0/20 1304 | 172.67.80.0/20 1305 | 172.67.96.0/20 1306 | 172.67.112.0/20 1307 | 172.67.128.0/20 1308 | 172.67.144.0/20 1309 | 172.67.160.0/20 1310 | 172.67.176.0/20 1311 | 172.67.192.0/20 1312 | 172.67.208.0/20 1313 | 172.67.224.0/20 1314 | 172.67.240.0/20 1315 | 172.68.0.0/22 1316 | 172.68.4.0/24 1317 | 172.68.8.0/22 1318 | 172.68.12.0/22 1319 | 172.68.16.0/21 1320 | 172.68.24.0/22 1321 | 172.68.28.0/24 1322 | 172.68.29.0/24 1323 | 172.68.30.0/24 1324 | 172.68.31.0/24 1325 | 172.68.32.0/22 1326 | 172.68.36.0/23 1327 | 172.68.38.0/24 1328 | 172.68.39.0/24 1329 | 172.68.40.0/22 1330 | 172.68.45.0/24 1331 | 172.68.46.0/24 1332 | 172.68.47.0/24 1333 | 172.68.48.0/22 1334 | 172.68.52.0/22 1335 | 172.68.56.0/24 1336 | 172.68.57.0/24 1337 | 172.68.58.0/24 1338 | 172.68.59.0/24 1339 | 172.68.60.0/22 1340 | 172.68.64.0/24 1341 | 172.68.65.0/24 1342 | 172.68.66.0/24 1343 | 172.68.67.0/24 1344 | 172.68.68.0/22 1345 | 172.68.72.0/23 1346 | 172.68.74.0/24 1347 | 172.68.75.0/24 1348 | 172.68.76.0/23 1349 | 172.68.78.0/24 1350 | 172.68.79.0/24 1351 | 172.68.80.0/24 1352 | 172.68.81.0/24 1353 | 172.68.83.0/24 1354 | 172.68.84.0/22 1355 | 172.68.88.0/24 1356 | 172.68.89.0/24 1357 | 172.68.90.0/24 1358 | 172.68.91.0/24 1359 | 172.68.92.0/24 1360 | 172.68.93.0/24 1361 | 172.68.94.0/24 1362 | 172.68.95.0/24 1363 | 172.68.96.0/24 1364 | 172.68.97.0/24 1365 | 172.68.98.0/24 1366 | 172.68.99.0/24 1367 | 172.68.100.0/22 1368 | 172.68.104.0/22 1369 | 172.68.104.0/24 1370 | 172.68.108.0/22 1371 | 172.68.112.0/24 1372 | 172.68.113.0/24 1373 | 172.68.114.0/24 1374 | 172.68.115.0/24 1375 | 172.68.116.0/24 1376 | 172.68.117.0/24 1377 | 172.68.118.0/24 1378 | 172.68.119.0/24 1379 | 172.68.120.0/23 1380 | 172.68.123.0/24 1381 | 172.68.124.0/23 1382 | 172.68.126.0/24 1383 | 172.68.127.0/24 1384 | 172.68.128.0/24 1385 | 172.68.129.0/24 1386 | 172.68.130.0/24 1387 | 172.68.131.0/24 1388 | 172.68.132.0/24 1389 | 172.68.133.0/24 1390 | 172.68.134.0/24 1391 | 172.68.135.0/24 1392 | 172.68.136.0/22 1393 | 172.68.140.0/24 1394 | 172.68.141.0/24 1395 | 172.68.142.0/24 1396 | 172.68.143.0/24 1397 | 172.68.144.0/24 1398 | 172.68.145.0/24 1399 | 172.68.146.0/24 1400 | 172.68.147.0/24 1401 | 172.68.148.0/22 1402 | 172.68.152.0/24 1403 | 172.68.153.0/24 1404 | 172.68.154.0/24 1405 | 172.68.155.0/24 1406 | 172.68.161.0/24 1407 | 172.68.162.0/24 1408 | 172.68.163.0/24 1409 | 172.68.164.0/23 1410 | 172.68.166.0/23 1411 | 172.68.168.0/24 1412 | 172.68.169.0/24 1413 | 172.68.170.0/24 1414 | 172.68.171.0/24 1415 | 172.68.172.0/22 1416 | 172.68.176.0/24 1417 | 172.68.177.0/24 1418 | 172.68.179.0/24 1419 | 172.68.180.0/22 1420 | 172.68.184.0/22 1421 | 172.68.188.0/24 1422 | 172.68.189.0/24 1423 | 172.68.190.0/24 1424 | 172.68.191.0/24 1425 | 172.68.196.0/22 1426 | 172.68.200.0/24 1427 | 172.68.201.0/24 1428 | 172.68.202.0/24 1429 | 172.68.203.0/24 1430 | 172.68.204.0/23 1431 | 172.68.206.0/24 1432 | 172.68.207.0/24 1433 | 172.68.208.0/24 1434 | 172.68.209.0/24 1435 | 172.68.210.0/24 1436 | 172.68.211.0/24 1437 | 172.68.212.0/22 1438 | 172.68.217.0/24 1439 | 172.68.218.0/24 1440 | 172.68.219.0/24 1441 | 172.68.220.0/23 1442 | 172.68.222.0/24 1443 | 172.68.223.0/24 1444 | 172.68.224.0/22 1445 | 172.68.228.0/23 1446 | 172.68.230.0/24 1447 | 172.68.231.0/24 1448 | 172.68.232.0/22 1449 | 172.68.236.0/22 1450 | 172.68.240.0/22 1451 | 172.68.244.0/22 1452 | 172.68.248.0/24 1453 | 172.68.249.0/24 1454 | 172.68.250.0/24 1455 | 172.68.251.0/24 1456 | 172.68.252.0/24 1457 | 172.68.253.0/24 1458 | 172.68.255.0/24 1459 | 172.69.0.0/23 1460 | 172.69.2.0/24 1461 | 172.69.3.0/24 1462 | 172.69.4.0/22 1463 | 172.69.8.0/22 1464 | 172.69.12.0/24 1465 | 172.69.13.0/24 1466 | 172.69.14.0/24 1467 | 172.69.15.0/24 1468 | 172.69.16.0/24 1469 | 172.69.18.0/24 1470 | 172.69.19.0/24 1471 | 172.69.20.0/24 1472 | 172.69.21.0/24 1473 | 172.69.22.0/24 1474 | 172.69.23.0/24 1475 | 172.69.32.0/24 1476 | 172.69.33.0/24 1477 | 172.69.34.0/24 1478 | 172.69.35.0/24 1479 | 172.69.36.0/23 1480 | 172.69.38.0/23 1481 | 172.69.40.0/22 1482 | 172.69.44.0/24 1483 | 172.69.45.0/24 1484 | 172.69.46.0/24 1485 | 172.69.47.0/24 1486 | 172.69.48.0/24 1487 | 172.69.52.0/24 1488 | 172.69.53.0/24 1489 | 172.69.54.0/24 1490 | 172.69.55.0/24 1491 | 172.69.60.0/24 1492 | 172.69.61.0/24 1493 | 172.69.62.0/24 1494 | 172.69.63.0/24 1495 | 172.69.64.0/24 1496 | 172.69.65.0/24 1497 | 172.69.66.0/24 1498 | 172.69.67.0/24 1499 | 172.69.68.0/24 1500 | 172.69.69.0/24 1501 | 172.69.70.0/24 1502 | 172.69.71.0/24 1503 | 172.69.72.0/22 1504 | 172.69.76.0/23 1505 | 172.69.78.0/24 1506 | 172.69.79.0/24 1507 | 172.69.80.0/22 1508 | 172.69.84.0/22 1509 | 172.69.88.0/22 1510 | 172.69.92.0/22 1511 | 172.69.96.0/24 1512 | 172.69.97.0/24 1513 | 172.69.100.0/24 1514 | 172.69.101.0/24 1515 | 172.69.102.0/24 1516 | 172.69.103.0/24 1517 | 172.69.105.0/24 1518 | 172.69.106.0/24 1519 | 172.69.107.0/24 1520 | 172.69.108.0/23 1521 | 172.69.110.0/24 1522 | 172.69.111.0/24 1523 | 172.69.112.0/22 1524 | 172.69.116.0/22 1525 | 172.69.124.0/22 1526 | 172.69.128.0/22 1527 | 172.69.132.0/24 1528 | 172.69.133.0/24 1529 | 172.69.134.0/24 1530 | 172.69.135.0/24 1531 | 172.69.136.0/22 1532 | 172.69.140.0/22 1533 | 172.69.144.0/22 1534 | 172.69.148.0/22 1535 | 172.69.156.0/24 1536 | 172.69.157.0/24 1537 | 172.69.158.0/24 1538 | 172.69.159.0/24 1539 | 172.69.160.0/24 1540 | 172.69.161.0/24 1541 | 172.69.162.0/24 1542 | 172.69.163.0/24 1543 | 172.69.164.0/22 1544 | 172.69.168.0/22 1545 | 172.69.172.0/22 1546 | 172.69.180.0/24 1547 | 172.69.181.0/24 1548 | 172.69.182.0/24 1549 | 172.69.183.0/24 1550 | 172.69.184.0/22 1551 | 172.69.188.0/22 1552 | 172.69.192.0/22 1553 | 172.69.196.0/24 1554 | 172.69.197.0/24 1555 | 172.69.198.0/24 1556 | 172.69.199.0/24 1557 | 172.69.200.0/22 1558 | 172.69.204.0/22 1559 | 172.69.208.0/24 1560 | 172.69.210.0/24 1561 | 172.69.211.0/24 1562 | 172.69.212.0/24 1563 | 172.69.216.0/24 1564 | 172.69.217.0/24 1565 | 172.69.218.0/24 1566 | 172.69.219.0/24 1567 | 172.69.220.0/24 1568 | 172.69.221.0/24 1569 | 172.69.224.0/23 1570 | 172.69.226.0/24 1571 | 172.69.227.0/24 1572 | 172.69.228.0/22 1573 | 172.69.232.0/24 1574 | 172.69.233.0/24 1575 | 172.69.234.0/24 1576 | 172.69.235.0/24 1577 | 172.69.236.0/24 1578 | 172.69.237.0/24 1579 | 172.69.238.0/24 1580 | 172.69.239.0/24 1581 | 172.69.241.0/24 1582 | 172.69.242.0/24 1583 | 172.69.244.0/23 1584 | 172.69.246.0/23 1585 | 172.69.248.0/24 1586 | 172.69.250.0/24 1587 | 172.69.251.0/24 1588 | 172.69.252.0/24 1589 | 172.69.253.0/24 1590 | 172.69.254.0/24 1591 | 172.69.255.0/24 1592 | 172.70.32.0/24 1593 | 172.70.33.0/24 1594 | 172.70.34.0/24 1595 | 172.70.35.0/24 1596 | 172.70.36.0/24 1597 | 172.70.37.0/24 1598 | 172.70.38.0/24 1599 | 172.70.39.0/24 1600 | 172.70.40.0/24 1601 | 172.70.41.0/24 1602 | 172.70.42.0/24 1603 | 172.70.43.0/24 1604 | 172.70.44.0/24 1605 | 172.70.45.0/24 1606 | 172.70.46.0/24 1607 | 172.70.47.0/24 1608 | 172.70.48.0/24 1609 | 172.70.49.0/24 1610 | 172.70.51.0/24 1611 | 172.70.52.0/24 1612 | 172.70.53.0/24 1613 | 172.70.54.0/24 1614 | 172.70.55.0/24 1615 | 172.70.56.0/24 1616 | 172.70.57.0/24 1617 | 172.70.58.0/24 1618 | 172.70.59.0/24 1619 | 172.70.60.0/24 1620 | 172.70.61.0/24 1621 | 172.70.62.0/24 1622 | 172.70.63.0/24 1623 | 172.70.80.0/24 1624 | 172.70.81.0/24 1625 | 172.70.82.0/24 1626 | 172.70.83.0/24 1627 | 172.70.84.0/24 1628 | 172.70.85.0/24 1629 | 172.70.86.0/24 1630 | 172.70.87.0/24 1631 | 172.70.88.0/24 1632 | 172.70.89.0/24 1633 | 172.70.90.0/24 1634 | 172.70.91.0/24 1635 | 172.70.92.0/24 1636 | 172.70.93.0/24 1637 | 172.70.94.0/24 1638 | 172.70.95.0/24 1639 | 172.70.96.0/24 1640 | 172.70.97.0/24 1641 | 172.70.98.0/24 1642 | 172.70.99.0/24 1643 | 172.70.100.0/24 1644 | 172.70.101.0/24 1645 | 172.70.102.0/24 1646 | 172.70.103.0/24 1647 | 172.70.104.0/24 1648 | 172.70.105.0/24 1649 | 172.70.106.0/24 1650 | 172.70.107.0/24 1651 | 172.70.108.0/24 1652 | 172.70.109.0/24 1653 | 172.70.110.0/24 1654 | 172.70.111.0/24 1655 | 172.70.112.0/24 1656 | 172.70.113.0/24 1657 | 172.70.114.0/24 1658 | 172.70.115.0/24 1659 | 172.70.116.0/24 1660 | 172.70.117.0/24 1661 | 172.70.120.0/24 1662 | 172.70.121.0/24 1663 | 172.70.122.0/24 1664 | 172.70.123.0/24 1665 | 172.70.124.0/24 1666 | 172.70.125.0/24 1667 | 172.70.126.0/24 1668 | 172.70.127.0/24 1669 | 172.70.128.0/24 1670 | 172.70.129.0/24 1671 | 172.70.130.0/24 1672 | 172.70.131.0/24 1673 | 172.70.132.0/24 1674 | 172.70.133.0/24 1675 | 172.70.134.0/24 1676 | 172.70.135.0/24 1677 | 172.70.136.0/24 1678 | 172.70.139.0/24 1679 | 172.70.140.0/24 1680 | 172.70.141.0/24 1681 | 172.70.142.0/24 1682 | 172.70.143.0/24 1683 | 172.70.144.0/24 1684 | 172.70.145.0/24 1685 | 172.70.146.0/24 1686 | 172.70.147.0/24 1687 | 172.70.148.0/24 1688 | 172.70.149.0/24 1689 | 172.70.150.0/24 1690 | 172.70.152.0/24 1691 | 172.70.153.0/24 1692 | 172.70.154.0/24 1693 | 172.70.155.0/24 1694 | 172.70.156.0/24 1695 | 172.70.157.0/24 1696 | 172.70.158.0/24 1697 | 172.70.159.0/24 1698 | 172.70.160.0/24 1699 | 172.70.161.0/24 1700 | 172.70.162.0/24 1701 | 172.70.163.0/24 1702 | 172.70.172.0/24 1703 | 172.70.173.0/24 1704 | 172.70.174.0/24 1705 | 172.70.175.0/24 1706 | 172.70.176.0/24 1707 | 172.70.177.0/24 1708 | 172.70.178.0/24 1709 | 172.70.179.0/24 1710 | 172.70.180.0/24 1711 | 172.70.181.0/24 1712 | 172.70.182.0/24 1713 | 172.70.183.0/24 1714 | 172.70.185.0/24 1715 | 172.70.186.0/24 1716 | 172.70.187.0/24 1717 | 172.70.188.0/24 1718 | 172.70.189.0/24 1719 | 172.70.190.0/24 1720 | 172.70.191.0/24 1721 | 172.70.192.0/24 1722 | 172.70.193.0/24 1723 | 172.70.194.0/24 1724 | 172.70.195.0/24 1725 | 172.70.196.0/24 1726 | 172.70.197.0/24 1727 | 172.70.198.0/24 1728 | 172.70.199.0/24 1729 | 172.70.200.0/24 1730 | 172.70.202.0/24 1731 | 172.70.203.0/24 1732 | 172.70.204.0/24 1733 | 172.70.205.0/24 1734 | 172.70.206.0/24 1735 | 172.70.207.0/24 1736 | 172.70.208.0/24 1737 | 172.70.209.0/24 1738 | 172.70.210.0/24 1739 | 172.70.211.0/24 1740 | 172.70.212.0/24 1741 | 172.70.213.0/24 1742 | 172.70.214.0/24 1743 | 172.70.215.0/24 1744 | 172.70.216.0/24 1745 | 172.70.217.0/24 1746 | 172.70.218.0/24 1747 | 172.70.219.0/24 1748 | 172.70.220.0/24 1749 | 172.70.221.0/24 1750 | 172.70.222.0/24 1751 | 172.70.223.0/24 1752 | 172.70.224.0/24 1753 | 172.70.225.0/24 1754 | 172.70.226.0/24 1755 | 172.70.227.0/24 1756 | 172.70.228.0/24 1757 | 172.70.229.0/24 1758 | 172.70.230.0/24 1759 | 172.70.231.0/24 1760 | 172.70.232.0/24 1761 | 172.70.233.0/24 1762 | 172.70.234.0/24 1763 | 172.70.235.0/24 1764 | 172.70.236.0/24 1765 | 172.70.237.0/24 1766 | 172.70.238.0/24 1767 | 172.70.239.0/24 1768 | 172.70.240.0/24 1769 | 172.70.241.0/24 1770 | 172.70.242.0/24 1771 | 172.70.243.0/24 1772 | 172.70.244.0/24 1773 | 172.70.245.0/24 1774 | 172.70.246.0/24 1775 | 172.70.247.0/24 1776 | 172.70.248.0/24 1777 | 172.70.249.0/24 1778 | 172.70.250.0/24 1779 | 172.70.251.0/24 1780 | 172.70.252.0/24 1781 | 172.70.253.0/24 1782 | 172.70.254.0/24 1783 | 172.70.255.0/24 1784 | 172.71.0.0/24 1785 | 172.71.2.0/24 1786 | 172.71.3.0/24 1787 | 172.71.4.0/24 1788 | 172.71.5.0/24 1789 | 172.71.6.0/24 1790 | 172.71.7.0/24 1791 | 172.71.8.0/24 1792 | 172.71.9.0/24 1793 | 172.71.10.0/24 1794 | 172.71.11.0/24 1795 | 172.71.12.0/24 1796 | 172.71.13.0/24 1797 | 172.71.14.0/24 1798 | 172.71.15.0/24 1799 | 172.71.16.0/24 1800 | 172.71.17.0/24 1801 | 172.71.20.0/24 1802 | 172.71.21.0/24 1803 | 172.71.22.0/24 1804 | 172.71.23.0/24 1805 | 172.71.24.0/24 1806 | 172.71.25.0/24 1807 | 172.71.26.0/24 1808 | 172.71.27.0/24 1809 | 172.71.28.0/24 1810 | 172.71.29.0/24 1811 | 172.71.30.0/24 1812 | 172.71.31.0/24 1813 | 172.71.80.0/24 1814 | 172.71.81.0/24 1815 | 172.71.82.0/24 1816 | 172.71.83.0/24 1817 | 172.71.84.0/24 1818 | 172.71.85.0/24 1819 | 172.71.86.0/24 1820 | 172.71.87.0/24 1821 | 172.71.88.0/24 1822 | 172.71.89.0/24 1823 | 172.71.90.0/24 1824 | 172.71.92.0/24 1825 | 172.71.93.0/24 1826 | 172.71.94.0/24 1827 | 172.71.95.0/24 1828 | 172.71.96.0/24 1829 | 172.71.97.0/24 1830 | 172.71.98.0/24 1831 | 172.71.99.0/24 1832 | 172.71.100.0/24 1833 | 172.71.101.0/24 1834 | 172.71.102.0/24 1835 | 172.71.103.0/24 1836 | 172.71.108.0/24 1837 | 172.71.109.0/24 1838 | 172.71.110.0/24 1839 | 172.71.111.0/24 1840 | 172.71.112.0/24 1841 | 172.71.113.0/24 1842 | 172.71.114.0/24 1843 | 172.71.115.0/24 1844 | 172.71.116.0/24 1845 | 172.71.117.0/24 1846 | 172.71.118.0/24 1847 | 172.71.119.0/24 1848 | 172.71.120.0/24 1849 | 172.71.121.0/24 1850 | 172.71.122.0/24 1851 | 172.71.123.0/24 1852 | 172.71.124.0/24 1853 | 172.71.125.0/24 1854 | 172.71.126.0/24 1855 | 172.71.127.0/24 1856 | 172.71.128.0/24 1857 | 172.71.129.0/24 1858 | 172.71.130.0/24 1859 | 172.71.131.0/24 1860 | 172.71.132.0/24 1861 | 172.71.133.0/24 1862 | 172.71.134.0/24 1863 | 172.71.135.0/24 1864 | 172.71.137.0/24 1865 | 172.71.138.0/24 1866 | 172.71.139.0/24 1867 | 172.71.140.0/24 1868 | 172.71.141.0/24 1869 | 172.71.142.0/24 1870 | 172.71.143.0/24 1871 | 172.71.144.0/24 1872 | 172.71.145.0/24 1873 | 172.71.146.0/24 1874 | 172.71.147.0/24 1875 | 172.71.148.0/24 1876 | 172.71.149.0/24 1877 | 172.71.150.0/24 1878 | 172.71.151.0/24 1879 | 172.71.152.0/24 1880 | 172.71.153.0/24 1881 | 172.71.154.0/24 1882 | 172.71.155.0/24 1883 | 172.71.156.0/24 1884 | 172.71.157.0/24 1885 | 172.71.158.0/24 1886 | 172.71.159.0/24 1887 | 172.71.160.0/24 1888 | 172.71.161.0/24 1889 | 172.71.162.0/24 1890 | 172.71.163.0/24 1891 | 172.71.164.0/24 1892 | 172.71.165.0/24 1893 | 172.71.166.0/24 1894 | 172.71.167.0/24 1895 | 172.71.168.0/24 1896 | 172.71.169.0/24 1897 | 172.71.170.0/24 1898 | 172.71.171.0/24 1899 | 172.71.172.0/24 1900 | 172.71.173.0/24 1901 | 172.71.174.0/24 1902 | 172.71.175.0/24 1903 | 172.71.176.0/24 1904 | 172.71.177.0/24 1905 | 172.71.178.0/24 1906 | 172.71.179.0/24 1907 | 172.71.180.0/24 1908 | 172.71.181.0/24 1909 | 172.71.182.0/24 1910 | 172.71.183.0/24 1911 | 172.71.184.0/24 1912 | 172.71.185.0/24 1913 | 172.71.186.0/24 1914 | 172.71.187.0/24 1915 | 172.71.188.0/24 1916 | 172.71.189.0/24 1917 | 172.71.190.0/24 1918 | 172.71.191.0/24 1919 | 172.71.196.0/24 1920 | 172.71.197.0/24 1921 | 172.71.198.0/24 1922 | 172.71.199.0/24 1923 | 172.71.200.0/24 1924 | 172.71.201.0/24 1925 | 172.71.202.0/24 1926 | 172.71.203.0/24 1927 | 172.71.204.0/24 1928 | 172.71.205.0/24 1929 | 172.71.206.0/24 1930 | 172.71.207.0/24 1931 | 172.71.208.0/24 1932 | 172.71.209.0/24 1933 | 172.71.210.0/24 1934 | 172.71.211.0/24 1935 | 172.71.212.0/24 1936 | 172.71.213.0/24 1937 | 172.71.214.0/24 1938 | 172.71.215.0/24 1939 | 172.71.216.0/24 1940 | 172.71.217.0/24 1941 | 172.71.218.0/24 1942 | 172.71.219.0/24 1943 | 172.71.220.0/24 1944 | 172.71.221.0/24 1945 | 172.71.222.0/24 1946 | 172.71.223.0/24 1947 | 172.71.224.0/24 1948 | 172.71.225.0/24 1949 | 172.71.226.0/24 1950 | 172.71.227.0/24 1951 | 172.71.228.0/24 1952 | 172.71.229.0/24 1953 | 172.71.230.0/24 1954 | 172.71.231.0/24 1955 | 172.71.232.0/24 1956 | 172.71.233.0/24 1957 | 172.71.234.0/24 1958 | 172.71.235.0/24 1959 | 172.71.236.0/24 1960 | 172.71.237.0/24 1961 | 172.71.238.0/24 1962 | 172.71.239.0/24 1963 | 172.71.240.0/24 1964 | 172.71.241.0/24 1965 | 172.71.242.0/24 1966 | 172.71.243.0/24 1967 | 172.71.244.0/24 1968 | 172.71.245.0/24 1969 | 172.71.246.0/24 1970 | 172.71.247.0/24 1971 | 172.71.248.0/24 1972 | 172.71.249.0/24 1973 | 172.71.250.0/24 1974 | 172.71.251.0/24 1975 | 172.71.252.0/24 1976 | 172.71.253.0/24 1977 | 172.71.254.0/24 1978 | 172.71.255.0/24 1979 | 173.245.49.0/24 1980 | 173.245.54.0/24 1981 | 173.245.58.0/24 1982 | 173.245.59.0/24 1983 | 173.245.63.0/24 1984 | 185.146.172.0/24 1985 | 185.146.173.0/24 1986 | 188.114.96.0/24 1987 | 188.114.97.0/24 1988 | 188.114.98.0/24 1989 | 188.114.99.0/24 1990 | 188.114.100.0/24 1991 | 188.114.102.0/24 1992 | 188.114.103.0/24 1993 | 188.114.106.0/23 1994 | 188.114.108.0/24 1995 | 188.114.111.0/24 1996 | 190.93.240.0/20 1997 | 190.93.244.0/22 1998 | 195.242.122.0/23 1999 | 197.234.240.0/22 2000 | 197.234.240.0/24 2001 | 197.234.241.0/24 2002 | 197.234.242.0/24 2003 | 198.41.129.0/24 2004 | 198.41.192.0/21 2005 | 198.41.200.0/21 2006 | 198.41.208.0/23 2007 | 198.41.211.0/24 2008 | 198.41.212.0/24 2009 | 198.41.214.0/23 2010 | 198.41.216.0/24 2011 | 198.41.217.0/24 2012 | 198.41.218.0/24 2013 | 198.41.219.0/24 2014 | 198.41.220.0/23 2015 | 198.41.222.0/24 2016 | 198.41.223.0/24 2017 | 198.41.224.0/22 2018 | 198.41.228.0/22 2019 | 198.41.232.0/23 2020 | 198.41.236.0/22 2021 | 198.41.240.0/24 2022 | 198.41.241.0/24 2023 | 198.41.242.0/24 2024 | 198.217.251.0/24 2025 | 199.27.128.0/22 2026 | 199.27.132.0/24 2027 | 199.27.134.0/23 2028 | 103.21.246.0/24 2029 | 103.21.247.0/24 2030 | 141.101.88.0/24 2031 | 141.101.89.0/24 2032 | 162.158.64.0/21 2033 | 172.69.24.0/21 2034 | 172.70.0.0/19 2035 | 172.70.64.0/21 2036 | 172.70.72.0/21 2037 | 198.41.144.0/22 2038 | 198.41.234.0/24 2039 | 198.41.243.0/24 2040 | 198.41.245.0/24 2041 | 198.41.246.0/23 2042 | 198.41.248.0/23 2043 | 198.41.250.0/24 2044 | 198.41.251.0/24 2045 | 198.41.254.0/24 2046 | 198.41.255.0/24 2047 | -------------------------------------------------------------------------------- /cf-v6.txt: -------------------------------------------------------------------------------- 1 | 2400:cb00:131::/48 2 | 2400:cb00:133::/48 3 | 2400:cb00:164::/48 4 | 2400:cb00:171::/48 5 | 2400:cb00:302::/48 6 | 2400:cb00:517::/48 7 | 2400:cb00:531::/48 8 | 2400:cb00:539::/48 9 | 2606:4700:2001::/48 10 | 2606:4700:3131::/48 11 | 2606:4700:ff01::/48 12 | 2606:4700:ff02::/48 13 | 2a06:98c0:1c01::/48 14 | 2a06:98c0:1c0b::/48 15 | 2a09:bac0:108::/48 16 | 2a09:bac0:131::/48 17 | 2a09:bac0:133::/48 18 | 2606:4700:ff01::/48 19 | 2407:30c0:180::/48 20 | 2407:30c0:181::/48 21 | 2407:30c0:182::/48 22 | 2602:80c:cf::/48 23 | 2606:2c40::/48 24 | 2606:ae80:10::/48 25 | 2620:78:200f::/48 26 | 2a00:1c88:100::/48 27 | 2a05:7880::/32 28 | 2a06:9ac0::/32 29 | 2a07:180::/32 30 | 2a06:98c0:1000::/48 31 | 2400:cb00:420::/48 32 | 2a06:98c0:1400::/48 33 | 2a06:98c0:1401::/48 34 | 2a06:98c0:3603::/48 35 | 2a06:98c0:3605::/48 36 | 2a06:98c0:3606::/48 37 | 2a06:98c0:3607::/48 38 | 2a06:98c0:360e::/48 39 | 2a06:98c0:3616::/48 40 | 2a06:98c0:1001::/48 41 | 2400:cb00:4::/48 42 | 2400:cb00:11::/48 43 | 2400:cb00:12::/48 44 | 2400:cb00:14::/48 45 | 2400:cb00:15::/48 46 | 2400:cb00:16::/48 47 | 2400:cb00:17::/48 48 | 2400:cb00:19::/48 49 | 2400:cb00:20::/48 50 | 2400:cb00:21::/48 51 | 2400:cb00:22::/48 52 | 2400:cb00:23::/48 53 | 2400:cb00:26::/48 54 | 2400:cb00:27::/48 55 | 2400:cb00:28::/48 56 | 2400:cb00:29::/48 57 | 2400:cb00:31::/48 58 | 2400:cb00:34::/48 59 | 2400:cb00:35::/48 60 | 2400:cb00:38::/48 61 | 2400:cb00:39::/48 62 | 2400:cb00:40::/48 63 | 2400:cb00:41::/48 64 | 2400:cb00:43::/48 65 | 2400:cb00:44::/48 66 | 2400:cb00:45::/48 67 | 2400:cb00:46::/48 68 | 2400:cb00:47::/48 69 | 2400:cb00:48::/48 70 | 2400:cb00:49::/48 71 | 2400:cb00:50::/48 72 | 2400:cb00:51::/48 73 | 2400:cb00:52::/48 74 | 2400:cb00:53::/48 75 | 2400:cb00:54::/48 76 | 2400:cb00:55::/48 77 | 2400:cb00:56::/48 78 | 2400:cb00:57::/48 79 | 2400:cb00:59::/48 80 | 2400:cb00:60::/48 81 | 2400:cb00:61::/48 82 | 2400:cb00:63::/48 83 | 2400:cb00:64::/48 84 | 2400:cb00:65::/48 85 | 2400:cb00:66::/48 86 | 2400:cb00:67::/48 87 | 2400:cb00:68::/48 88 | 2400:cb00:69::/48 89 | 2400:cb00:70::/48 90 | 2400:cb00:71::/48 91 | 2400:cb00:72::/48 92 | 2400:cb00:73::/48 93 | 2400:cb00:74::/48 94 | 2400:cb00:75::/48 95 | 2400:cb00:76::/48 96 | 2400:cb00:77::/48 97 | 2400:cb00:78::/48 98 | 2400:cb00:79::/48 99 | 2400:cb00:80::/48 100 | 2400:cb00:81::/48 101 | 2400:cb00:83::/48 102 | 2400:cb00:84::/48 103 | 2400:cb00:85::/48 104 | 2400:cb00:86::/48 105 | 2400:cb00:87::/48 106 | 2400:cb00:88::/48 107 | 2400:cb00:89::/48 108 | 2400:cb00:90::/48 109 | 2400:cb00:94::/48 110 | 2400:cb00:95::/48 111 | 2400:cb00:96::/48 112 | 2400:cb00:97::/48 113 | 2400:cb00:98::/48 114 | 2400:cb00:100::/48 115 | 2400:cb00:102::/48 116 | 2400:cb00:103::/48 117 | 2400:cb00:104::/48 118 | 2400:cb00:105::/48 119 | 2400:cb00:106::/48 120 | 2400:cb00:107::/48 121 | 2400:cb00:109::/48 122 | 2400:cb00:110::/48 123 | 2400:cb00:111::/48 124 | 2400:cb00:112::/48 125 | 2400:cb00:113::/48 126 | 2400:cb00:114::/48 127 | 2400:cb00:115::/48 128 | 2400:cb00:116::/48 129 | 2400:cb00:117::/48 130 | 2400:cb00:118::/48 131 | 2400:cb00:119::/48 132 | 2400:cb00:120::/48 133 | 2400:cb00:121::/48 134 | 2400:cb00:122::/48 135 | 2400:cb00:123::/48 136 | 2400:cb00:124::/48 137 | 2400:cb00:125::/48 138 | 2400:cb00:126::/48 139 | 2400:cb00:127::/48 140 | 2400:cb00:128::/48 141 | 2400:cb00:129::/48 142 | 2400:cb00:130::/48 143 | 2400:cb00:132::/48 144 | 2400:cb00:134::/48 145 | 2400:cb00:135::/48 146 | 2400:cb00:136::/48 147 | 2400:cb00:137::/48 148 | 2400:cb00:138::/48 149 | 2400:cb00:139::/48 150 | 2400:cb00:140::/48 151 | 2400:cb00:141::/48 152 | 2400:cb00:142::/48 153 | 2400:cb00:143::/48 154 | 2400:cb00:144::/48 155 | 2400:cb00:145::/48 156 | 2400:cb00:146::/48 157 | 2400:cb00:147::/48 158 | 2400:cb00:148::/48 159 | 2400:cb00:149::/48 160 | 2400:cb00:150::/48 161 | 2400:cb00:151::/48 162 | 2400:cb00:152::/48 163 | 2400:cb00:153::/48 164 | 2400:cb00:154::/48 165 | 2400:cb00:155::/48 166 | 2400:cb00:156::/48 167 | 2400:cb00:157::/48 168 | 2400:cb00:158::/48 169 | 2400:cb00:159::/48 170 | 2400:cb00:160::/48 171 | 2400:cb00:161::/48 172 | 2400:cb00:162::/48 173 | 2400:cb00:163::/48 174 | 2400:cb00:165::/48 175 | 2400:cb00:166::/48 176 | 2400:cb00:167::/48 177 | 2400:cb00:168::/48 178 | 2400:cb00:169::/48 179 | 2400:cb00:170::/48 180 | 2400:cb00:172::/48 181 | 2400:cb00:173::/48 182 | 2400:cb00:174::/48 183 | 2400:cb00:175::/48 184 | 2400:cb00:176::/48 185 | 2400:cb00:177::/48 186 | 2400:cb00:178::/48 187 | 2400:cb00:179::/48 188 | 2400:cb00:180::/48 189 | 2400:cb00:181::/48 190 | 2400:cb00:182::/48 191 | 2400:cb00:184::/48 192 | 2400:cb00:185::/48 193 | 2400:cb00:186::/48 194 | 2400:cb00:187::/48 195 | 2400:cb00:188::/48 196 | 2400:cb00:189::/48 197 | 2400:cb00:190::/48 198 | 2400:cb00:191::/48 199 | 2400:cb00:192::/48 200 | 2400:cb00:193::/48 201 | 2400:cb00:194::/48 202 | 2400:cb00:195::/48 203 | 2400:cb00:196::/48 204 | 2400:cb00:197::/48 205 | 2400:cb00:198::/48 206 | 2400:cb00:199::/48 207 | 2400:cb00:200::/48 208 | 2400:cb00:201::/48 209 | 2400:cb00:202::/48 210 | 2400:cb00:203::/48 211 | 2400:cb00:204::/48 212 | 2400:cb00:205::/48 213 | 2400:cb00:206::/48 214 | 2400:cb00:207::/48 215 | 2400:cb00:208::/48 216 | 2400:cb00:209::/48 217 | 2400:cb00:210::/48 218 | 2400:cb00:211::/48 219 | 2400:cb00:212::/48 220 | 2400:cb00:213::/48 221 | 2400:cb00:214::/48 222 | 2400:cb00:215::/48 223 | 2400:cb00:216::/48 224 | 2400:cb00:217::/48 225 | 2400:cb00:218::/48 226 | 2400:cb00:219::/48 227 | 2400:cb00:220::/48 228 | 2400:cb00:221::/48 229 | 2400:cb00:222::/48 230 | 2400:cb00:223::/48 231 | 2400:cb00:224::/48 232 | 2400:cb00:225::/48 233 | 2400:cb00:226::/48 234 | 2400:cb00:227::/48 235 | 2400:cb00:228::/48 236 | 2400:cb00:229::/48 237 | 2400:cb00:230::/48 238 | 2400:cb00:231::/48 239 | 2400:cb00:232::/48 240 | 2400:cb00:233::/48 241 | 2400:cb00:234::/48 242 | 2400:cb00:235::/48 243 | 2400:cb00:236::/48 244 | 2400:cb00:237::/48 245 | 2400:cb00:238::/48 246 | 2400:cb00:239::/48 247 | 2400:cb00:241::/48 248 | 2400:cb00:242::/48 249 | 2400:cb00:243::/48 250 | 2400:cb00:245::/48 251 | 2400:cb00:246::/48 252 | 2400:cb00:247::/48 253 | 2400:cb00:248::/48 254 | 2400:cb00:249::/48 255 | 2400:cb00:250::/48 256 | 2400:cb00:251::/48 257 | 2400:cb00:253::/48 258 | 2400:cb00:254::/48 259 | 2400:cb00:255::/48 260 | 2400:cb00:256::/48 261 | 2400:cb00:257::/48 262 | 2400:cb00:258::/48 263 | 2400:cb00:260::/48 264 | 2400:cb00:261::/48 265 | 2400:cb00:266::/48 266 | 2400:cb00:267::/48 267 | 2400:cb00:268::/48 268 | 2400:cb00:269::/48 269 | 2400:cb00:270::/48 270 | 2400:cb00:274::/48 271 | 2400:cb00:275::/48 272 | 2400:cb00:279::/48 273 | 2400:cb00:280::/48 274 | 2400:cb00:281::/48 275 | 2400:cb00:282::/48 276 | 2400:cb00:283::/48 277 | 2400:cb00:284::/48 278 | 2400:cb00:285::/48 279 | 2400:cb00:291::/48 280 | 2400:cb00:292::/48 281 | 2400:cb00:298::/48 282 | 2400:cb00:299::/48 283 | 2400:cb00:300::/48 284 | 2400:cb00:301::/48 285 | 2400:cb00:303::/48 286 | 2400:cb00:304::/48 287 | 2400:cb00:305::/48 288 | 2400:cb00:306::/48 289 | 2400:cb00:308::/48 290 | 2400:cb00:326::/48 291 | 2400:cb00:331::/48 292 | 2400:cb00:336::/48 293 | 2400:cb00:337::/48 294 | 2400:cb00:338::/48 295 | 2400:cb00:339::/48 296 | 2400:cb00:340::/48 297 | 2400:cb00:341::/48 298 | 2400:cb00:342::/48 299 | 2400:cb00:343::/48 300 | 2400:cb00:344::/48 301 | 2400:cb00:346::/48 302 | 2400:cb00:347::/48 303 | 2400:cb00:350::/48 304 | 2400:cb00:352::/48 305 | 2400:cb00:354::/48 306 | 2400:cb00:356::/48 307 | 2400:cb00:357::/48 308 | 2400:cb00:358::/48 309 | 2400:cb00:359::/48 310 | 2400:cb00:360::/48 311 | 2400:cb00:362::/48 312 | 2400:cb00:363::/48 313 | 2400:cb00:365::/48 314 | 2400:cb00:366::/48 315 | 2400:cb00:367::/48 316 | 2400:cb00:368::/48 317 | 2400:cb00:369::/48 318 | 2400:cb00:370::/48 319 | 2400:cb00:373::/48 320 | 2400:cb00:374::/48 321 | 2400:cb00:376::/48 322 | 2400:cb00:377::/48 323 | 2400:cb00:378::/48 324 | 2400:cb00:380::/48 325 | 2400:cb00:381::/48 326 | 2400:cb00:382::/48 327 | 2400:cb00:384::/48 328 | 2400:cb00:385::/48 329 | 2400:cb00:386::/48 330 | 2400:cb00:388::/48 331 | 2400:cb00:390::/48 332 | 2400:cb00:391::/48 333 | 2400:cb00:392::/48 334 | 2400:cb00:393::/48 335 | 2400:cb00:394::/48 336 | 2400:cb00:397::/48 337 | 2400:cb00:398::/48 338 | 2400:cb00:399::/48 339 | 2400:cb00:403::/48 340 | 2400:cb00:404::/48 341 | 2400:cb00:405::/48 342 | 2400:cb00:406::/48 343 | 2400:cb00:407::/48 344 | 2400:cb00:408::/48 345 | 2400:cb00:409::/48 346 | 2400:cb00:410::/48 347 | 2400:cb00:411::/48 348 | 2400:cb00:412::/48 349 | 2400:cb00:413::/48 350 | 2400:cb00:414::/48 351 | 2400:cb00:415::/48 352 | 2400:cb00:416::/48 353 | 2400:cb00:419::/48 354 | 2400:cb00:422::/48 355 | 2400:cb00:423::/48 356 | 2400:cb00:424::/48 357 | 2400:cb00:427::/48 358 | 2400:cb00:428::/48 359 | 2400:cb00:429::/48 360 | 2400:cb00:430::/48 361 | 2400:cb00:431::/48 362 | 2400:cb00:432::/48 363 | 2400:cb00:433::/48 364 | 2400:cb00:435::/48 365 | 2400:cb00:437::/48 366 | 2400:cb00:438::/48 367 | 2400:cb00:439::/48 368 | 2400:cb00:440::/48 369 | 2400:cb00:441::/48 370 | 2400:cb00:443::/48 371 | 2400:cb00:445::/48 372 | 2400:cb00:446::/48 373 | 2400:cb00:447::/48 374 | 2400:cb00:448::/48 375 | 2400:cb00:450::/48 376 | 2400:cb00:451::/48 377 | 2400:cb00:452::/48 378 | 2400:cb00:453::/48 379 | 2400:cb00:454::/48 380 | 2400:cb00:455::/48 381 | 2400:cb00:458::/48 382 | 2400:cb00:460::/48 383 | 2400:cb00:462::/48 384 | 2400:cb00:463::/48 385 | 2400:cb00:464::/48 386 | 2400:cb00:465::/48 387 | 2400:cb00:466::/48 388 | 2400:cb00:467::/48 389 | 2400:cb00:469::/48 390 | 2400:cb00:470::/48 391 | 2400:cb00:471::/48 392 | 2400:cb00:472::/48 393 | 2400:cb00:474::/48 394 | 2400:cb00:476::/48 395 | 2400:cb00:477::/48 396 | 2400:cb00:478::/48 397 | 2400:cb00:479::/48 398 | 2400:cb00:480::/48 399 | 2400:cb00:481::/48 400 | 2400:cb00:482::/48 401 | 2400:cb00:483::/48 402 | 2400:cb00:484::/48 403 | 2400:cb00:485::/48 404 | 2400:cb00:486::/48 405 | 2400:cb00:487::/48 406 | 2400:cb00:488::/48 407 | 2400:cb00:489::/48 408 | 2400:cb00:490::/48 409 | 2400:cb00:491::/48 410 | 2400:cb00:492::/48 411 | 2400:cb00:493::/48 412 | 2400:cb00:495::/48 413 | 2400:cb00:496::/48 414 | 2400:cb00:497::/48 415 | 2400:cb00:498::/48 416 | 2400:cb00:500::/48 417 | 2400:cb00:502::/48 418 | 2400:cb00:503::/48 419 | 2400:cb00:504::/48 420 | 2400:cb00:507::/48 421 | 2400:cb00:508::/48 422 | 2400:cb00:509::/48 423 | 2400:cb00:510::/48 424 | 2400:cb00:511::/48 425 | 2400:cb00:512::/48 426 | 2400:cb00:513::/48 427 | 2400:cb00:515::/48 428 | 2400:cb00:516::/48 429 | 2400:cb00:519::/48 430 | 2400:cb00:520::/48 431 | 2400:cb00:521::/48 432 | 2400:cb00:522::/48 433 | 2400:cb00:523::/48 434 | 2400:cb00:524::/48 435 | 2400:cb00:525::/48 436 | 2400:cb00:526::/48 437 | 2400:cb00:527::/48 438 | 2400:cb00:528::/48 439 | 2400:cb00:529::/48 440 | 2400:cb00:530::/48 441 | 2400:cb00:532::/48 442 | 2400:cb00:533::/48 443 | 2400:cb00:534::/48 444 | 2400:cb00:537::/48 445 | 2400:cb00:538::/48 446 | 2400:cb00:540::/48 447 | 2400:cb00:541::/48 448 | 2400:cb00:542::/48 449 | 2400:cb00:543::/48 450 | 2400:cb00:544::/48 451 | 2400:cb00:545::/48 452 | 2400:cb00:546::/48 453 | 2400:cb00:547::/48 454 | 2400:cb00:548::/48 455 | 2400:cb00:549::/48 456 | 2400:cb00:550::/48 457 | 2400:cb00:551::/48 458 | 2400:cb00:555::/48 459 | 2400:cb00:556::/48 460 | 2400:cb00:557::/48 461 | 2400:cb00:558::/48 462 | 2400:cb00:559::/48 463 | 2400:cb00:560::/48 464 | 2400:cb00:561::/48 465 | 2400:cb00:562::/48 466 | 2400:cb00:566::/48 467 | 2400:cb00:567::/48 468 | 2400:cb00:568::/48 469 | 2400:cb00:570::/48 470 | 2400:cb00:571::/48 471 | 2400:cb00:572::/48 472 | 2400:cb00:573::/48 473 | 2400:cb00:574::/48 474 | 2400:cb00:577::/48 475 | 2400:cb00:578::/48 476 | 2400:cb00:579::/48 477 | 2400:cb00:580::/48 478 | 2400:cb00:581::/48 479 | 2400:cb00:582::/48 480 | 2400:cb00:583::/48 481 | 2400:cb00:585::/48 482 | 2400:cb00:586::/48 483 | 2400:cb00:587::/48 484 | 2400:cb00:588::/48 485 | 2400:cb00:589::/48 486 | 2400:cb00:590::/48 487 | 2400:cb00:591::/48 488 | 2400:cb00:592::/48 489 | 2400:cb00:593::/48 490 | 2400:cb00:594::/48 491 | 2400:cb00:595::/48 492 | 2400:cb00:596::/48 493 | 2400:cb00:597::/48 494 | 2400:cb00:598::/48 495 | 2400:cb00:599::/48 496 | 2400:cb00:600::/48 497 | 2400:cb00:601::/48 498 | 2400:cb00:604::/48 499 | 2400:cb00:605::/48 500 | 2400:cb00:606::/48 501 | 2400:cb00:607::/48 502 | 2400:cb00:608::/48 503 | 2400:cb00:609::/48 504 | 2400:cb00:610::/48 505 | 2400:cb00:611::/48 506 | 2400:cb00:612::/48 507 | 2400:cb00:613::/48 508 | 2400:cb00:614::/48 509 | 2400:cb00:617::/48 510 | 2400:cb00:618::/48 511 | 2400:cb00:619::/48 512 | 2400:cb00:620::/48 513 | 2400:cb00:621::/48 514 | 2400:cb00:622::/48 515 | 2400:cb00:623::/48 516 | 2400:cb00:625::/48 517 | 2400:cb00:626::/48 518 | 2400:cb00:627::/48 519 | 2400:cb00:631::/48 520 | 2400:cb00:632::/48 521 | 2400:cb00:633::/48 522 | 2400:cb00:634::/48 523 | 2400:cb00:636::/48 524 | 2400:cb00:637::/48 525 | 2400:cb00:638::/48 526 | 2400:cb00:639::/48 527 | 2400:cb00:640::/48 528 | 2400:cb00:641::/48 529 | 2400:cb00:643::/48 530 | 2400:cb00:644::/48 531 | 2400:cb00:645::/48 532 | 2400:cb00:646::/48 533 | 2400:cb00:648::/48 534 | 2400:cb00:649::/48 535 | 2400:cb00:650::/48 536 | 2400:cb00:651::/48 537 | 2400:cb00:2049::/48 538 | 2400:cb00:3000::/48 539 | 2400:cb00:3007::/48 540 | 2400:cb00:3008::/48 541 | 2400:cb00:3009::/48 542 | 2400:cb00:300d::/48 543 | 2400:cb00:a1d0::/48 544 | 2400:cb00:a1d1::/48 545 | 2400:cb00:a1d2::/48 546 | 2400:cb00:a1d3::/48 547 | 2400:cb00:a1d4::/48 548 | 2400:cb00:a1d5::/48 549 | 2400:cb00:a1f0::/48 550 | 2400:cb00:a1f1::/48 551 | 2400:cb00:a1f2::/48 552 | 2400:cb00:a1f3::/48 553 | 2400:cb00:a260::/48 554 | 2400:cb00:a261::/48 555 | 2400:cb00:a2b0::/48 556 | 2400:cb00:a2b1::/48 557 | 2400:cb00:a2c0::/48 558 | 2400:cb00:a2c2::/48 559 | 2400:cb00:a2d0::/48 560 | 2400:cb00:a2d1::/48 561 | 2400:cb00:a2e0::/48 562 | 2400:cb00:a2e1::/48 563 | 2400:cb00:a2f0::/48 564 | 2400:cb00:a2f1::/48 565 | 2400:cb00:a2f2::/48 566 | 2400:cb00:a320::/48 567 | 2400:cb00:a321::/48 568 | 2400:cb00:a322::/48 569 | 2400:cb00:a323::/48 570 | 2400:cb00:a324::/48 571 | 2400:cb00:a325::/48 572 | 2400:cb00:a340::/48 573 | 2400:cb00:a341::/48 574 | 2400:cb00:a342::/48 575 | 2400:cb00:a343::/48 576 | 2400:cb00:a370::/48 577 | 2400:cb00:a371::/48 578 | 2400:cb00:a390::/48 579 | 2400:cb00:a391::/48 580 | 2400:cb00:a410::/48 581 | 2400:cb00:a411::/48 582 | 2400:cb00:a412::/48 583 | 2400:cb00:a413::/48 584 | 2400:cb00:a430::/48 585 | 2400:cb00:a431::/48 586 | 2400:cb00:a432::/48 587 | 2400:cb00:a433::/48 588 | 2400:cb00:a434::/48 589 | 2400:cb00:a460::/48 590 | 2400:cb00:a461::/48 591 | 2400:cb00:a462::/48 592 | 2400:cb00:a463::/48 593 | 2400:cb00:a464::/48 594 | 2400:cb00:a480::/48 595 | 2400:cb00:a481::/48 596 | 2400:cb00:a482::/48 597 | 2400:cb00:a483::/48 598 | 2400:cb00:a484::/48 599 | 2400:cb00:a490::/48 600 | 2400:cb00:a491::/48 601 | 2400:cb00:a492::/48 602 | 2400:cb00:a493::/48 603 | 2400:cb00:a494::/48 604 | 2400:cb00:a495::/48 605 | 2400:cb00:a496::/48 606 | 2400:cb00:a4a0::/48 607 | 2400:cb00:a4a1::/48 608 | 2400:cb00:a4a2::/48 609 | 2400:cb00:a4a3::/48 610 | 2400:cb00:a4a4::/48 611 | 2400:cb00:a4a5::/48 612 | 2400:cb00:a4b0::/48 613 | 2400:cb00:a4b1::/48 614 | 2400:cb00:a4b2::/48 615 | 2400:cb00:a4b3::/48 616 | 2400:cb00:a4c0::/48 617 | 2400:cb00:a4c1::/48 618 | 2400:cb00:a4e0::/48 619 | 2400:cb00:a4e1::/48 620 | 2400:cb00:a4e2::/48 621 | 2400:cb00:a4e3::/48 622 | 2400:cb00:a4e4::/48 623 | 2400:cb00:a4e5::/48 624 | 2400:cb00:a4f0::/48 625 | 2400:cb00:a4f1::/48 626 | 2400:cb00:a4f2::/48 627 | 2400:cb00:a530::/48 628 | 2400:cb00:a531::/48 629 | 2400:cb00:a532::/48 630 | 2400:cb00:a533::/48 631 | 2400:cb00:a540::/48 632 | 2400:cb00:a541::/48 633 | 2400:cb00:a542::/48 634 | 2400:cb00:a550::/48 635 | 2400:cb00:a551::/48 636 | 2400:cb00:a552::/48 637 | 2400:cb00:a570::/48 638 | 2400:cb00:a571::/48 639 | 2400:cb00:a580::/48 640 | 2400:cb00:a581::/48 641 | 2400:cb00:a590::/48 642 | 2400:cb00:a591::/48 643 | 2400:cb00:a592::/48 644 | 2400:cb00:a593::/48 645 | 2400:cb00:a594::/48 646 | 2400:cb00:a595::/48 647 | 2400:cb00:a596::/48 648 | 2400:cb00:a600::/48 649 | 2400:cb00:a601::/48 650 | 2400:cb00:a620::/48 651 | 2400:cb00:a621::/48 652 | 2400:cb00:a622::/48 653 | 2400:cb00:a623::/48 654 | 2400:cb00:a625::/48 655 | 2400:cb00:a626::/48 656 | 2400:cb00:a640::/48 657 | 2400:cb00:a641::/48 658 | 2400:cb00:a642::/48 659 | 2400:cb00:a643::/48 660 | 2400:cb00:a644::/48 661 | 2400:cb00:a6a0::/48 662 | 2400:cb00:a6a1::/48 663 | 2400:cb00:a6a2::/48 664 | 2400:cb00:a6a3::/48 665 | 2400:cb00:a6a4::/48 666 | 2400:cb00:a6a5::/48 667 | 2400:cb00:a6a6::/48 668 | 2400:cb00:a6b0::/48 669 | 2400:cb00:a6b1::/48 670 | 2400:cb00:a6b2::/48 671 | 2400:cb00:a710::/48 672 | 2400:cb00:a720::/48 673 | 2400:cb00:a721::/48 674 | 2400:cb00:a722::/48 675 | 2400:cb00:a723::/48 676 | 2400:cb00:a724::/48 677 | 2400:cb00:a725::/48 678 | 2400:cb00:a726::/48 679 | 2400:cb00:a727::/48 680 | 2400:cb00:a730::/48 681 | 2400:cb00:a731::/48 682 | 2400:cb00:a732::/48 683 | 2400:cb00:a733::/48 684 | 2400:cb00:a740::/48 685 | 2400:cb00:a742::/48 686 | 2400:cb00:a743::/48 687 | 2400:cb00:a744::/48 688 | 2400:cb00:a760::/48 689 | 2400:cb00:a761::/48 690 | 2400:cb00:a762::/48 691 | 2400:cb00:a770::/48 692 | 2400:cb00:a771::/48 693 | 2400:cb00:a772::/48 694 | 2400:cb00:a773::/48 695 | 2400:cb00:a774::/48 696 | 2400:cb00:a7b0::/48 697 | 2400:cb00:a7b1::/48 698 | 2400:cb00:a7b2::/48 699 | 2400:cb00:a7b3::/48 700 | 2400:cb00:a7b4::/48 701 | 2400:cb00:a7b5::/48 702 | 2400:cb00:a7c0::/48 703 | 2400:cb00:a7c1::/48 704 | 2400:cb00:a7c2::/48 705 | 2400:cb00:a800::/48 706 | 2400:cb00:a801::/48 707 | 2400:cb00:a802::/48 708 | 2400:cb00:a803::/48 709 | 2400:cb00:a804::/48 710 | 2400:cb00:a805::/48 711 | 2400:cb00:a820::/48 712 | 2400:cb00:a821::/48 713 | 2400:cb00:a840::/48 714 | 2400:cb00:a841::/48 715 | 2400:cb00:a842::/48 716 | 2400:cb00:a870::/48 717 | 2400:cb00:a871::/48 718 | 2400:cb00:a872::/48 719 | 2400:cb00:a873::/48 720 | 2400:cb00:a874::/48 721 | 2400:cb00:a875::/48 722 | 2400:cb00:a880::/48 723 | 2400:cb00:a881::/48 724 | 2400:cb00:a8f0::/48 725 | 2400:cb00:a8f1::/48 726 | 2400:cb00:a940::/48 727 | 2400:cb00:a941::/48 728 | 2400:cb00:a970::/48 729 | 2400:cb00:a971::/48 730 | 2400:cb00:a972::/48 731 | 2400:cb00:a980::/48 732 | 2400:cb00:a981::/48 733 | 2400:cb00:a982::/48 734 | 2400:cb00:a9a0::/48 735 | 2400:cb00:a9a1::/48 736 | 2400:cb00:a9a2::/48 737 | 2400:cb00:a9c0::/48 738 | 2400:cb00:a9f0::/48 739 | 2400:cb00:a9f1::/48 740 | 2400:cb00:aa21::/48 741 | 2400:cb00:aa23::/48 742 | 2400:cb00:aa24::/48 743 | 2400:cb00:aa90::/48 744 | 2400:cb00:aa91::/48 745 | 2400:cb00:ab90::/48 746 | 2400:cb00:ab91::/48 747 | 2400:cb00:ab92::/48 748 | 2400:cb00:f00e::/48 749 | 2405:8100:8005::/48 750 | 2405:8100:c000::/38 751 | 2405:b500::/34 752 | 2405:b500:4000::/34 753 | 2405:b500:8000::/34 754 | 2405:b500:c000::/34 755 | 2606:4700::/36 756 | 2606:4700::/44 757 | 2606:4700:1::/48 758 | 2606:4700:10::/44 759 | 2606:4700:11::/48 760 | 2606:4700:20::/44 761 | 2606:4700:21::/48 762 | 2606:4700:50::/44 763 | 2606:4700:52::/48 764 | 2606:4700:54::/48 765 | 2606:4700:56::/48 766 | 2606:4700:57::/48 767 | 2606:4700:5a::/48 768 | 2606:4700:5c::/48 769 | 2606:4700:60::/44 770 | 2606:4700:68::/47 771 | 2606:4700:70::/44 772 | 2606:4700:80::/44 773 | 2606:4700:90::/44 774 | 2606:4700:a0::/48 775 | 2606:4700:a1::/48 776 | 2606:4700:a8::/48 777 | 2606:4700:a9::/48 778 | 2606:4700:c0::/44 779 | 2606:4700:d0::/44 780 | 2606:4700:d0::/48 781 | 2606:4700:d1::/48 782 | 2606:4700:e0::/47 783 | 2606:4700:e2::/47 784 | 2606:4700:e4::/47 785 | 2606:4700:e6::/47 786 | 2606:4700:f0::/48 787 | 2606:4700:f1::/48 788 | 2606:4700:f2::/48 789 | 2606:4700:f3::/48 790 | 2606:4700:f4::/48 791 | 2606:4700:f5::/48 792 | 2606:4700:100::/48 793 | 2606:4700:101::/48 794 | 2606:4700:10f::/48 795 | 2606:4700:130::/44 796 | 2606:4700:3000::/44 797 | 2606:4700:3000::/48 798 | 2606:4700:3001::/48 799 | 2606:4700:3002::/48 800 | 2606:4700:3003::/48 801 | 2606:4700:3004::/48 802 | 2606:4700:3005::/48 803 | 2606:4700:3006::/48 804 | 2606:4700:3007::/48 805 | 2606:4700:3008::/48 806 | 2606:4700:3009::/48 807 | 2606:4700:300a::/48 808 | 2606:4700:300b::/48 809 | 2606:4700:3010::/44 810 | 2606:4700:3010::/48 811 | 2606:4700:3011::/48 812 | 2606:4700:3012::/48 813 | 2606:4700:3013::/48 814 | 2606:4700:3014::/48 815 | 2606:4700:3015::/48 816 | 2606:4700:3016::/48 817 | 2606:4700:3017::/48 818 | 2606:4700:3018::/48 819 | 2606:4700:3019::/48 820 | 2606:4700:3020::/44 821 | 2606:4700:3020::/48 822 | 2606:4700:3021::/48 823 | 2606:4700:3022::/48 824 | 2606:4700:3023::/48 825 | 2606:4700:3024::/48 826 | 2606:4700:3025::/48 827 | 2606:4700:3026::/48 828 | 2606:4700:3027::/48 829 | 2606:4700:3028::/48 830 | 2606:4700:3029::/48 831 | 2606:4700:3030::/44 832 | 2606:4700:3030::/48 833 | 2606:4700:3031::/48 834 | 2606:4700:3032::/48 835 | 2606:4700:3033::/48 836 | 2606:4700:3034::/48 837 | 2606:4700:3035::/48 838 | 2606:4700:3036::/48 839 | 2606:4700:3037::/48 840 | 2606:4700:3038::/48 841 | 2606:4700:3039::/48 842 | 2606:4700:3055::/48 843 | 2606:4700:3056::/48 844 | 2606:4700:3108::/48 845 | 2606:4700:310c::/48 846 | 2606:4700:3110::/48 847 | 2606:4700:3111::/48 848 | 2606:4700:3112::/48 849 | 2606:4700:3113::/48 850 | 2606:4700:3114::/48 851 | 2606:4700:3115::/48 852 | 2606:4700:3116::/48 853 | 2606:4700:3117::/48 854 | 2606:4700:3118::/48 855 | 2606:4700:3119::/48 856 | 2606:4700:311a::/48 857 | 2606:4700:311b::/48 858 | 2606:4700:311c::/48 859 | 2606:4700:311d::/48 860 | 2606:4700:311e::/48 861 | 2606:4700:311f::/48 862 | 2606:4700:4000::/45 863 | 2606:4700:4008::/45 864 | 2606:4700:4010::/45 865 | 2606:4700:4018::/45 866 | 2606:4700:4020::/48 867 | 2606:4700:4021::/48 868 | 2606:4700:42c8::/45 869 | 2606:4700:43d8::/45 870 | 2606:4700:4400::/48 871 | 2606:4700:4401::/48 872 | 2606:4700:4402::/48 873 | 2606:4700:4403::/48 874 | 2606:4700:4404::/48 875 | 2606:4700:4405::/48 876 | 2606:4700:4406::/48 877 | 2606:4700:4407::/48 878 | 2606:4700:4408::/48 879 | 2606:4700:4409::/48 880 | 2606:4700:440a::/48 881 | 2606:4700:440b::/48 882 | 2606:4700:440c::/48 883 | 2606:4700:440d::/48 884 | 2606:4700:440e::/48 885 | 2606:4700:440f::/48 886 | 2606:4700:4700::/48 887 | 2606:4700:7000::/48 888 | 2606:4700:8390::/44 889 | 2606:4700:8390::/48 890 | 2606:4700:8391::/48 891 | 2606:4700:8392::/48 892 | 2606:4700:8393::/48 893 | 2606:4700:8394::/48 894 | 2606:4700:8395::/48 895 | 2606:4700:8396::/48 896 | 2606:4700:8397::/48 897 | 2606:4700:8398::/48 898 | 2606:4700:8399::/48 899 | 2606:4700:839a::/48 900 | 2606:4700:839b::/48 901 | 2606:4700:83b0::/44 902 | 2606:4700:83b0::/48 903 | 2606:4700:83b1::/48 904 | 2606:4700:83b3::/48 905 | 2606:4700:83b4::/48 906 | 2606:4700:83b5::/48 907 | 2606:4700:83b6::/48 908 | 2606:4700:83b7::/48 909 | 2606:4700:83b8::/48 910 | 2606:4700:83b9::/48 911 | 2606:4700:83ba::/48 912 | 2606:4700:83bb::/48 913 | 2606:4700:85c0::/44 914 | 2606:4700:85d0::/44 915 | 2606:4700:8ca0::/44 916 | 2606:4700:8ca0::/48 917 | 2606:4700:8ca1::/48 918 | 2606:4700:8ca2::/48 919 | 2606:4700:8ca3::/48 920 | 2606:4700:8ca4::/48 921 | 2606:4700:8ca5::/48 922 | 2606:4700:8ca6::/48 923 | 2606:4700:8ca7::/48 924 | 2606:4700:8ca8::/48 925 | 2606:4700:8ca9::/48 926 | 2606:4700:8caa::/48 927 | 2606:4700:8cab::/48 928 | 2606:4700:8cac::/48 929 | 2606:4700:8cad::/48 930 | 2606:4700:8cae::/48 931 | 2606:4700:8caf::/48 932 | 2606:4700:8d70::/44 933 | 2606:4700:8d70::/48 934 | 2606:4700:8d71::/48 935 | 2606:4700:8d72::/48 936 | 2606:4700:8d74::/48 937 | 2606:4700:8d75::/48 938 | 2606:4700:8d76::/48 939 | 2606:4700:8d77::/48 940 | 2606:4700:8d90::/44 941 | 2606:4700:8d90::/48 942 | 2606:4700:8d91::/48 943 | 2606:4700:8d92::/48 944 | 2606:4700:8d93::/48 945 | 2606:4700:8d94::/48 946 | 2606:4700:8d95::/48 947 | 2606:4700:8d96::/48 948 | 2606:4700:8d97::/48 949 | 2606:4700:8dd0::/44 950 | 2606:4700:8dd0::/48 951 | 2606:4700:8dd1::/48 952 | 2606:4700:8dd2::/48 953 | 2606:4700:8dd3::/48 954 | 2606:4700:8dd4::/48 955 | 2606:4700:8dd5::/48 956 | 2606:4700:8dd6::/48 957 | 2606:4700:8dd7::/48 958 | 2606:4700:8dd8::/48 959 | 2606:4700:8dd9::/48 960 | 2606:4700:8dda::/48 961 | 2606:4700:8ddb::/48 962 | 2606:4700:8ddc::/48 963 | 2606:4700:8ddd::/48 964 | 2606:4700:8dde::/48 965 | 2606:4700:8ddf::/48 966 | 2606:4700:8de0::/44 967 | 2606:4700:8de0::/48 968 | 2606:4700:8de1::/48 969 | 2606:4700:8de2::/48 970 | 2606:4700:8de3::/48 971 | 2606:4700:8de4::/48 972 | 2606:4700:8de5::/48 973 | 2606:4700:8de6::/48 974 | 2606:4700:8de7::/48 975 | 2606:4700:8de8::/48 976 | 2606:4700:8de9::/48 977 | 2606:4700:8dea::/48 978 | 2606:4700:8deb::/48 979 | 2606:4700:8dec::/48 980 | 2606:4700:8ded::/48 981 | 2606:4700:8dee::/48 982 | 2606:4700:8def::/48 983 | 2606:4700:90c0::/44 984 | 2606:4700:90c0::/48 985 | 2606:4700:90c1::/48 986 | 2606:4700:90c2::/48 987 | 2606:4700:90c3::/48 988 | 2606:4700:90c4::/48 989 | 2606:4700:90c5::/48 990 | 2606:4700:90c6::/48 991 | 2606:4700:90c7::/48 992 | 2606:4700:90d0::/44 993 | 2606:4700:90d0::/48 994 | 2606:4700:90d2::/48 995 | 2606:4700:90d4::/48 996 | 2606:4700:90d5::/48 997 | 2606:4700:90d6::/48 998 | 2606:4700:90d7::/48 999 | 2606:4700:90d8::/48 1000 | 2606:4700:90d9::/48 1001 | 2606:4700:90db::/48 1002 | 2606:4700:91b0::/44 1003 | 2606:4700:91b0::/48 1004 | 2606:4700:91b1::/48 1005 | 2606:4700:91b2::/48 1006 | 2606:4700:91b3::/48 1007 | 2606:4700:91b4::/48 1008 | 2606:4700:91b5::/48 1009 | 2606:4700:91b6::/48 1010 | 2606:4700:91b7::/48 1011 | 2606:4700:91b8::/48 1012 | 2606:4700:91b9::/48 1013 | 2606:4700:91ba::/48 1014 | 2606:4700:91bb::/48 1015 | 2606:4700:9640::/44 1016 | 2606:4700:9640::/48 1017 | 2606:4700:9641::/48 1018 | 2606:4700:9642::/48 1019 | 2606:4700:9644::/48 1020 | 2606:4700:9645::/48 1021 | 2606:4700:9646::/48 1022 | 2606:4700:964c::/48 1023 | 2606:4700:964d::/48 1024 | 2606:4700:964e::/48 1025 | 2606:4700:964f::/48 1026 | 2606:4700:9760::/44 1027 | 2606:4700:9760::/48 1028 | 2606:4700:9761::/48 1029 | 2606:4700:9762::/48 1030 | 2606:4700:9763::/48 1031 | 2606:4700:9764::/48 1032 | 2606:4700:9765::/48 1033 | 2606:4700:9766::/48 1034 | 2606:4700:9767::/48 1035 | 2606:4700:9768::/48 1036 | 2606:4700:9769::/48 1037 | 2606:4700:976a::/48 1038 | 2606:4700:976b::/48 1039 | 2606:4700:99e0::/44 1040 | 2606:4700:99e0::/48 1041 | 2606:4700:99e2::/48 1042 | 2606:4700:99e3::/48 1043 | 2606:4700:99e4::/48 1044 | 2606:4700:99e5::/48 1045 | 2606:4700:99e6::/48 1046 | 2606:4700:99e7::/48 1047 | 2606:4700:99e8::/48 1048 | 2606:4700:99e9::/48 1049 | 2606:4700:99ea::/48 1050 | 2606:4700:99eb::/48 1051 | 2606:4700:99ec::/48 1052 | 2606:4700:99ed::/48 1053 | 2606:4700:99ee::/48 1054 | 2606:4700:99ef::/48 1055 | 2606:4700:9a60::/44 1056 | 2606:4700:9a60::/48 1057 | 2606:4700:9a61::/48 1058 | 2606:4700:9a62::/48 1059 | 2606:4700:9a63::/48 1060 | 2606:4700:9a64::/48 1061 | 2606:4700:9a65::/48 1062 | 2606:4700:9a66::/48 1063 | 2606:4700:9a67::/48 1064 | 2606:4700:9a68::/48 1065 | 2606:4700:9a69::/48 1066 | 2606:4700:9a6a::/48 1067 | 2606:4700:9a6b::/48 1068 | 2606:4700:9a6c::/48 1069 | 2606:4700:9a6d::/48 1070 | 2606:4700:9a6e::/48 1071 | 2606:4700:9a6f::/48 1072 | 2606:4700:9a90::/44 1073 | 2606:4700:9ad0::/44 1074 | 2606:4700:9ad0::/48 1075 | 2606:4700:9ad1::/48 1076 | 2606:4700:9ad2::/48 1077 | 2606:4700:9ad3::/48 1078 | 2606:4700:9ad4::/48 1079 | 2606:4700:9ad5::/48 1080 | 2606:4700:9ad6::/48 1081 | 2606:4700:9ad7::/48 1082 | 2606:4700:9ad8::/48 1083 | 2606:4700:9ad9::/48 1084 | 2606:4700:9ada::/48 1085 | 2606:4700:9adb::/48 1086 | 2606:4700:9adc::/48 1087 | 2606:4700:9add::/48 1088 | 2606:4700:9ade::/48 1089 | 2606:4700:9adf::/48 1090 | 2606:4700:9ae0::/44 1091 | 2606:4700:9ae0::/48 1092 | 2606:4700:9ae1::/48 1093 | 2606:4700:9ae2::/48 1094 | 2606:4700:9ae3::/48 1095 | 2606:4700:9ae4::/48 1096 | 2606:4700:9ae5::/48 1097 | 2606:4700:9ae6::/48 1098 | 2606:4700:9ae7::/48 1099 | 2606:4700:9ae8::/48 1100 | 2606:4700:9ae9::/48 1101 | 2606:4700:9aea::/48 1102 | 2606:4700:9aeb::/48 1103 | 2606:4700:9b00::/44 1104 | 2606:4700:9b00::/48 1105 | 2606:4700:9b01::/48 1106 | 2606:4700:9b02::/48 1107 | 2606:4700:9b03::/48 1108 | 2606:4700:9b04::/48 1109 | 2606:4700:9b05::/48 1110 | 2606:4700:9b06::/48 1111 | 2606:4700:9b07::/48 1112 | 2606:4700:9b08::/48 1113 | 2606:4700:9b09::/48 1114 | 2606:4700:9b0a::/48 1115 | 2606:4700:9b0b::/48 1116 | 2606:4700:9b0c::/48 1117 | 2606:4700:9b0d::/48 1118 | 2606:4700:9b0e::/48 1119 | 2606:4700:9b0f::/48 1120 | 2606:4700:9c60::/44 1121 | 2606:4700:9c60::/48 1122 | 2606:4700:9c61::/48 1123 | 2606:4700:9c62::/48 1124 | 2606:4700:9c63::/48 1125 | 2606:4700:9c64::/48 1126 | 2606:4700:9c65::/48 1127 | 2606:4700:9c66::/48 1128 | 2606:4700:9c67::/48 1129 | 2606:4700:9c68::/48 1130 | 2606:4700:9c69::/48 1131 | 2606:4700:9c6a::/48 1132 | 2606:4700:9c6b::/48 1133 | 2606:4700:9c6c::/48 1134 | 2606:4700:9c6d::/48 1135 | 2606:4700:9c6e::/48 1136 | 2606:4700:9c6f::/48 1137 | 2606:54c0::/34 1138 | 2606:54c0:4000::/34 1139 | 2606:54c0:8000::/34 1140 | 2606:54c0:c000::/34 1141 | 2620:127:f00e::/48 1142 | 2620:127:f00f::/48 1143 | 2803:f800:50::/45 1144 | 2803:f800:52::/48 1145 | 2a06:98c0:1c00::/48 1146 | 2a06:98c0:1c02::/48 1147 | 2a06:98c0:1c03::/48 1148 | 2a06:98c0:1c04::/48 1149 | 2a06:98c0:1c06::/48 1150 | 2a06:98c0:1c07::/48 1151 | 2a06:98c0:1c08::/48 1152 | 2a06:98c0:1c09::/48 1153 | 2a06:98c0:1c0a::/48 1154 | 2a06:98c0:1c0c::/48 1155 | 2a06:98c0:1c0d::/48 1156 | 2a06:98c0:1c0e::/48 1157 | 2a06:98c0:1c0f::/48 1158 | 2a06:98c0:1c20::/48 1159 | 2a06:98c0:1c21::/48 1160 | 2a06:98c0:1c22::/48 1161 | 2a06:98c0:1c23::/48 1162 | 2a06:98c1:50::/45 1163 | 2a06:98c1:54::/48 1164 | 2a06:98c1:56::/48 1165 | 2a06:98c1:58::/48 1166 | 2a06:98c1:3100::/48 1167 | 2a06:98c1:3101::/48 1168 | 2a06:98c1:3102::/48 1169 | 2a06:98c1:3103::/48 1170 | 2a06:98c1:3104::/48 1171 | 2a06:98c1:3105::/48 1172 | 2a06:98c1:3106::/48 1173 | 2a06:98c1:3107::/48 1174 | 2a06:98c1:3108::/48 1175 | 2a06:98c1:3109::/48 1176 | 2a06:98c1:310a::/48 1177 | 2a06:98c1:310b::/48 1178 | 2a06:98c1:310c::/48 1179 | 2a06:98c1:310d::/48 1180 | 2a06:98c1:310e::/48 1181 | 2a06:98c1:310f::/48 1182 | 2a06:98c1:3120::/48 1183 | 2a06:98c1:3121::/48 1184 | 2a06:98c1:3122::/48 1185 | 2a06:98c1:3123::/48 1186 | 2a06:98c1:3200::/48 1187 | 2a09:bac0:4::/48 1188 | 2a09:bac0:11::/48 1189 | 2a09:bac0:12::/48 1190 | 2a09:bac0:14::/48 1191 | 2a09:bac0:15::/48 1192 | 2a09:bac0:16::/48 1193 | 2a09:bac0:17::/48 1194 | 2a09:bac0:19::/48 1195 | 2a09:bac0:20::/48 1196 | 2a09:bac0:21::/48 1197 | 2a09:bac0:22::/48 1198 | 2a09:bac0:23::/48 1199 | 2a09:bac0:26::/48 1200 | 2a09:bac0:27::/48 1201 | 2a09:bac0:28::/48 1202 | 2a09:bac0:29::/48 1203 | 2a09:bac0:31::/48 1204 | 2a09:bac0:34::/48 1205 | 2a09:bac0:35::/48 1206 | 2a09:bac0:38::/48 1207 | 2a09:bac0:39::/48 1208 | 2a09:bac0:40::/48 1209 | 2a09:bac0:43::/48 1210 | 2a09:bac0:44::/48 1211 | 2a09:bac0:45::/48 1212 | 2a09:bac0:46::/48 1213 | 2a09:bac0:47::/48 1214 | 2a09:bac0:48::/48 1215 | 2a09:bac0:49::/48 1216 | 2a09:bac0:50::/48 1217 | 2a09:bac0:51::/48 1218 | 2a09:bac0:52::/48 1219 | 2a09:bac0:54::/48 1220 | 2a09:bac0:56::/48 1221 | 2a09:bac0:57::/48 1222 | 2a09:bac0:59::/48 1223 | 2a09:bac0:60::/48 1224 | 2a09:bac0:63::/48 1225 | 2a09:bac0:64::/48 1226 | 2a09:bac0:65::/48 1227 | 2a09:bac0:66::/48 1228 | 2a09:bac0:67::/48 1229 | 2a09:bac0:68::/48 1230 | 2a09:bac0:69::/48 1231 | 2a09:bac0:70::/48 1232 | 2a09:bac0:71::/48 1233 | 2a09:bac0:72::/48 1234 | 2a09:bac0:73::/48 1235 | 2a09:bac0:74::/48 1236 | 2a09:bac0:75::/48 1237 | 2a09:bac0:76::/48 1238 | 2a09:bac0:77::/48 1239 | 2a09:bac0:78::/48 1240 | 2a09:bac0:79::/48 1241 | 2a09:bac0:80::/48 1242 | 2a09:bac0:81::/48 1243 | 2a09:bac0:83::/48 1244 | 2a09:bac0:84::/48 1245 | 2a09:bac0:85::/48 1246 | 2a09:bac0:87::/48 1247 | 2a09:bac0:88::/48 1248 | 2a09:bac0:89::/48 1249 | 2a09:bac0:94::/48 1250 | 2a09:bac0:96::/48 1251 | 2a09:bac0:97::/48 1252 | 2a09:bac0:98::/48 1253 | 2a09:bac0:100::/48 1254 | 2a09:bac0:102::/48 1255 | 2a09:bac0:103::/48 1256 | 2a09:bac0:106::/48 1257 | 2a09:bac0:107::/48 1258 | 2a09:bac0:109::/48 1259 | 2a09:bac0:113::/48 1260 | 2a09:bac0:114::/48 1261 | 2a09:bac0:115::/48 1262 | 2a09:bac0:116::/48 1263 | 2a09:bac0:118::/48 1264 | 2a09:bac0:119::/48 1265 | 2a09:bac0:120::/48 1266 | 2a09:bac0:121::/48 1267 | 2a09:bac0:123::/48 1268 | 2a09:bac0:124::/48 1269 | 2a09:bac0:125::/48 1270 | 2a09:bac0:126::/48 1271 | 2a09:bac0:128::/48 1272 | 2a09:bac0:130::/48 1273 | 2a09:bac0:132::/48 1274 | 2a09:bac0:134::/48 1275 | 2a09:bac0:135::/48 1276 | 2a09:bac0:136::/48 1277 | 2a09:bac0:137::/48 1278 | 2a09:bac0:138::/48 1279 | 2a09:bac0:143::/48 1280 | 2a09:bac0:144::/48 1281 | 2a09:bac0:145::/48 1282 | 2a09:bac0:148::/48 1283 | 2a09:bac0:149::/48 1284 | 2a09:bac0:151::/48 1285 | 2a09:bac0:152::/48 1286 | 2a09:bac0:153::/48 1287 | 2a09:bac0:154::/48 1288 | 2a09:bac0:155::/48 1289 | 2a09:bac0:156::/48 1290 | 2a09:bac0:157::/48 1291 | 2a09:bac0:158::/48 1292 | 2a09:bac0:159::/48 1293 | 2a09:bac0:160::/48 1294 | 2a09:bac0:162::/48 1295 | 2a09:bac0:163::/48 1296 | 2a09:bac0:165::/48 1297 | 2a09:bac0:166::/48 1298 | 2a09:bac0:167::/48 1299 | 2a09:bac0:168::/48 1300 | 2a09:bac0:169::/48 1301 | 2a09:bac0:172::/48 1302 | 2a09:bac0:174::/48 1303 | 2a09:bac0:181::/48 1304 | 2a09:bac0:184::/48 1305 | 2a09:bac0:185::/48 1306 | 2a09:bac0:189::/48 1307 | 2a09:bac0:191::/48 1308 | 2a09:bac0:192::/48 1309 | 2a09:bac0:193::/48 1310 | 2a09:bac0:194::/48 1311 | 2a09:bac0:196::/48 1312 | 2a09:bac0:197::/48 1313 | 2a09:bac0:199::/48 1314 | 2a09:bac0:201::/48 1315 | 2a09:bac0:202::/48 1316 | 2a09:bac0:203::/48 1317 | 2a09:bac0:204::/48 1318 | 2a09:bac0:205::/48 1319 | 2a09:bac0:212::/48 1320 | 2a09:bac0:213::/48 1321 | 2a09:bac0:216::/48 1322 | 2a09:bac0:217::/48 1323 | 2a09:bac0:218::/48 1324 | 2a09:bac0:227::/48 1325 | 2a09:bac0:228::/48 1326 | 2a09:bac0:232::/48 1327 | 2a09:bac0:237::/48 1328 | 2a09:bac0:242::/48 1329 | 2a09:bac0:243::/48 1330 | 2a09:bac0:246::/48 1331 | 2a09:bac0:251::/48 1332 | 2a09:bac0:253::/48 1333 | 2a09:bac0:254::/48 1334 | 2a09:bac0:268::/48 1335 | 2a09:bac0:269::/48 1336 | 2a09:bac0:270::/48 1337 | 2a09:bac0:275::/48 1338 | 2a09:bac0:281::/48 1339 | 2a09:bac0:283::/48 1340 | 2a09:bac0:284::/48 1341 | 2a09:bac0:285::/48 1342 | 2a09:bac0:298::/48 1343 | 2a09:bac0:299::/48 1344 | 2a09:bac0:301::/48 1345 | 2a09:bac0:304::/48 1346 | 2a09:bac0:308::/48 1347 | 2a09:bac0:336::/48 1348 | 2a09:bac0:337::/48 1349 | 2a09:bac0:338::/48 1350 | 2a09:bac0:339::/48 1351 | 2a09:bac0:341::/48 1352 | 2a09:bac0:343::/48 1353 | 2a09:bac0:346::/48 1354 | 2a09:bac0:352::/48 1355 | 2a09:bac0:358::/48 1356 | 2a09:bac0:360::/48 1357 | 2a09:bac0:373::/48 1358 | 2a09:bac0:374::/48 1359 | 2a09:bac0:376::/48 1360 | 2a09:bac0:378::/48 1361 | 2a09:bac0:380::/48 1362 | 2a09:bac0:381::/48 1363 | 2a09:bac0:382::/48 1364 | 2a09:bac0:384::/48 1365 | 2a09:bac0:385::/48 1366 | 2a09:bac0:388::/48 1367 | 2a09:bac0:390::/48 1368 | 2a09:bac0:391::/48 1369 | 2a09:bac0:392::/48 1370 | 2a09:bac0:393::/48 1371 | 2a09:bac0:403::/48 1372 | 2a09:bac0:404::/48 1373 | 2a09:bac0:407::/48 1374 | 2a09:bac0:408::/48 1375 | 2a09:bac0:411::/48 1376 | 2a09:bac0:412::/48 1377 | 2a09:bac0:423::/48 1378 | 2a09:bac0:428::/48 1379 | 2a09:bac0:431::/48 1380 | 2a09:bac0:433::/48 1381 | 2a09:bac0:439::/48 1382 | 2a09:bac0:441::/48 1383 | 2a09:bac0:443::/48 1384 | 2a09:bac0:445::/48 1385 | 2a09:bac0:448::/48 1386 | 2a09:bac0:450::/48 1387 | 2a09:bac0:451::/48 1388 | 2a09:bac0:453::/48 1389 | 2a09:bac0:455::/48 1390 | 2a09:bac0:458::/48 1391 | 2a09:bac0:462::/48 1392 | 2a09:bac0:464::/48 1393 | 2a09:bac0:466::/48 1394 | 2a09:bac0:467::/48 1395 | 2a09:bac0:469::/48 1396 | 2a09:bac0:470::/48 1397 | 2a09:bac0:472::/48 1398 | 2a09:bac0:476::/48 1399 | 2a09:bac0:477::/48 1400 | 2a09:bac0:478::/48 1401 | 2a09:bac0:479::/48 1402 | 2a09:bac0:481::/48 1403 | 2a09:bac0:483::/48 1404 | 2a09:bac0:485::/48 1405 | 2a09:bac0:497::/48 1406 | 2a09:bac0:507::/48 1407 | 2a09:bac0:522::/48 1408 | 2a09:bac0:523::/48 1409 | 2a09:bac0:525::/48 1410 | 2a09:bac0:532::/48 1411 | 2a09:bac0:533::/48 1412 | 2a09:bac0:534::/48 1413 | 2a09:bac0:537::/48 1414 | 2a09:bac0:538::/48 1415 | 2a09:bac0:541::/48 1416 | 2a09:bac0:542::/48 1417 | 2a09:bac0:543::/48 1418 | 2a09:bac0:545::/48 1419 | 2a09:bac0:557::/48 1420 | 2a09:bac0:558::/48 1421 | 2a09:bac0:559::/48 1422 | 2a09:bac0:566::/48 1423 | 2a09:bac0:567::/48 1424 | 2a09:bac0:572::/48 1425 | 2a09:bac0:573::/48 1426 | 2a09:bac0:574::/48 1427 | 2a09:bac0:577::/48 1428 | 2a09:bac0:578::/48 1429 | 2a09:bac0:579::/48 1430 | 2a09:bac0:581::/48 1431 | 2a09:bac0:582::/48 1432 | 2a09:bac0:583::/48 1433 | 2a09:bac0:594::/48 1434 | 2a09:bac0:597::/48 1435 | 2a09:bac0:598::/48 1436 | 2a09:bac0:601::/48 1437 | 2a09:bac0:612::/48 1438 | 2a09:bac0:618::/48 1439 | 2a09:bac0:619::/48 1440 | 2a09:bac0:626::/48 1441 | 2a09:bac0:631::/48 1442 | 2a09:bac0:632::/48 1443 | 2a09:bac0:633::/48 1444 | 2a09:bac0:636::/48 1445 | 2a09:bac0:637::/48 1446 | 2a09:bac0:641::/48 1447 | 2a09:bac0:646::/48 1448 | 2a09:bac0:649::/48 1449 | 2a09:bac0:650::/48 1450 | 2a09:bac0:1000::/48 1451 | 2a09:bac0:1001::/48 1452 | 2a09:bac1::/32 1453 | 2a09:bac2::/32 1454 | 2a09:bac3::/32 1455 | 2a09:bac4::/32 1456 | 2a09:bac5::/32 1457 | 2a09:bac6::/32 1458 | 2a09:bac7::/32 1459 | 2c0f:f248::/32 1460 | 2400:cb00:36::/48 1461 | 2400:cb00:348::/48 1462 | 2400:cb00:349::/48 1463 | 2606:4700:1100::/40 1464 | 2a06:98c0:3600::/48 1465 | 2a06:98c0:3601::/48 1466 | 2a06:98c0:3602::/48 1467 | 2a06:98c0:3603::/48 1468 | 2a06:98c0:3604::/48 1469 | 2a06:98c0:3605::/48 1470 | 2a06:98c0:3606::/48 1471 | 2a06:98c0:3607::/48 1472 | 2a06:98c0:3608::/48 1473 | 2a06:98c0:3609::/48 1474 | 2a06:98c0:360a::/48 1475 | 2a06:98c0:360b::/48 1476 | 2a06:98c0:360c::/48 1477 | 2a06:98c0:360d::/48 1478 | 2a06:98c0:3613::/48 1479 | 2a06:98c0:3614::/48 1480 | 2a06:98c0:3615::/48 1481 | -------------------------------------------------------------------------------- /get-cf-ip.py: -------------------------------------------------------------------------------- 1 | import hashlib 2 | from dataclasses import dataclass 3 | from enum import Enum, unique, auto 4 | from typing import Optional, List 5 | from urllib.parse import unquote 6 | 7 | import requests 8 | from bs4 import BeautifulSoup, Tag 9 | from requests import Response 10 | 11 | 12 | @dataclass(repr=True, init=True) 13 | class QueryResult: 14 | @unique 15 | class ResultType(Enum): 16 | AS = auto() 17 | NET = auto() 18 | DNS = auto() 19 | IP = auto() 20 | 21 | result_type: ResultType 22 | result: str 23 | path: str 24 | description: str 25 | region: str 26 | 27 | 28 | @dataclass(repr=True, init=True) 29 | class AutonomousSystem: 30 | name: str 31 | region: str 32 | prefixes_v4: List[QueryResult] 33 | prefixes_v6: List[QueryResult] 34 | 35 | 36 | class BgpInfo: 37 | DOMAIN = 'bgp.he.net' 38 | URL = f"https://{DOMAIN}" 39 | 40 | def __init__(self): 41 | self.session = requests.Session() 42 | self.session.headers["User-Agent"] = "Chrome" 43 | 44 | self.session.get(f"{self.URL}/search") 45 | path_cookie: Optional[str] = self.session.cookies.get('path', domain=self.DOMAIN) 46 | if path_cookie is None: 47 | raise Exception(f"path_cookie is None, cookies: {self.session.cookies}") 48 | path_cookie = unquote(path_cookie) 49 | ip_res: Response = self.session.get(f"{self.URL}/i") 50 | ip: str = ip_res.text.strip() 51 | p = hashlib.md5(path_cookie.encode()).hexdigest() 52 | i = hashlib.md5(ip.encode()).hexdigest() 53 | 54 | r = self.session.post(f"{self.URL}/jc", data={'p': p, 'i': i}) 55 | 56 | if r.status_code != 200: 57 | raise Exception(f"init error! p: {p}, i: {i}, r: {r} {r.content!r}, ip: {ip}, path_cookie: {path_cookie}") 58 | 59 | @staticmethod 60 | def _parse_result_table(table: Tag) -> List[QueryResult]: 61 | ret = [] 62 | assert (type(table.tbody) is Tag) 63 | lines: List[Tag] = [line for line in table.tbody.children if type(line) is Tag] 64 | for line in lines: 65 | tds = line.find_all("td") 66 | assert (len(tds) == 2) 67 | href: str = tds[0].a.attrs['href'] 68 | result: str = tds[0].a.get_text() 69 | description: str = tds[1].get_text().strip() 70 | region: str = '' 71 | result_type: QueryResult.ResultType 72 | img: Optional[Tag] = tds[1].find('img') 73 | if img is not None: 74 | region = img.attrs['title'] 75 | 76 | if href.startswith('/dns/'): 77 | result_type = QueryResult.ResultType.DNS 78 | elif href.startswith('/AS'): 79 | result_type = QueryResult.ResultType.AS 80 | elif href.startswith('/net/'): 81 | result_type = QueryResult.ResultType.NET 82 | else: 83 | print(href, result, description, region) 84 | raise Exception('fuck') 85 | ret.append(QueryResult(result_type, result, href, description, region)) 86 | # for i in ret[-30:]: 87 | # print(i) 88 | return ret 89 | 90 | def search(self, text: str) -> List[QueryResult]: 91 | params = { 92 | 'search[search]': text, 93 | 'commit': 'Search' 94 | } 95 | 96 | r = self.session.get(f"{self.URL}/search", params=params) 97 | soup = BeautifulSoup(r.text, features="html.parser") 98 | soup_text = soup.get_text() 99 | 100 | if 'did not return any results. You may go Back to the page that referred you' in soup_text: 101 | return [] 102 | 103 | return self._parse_result_table(soup.find_all(attrs={'class': 'w100p'})[0]) 104 | 105 | def autonomous_system(self, name: str) -> AutonomousSystem: 106 | assert (name.startswith("AS")) 107 | as_res = self.session.get(f"{self.URL}/{name}") 108 | as_res_soup = BeautifulSoup(as_res.text, features="html.parser") 109 | prefixes4_tables = as_res_soup.find_all(attrs={'id': 'table_prefixes4'}) 110 | prefixes6_tables = as_res_soup.find_all(attrs={'id': 'table_prefixes6'}) 111 | 112 | if prefixes4_tables: 113 | prefixes_v4 = self._parse_result_table(prefixes4_tables[0]) 114 | else: 115 | prefixes_v4 = [] 116 | 117 | if prefixes6_tables: 118 | prefixes_v6 = self._parse_result_table(prefixes6_tables[0]) 119 | else: 120 | prefixes_v6 = [] 121 | 122 | return AutonomousSystem(name, "", prefixes_v4, prefixes_v6) 123 | 124 | 125 | def main(): 126 | bgp_info = BgpInfo() 127 | bgp_info.search("cloudflare") 128 | as_list: List[AutonomousSystem] = [bgp_info.autonomous_system(result.result) for result in 129 | bgp_info.search("cloudflare") if 130 | result.result_type is QueryResult.ResultType.AS] 131 | 132 | with open('cf-v4.txt', 'w') as cf_v4, open('cf-v6.txt', 'w') as cf_v6: 133 | for as_info in as_list: 134 | for net in as_info.prefixes_v4: 135 | assert net.result_type is QueryResult.ResultType.NET 136 | cf_v4.write(f'{net.result}\n') 137 | for net in as_info.prefixes_v6: 138 | assert net.result_type is QueryResult.ResultType.NET 139 | cf_v6.write(f'{net.result}\n') 140 | print('update cf ip success!') 141 | 142 | 143 | # res = requests.get("https://bgp.he.net/search", params=params, headers=headers) 144 | # print(res.text) 145 | if __name__ == '__main__': 146 | main() 147 | -------------------------------------------------------------------------------- /get-data.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | echo "download sing-box" 3 | curl -Lo "sing-box.tar.gz" "https://github.com/SagerNet/sing-box/releases/download/v1.2-beta8/sing-box-1.2-beta8-linux-amd64v3.tar.gz" 4 | tar -xvf sing-box.tar.gz 5 | mv sing-box-1.2-beta8-linux-amd64v3/sing-box . 6 | rm -r sing-box-1.2-beta8-linux-amd64v3 sing-box.tar.gz 7 | mkdir data 8 | echo "download cf-v4.txt" 9 | curl -Lo "cf-v4.txt" https://raw.githubusercontent.com/plusls/cdn-ip-tester/master/cf-v4.txt 10 | echo "download cf-v6.txt" 11 | curl -Lo "cf-v6.txt" https://raw.githubusercontent.com/plusls/cdn-ip-tester/master/cf-v6.txt 12 | echo "download outbound-template.json" 13 | curl -Lo "data/outbound-template.json" https://raw.githubusercontent.com/plusls/cdn-ip-tester/master/outbound-template.json 14 | echo "download sing-box-template.json" 15 | curl -Lo "data/sing-box-template.json" https://raw.githubusercontent.com/plusls/cdn-ip-tester/master/sing-box-template.json 16 | echo "download ip-tester.toml" 17 | curl -Lo "data/ip-tester.toml" https://raw.githubusercontent.com/plusls/cdn-ip-tester/master/ip-tester.toml -------------------------------------------------------------------------------- /img/struct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plusls/cdn-ip-tester/e30f873cf1b2ad4815a9db3a53c168281f38d260/img/struct.png -------------------------------------------------------------------------------- /img/struct.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plusls/cdn-ip-tester/e30f873cf1b2ad4815a9db3a53c168281f38d260/img/struct.vsdx -------------------------------------------------------------------------------- /ip-tester.toml: -------------------------------------------------------------------------------- 1 | port_base = 31000 2 | max_connection_count = 50 3 | server_url = "http://127.0.0.1/" 4 | cdn_url = "" 5 | listen_ip = "127.0.0.2" 6 | max_rtt = 1000 7 | server_res_body = "" 8 | cdn_res_body = "error code: 1003" 9 | max_subnet_len = 256 -------------------------------------------------------------------------------- /outbound-template.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "trojan", 3 | "server_port": 443, 4 | "password": "your password", 5 | "tls": { 6 | "enabled": true, 7 | "server_name": "your server name", 8 | "min_version": "1.3", 9 | "utls": { 10 | "enabled": true, 11 | "fingerprint": "chrome" 12 | } 13 | }, 14 | "transport": { 15 | "type": "ws", 16 | "path": "/your path", 17 | "headers": { 18 | "Host": "your server name" 19 | }, 20 | "max_early_data": 2048, 21 | "early_data_header_name": "Sec-WebSocket-Protocol" 22 | } 23 | } -------------------------------------------------------------------------------- /rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "nightly" -------------------------------------------------------------------------------- /sing-box-template.json: -------------------------------------------------------------------------------- 1 | { 2 | "inbounds": [], 3 | "outbounds": [ 4 | { 5 | "type": "direct", 6 | "tag": "direct-out" 7 | } 8 | ], 9 | "route": { 10 | "rules": [ 11 | ] 12 | } 13 | } -------------------------------------------------------------------------------- /src/cache.rs: -------------------------------------------------------------------------------- 1 | use std::cmp::Ordering; 2 | use std::collections::{HashMap, HashSet}; 3 | use std::str::FromStr; 4 | 5 | use cidr::{IpCidr, IpInet}; 6 | use lazy_static::lazy_static; 7 | use regex::Regex; 8 | use serde::{Deserialize, Serialize}; 9 | 10 | use cdn_ip_tester_derive::{TomlLoadable, TomlSavable}; 11 | 12 | use crate::data::{Loadable, Savable, Subnet}; 13 | use crate::error::{DeserializedError, Result}; 14 | 15 | #[derive(Debug, Clone)] 16 | pub struct RttResult { 17 | cdn_rtt: u64, 18 | server_rtt: u64, 19 | } 20 | 21 | impl Eq for RttResult {} 22 | 23 | impl PartialEq for RttResult { 24 | fn eq(&self, other: &Self) -> bool { 25 | self.server_rtt == other.server_rtt && self.cdn_rtt == other.cdn_rtt 26 | } 27 | } 28 | 29 | impl PartialOrd for RttResult { 30 | fn partial_cmp(&self, other: &Self) -> Option { 31 | Some(self.cmp(other)) 32 | } 33 | } 34 | 35 | impl Ord for RttResult { 36 | fn cmp(&self, other: &Self) -> Ordering { 37 | self.server_rtt 38 | .cmp(&other.server_rtt) 39 | .then(self.cdn_rtt.cmp(&other.cdn_rtt)) 40 | } 41 | } 42 | 43 | impl RttResult { 44 | pub(crate) fn new(server_rtt: u64, cdn_rtt: u64) -> Self { 45 | Self { 46 | cdn_rtt, 47 | server_rtt, 48 | } 49 | } 50 | } 51 | 52 | #[derive(Debug, Default)] 53 | pub struct RttResults { 54 | res: HashMap, 55 | sorted_res_keys: Vec, 56 | tmp_key_set: HashSet, 57 | } 58 | 59 | impl RttResults { 60 | pub fn len(&self) -> usize { 61 | self.res.len() 62 | } 63 | 64 | pub fn add_result(&mut self, ip_inet: IpInet, rtt_result: RttResult) { 65 | self.tmp_key_set.insert(ip_inet); 66 | // 永远用最新的结果进行覆盖 67 | self.res.insert(ip_inet, rtt_result); 68 | } 69 | 70 | fn from_string_list(s: &Vec) -> Result { 71 | lazy_static! { 72 | static ref RE_RTT_RESULT_MATCH: Regex = 73 | Regex::new(r"^ip: (.{2,45}/\d+), server_rtt: (\d+), cdn_rtt: (\d+)$").unwrap(); 74 | } 75 | let mut ret = Self::default(); 76 | 77 | for line in s { 78 | let res = RE_RTT_RESULT_MATCH.captures(line); 79 | if let Some(res) = res { 80 | let ip_inet = IpInet::from_str(&res[1]).map_err(DeserializedError::from)?; 81 | ret.res.insert( 82 | ip_inet, 83 | RttResult::new( 84 | u64::from_str(&res[2]).map_err(DeserializedError::from)?, 85 | u64::from_str(&res[3]).map_err(DeserializedError::from)?, 86 | ), 87 | ); 88 | ret.sorted_res_keys.push(ip_inet); 89 | } else { 90 | return Err(DeserializedError::regex(line.clone(), &RE_RTT_RESULT_MATCH))?; 91 | } 92 | } 93 | ret.sorted_res_keys 94 | .sort_by_key(|ip_inet| ret.res.get(ip_inet).unwrap()); 95 | Ok(ret) 96 | } 97 | 98 | pub fn commit(&mut self) { 99 | let mut new_res = Vec::new(); 100 | 101 | if self.tmp_key_set.is_empty() { 102 | return; 103 | } 104 | let mut buf: Vec = self.tmp_key_set.iter().copied().collect(); 105 | buf.sort_by_key(|ip_inet| self.res.get(ip_inet).unwrap()); 106 | 107 | let mut i = 0_usize; 108 | let mut j = 0_usize; 109 | let mut res_data = self.sorted_res_keys.get(i).cloned(); 110 | let mut buf_data = buf.get(j).cloned(); 111 | while i < self.sorted_res_keys.len() || j < buf.len() { 112 | if buf_data.is_none() { 113 | let tmp_res_data = res_data.unwrap(); 114 | i += 1; 115 | res_data = self.sorted_res_keys.get(i).cloned(); 116 | if !self.tmp_key_set.contains(&tmp_res_data) { 117 | new_res.push(tmp_res_data); 118 | } 119 | continue; 120 | } 121 | if res_data.is_none() { 122 | new_res.push(buf_data.unwrap()); 123 | j += 1; 124 | buf_data = buf.get(j).cloned(); 125 | continue; 126 | } 127 | let tmp_res_data = res_data.unwrap(); 128 | let tmp_buf_data = buf_data.unwrap(); 129 | 130 | if self.res.get(&tmp_res_data).unwrap() < self.res.get(&tmp_buf_data).unwrap() { 131 | i += 1; 132 | res_data = self.sorted_res_keys.get(i).cloned(); 133 | if !self.tmp_key_set.contains(&tmp_res_data) { 134 | new_res.push(tmp_res_data); 135 | } 136 | } else { 137 | j += 1; 138 | buf_data = buf.get(j).cloned(); 139 | new_res.push(tmp_buf_data); 140 | } 141 | } 142 | self.sorted_res_keys = new_res; 143 | self.tmp_key_set.clear(); 144 | } 145 | 146 | pub fn enable_subnets(&self, subnets: &mut [Subnet]) { 147 | let mut cidr_set: HashSet = HashSet::new(); 148 | for key in &self.sorted_res_keys { 149 | cidr_set.insert(IpCidr::new(key.first_address(), key.network_length()).unwrap()); 150 | } 151 | 152 | for subnet in subnets { 153 | if cidr_set.contains(&subnet.cidr) { 154 | subnet.enable = true; 155 | } 156 | } 157 | } 158 | } 159 | 160 | impl Loadable for RttResults { 161 | fn from_str(s: &str) -> Result { 162 | let string_list = s 163 | .split('\n') 164 | .map(|s| s.replace('\r', "")) 165 | .filter_map(|s| if s.is_empty() { None } else { Some(s) }) 166 | .collect(); 167 | Self::from_string_list(&string_list) 168 | } 169 | } 170 | 171 | impl Savable for RttResults { 172 | fn to_string(&self) -> Result { 173 | let mut ret = String::new(); 174 | 175 | for ip_inet in &self.sorted_res_keys { 176 | let rtt_result = self.res.get(ip_inet).unwrap(); 177 | ret.push_str( 178 | format!( 179 | "ip: {ip_inet}, server_rtt: {}, cdn_rtt: {}\n", 180 | rtt_result.server_rtt, rtt_result.cdn_rtt 181 | ) 182 | .as_str(), 183 | ); 184 | } 185 | Ok(ret) 186 | } 187 | } 188 | 189 | #[derive(Serialize, Deserialize, Debug, Default, TomlLoadable, TomlSavable)] 190 | pub struct RttResultCache { 191 | pub current_subnet: usize, 192 | pub current_subnet_start: usize, 193 | } 194 | -------------------------------------------------------------------------------- /src/config.rs: -------------------------------------------------------------------------------- 1 | use serde::{Deserialize, Serialize}; 2 | 3 | use cdn_ip_tester_derive::{TomlLoadable, TomlSavable}; 4 | 5 | #[derive(Serialize, Deserialize, Clone, TomlLoadable, TomlSavable)] 6 | pub struct Config { 7 | pub port_base: u16, 8 | pub max_connection_count: usize, 9 | pub server_url: String, 10 | pub cdn_url: String, 11 | pub listen_ip: String, 12 | pub max_rtt: u64, 13 | pub server_res_body: String, 14 | pub cdn_res_body: String, 15 | pub max_subnet_len: usize, 16 | } 17 | -------------------------------------------------------------------------------- /src/data.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashSet; 2 | use std::fs; 3 | use std::net::{Ipv4Addr, Ipv6Addr}; 4 | use std::path::Path; 5 | use std::str::FromStr; 6 | 7 | use cidr::errors::NetworkParseError; 8 | use cidr::{IpCidr, IpInet, Ipv4Inet, Ipv6Inet}; 9 | use lazy_static::lazy_static; 10 | use log::warn; 11 | use regex::Regex; 12 | 13 | use crate::error; 14 | 15 | pub trait Loadable { 16 | fn from_str(s: &str) -> error::Result; 17 | 18 | fn load>(path: P) -> error::Result { 19 | Self::from_str( 20 | fs::read_to_string(&path) 21 | .map_err(|err| error::ErrorKind::fs(err, &path))? 22 | .as_str(), 23 | ) 24 | } 25 | } 26 | 27 | pub trait Savable { 28 | fn to_string(&self) -> error::Result; 29 | fn save>(&self, path: P) -> error::Result<()> { 30 | fs::write(&path, self.to_string()?).map_err(|err| error::ErrorKind::fs(err, &path).into()) 31 | } 32 | } 33 | 34 | // TODO add ipv6 support 35 | impl Loadable for HashSet { 36 | fn from_str(s: &str) -> error::Result { 37 | lazy_static! { 38 | static ref RE_V4_SUBNET_MATCH: Regex = 39 | Regex::new(r"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/\d{1,3})").unwrap(); 40 | static ref RE_V4_MATCH: Regex = 41 | Regex::new(r"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})").unwrap(); 42 | } 43 | let mut ret = HashSet::new(); 44 | 45 | for cap in RE_V4_SUBNET_MATCH.captures_iter(s) { 46 | match Subnet::from_str(&cap[0]) { 47 | Ok(subnet) => { 48 | ret.insert(subnet); 49 | } 50 | Err(err) => { 51 | warn!("parse {:?} to subnet failed: {err:?} , skip.", &cap[0]); 52 | } 53 | } 54 | } 55 | 56 | // TODO: 修好它 57 | // for cap in RE_V4_MATCH.captures_iter(s) { 58 | // match IpAddr::from_str(&cap[0]) { 59 | // Ok(ip_addr) => { 60 | // ret.push(Subnet::new(ip_addr, Family::Ipv4.len()).unwrap()); 61 | // } 62 | // Err(err) => { 63 | // warn!("parse {:?} to subnet failed: {err:?} , skip.", &cap[0]); 64 | // } 65 | // } 66 | // } 67 | Ok(ret) 68 | } 69 | } 70 | 71 | #[derive(Debug, PartialEq, Eq, Hash, Clone)] 72 | pub struct Subnet { 73 | pub cidr: IpCidr, 74 | pub enable: bool, 75 | } 76 | 77 | impl FromStr for Subnet { 78 | type Err = NetworkParseError; 79 | fn from_str(s: &str) -> Result { 80 | let ip_inet = IpInet::from_str(s)?; 81 | Ok(Self { 82 | cidr: IpCidr::new(ip_inet.first_address(), ip_inet.network_length())?, 83 | enable: false, 84 | }) 85 | } 86 | } 87 | 88 | impl Subnet { 89 | pub fn len(&self) -> usize { 90 | 1 << (self.cidr.family().len() - self.cidr.network_length()) 91 | } 92 | 93 | pub fn get_ip(&self, idx: usize) -> Option { 94 | if idx >= self.len() { 95 | return None; 96 | } 97 | 98 | match self.cidr { 99 | IpCidr::V4(cidr_v4) => { 100 | let ipv4 = u32::from(cidr_v4.first_address()) + idx as u32; 101 | Some( 102 | Ipv4Inet::new(Ipv4Addr::from(ipv4), cidr_v4.network_length()) 103 | .unwrap() 104 | .into(), 105 | ) 106 | } 107 | IpCidr::V6(cidr_v6) => { 108 | let ipv6 = u128::from(cidr_v6.first_address()) + idx as u128; 109 | Some( 110 | Ipv6Inet::new(Ipv6Addr::from(ipv6), cidr_v6.network_length()) 111 | .unwrap() 112 | .into(), 113 | ) 114 | } 115 | } 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /src/error.rs: -------------------------------------------------------------------------------- 1 | use std::backtrace::Backtrace; 2 | use std::path::Path; 3 | 4 | use regex::Regex; 5 | use thiserror::Error as ThisError; 6 | 7 | pub type Result = core::result::Result; 8 | 9 | #[derive(ThisError, Debug)] 10 | #[error(transparent)] 11 | pub enum SerializedError { 12 | Toml(#[from] toml::ser::Error), 13 | Json(#[from] serde_json::error::Error), 14 | } 15 | 16 | #[derive(ThisError, Debug)] 17 | #[error(transparent)] 18 | pub enum DeserializedError { 19 | Toml(#[from] toml::de::Error), 20 | Json(#[from] serde_json::error::Error), 21 | #[error("{unmatched:?} unmatched regex: \"{regex}\"")] 22 | Regex { 23 | unmatched: String, 24 | regex: String, 25 | }, 26 | ParseInt(#[from] std::num::ParseIntError), 27 | AddrParse(#[from] std::net::AddrParseError), 28 | NetworkParse(#[from] cidr::errors::NetworkParseError), 29 | ParseUrl(#[from] url::ParseError), 30 | #[error("{0}")] 31 | Custom(String), 32 | } 33 | 34 | impl DeserializedError { 35 | pub fn regex(unmatched: String, regex: &Regex) -> Self { 36 | Self::Regex { 37 | unmatched, 38 | regex: regex.to_string(), 39 | } 40 | } 41 | pub fn custom(reason: &str) -> Self { 42 | Self::Custom(reason.into()) 43 | } 44 | } 45 | 46 | #[derive(ThisError, Debug)] 47 | pub enum ReqwestError { 48 | #[error("Reqwest build error, source: {source}")] 49 | Build { source: reqwest::Error }, 50 | #[error("Reqwest network error, source: {source}")] 51 | Network { source: reqwest::Error }, 52 | #[error("Expected body {expected:?} not found in {body:?}")] 53 | BodyNoMatch { body: String, expected: String }, 54 | } 55 | 56 | impl ReqwestError { 57 | pub fn build(err: reqwest::Error) -> Self { 58 | Self::Build { source: err } 59 | } 60 | pub fn network(err: reqwest::Error) -> Self { 61 | Self::Network { source: err } 62 | } 63 | pub fn body_no_match(body: String, expected: String) -> Self { 64 | Self::BodyNoMatch { body, expected } 65 | } 66 | } 67 | 68 | #[derive(ThisError, Debug)] 69 | #[error(transparent)] 70 | pub struct Error(pub Box); 71 | 72 | impl From for Error 73 | where 74 | ErrorKind: From, 75 | { 76 | fn from(err: E) -> Self { 77 | Error(Box::new(ErrorKind::from(err))) 78 | } 79 | } 80 | 81 | #[derive(ThisError, Debug)] 82 | #[error(transparent)] 83 | pub enum TokioError { 84 | Join(#[from] tokio::task::JoinError), 85 | } 86 | 87 | #[derive(ThisError, Debug)] 88 | pub enum ErrorKind { 89 | #[error("IO error when processing file {path}\nCause: {source}\nBacktrace: {backtrace}")] 90 | Fs { 91 | source: std::io::Error, 92 | path: String, 93 | backtrace: Backtrace, 94 | }, 95 | #[error("Process IO error\nCause: {source}\nBacktrace: {backtrace}")] 96 | Process { 97 | source: std::io::Error, 98 | backtrace: Backtrace, 99 | }, 100 | #[error("Serialized error\nCause: {0}\nBacktrace: {1}")] 101 | Serialized(#[from] SerializedError, Backtrace), 102 | #[error("Deserialized error\nCause: {0}\nBacktrace: {1}")] 103 | Deserialized(#[from] DeserializedError, Backtrace), 104 | #[error("ReqwestError error\nCause: {0}\nBacktrace: {1}")] 105 | Reqwest(#[from] ReqwestError, Backtrace), 106 | #[error("JoinError error\nCause: {0}\nBacktrace: {1}")] 107 | Tokio(#[from] TokioError, Backtrace), 108 | } 109 | 110 | impl ErrorKind { 111 | pub fn fs>(err: std::io::Error, path: P) -> Self { 112 | Self::Fs { 113 | source: err, 114 | path: format!("{:?}", path.as_ref()), 115 | backtrace: Backtrace::capture(), 116 | } 117 | } 118 | pub fn process(source: std::io::Error) -> Self { 119 | Self::Process { 120 | source, 121 | backtrace: Backtrace::capture(), 122 | } 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | #![feature(error_generic_member_access)] 2 | 3 | pub mod data; 4 | pub mod error; 5 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #![feature(error_generic_member_access)] 2 | 3 | use std::collections::HashSet; 4 | use std::error::Error; 5 | use std::net::{IpAddr, SocketAddr}; 6 | use std::process::Stdio; 7 | use std::sync::Arc; 8 | use std::time::{Duration, SystemTime}; 9 | 10 | use cidr::IpInet; 11 | use clap::Parser; 12 | use indicatif::{ProgressBar, ProgressStyle}; 13 | use log::{debug, error, info, warn, LevelFilter}; 14 | use reqwest::{Client, Url}; 15 | use tokio::io::AsyncReadExt; 16 | use tokio::process::{Child, Command}; 17 | use tokio::runtime::Handle; 18 | 19 | use crate::cache::{RttResult, RttResultCache, RttResults}; 20 | use crate::config::Config; 21 | use crate::data::{Loadable, Savable, Subnet}; 22 | use crate::error::{DeserializedError, ErrorKind, ReqwestError, Result, TokioError}; 23 | use crate::template::{Outbound, SingBoxConfig}; 24 | 25 | mod cache; 26 | mod config; 27 | mod data; 28 | mod error; 29 | mod template; 30 | 31 | const CONFIG_FILE_NAME: &str = "ip-tester.toml"; 32 | const OUTBOUND_TEMPLATE_FILE_NAME: &str = "outbound-template.json"; 33 | const SING_BOX_TEMPLATE_FILE_NAME: &str = "sing-box-template.json"; 34 | const SING_BOX_CONFIG_FILE_NAME: &str = "sing-box-test-config.json"; 35 | const RTT_RESULT_FILE_NAME: &str = "result.txt"; 36 | const RTT_RESULT_CACHE_FILE_NAME: &str = "result_cache.toml"; 37 | 38 | async fn do_test_rtt( 39 | client: Client, 40 | url: Url, 41 | expected_body: String, 42 | ) -> core::result::Result { 43 | let start = SystemTime::now(); 44 | let res = client 45 | .get(url) 46 | .send() 47 | .await 48 | .map_err(ReqwestError::network)?; 49 | 50 | let body = res.text().await.map_err(ReqwestError::network)?; 51 | if !body.contains(expected_body.as_str()) { 52 | Err(ReqwestError::body_no_match(body, expected_body))? 53 | } 54 | Ok(SystemTime::now().duration_since(start).unwrap().as_millis() as u64) 55 | } 56 | 57 | async fn test_rtt(config: Arc, cdn_ip: IpAddr, idx: usize) -> Result { 58 | let server_client = Client::builder() 59 | .proxy( 60 | reqwest::Proxy::all(format!( 61 | "socks5://{}:{}", 62 | config.listen_ip, 63 | config.port_base + idx as u16 64 | )) 65 | .map_err(ReqwestError::build)?, 66 | ) 67 | .timeout(Duration::from_millis(config.max_rtt)) 68 | .build() 69 | .map_err(ReqwestError::build)?; 70 | 71 | let server_url = Url::parse(config.server_url.as_str()).map_err(DeserializedError::from)?; 72 | let cdn_ip_string = cdn_ip.to_string(); 73 | 74 | let cdn_url = if config.cdn_url.is_empty() { 75 | Url::parse(format!("http://{}", cdn_ip_string).as_str()).map_err(DeserializedError::from)? 76 | } else { 77 | Url::parse(config.cdn_url.as_str()).map_err(DeserializedError::from)? 78 | }; 79 | let cdn_domain = if let Some(cdn_domain) = cdn_url.domain() { 80 | cdn_domain 81 | } else if config.cdn_url.is_empty() { 82 | cdn_ip_string.as_str() 83 | } else { 84 | Err(DeserializedError::custom("Url must have domain, not IP"))? 85 | }; 86 | if cdn_url.scheme() != "http" && cdn_url.scheme() != "https" { 87 | Err(DeserializedError::custom( 88 | "Url scheme must be http or https", 89 | ))? 90 | } 91 | let cdn_url_port = if let Some(cdn_url_port) = cdn_url.port_or_known_default() { 92 | cdn_url_port 93 | } else { 94 | unreachable!() 95 | }; 96 | 97 | let cdn_client = Client::builder() 98 | .resolve_to_addrs(cdn_domain, &[SocketAddr::new(cdn_ip, cdn_url_port)]) 99 | .timeout(Duration::from_millis(config.max_rtt)) 100 | .build() 101 | .map_err(ReqwestError::build)?; 102 | 103 | let cdn_expected_body = config.cdn_res_body.clone(); 104 | let cdn_rtt_task = tokio::task::spawn(do_test_rtt(cdn_client, cdn_url, cdn_expected_body)); 105 | let server_expected_body = config.server_res_body.clone(); 106 | let server_rtt_task = 107 | tokio::task::spawn(do_test_rtt(server_client, server_url, server_expected_body)); 108 | 109 | let cdn_rtt_result = cdn_rtt_task.await.map_err(TokioError::from)?; 110 | let server_rtt_result = server_rtt_task.await.map_err(TokioError::from)?; 111 | 112 | Ok(RttResult::new(server_rtt_result?, cdn_rtt_result?)) 113 | } 114 | 115 | struct SingBox { 116 | child: Child, 117 | } 118 | 119 | impl SingBox { 120 | async fn new(config_file_name: &str) -> Result { 121 | let mut child = Command::new("./sing-box") 122 | .args(["run", "-c", config_file_name]) 123 | .stdout(Stdio::piped()) 124 | .stderr(Stdio::piped()) 125 | .spawn() 126 | .map_err(ErrorKind::process)?; 127 | let mut tmp_buf = [0_u8]; 128 | if let Err(read_stdout_err) = child 129 | .stderr 130 | .as_mut() 131 | .unwrap() 132 | .read_exact(&mut tmp_buf) 133 | .await 134 | { 135 | child.wait().await.map_err(ErrorKind::process)?; 136 | let mut stderr_output = Vec::new(); 137 | child 138 | .stderr 139 | .as_mut() 140 | .unwrap() 141 | .read_to_end(&mut stderr_output) 142 | .await 143 | .map_err(ErrorKind::process)?; 144 | let stderr_output_str = String::from_utf8(stderr_output.clone()).unwrap(); 145 | error!("{read_stdout_err}\noutput: \n{stderr_output_str}"); 146 | Err(ErrorKind::process(read_stdout_err))? 147 | } 148 | Ok(Self { child }) 149 | } 150 | } 151 | 152 | impl Drop for SingBox { 153 | fn drop(&mut self) { 154 | tokio::task::block_in_place(move || { 155 | Handle::current().block_on(async { 156 | if let Err(err) = self.child.kill().await { 157 | error!("self.child.kill failed: {err}"); 158 | } else { 159 | debug!("child kill!"); 160 | } 161 | }); 162 | }); 163 | } 164 | } 165 | 166 | async fn test_rtts( 167 | config: &Arc, 168 | sing_box_template: &SingBoxConfig, 169 | outbound_template: &Outbound, 170 | data_dir: &str, 171 | ignore_body_warning: bool, 172 | progress_bar: &ProgressBar, 173 | ips: &[IpInet], 174 | ) -> Result>> { 175 | let sing_box_config = sing_box_template.generate( 176 | outbound_template, 177 | &ips.iter() 178 | .map(|ip_inet| ip_inet.address().to_string()) 179 | .collect::>(), 180 | config.listen_ip.clone(), 181 | config.port_base, 182 | ); 183 | 184 | let sing_box_config_path = format!("{data_dir}/{SING_BOX_CONFIG_FILE_NAME}"); 185 | sing_box_config.save(&sing_box_config_path)?; 186 | 187 | let sing_box = match SingBox::new(&sing_box_config_path).await { 188 | Ok(sing_box) => sing_box, 189 | Err(err) => { 190 | error!("Can not start sing box process: {err}"); 191 | Err(err)? 192 | } 193 | }; 194 | 195 | let mut tasks = Vec::new(); 196 | let mut ret = Vec::new(); 197 | for (i, &cdn_ip) in ips.iter().enumerate() { 198 | let config = config.clone(); 199 | tasks.push(tokio::task::spawn(test_rtt(config, cdn_ip.address(), i))); 200 | } 201 | 202 | for (i, task) in tasks.iter_mut().enumerate() { 203 | let res = task.await.map_err(TokioError::from)?; 204 | 205 | match res { 206 | Ok(rtt) => { 207 | let log_str = format!("ip: {}, rtt: {:?}", ips[i], rtt); 208 | progress_bar.println(log_str.as_str()); 209 | debug!("{log_str}"); 210 | ret.push(Some(rtt)); 211 | } 212 | Err(err) => { 213 | if !ignore_body_warning { 214 | if let Some(ReqwestError::BodyNoMatch { .. }) = 215 | err.source().unwrap().downcast_ref() 216 | { 217 | warn!("ip: {} body unmatched: \n{}", ips[i], err); 218 | } 219 | } 220 | 221 | // warn!("ip:{}, err:{:?}", ips[i], err); 222 | 223 | ret.push(None); 224 | } 225 | } 226 | } 227 | drop(sing_box); 228 | Ok(ret) 229 | } 230 | 231 | #[derive(Parser, Debug)] 232 | #[command(author, version, about, long_about = None)] 233 | struct Args { 234 | #[arg(long)] 235 | ignore_body_warning: bool, 236 | #[arg(long)] 237 | ip_file: String, 238 | #[arg(long, default_value_t = 0)] 239 | subnet_count: usize, 240 | #[arg(long)] 241 | no_cache: bool, 242 | #[arg(long, default_value = "data")] 243 | data_dir: String, 244 | #[arg(long)] 245 | auto_skip: bool, 246 | #[arg(long, default_value_t = 10)] 247 | enable_threshold: usize, 248 | } 249 | 250 | #[tokio::main] 251 | async fn main() -> Result<()> { 252 | let args = Args::parse(); 253 | pretty_env_logger::formatted_builder() 254 | .filter_level(LevelFilter::Info) 255 | .init(); 256 | 257 | let config_path = format!("{}/{CONFIG_FILE_NAME}", args.data_dir); 258 | let config: Arc = match Config::load(&config_path) { 259 | Ok(config) => Arc::new(config), 260 | Err(err) => { 261 | info!("Unable to load config from {config_path}\n{err}"); 262 | return Err(err); 263 | } 264 | }; 265 | 266 | let outbound_template_path = format!("{}/{OUTBOUND_TEMPLATE_FILE_NAME}", args.data_dir); 267 | let outbound_template = match Outbound::load(&outbound_template_path) { 268 | Ok(outbound) => outbound, 269 | Err(err) => { 270 | info!("Unable to load outbound template from {outbound_template_path}\n{err}"); 271 | return Err(err); 272 | } 273 | }; 274 | 275 | let mut subnets: Vec = match HashSet::load(&args.ip_file) { 276 | Ok(subnets) => subnets, 277 | Err(err) => { 278 | info!("Unable to load subnets from {}\n{err}", &args.ip_file); 279 | return Err(err); 280 | } 281 | } 282 | .iter() 283 | .map(Subnet::clone) 284 | .collect(); 285 | 286 | let subnets = if args.subnet_count != 0 { 287 | &mut subnets[..args.subnet_count] 288 | } else { 289 | &mut subnets 290 | }; 291 | 292 | let max_subnet_len = subnets 293 | .iter() 294 | .fold(0_usize, |max_subnet_len, subnet| { 295 | max_subnet_len.max(subnet.len()) 296 | }) 297 | .min(config.max_subnet_len); 298 | 299 | info!( 300 | "Load {} subnets from {:?} success. max_subnet_len: {}", 301 | subnets.len(), 302 | args.ip_file, 303 | max_subnet_len 304 | ); 305 | 306 | let sing_box_template_path = format!("{}/{SING_BOX_TEMPLATE_FILE_NAME}", args.data_dir); 307 | let sing_box_template = match SingBoxConfig::load(&sing_box_template_path) { 308 | Ok(sing_box_template) => sing_box_template, 309 | Err(err) => { 310 | info!( 311 | "Unable to load sing box template from {}\n{err}", 312 | &sing_box_template_path 313 | ); 314 | return Err(err); 315 | } 316 | }; 317 | 318 | let mut rtt_results; 319 | let mut rtt_result_cache; 320 | let rtt_result_file_name = format!("{}/{RTT_RESULT_FILE_NAME}", args.data_dir); 321 | let rtt_result_cache_file_name = format!("{}/{RTT_RESULT_CACHE_FILE_NAME}", args.data_dir); 322 | 323 | if args.no_cache { 324 | info!("no_cache = true, use default rtt result cache and default rtt result"); 325 | rtt_results = RttResults::default(); 326 | rtt_result_cache = RttResultCache::default() 327 | } else { 328 | rtt_results = match RttResults::load(&rtt_result_file_name) { 329 | Ok(rtt_results) => { 330 | info!( 331 | "Load {} rtt results from {rtt_result_file_name} success", 332 | rtt_results.len() 333 | ); 334 | rtt_results 335 | } 336 | Err(err) => { 337 | if let ErrorKind::Fs { .. } = *err.0 { 338 | info!("Can not load rtt result. Create new rtt result."); 339 | RttResults::default() 340 | } else { 341 | error!("Can not load rtt result: {err}"); 342 | return Err(err); 343 | } 344 | } 345 | }; 346 | 347 | rtt_result_cache = match RttResultCache::load(&rtt_result_cache_file_name) { 348 | Ok(rtt_result_cache) => { 349 | if rtt_result_cache.current_subnet >= subnets.len() { 350 | Err(DeserializedError::custom(format!( "Can not load rtt result cache. current_subnet: {}, but subnets.len(): {}", rtt_result_cache.current_subnet, subnets.len()).as_str()))?; 351 | } 352 | 353 | if rtt_result_cache.current_subnet_start >= max_subnet_len { 354 | Err(DeserializedError::custom(format!( "Can not load rtt result cache. current_subnet_start: {}, but max_subnet_len: {}", rtt_result_cache.current_subnet_start, max_subnet_len).as_str()))?; 355 | } 356 | info!("Load rtt result cache success: {rtt_result_cache:?}"); 357 | rtt_result_cache 358 | } 359 | 360 | Err(err) => { 361 | if let ErrorKind::Fs { .. } = *err.0 { 362 | info!("Can not load rtt result cache. Create new rtt result cache."); 363 | RttResultCache::default() 364 | } else { 365 | error!("Can not load rtt result cache cache: {err}"); 366 | return Err(err); 367 | } 368 | } 369 | } 370 | } 371 | rtt_results.save(&rtt_result_file_name)?; 372 | rtt_result_cache.save(&rtt_result_cache_file_name)?; 373 | 374 | rtt_results.enable_subnets(subnets); 375 | 376 | fn calc_subnet_len( 377 | subnet: &Subnet, 378 | rtt_result_cache: &RttResultCache, 379 | args: &Args, 380 | max_subnet_len: usize, 381 | ) -> usize { 382 | if !args.auto_skip 383 | || rtt_result_cache.current_subnet_start < args.enable_threshold 384 | || subnet.enable 385 | { 386 | subnet.len().min(max_subnet_len) 387 | } else { 388 | 0 389 | } 390 | } 391 | 392 | let mut all_ip_count = subnets.iter().fold(0, |acc, subnet| { 393 | acc + calc_subnet_len(subnet, &rtt_result_cache, &args, max_subnet_len) 394 | }); 395 | 396 | fn calc_start_ip_count( 397 | subnets: &[Subnet], 398 | rtt_result_cache: &RttResultCache, 399 | args: &Args, 400 | max_subnet_len: usize, 401 | ) -> usize { 402 | subnets.iter().enumerate().fold(0, |acc, (i, subnet)| { 403 | let subnet_len = calc_subnet_len(subnet, rtt_result_cache, args, max_subnet_len); 404 | acc + subnet_len.min(rtt_result_cache.current_subnet_start) 405 | + if i < rtt_result_cache.current_subnet && subnet_len != 0 { 406 | 1 407 | } else { 408 | 0 409 | } 410 | }) 411 | } 412 | 413 | let mut start_ip_count = calc_start_ip_count(subnets, &rtt_result_cache, &args, max_subnet_len); 414 | 415 | info!("current progress: {start_ip_count}/{all_ip_count}"); 416 | 417 | let progress_bar = ProgressBar::new(all_ip_count as u64); 418 | progress_bar.set_style( 419 | ProgressStyle::with_template( 420 | "{spinner:.green} [{wide_bar:.cyan/blue}] [{pos:>7}/{len:7}] {percent}% ({elapsed_precise}/{duration_precise})", 421 | ) 422 | .unwrap() 423 | .progress_chars("#>-"), 424 | ); 425 | progress_bar.set_position(start_ip_count as u64); 426 | progress_bar.reset_eta(); 427 | 428 | while rtt_result_cache.current_subnet_start < max_subnet_len { 429 | let mut ips: Vec = Vec::new(); 430 | let mut subnet_idxs: Vec = Vec::new(); 431 | while ips.len() < config.max_connection_count { 432 | let subnet = &subnets[rtt_result_cache.current_subnet]; 433 | if !args.auto_skip 434 | || rtt_result_cache.current_subnet_start < args.enable_threshold 435 | || subnet.enable 436 | { 437 | if let Some(ip_inet) = subnet.get_ip(rtt_result_cache.current_subnet_start) { 438 | ips.push(ip_inet); 439 | subnet_idxs.push(rtt_result_cache.current_subnet); 440 | } 441 | } 442 | 443 | rtt_result_cache.current_subnet += 1; 444 | if rtt_result_cache.current_subnet == subnets.len() { 445 | rtt_result_cache.current_subnet = 0; 446 | rtt_result_cache.current_subnet_start += 1; 447 | 448 | if args.auto_skip && rtt_result_cache.current_subnet_start == args.enable_threshold 449 | { 450 | all_ip_count = subnets.iter().fold(0, |acc, subnet| { 451 | acc + calc_subnet_len(subnet, &rtt_result_cache, &args, max_subnet_len) 452 | }); 453 | 454 | 455 | // TODO: 可能会溢出,有空看看 456 | // start_ip_count = 457 | // calc_start_ip_count(subnets, &rtt_result_cache, &args, max_subnet_len) 458 | // - ips.len(); 459 | start_ip_count = 460 | if calc_start_ip_count(subnets, &rtt_result_cache, &args, max_subnet_len) > ips.len() { 461 | calc_start_ip_count(subnets, &rtt_result_cache, &args, max_subnet_len) - ips.len() 462 | } else { 463 | 0 464 | }; 465 | 466 | progress_bar.println(format!("update: {start_ip_count}/{all_ip_count}")); 467 | progress_bar.set_length(all_ip_count as u64); 468 | progress_bar.set_position(start_ip_count as u64); 469 | progress_bar.reset_eta(); 470 | } 471 | 472 | if rtt_result_cache.current_subnet_start == max_subnet_len { 473 | break; 474 | } 475 | } 476 | } 477 | 478 | let test_res = test_rtts( 479 | &config, 480 | &sing_box_template, 481 | &outbound_template, 482 | args.data_dir.as_str(), 483 | args.ignore_body_warning, 484 | &progress_bar, 485 | &ips, 486 | ) 487 | .await?; 488 | let mut success_count = 0; 489 | for (i, ip) in ips.iter().enumerate() { 490 | if let Some(rtt) = &test_res[i] { 491 | success_count += 1; 492 | rtt_results.add_result(*ip, rtt.clone()); 493 | if rtt_result_cache.current_subnet_start < args.enable_threshold { 494 | subnets[subnet_idxs[i]].enable = true; 495 | } 496 | } 497 | } 498 | 499 | if success_count != 0 { 500 | rtt_results.commit(); 501 | rtt_results.save(&rtt_result_file_name)?; 502 | } 503 | 504 | let log_str = format!( 505 | "Test success count: {success_count}/{} subnet: {}/{} current_subnet_start: {}/{}", 506 | ips.len(), 507 | rtt_result_cache.current_subnet, 508 | subnets.len(), 509 | rtt_result_cache.current_subnet_start, 510 | max_subnet_len 511 | ); 512 | progress_bar.inc(ips.len() as u64); 513 | progress_bar.println(log_str.as_str()); 514 | debug!("{log_str}"); 515 | rtt_result_cache.save(&rtt_result_cache_file_name)? 516 | } 517 | 518 | progress_bar.finish_with_message("finish!"); 519 | Ok(()) 520 | } 521 | -------------------------------------------------------------------------------- /src/template.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashMap; 2 | use std::fmt::Debug; 3 | 4 | use serde::{Deserialize, Serialize}; 5 | use serde_json::Value; 6 | 7 | use cdn_ip_tester_derive::{JsonLoadable, JsonSavable}; 8 | 9 | #[derive(Serialize, Deserialize, Clone, Debug, JsonLoadable, JsonSavable)] 10 | pub struct SingBoxConfig { 11 | inbounds: Vec, 12 | outbounds: Vec, 13 | route: Route, 14 | #[serde(flatten)] 15 | other: HashMap, 16 | } 17 | 18 | impl SingBoxConfig { 19 | pub fn generate( 20 | &self, 21 | outbound_template: &Outbound, 22 | ips: &[String], 23 | listen_ip: String, 24 | port_base: u16, 25 | ) -> Self { 26 | let mut ret = self.clone(); 27 | for (i, ip) in ips.iter().enumerate() { 28 | let inbound_tag = format!("inbound-{i}"); 29 | let outbound_tag = format!("outbound-{i}"); 30 | ret.inbounds.push(Inbound::new( 31 | inbound_tag.clone(), 32 | listen_ip.clone(), 33 | port_base + i as u16, 34 | )); 35 | ret.outbounds 36 | .push(outbound_template.generate(outbound_tag.clone(), ip.clone())); 37 | ret.route.rules.push(Rule::new(inbound_tag, outbound_tag)); 38 | } 39 | ret 40 | } 41 | } 42 | 43 | #[derive(Serialize, Deserialize, Clone, Debug)] 44 | pub struct Inbound { 45 | #[serde(flatten)] 46 | other: HashMap, 47 | } 48 | 49 | impl Inbound { 50 | pub fn new(tag: String, listen: String, listen_port: u16) -> Self { 51 | let mut ret = Inbound { 52 | other: HashMap::new(), 53 | }; 54 | ret.other.insert("type".into(), "socks".into()); 55 | ret.other.insert("tag".into(), tag.into()); 56 | ret.other.insert("listen".into(), listen.into()); 57 | ret.other.insert("listen_port".into(), listen_port.into()); 58 | ret.other.insert("tcp_fast_open".into(), true.into()); 59 | ret.other.insert("users".into(), Vec::::new().into()); 60 | ret 61 | } 62 | } 63 | 64 | #[derive(Serialize, Deserialize, Clone, Debug, JsonLoadable)] 65 | pub struct Outbound { 66 | #[serde(flatten)] 67 | other: HashMap, 68 | } 69 | 70 | impl Outbound { 71 | pub fn generate(&self, tag: String, server: String) -> Self { 72 | let mut ret = self.clone(); 73 | ret.other.insert("tag".into(), tag.into()); 74 | ret.other.insert("server".into(), server.into()); 75 | ret 76 | } 77 | } 78 | 79 | #[derive(Serialize, Deserialize, Clone, Debug)] 80 | struct Route { 81 | rules: Vec, 82 | #[serde(flatten)] 83 | other: HashMap, 84 | } 85 | 86 | #[derive(Serialize, Deserialize, Clone, Debug)] 87 | pub struct Rule { 88 | outbound: String, 89 | #[serde(flatten)] 90 | other: HashMap, 91 | } 92 | 93 | impl Rule { 94 | pub fn new(inbound: String, outbound: String) -> Self { 95 | let mut ret = Self { 96 | outbound, 97 | other: HashMap::new(), 98 | }; 99 | ret.other.insert("inbound".into(), vec![inbound].into()); 100 | ret 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /tests/ip_cidr_test.rs: -------------------------------------------------------------------------------- 1 | use cdn_ip_tester::data::{Loadable, Subnet}; 2 | 3 | #[test] 4 | fn parse_ip_cidr() { 5 | let subnets: Vec = Vec::from_str( 6 | r"192.168.1.1 7 | 192.167.2.0/24 8 | 192.167.3.3/24 9 | 1.2.3.456/24 10 | 1.2.3.4/24 11 | 1.2.3.4a/24 12 | 1.2.3.a5/12 13 | ", 14 | ) 15 | .unwrap(); 16 | println!("{subnets:?}"); 17 | // assert_eq!(4, subnets); 18 | } 19 | --------------------------------------------------------------------------------