├── .gitignore ├── src ├── dot11 │ ├── mod.rs │ ├── vendors.rs │ ├── info.rs │ └── header.rs ├── errors.rs ├── server.rs ├── util.rs ├── linux_device_management.rs ├── main.rs └── mapper.rs ├── .rustfmt.toml ├── LICENSE ├── .travis.yml ├── static ├── index.html └── netjson │ ├── netjsongraph.css │ ├── netjsongraph-theme.css │ └── netjsongraph.js ├── Cargo.toml ├── README.md └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | **/*.rs.bk 3 | **/*.log 4 | *.fmt 5 | *.json -------------------------------------------------------------------------------- /src/dot11/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod header; 2 | pub mod info; 3 | pub mod vendors; 4 | -------------------------------------------------------------------------------- /.rustfmt.toml: -------------------------------------------------------------------------------- 1 | binop_separator = "Back" 2 | fn_args_layout = "Compressed" 3 | newline_style = "Unix" 4 | reorder_imports = false 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2018 Flavio Oliveira (flavio@wisespace.io) 2 | 3 | Licensed under either of 4 | 5 | * Apache License, Version 2.0, (http://www.apache.org/licenses/LICENSE-2.0) 6 | * MIT license (http://opensource.org/licenses/MIT) 7 | 8 | at your option. 9 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: rust 2 | sudo: false 3 | dist: trusty 4 | matrix: 5 | fast_finish: true 6 | include: 7 | - rust: nightly 8 | - rust: stable 9 | 10 | cache: 11 | apt: true 12 | directories: 13 | - target/debug/deps 14 | - target/debug/build 15 | addons: 16 | apt: 17 | packages: 18 | - libpcap-dev -------------------------------------------------------------------------------- /src/errors.rs: -------------------------------------------------------------------------------- 1 | use serde_json; 2 | use ctrlc::Error as ctrlcError; 3 | use pcap::Error as pcapError; 4 | use std::io::Error as ioError; 5 | use std::num::ParseIntError as parseIntError; 6 | 7 | error_chain! { 8 | types { 9 | Error, ErrorKind, ResultExt, Result; 10 | } 11 | 12 | foreign_links { 13 | IoError(ioError); 14 | PacpError(pcapError); 15 | Json(serde_json::Error); 16 | ParseIntError(parseIntError); 17 | CtrlcError(ctrlcError); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Nearby 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "nearby" 3 | version = "0.1.5" 4 | authors = ["Flavio "] 5 | edition = "2018" 6 | license = "MIT OR Apache-2.0" 7 | 8 | description = "Scans all nearby wifi networks and the devices connected to each network" 9 | keywords = ["wireless", "wifi", "dot11", "netjson"] 10 | documentation = "https://github.com/wisespace-io/nearby" 11 | repository = "https://github.com/wisespace-io/nearby" 12 | readme = "README.md" 13 | 14 | [dependencies] 15 | clap = "2.33" 16 | pcap = "0.7.0" 17 | radiotap = "1.3" 18 | bytes = "0.4" 19 | byteorder = "1" 20 | console = "0.9" 21 | env_logger = "0.7" 22 | actix = "0.7" 23 | actix-web = "0.7" 24 | ctrlc = "3.1" 25 | crossbeam-channel = "0.4" 26 | serde_json = "1.0" 27 | serde = { version = "1.0", features = ["derive"] } 28 | error-chain = { version = "0.12", default-features = false } -------------------------------------------------------------------------------- /src/server.rs: -------------------------------------------------------------------------------- 1 | use env_logger::init; 2 | use actix::System; 3 | use actix_web::{fs, middleware, server, App}; 4 | 5 | pub fn start() { 6 | ::std::env::set_var("RUST_LOG", "actix_web=info"); 7 | ::std::env::set_var("RUST_BACKTRACE", "1"); 8 | init(); 9 | 10 | let sys = System::new("static_index"); 11 | 12 | server::new(|| { 13 | App::new() 14 | // enable logger 15 | .middleware(middleware::Logger::default()) 16 | .handler( 17 | "/", 18 | fs::StaticFiles::new("./static/") 19 | .unwrap() 20 | .index_file("index.html"), 21 | ) 22 | }) 23 | .bind("127.0.0.1:8080") 24 | .expect("Can not start server on given IP/Port") 25 | .start(); 26 | 27 | println!("Started http server: 127.0.0.1:8080"); 28 | let _ = sys.run(); 29 | } 30 | -------------------------------------------------------------------------------- /static/netjson/netjsongraph.css: -------------------------------------------------------------------------------- 1 | .njg-hidden { 2 | display: none !important; 3 | visibility: hidden !important; 4 | } 5 | 6 | .njg-tooltip{ 7 | font-family: sans-serif; 8 | font-size: 10px; 9 | fill: #000; 10 | opacity: 0.5; 11 | text-anchor: middle; 12 | } 13 | 14 | .njg-overlay{ 15 | display: none; 16 | position: absolute; 17 | z-index: 11; 18 | } 19 | 20 | .njg-close{ 21 | cursor: pointer; 22 | position: absolute; 23 | right: 10px; 24 | top: 10px; 25 | } 26 | .njg-close:before { content: "\2716"; } 27 | 28 | .njg-metadata{ 29 | display: none; 30 | position: absolute; 31 | z-index: 12; 32 | } 33 | 34 | .njg-node{ cursor: pointer } 35 | .njg-link{ cursor: pointer } 36 | 37 | #njg-select-group { 38 | text-align: center; 39 | box-shadow: 0 0 10px #ccc; 40 | position: fixed; 41 | left: 50%; 42 | top: 50%; 43 | width: 50%; 44 | margin-top: -7.5em; 45 | margin-left: -25%; 46 | padding: 5em 2em; 47 | } 48 | 49 | #njg-select-group select { 50 | font-size: 2em; 51 | padding: 10px 15px; 52 | width: 50%; 53 | cursor: pointer; 54 | } 55 | 56 | #njg-select-group option { 57 | padding: 0.5em; 58 | } 59 | 60 | #njg-select-group option[value=""] { 61 | color: #aaa; 62 | } 63 | -------------------------------------------------------------------------------- /src/dot11/vendors.rs: -------------------------------------------------------------------------------- 1 | use crate::errors::*; 2 | use std::fs::File; 3 | use std::io::{BufReader, prelude::*}; 4 | use std::collections::HashMap; 5 | 6 | #[derive(Clone, Debug)] 7 | pub struct VendorsDB { 8 | db: HashMap, 9 | } 10 | 11 | impl VendorsDB { 12 | pub fn from_file(file_name: &str) -> Result { 13 | let mut vendors: HashMap = HashMap::new(); 14 | let file = File::open(file_name)?; 15 | let buf_reader = BufReader::new(file); 16 | 17 | for line in buf_reader.lines() { 18 | let strline = line?; 19 | let v: Vec<&str> = strline.split('\t').collect(); 20 | if v[0].contains("base 16") && v.len() >= 3 { 21 | let (vendor_code, _discard) = v[0].split_at(6); 22 | let vendor_name = v[2]; 23 | vendors.insert(vendor_code.to_lowercase(), vendor_name.to_string()); 24 | } 25 | } 26 | 27 | Ok(VendorsDB { db: vendors }) 28 | } 29 | 30 | pub fn lookup(&self, mac: String) -> String { 31 | let v: Vec<&str> = mac.split(':').collect(); 32 | let key: String = format!("{}{}{}", v[0], v[1], v[2]); 33 | 34 | match self.db.get(&key) { 35 | Some(key) => key.clone(), 36 | None => "".into(), 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /static/netjson/netjsongraph-theme.css: -------------------------------------------------------------------------------- 1 | .njg-overlay{ 2 | background: #fbfbfb; 3 | border-radius: 2px; 4 | border: 1px solid #ccc; 5 | color: #6d6357; 6 | font-family: Arial, sans-serif; 7 | font-family: sans-serif; 8 | font-size: 14px; 9 | line-height: 20px; 10 | height: auto; 11 | max-width: 400px; 12 | min-width: 200px; 13 | padding: 0 15px; 14 | right: 10px; 15 | top: 10px; 16 | width: auto; 17 | } 18 | 19 | .njg-metadata{ 20 | background: #fbfbfb; 21 | border-radius: 2px; 22 | border: 1px solid #ccc; 23 | color: #6d6357; 24 | display: none; 25 | font-family: Arial, sans-serif; 26 | font-family: sans-serif; 27 | font-size: 14px; 28 | height: auto; 29 | left: 10px; 30 | max-width: 500px; 31 | min-width: 200px; 32 | padding: 0 15px; 33 | top: 10px; 34 | width: auto; 35 | } 36 | 37 | .njg-node{ 38 | stroke-opacity: 0.5; 39 | stroke-width: 7px; 40 | stroke: #fff; 41 | } 42 | 43 | .njg-node:hover, 44 | .njg-node.njg-open { 45 | stroke: rgba(0, 0, 0, 0.2); 46 | } 47 | 48 | .njg-link{ 49 | cursor: pointer; 50 | stroke: #999; 51 | stroke-width: 2; 52 | stroke-opacity: 0.25; 53 | } 54 | 55 | .njg-link:hover, 56 | .njg-link.njg-open{ 57 | stroke-width: 4 !important; 58 | stroke-opacity: 0.5; 59 | } 60 | -------------------------------------------------------------------------------- /src/util.rs: -------------------------------------------------------------------------------- 1 | use std::fs::File; 2 | use std::io::prelude::*; 3 | use crate::mapper::*; 4 | use crate::errors::*; 5 | use serde_json::to_string_pretty; 6 | use serde::{Serialize}; 7 | 8 | #[derive(Serialize, Clone, Debug)] 9 | #[serde(rename_all = "camelCase")] 10 | pub struct WifiAccessPoints { 11 | wifi_access_points: Vec, 12 | } 13 | 14 | #[derive(Serialize, Clone, Debug)] 15 | #[serde(rename_all = "camelCase")] 16 | pub struct Macs { 17 | mac_address: String, 18 | signal_strength: i8, 19 | } 20 | 21 | #[inline] 22 | pub fn flag_is_set(data: u8, bit: u8) -> bool { 23 | if bit == 0 { 24 | let mask = 1; 25 | (data & mask) > 0 26 | } else { 27 | let mask = 1 << bit; 28 | (data & mask) > 0 29 | } 30 | } 31 | 32 | pub fn create_netjson(mapper: Mapper) -> Result { 33 | // Print Access Point information 34 | let mut net: Vec = Vec::new(); 35 | for ap in mapper.net_map.values() { 36 | net.push(ap.clone()); 37 | } 38 | 39 | let net_col = NetworkCollection { 40 | id: "NetworkCollection".into(), 41 | collection: net, 42 | }; 43 | 44 | let netjson = to_string_pretty(&net_col)?; 45 | 46 | Ok(netjson) 47 | } 48 | 49 | pub fn format_people_json(mapper: Mapper) -> Result { 50 | let mut people_vec: Vec = Vec::new(); 51 | 52 | for person in mapper.people_map.values() { 53 | people_vec.push(person.clone()); 54 | } 55 | 56 | let json = to_string_pretty(&people_vec)?; 57 | 58 | Ok(json) 59 | } 60 | 61 | pub fn save_netjson(file: &str, content: String) -> Result<()> { 62 | let mut file = File::create("static/".to_owned() + file)?; 63 | file.write_all(content.as_bytes())?; 64 | println!("static/networks.json generated"); 65 | Ok(()) 66 | } 67 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Nearby 2 | 3 | [![Crates.io](https://img.shields.io/crates/v/nearby.svg)](https://crates.io/crates/nearby) 4 | [![Build Status](https://travis-ci.org/wisespace-io/nearby.png?branch=master)](https://travis-ci.org/wisespace-io/nearby) 5 | [![MIT licensed](https://img.shields.io/badge/License-MIT-blue.svg)](./LICENSE-MIT) 6 | [![Apache-2.0 licensed](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](./LICENSE-APACHE) 7 | 8 | ## Description 9 | 10 | Scans nearby wifi networks and the devices connected to each network. 11 | 12 | ## Planned features 13 | 14 | - [x] Map nearby devices ([Netjson for visualization](https://github.com/netjson/netjsongraph.js)) 15 | - [x] Count the number of people around you 16 | - [x] Stop Scanning with CTRL-C and print all collected results 17 | - [ ] Monitor suspicious wireless network activities 18 | - [ ] GeoLocation (Monitor usage of less common SSIDs) 19 | - [ ] Watch specific Mac Address (Send alert by email) 20 | - [ ] BLE Indoor Positioning 21 | 22 | ## Build 23 | 24 | On Debian based Linux, install `apt-get install libpcap-dev`, so build the project: 25 | 26 | ```rust 27 | cargo build --release 28 | ``` 29 | 30 | ## Usage 31 | 32 | ### Nearby Devices 33 | 34 | Root access is required to `nearby` be able to set the wireless interface on `Monitor Mode` 35 | You can list the network interfaces with `ip link show` on Ubuntu. 36 | 37 | ```rust 38 | sudo target/release/nearby -i your_wireless_adapter 39 | ``` 40 | 41 | I.e: wlan0, or just run iwconfig to get it 42 | 43 | Use `--netjson` to generate `networks.json` and use it as input to visualization 44 | 45 | ```rust 46 | sudo target/release/nearby -i your_wireless_adapter --netjson 47 | ``` 48 | 49 | Use `--graph` to start a webserver and visualize the generated file (`networks.json`) 50 | 51 | ```rust 52 | target/release/nearby --graph 53 | ``` 54 | 55 | ### People around you 56 | 57 | Use `--people` to generate `people.json`. It will watch Probe Requests and filter the mobiles according to a specified mobile phone vendor list. 58 | 59 | ```rust 60 | sudo target/release/nearby -i your_wireless_adapter --people 61 | ``` 62 | 63 | Note: The default scan time is 120s, if it stops working after a short period of time often with the error message `libpcap error: The interface went down`, it may be because another running process is causing it. On Ubuntu, you may be the network-manager, try `service network-manager stop`. 64 | 65 | ## Wifi adapter should support monitor mode 66 | 67 | There are many USB Wifi adapters that support monitor mode, i.e: 68 | 69 | - Alfa AWUS036NHA 70 | - Alfa AWUS036NEH 71 | - TP-Link TL-WN722N (ONLY Version 1) 72 | 73 | ## Disclaimer 74 | 75 | It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program. 76 | -------------------------------------------------------------------------------- /src/linux_device_management.rs: -------------------------------------------------------------------------------- 1 | use crate::errors::*; 2 | use std::thread; 3 | use std::sync::Arc; 4 | use std::time::Duration; 5 | use std::io::prelude::*; 6 | use std::fs::{self, File}; 7 | use std::process::Command; 8 | use std::path::{Path, PathBuf}; 9 | use std::sync::atomic::{AtomicBool, Ordering}; 10 | use crossbeam_channel::{bounded, tick, Receiver, select}; 11 | 12 | const ADAPTER_MONITOR_MODE: i32 = 803; // ARPHRD_IEEE80211_RADIOTAP 13 | static NETWORK_INTERFACE_PATH: &str = "/sys/class/net"; 14 | 15 | #[derive(Clone, Debug)] 16 | pub struct NetworkInterface { 17 | pub name: String, 18 | pub path: PathBuf, 19 | pub channels: Vec, 20 | wireless: bool, 21 | shared: Arc, 22 | } 23 | 24 | impl NetworkInterface { 25 | pub fn new(network_interface: S) -> Result 26 | where 27 | S: Into, 28 | { 29 | let network_interface_name = network_interface.into(); 30 | let network_interface_path = 31 | Path::new(NETWORK_INTERFACE_PATH).join(network_interface_name.clone()); 32 | if !network_interface_path.exists() { 33 | bail!("Network Interface not found") 34 | } 35 | 36 | let wireless = network_interface_path.join("wireless").exists(); 37 | 38 | Ok(NetworkInterface { 39 | name: network_interface_name, 40 | path: network_interface_path, 41 | channels: Vec::new(), 42 | wireless, 43 | shared: Arc::new(AtomicBool::new(true)), 44 | }) 45 | } 46 | 47 | pub fn monitor_mode_on(&self) -> Result<()> { 48 | self.set_interface_mode("monitor")?; 49 | Ok(()) 50 | } 51 | 52 | pub fn monitor_mode_off(&self) -> Result<()> { 53 | self.set_interface_mode("managed")?; 54 | Ok(()) 55 | } 56 | 57 | fn set_interface_mode(&self, mode: &str) -> Result<()> { 58 | let _down_status = Command::new("ifconfig") 59 | .arg(self.name.clone()) 60 | .arg("down") 61 | .status()?; 62 | 63 | let _iwconfig = Command::new("iwconfig") 64 | .arg(self.name.clone()) 65 | .arg("mode") 66 | .arg(mode) 67 | .status()?; 68 | 69 | let _up_status = Command::new("ifconfig") 70 | .arg(self.name.clone()) 71 | .arg("up") 72 | .status()?; 73 | 74 | Ok(()) 75 | } 76 | 77 | fn is_monitor_mode_device(&self, entry: String) -> Result { 78 | let mut str_mode = String::new(); 79 | let path = format!("{}/{}/type", NETWORK_INTERFACE_PATH, entry); 80 | let mut file = File::open(&path)?; 81 | 82 | file.read_to_string(&mut str_mode)?; 83 | let mode: Vec<&str> = str_mode.split('\n').collect(); 84 | let mode_number: i32 = mode[0].parse::()?; 85 | 86 | Ok(mode_number == ADAPTER_MONITOR_MODE) 87 | } 88 | 89 | pub fn find_monitor_interfaces(&self) -> Result<()> { 90 | for entry in fs::read_dir(NETWORK_INTERFACE_PATH)? { 91 | let filename = entry?.file_name().into_string().unwrap(); 92 | if let Ok(found) = self.is_monitor_mode_device(filename.clone()) { 93 | if found { 94 | break; 95 | } 96 | } 97 | } 98 | 99 | Ok(()) 100 | } 101 | 102 | pub fn find_supported_channels(&mut self) -> Result<()> { 103 | let iwlist = Command::new("iwlist") 104 | .arg(self.name.clone()) 105 | .arg("freq") 106 | .output()?; 107 | let output = String::from_utf8_lossy(&iwlist.stdout); 108 | let lines: Vec<&str> = output.split('\n').collect(); 109 | 110 | for line in lines { 111 | let channels: Vec = line.split(" : ").map(|s| s.into()).collect(); 112 | if channels[0].contains(" Channel ") { 113 | let ch = channels[0].trim().replace("Channel ", ""); 114 | self.channels.push(ch); 115 | } 116 | } 117 | Ok(()) 118 | } 119 | 120 | pub fn start_channel_switch(&self) { 121 | let name = self.name.clone(); 122 | let channels = self.channels.clone(); 123 | let mut index = 0; 124 | let ticks = tick(Duration::from_secs(5)); // switch channel each 5 seconds 125 | 126 | let ctrl_c_events = self.ctrl_channel().unwrap(); 127 | let _handle = thread::spawn(move || loop { 128 | select! { 129 | recv(ticks) -> _ => { 130 | index = (index + 1) % channels.len(); 131 | let _cmd_status = Command::new("iwconfig").arg(name.clone()) 132 | .arg("channel") 133 | .arg(channels[index].clone()) 134 | .status().unwrap(); 135 | } 136 | recv(ctrl_c_events) -> _ => { 137 | break; 138 | } 139 | } 140 | }); 141 | } 142 | 143 | pub fn running(&self) -> bool { 144 | self.shared.load(Ordering::Relaxed) 145 | } 146 | 147 | fn ctrl_channel(&self) -> Result> { 148 | let (sender, receiver) = bounded(100); 149 | let shared1 = Arc::clone(&self.shared); 150 | ctrlc::set_handler(move || { 151 | let _ = sender.send(()); 152 | shared1.swap(false, Ordering::Relaxed); 153 | })?; 154 | 155 | Ok(receiver) 156 | } 157 | } 158 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use pcap; 2 | use radiotap; 3 | 4 | #[macro_use] 5 | extern crate error_chain; 6 | 7 | mod dot11; 8 | mod errors; 9 | mod linux_device_management; 10 | mod mapper; 11 | mod server; 12 | mod util; 13 | 14 | use crate::errors::*; 15 | use crate::dot11::header::*; 16 | use crate::mapper::*; 17 | use bytes::{Buf}; 18 | use std::io::Cursor; 19 | use clap::{Arg, App}; 20 | use std::time::Instant; 21 | use console::{style, Emoji, Term}; 22 | use crate::linux_device_management::NetworkInterface; 23 | 24 | const TIMEOUT: i32 = 10; 25 | const DEFAULT_EXECUTION_WINDOW: usize = 10; 26 | const LONG_EXECUTION_WINDOW: usize = 15; 27 | 28 | fn main() -> Result<()> { 29 | let matches = App::new("Nearby") 30 | .args(&[ 31 | Arg::with_name("interface") 32 | .takes_value(true) 33 | .short("i") 34 | .long("interface") 35 | .multiple(true) 36 | .help("wireless interface") 37 | .required(false), 38 | Arg::with_name("graph") 39 | .help("Visualize the netjson") 40 | .short("g") 41 | .long("graph") 42 | .required(false), 43 | Arg::with_name("netjson") 44 | .help("Create a netjson file") 45 | .short("n") 46 | .long("netjson") 47 | .required(false), 48 | Arg::with_name("people") 49 | .help("Outputs a json with the devices") 50 | .short("p") 51 | .long("people") 52 | .required(false), 53 | ]) 54 | .get_matches(); 55 | 56 | if let Some(device) = matches.value_of("interface") { 57 | let mut wifi = NetworkInterface::new(device)?; 58 | 59 | if let Ok(_value) = wifi.monitor_mode_on() { 60 | wifi.find_monitor_interfaces()?; 61 | wifi.find_supported_channels()?; 62 | 63 | let capture = pcap::Capture::from_device(&device[..])?; 64 | let mut cap = match capture.timeout(TIMEOUT).rfmon(true).open() { 65 | Ok(cap) => cap, 66 | Err(_e) => bail!("Can not open device, you need root access"), 67 | }; 68 | 69 | let people = matches.is_present("people"); 70 | let mut execution_window = DEFAULT_EXECUTION_WINDOW * wifi.channels.len(); 71 | 72 | if people { 73 | execution_window = LONG_EXECUTION_WINDOW * wifi.channels.len(); 74 | } 75 | // DLT_IEEE802_11_RADIO = 127 76 | if let Ok(_result) = cap.set_datalink(pcap::Linktype(127)) { 77 | let mut mapper = Mapper::new()?; 78 | let term = Term::stdout(); 79 | let start = Instant::now(); 80 | 81 | wifi.start_channel_switch(); 82 | while start.elapsed().as_secs() < (execution_window as u64) { 83 | let remaining = (execution_window as u64) - start.elapsed().as_secs(); 84 | term.write_line(&format!( 85 | "{} Searching devices: remaining {} sec. Use CTRL-C to stop ", 86 | Emoji("📶", "📡 "), 87 | style(remaining).red() 88 | ))?; 89 | term.move_cursor_up(1)?; 90 | match cap.next() { 91 | Ok(packet) => { 92 | let data: &[u8] = &packet; 93 | let radiotap_header = radiotap::Radiotap::from_bytes(&packet); 94 | if radiotap_header.is_ok() { 95 | if let Ok(tap_data) = radiotap_header { 96 | let mut buf = Cursor::new(data); 97 | buf.advance(tap_data.header.length); 98 | 99 | let dot11_header = Dot11Header::from_bytes(&buf.bytes())?; 100 | if let Some(ap) = mapper.map(tap_data, dot11_header, people) { 101 | term.write_line(&format!( 102 | "Access point {} signal {} current channel {} {}", 103 | style(ap.ssid).cyan(), 104 | style(ap.signal).cyan(), 105 | style(ap.current_channel).cyan(), 106 | " " 107 | ))?; 108 | } 109 | } 110 | } 111 | } 112 | // There were no packets on the interface before the timeout 113 | Err(pcap::Error::TimeoutExpired) => { 114 | continue; 115 | } 116 | Err(e) => bail!("Unexpect error: {}", e.to_string()), 117 | } 118 | 119 | if !wifi.running() { 120 | println!(); 121 | println!("=>>>>>> Process stopped by user (CTRL-C)"); 122 | break; 123 | } 124 | } 125 | 126 | term.clear_line()?; 127 | 128 | if people { 129 | println!("{}", util::format_people_json(mapper)?); 130 | } else { 131 | let netjson = util::create_netjson(mapper)?; 132 | if matches.is_present("netjson") { 133 | let output = matches.value_of("netjson").unwrap_or("networks.json"); 134 | util::save_netjson(output, netjson)?; 135 | } else { 136 | println!("{}", netjson); 137 | } 138 | } 139 | } else { 140 | bail!("Can not set datalink") 141 | } 142 | } 143 | 144 | if let Err(e) = wifi.monitor_mode_off() { 145 | bail!("Monitor Mode Off: {:?}", e.to_string()) 146 | } 147 | } 148 | 149 | if matches.is_present("graph") { 150 | server::start(); 151 | } 152 | 153 | Ok(()) 154 | } 155 | -------------------------------------------------------------------------------- /src/dot11/info.rs: -------------------------------------------------------------------------------- 1 | use bytes::{Buf, Bytes}; 2 | use std::io::Cursor; 3 | 4 | #[derive(Clone, Debug)] 5 | pub enum BodyInformation { 6 | Beacon(Beacon), 7 | ProbeRequest(ProbeRequest), 8 | ProbeResponse(ProbeResponse), 9 | AssociationRequest(AssociationRequest), 10 | AssociationResponse(AssociationResponse), 11 | UnHandled(bool), 12 | } 13 | 14 | pub trait Info { 15 | fn from_bytes(input: &[u8]) -> Self 16 | where 17 | Self: Sized; 18 | } 19 | 20 | #[derive(Clone, Debug)] 21 | pub struct Beacon { 22 | pub timestamp: u64, 23 | pub interval: u16, 24 | pub cap_info: u16, 25 | pub ssid: SSID, 26 | pub supported_rates: Vec, 27 | pub current_channel: u8, 28 | pub country: Country, 29 | } 30 | 31 | impl Info for Beacon { 32 | fn from_bytes(input: &[u8]) -> Beacon { 33 | let mut cursor = Cursor::new(input); 34 | 35 | let timestamp = cursor.get_u64_le(); 36 | let interval = cursor.get_u16_le(); 37 | let cap_info = cursor.get_u16_le(); 38 | 39 | let ssid = SSID::from_bytes(cursor.bytes()); 40 | cursor.advance(ssid.ssid_len + 2); // 2 accounts for Id + Len 41 | let supported_rates = supported_rates(cursor.bytes()); 42 | cursor.advance(supported_rates.len() + 2); // 2 accounts for Id + Len 43 | let info = get_info(cursor.bytes()); 44 | 45 | Beacon { 46 | timestamp, 47 | interval, 48 | cap_info, 49 | ssid, 50 | supported_rates, 51 | current_channel: info.current_channel, 52 | country: info.country, 53 | } 54 | } 55 | } 56 | 57 | #[derive(Clone, Debug)] 58 | pub struct ProbeRequest { 59 | pub ssid: SSID, 60 | pub supported_rates: Vec, 61 | } 62 | 63 | impl Info for ProbeRequest { 64 | fn from_bytes(input: &[u8]) -> ProbeRequest { 65 | let mut cursor = Cursor::new(input); 66 | 67 | let ssid = SSID::from_bytes(cursor.bytes()); 68 | cursor.advance(ssid.ssid_len + 2); 69 | 70 | ProbeRequest { 71 | ssid, 72 | supported_rates: supported_rates(cursor.bytes()), 73 | } 74 | } 75 | } 76 | 77 | #[derive(Clone, Debug)] 78 | pub struct ProbeResponse { 79 | pub timestamp: u64, 80 | pub interval: u16, 81 | pub cap_info: u16, 82 | pub ssid: SSID, 83 | pub supported_rates: Vec, 84 | pub current_channel: u8, 85 | pub country: Country, 86 | } 87 | 88 | impl Info for ProbeResponse { 89 | fn from_bytes(input: &[u8]) -> ProbeResponse { 90 | let mut cursor = Cursor::new(input); 91 | 92 | let timestamp = cursor.get_u64_le(); 93 | let interval = cursor.get_u16_le(); 94 | let cap_info = cursor.get_u16_le(); 95 | 96 | let ssid = SSID::from_bytes(cursor.bytes()); 97 | cursor.advance(ssid.ssid_len + 2); // 2 accounts for Id + Len 98 | let supported_rates = supported_rates(cursor.bytes()); 99 | cursor.advance(supported_rates.len() + 2); // 2 accounts for Id + Len 100 | let info = get_info(cursor.bytes()); 101 | 102 | ProbeResponse { 103 | timestamp, 104 | interval, 105 | cap_info, 106 | ssid, 107 | supported_rates, 108 | current_channel: info.current_channel, 109 | country: info.country, 110 | } 111 | } 112 | } 113 | 114 | #[derive(Clone, Debug)] 115 | pub struct AssociationRequest { 116 | pub cap_info: u16, 117 | pub interval: u16, 118 | pub ssid: SSID, 119 | pub supported_rates: Vec, 120 | } 121 | 122 | impl Info for AssociationRequest { 123 | fn from_bytes(input: &[u8]) -> AssociationRequest { 124 | let mut cursor = Cursor::new(input); 125 | 126 | let cap_info = cursor.get_u16_le(); 127 | let interval = cursor.get_u16_le(); 128 | let ssid = SSID::from_bytes(cursor.bytes()); 129 | cursor.advance(ssid.ssid_len + 2); 130 | 131 | AssociationRequest { 132 | cap_info, 133 | interval, 134 | ssid, 135 | supported_rates: supported_rates(cursor.bytes()), 136 | } 137 | } 138 | } 139 | 140 | #[derive(Clone, Debug)] 141 | pub struct AssociationResponse { 142 | pub cap_info: u16, 143 | pub status_code: u16, 144 | pub association_id: u16, 145 | pub supported_rates: Vec, 146 | } 147 | 148 | impl Info for AssociationResponse { 149 | fn from_bytes(input: &[u8]) -> AssociationResponse { 150 | let mut cursor = Cursor::new(input); 151 | 152 | let cap_info = cursor.get_u16_le(); 153 | let status_code = cursor.get_u16_le(); 154 | let association_id = cursor.get_u16_le(); 155 | 156 | AssociationResponse { 157 | cap_info, 158 | status_code, 159 | association_id, 160 | supported_rates: supported_rates(cursor.bytes()), 161 | } 162 | } 163 | } 164 | 165 | #[derive(Clone, Debug, Eq, Hash, PartialEq)] 166 | pub struct SSID { 167 | pub element_id: u8, 168 | pub ssid_len: usize, 169 | pub value: String, 170 | } 171 | 172 | impl Info for SSID { 173 | fn from_bytes(input: &[u8]) -> SSID { 174 | let mut cursor = Cursor::new(input); 175 | 176 | let element_id = cursor.get_u8(); 177 | let ssid_len = cursor.get_u8() as usize; 178 | let mut buf = Bytes::from(cursor.bytes()); 179 | let ssid = buf.split_to(ssid_len); 180 | 181 | SSID { 182 | element_id, 183 | ssid_len, 184 | value: String::from_utf8(ssid.to_vec()).unwrap_or_else(|_| "".to_string()), 185 | } 186 | } 187 | } 188 | 189 | #[derive(Clone, Debug, Default)] 190 | pub struct Country { 191 | pub country_code: String, 192 | } 193 | 194 | impl Info for Country { 195 | fn from_bytes(input: &[u8]) -> Country { 196 | let mut buf = Bytes::from(input); 197 | let country_code = buf.split_to(3); // Country code has 3 bytes 198 | // We should include the supported channels 199 | Country { 200 | country_code: String::from_utf8(country_code.to_vec()) 201 | .unwrap_or_else(|_| "".to_string()), 202 | } 203 | } 204 | } 205 | 206 | #[derive(Clone, Debug, Default)] 207 | pub struct AdditionalInfo { 208 | country: Country, 209 | current_channel: u8, 210 | } 211 | 212 | impl AdditionalInfo { 213 | pub fn new() -> AdditionalInfo { 214 | let country = Country { 215 | ..Default::default() 216 | }; 217 | 218 | AdditionalInfo { 219 | country, 220 | current_channel: 0, 221 | } 222 | } 223 | } 224 | 225 | pub fn supported_rates(input: &[u8]) -> Vec { 226 | let mut rates: Vec = Vec::new(); 227 | let mut cursor = Cursor::new(input); 228 | 229 | let _element_id = cursor.get_u8(); 230 | let number_of_rates = cursor.get_u8(); 231 | 232 | for _x in 0..number_of_rates { 233 | let rate = cursor.get_u8(); 234 | 235 | match rate { 236 | 0x82 => rates.push(1.0), 237 | 0x84 => rates.push(2.0), 238 | 0x8b => rates.push(5.5), 239 | 0x0c => rates.push(6.0), 240 | 0x12 => rates.push(9.0), 241 | 0x96 => rates.push(11.0), 242 | 0x18 => rates.push(12.0), 243 | 0x24 => rates.push(18.0), 244 | 0x2c => rates.push(22.0), 245 | 0x30 => rates.push(24.0), 246 | 0x42 => rates.push(33.0), 247 | 0x48 => rates.push(36.0), 248 | 0x60 => rates.push(48.0), 249 | 0x6c => rates.push(54.0), 250 | _ => continue, 251 | } 252 | } 253 | 254 | rates 255 | } 256 | 257 | pub fn get_info(input: &[u8]) -> AdditionalInfo { 258 | let mut cursor = Cursor::new(input); 259 | let mut info = AdditionalInfo::new(); 260 | 261 | loop { 262 | let element_id = cursor.get_u8(); 263 | let len = cursor.get_u8() as usize; 264 | 265 | // Skipping some fields 266 | match element_id { 267 | 0x02 => cursor.advance(len), // FH Parameter Set 268 | 0x03 => { 269 | // DS Parameter Set 270 | info.current_channel = cursor.get_u8(); 271 | } 272 | 0x04 => cursor.advance(len), // CF Parameter Set 273 | 0x05 => cursor.advance(len), // TIM 274 | 0x06 => cursor.advance(len), // IBSS 275 | 0x07 => { 276 | info.country = Country::from_bytes(cursor.bytes()); 277 | cursor.advance(len); 278 | } 279 | 0x32..=0x42 => cursor.advance(len), // Can appear before country 280 | _ => { 281 | break; 282 | } 283 | } 284 | } 285 | 286 | info 287 | } 288 | -------------------------------------------------------------------------------- /src/mapper.rs: -------------------------------------------------------------------------------- 1 | use crate::errors::*; 2 | use crate::dot11::vendors::*; 3 | use crate::dot11::header::*; 4 | use crate::dot11::info::*; 5 | use radiotap::Radiotap; 6 | use std::collections::HashMap; 7 | use serde::{Serialize, Deserialize}; 8 | 9 | const FREE_SPACE_PATH_LOSS: f32 = 27.55; 10 | static PROTOCOL: &str = "802.11"; 11 | static BROADCAST: &str = "ff:ff:ff:ff:ff:ff"; 12 | static UNSPECIFIED: &str = "00:00:00:00:00:00"; 13 | static MULTICAST: &str = "33:33:00:"; 14 | 15 | // Access Point Information mapped to NetJson format 16 | #[derive(Serialize, Deserialize, Clone, Debug)] 17 | pub struct NetworkCollection { 18 | #[serde(rename = "type")] 19 | pub id: String, 20 | pub collection: Vec, 21 | } 22 | 23 | // Access Point Information mapped to NetJson format 24 | #[derive(Serialize, Deserialize, Clone, Debug)] 25 | pub struct Collection { 26 | #[serde(rename = "type")] 27 | pub ssid: String, 28 | pub protocol: String, 29 | pub version: String, 30 | pub router_id: String, // BSSID 31 | pub label: String, 32 | pub signal: i8, 33 | pub current_channel: u8, 34 | nodes: Vec, 35 | links: Vec, 36 | } 37 | 38 | impl Collection { 39 | fn new() -> Collection { 40 | Collection { 41 | ssid: String::new(), 42 | protocol: PROTOCOL.into(), 43 | version: String::new(), 44 | router_id: String::new(), 45 | label: String::new(), 46 | signal: 0, 47 | current_channel: 0, 48 | nodes: Vec::new(), 49 | links: Vec::new(), 50 | } 51 | } 52 | 53 | fn push_node(&mut self, node: Node) { 54 | self.nodes.push(node); 55 | } 56 | 57 | fn push_link(&mut self, link: Link) { 58 | self.links.push(link); 59 | } 60 | } 61 | 62 | #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash)] 63 | struct Node { 64 | #[serde(rename = "id")] 65 | pub mac: String, 66 | pub properties: Properties, 67 | } 68 | 69 | impl Node { 70 | fn new(mac: String, vendor: String, signal: i8) -> Node { 71 | let properties = Properties { vendor, signal }; 72 | 73 | Node { mac, properties } 74 | } 75 | } 76 | 77 | #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash)] 78 | struct Properties { 79 | pub vendor: String, 80 | pub signal: i8, 81 | } 82 | 83 | #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash)] 84 | struct Link { 85 | pub source: String, 86 | pub target: String, 87 | } 88 | 89 | impl Link { 90 | fn new(src: String, dst: String) -> Link { 91 | Link { 92 | source: src, 93 | target: dst, 94 | } 95 | } 96 | } 97 | 98 | #[derive(Serialize, Deserialize, Clone, Debug)] 99 | pub struct People { 100 | pub mac: String, 101 | pub vendor: String, 102 | pub signal: i8, 103 | pub distance: f32, 104 | } 105 | 106 | #[derive(Clone, Debug)] 107 | pub struct Mapper { 108 | pub vendors: VendorsDB, 109 | pub net_map: HashMap, 110 | pub people_map: HashMap, 111 | } 112 | 113 | impl Mapper { 114 | pub fn new() -> Result { 115 | let vendors = VendorsDB::from_file("data/oui.txt")?; 116 | 117 | Ok(Mapper { 118 | vendors, 119 | net_map: HashMap::new(), 120 | people_map: HashMap::new(), 121 | }) 122 | } 123 | 124 | pub fn map( 125 | &mut self, radio_header: Radiotap, dot11_header: Dot11Header, people: bool, 126 | ) -> Option { 127 | let mut new_ap = None; 128 | let info = dot11_header.info.clone(); 129 | let frame_type = dot11_header.frame_control.frame_type; 130 | let frame_subtype = dot11_header.frame_control.frame_subtype; 131 | let signal = match radio_header.antenna_signal { 132 | Some(antenna_signal) => antenna_signal.value, 133 | None => 0, 134 | }; 135 | 136 | let freq: f32 = match radio_header.channel { 137 | Some(channel) => channel.freq as f32, 138 | None => 0.0, 139 | }; 140 | 141 | if people { 142 | if frame_type == FrameType::Management && frame_subtype == FrameSubType::ProbeReq { 143 | self.add_people(dot11_header.src, freq, signal); 144 | } 145 | } else { 146 | // We should monitor the Probe Request frames for positioning information 147 | if frame_type == FrameType::Management && frame_subtype == FrameSubType::ProbeReq { 148 | self.add_to_collection(dot11_header.src, dot11_header.bssid, signal); 149 | } else if frame_type == FrameType::Data { 150 | if frame_subtype == FrameSubType::QoS || frame_subtype == FrameSubType::Data { 151 | self.add_to_collection(dot11_header.src, dot11_header.bssid.clone(), signal); 152 | self.add_to_collection(dot11_header.dst, dot11_header.bssid, signal); 153 | } else if frame_subtype == FrameSubType::NullData { 154 | // NullData informs Device Power Serving mode 155 | self.add_to_collection(dot11_header.dst, dot11_header.bssid, signal); 156 | } 157 | } else if frame_type == FrameType::Management { 158 | // Lets use the Beacon frame to get Access Point information 159 | if let BodyInformation::Beacon(beacon) = info { 160 | new_ap = self.add_access_point(beacon, signal, dot11_header); 161 | } 162 | } 163 | } 164 | new_ap 165 | } 166 | 167 | fn add_access_point( 168 | &mut self, beacon: Beacon, signal: i8, dot11_header: Dot11Header, 169 | ) -> Option { 170 | if !dot11_header.bssid.contains(BROADCAST) && !dot11_header.bssid.contains(UNSPECIFIED) { 171 | let header = dot11_header; 172 | if !self.net_map.contains_key(&header.bssid.clone()) { 173 | let mut access_point = Collection::new(); 174 | 175 | access_point.ssid = beacon.ssid.value.clone(); 176 | access_point.signal = signal; 177 | access_point.current_channel = beacon.current_channel; 178 | access_point.router_id = header.bssid.clone(); 179 | access_point.label = self.vendors.lookup(header.bssid.clone()); 180 | 181 | // TODO: Check why we get some empty SSIDs 182 | if access_point.ssid == "" { 183 | return None; 184 | } 185 | 186 | let node = Node::new(header.bssid.clone(), access_point.label.clone(), 0); 187 | access_point.nodes.push(node); 188 | self.net_map.insert(header.bssid, access_point.clone()); 189 | return Some(access_point); 190 | } 191 | } 192 | None 193 | } 194 | 195 | fn add_to_collection(&mut self, mac: String, bssid: String, signal: i8) { 196 | if !mac.contains(BROADCAST) && !mac.starts_with(MULTICAST) { 197 | let node = self.add_node(mac.clone(), signal); 198 | let link = Link::new(mac, bssid.clone()); 199 | if let Some(access_point) = self.net_map.get_mut(&bssid) { 200 | let mut node_iter = access_point.nodes.clone().into_iter(); 201 | if node_iter.find(|ref mut x| x.mac == node.mac) == None { 202 | access_point.push_node(node); 203 | } 204 | 205 | if !access_point.links.contains(&link) { 206 | access_point.push_link(link); 207 | } 208 | } 209 | } 210 | } 211 | 212 | fn add_node(&mut self, mac: String, signal: i8) -> Node { 213 | let vendor = self.vendors.lookup(mac.clone()); 214 | Node::new(mac, vendor, signal) 215 | } 216 | 217 | fn add_people(&mut self, src: String, freq: f32, signal: i8) { 218 | // Add phone vendors here but move for a Lazy Load initialization later 219 | let phone_vendors = vec![ 220 | "Samsung Electronics Co.,Ltd", 221 | "Apple, Inc.", 222 | "HTC Corporation", 223 | "Huawei Symantec Technologies Co.,Ltd.", 224 | "Google, Inc.", 225 | "Microsoft", 226 | "Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.", 227 | ]; 228 | 229 | // Get Mobile Phone vendor 230 | let vendor = self.vendors.lookup(src.clone()); 231 | if phone_vendors.contains(&vendor.as_str()) { 232 | let distance = self.calc_distance(freq, signal); 233 | let person = People { 234 | mac: src.clone(), 235 | vendor, 236 | signal, 237 | distance, 238 | }; 239 | self.people_map.insert(src, person); 240 | } 241 | } 242 | 243 | // https://en.wikipedia.org/wiki/Free-space_path_loss 244 | fn calc_distance(&mut self, freq: f32, signal: i8) -> f32 { 245 | let value = 10_f32; 246 | let expr = (FREE_SPACE_PATH_LOSS - (20.0 * freq.log10()) + (-signal as f32)) / 20.0; 247 | value.powf(expr) 248 | } 249 | } 250 | -------------------------------------------------------------------------------- /src/dot11/header.rs: -------------------------------------------------------------------------------- 1 | use crate::util::*; 2 | use crate::errors::*; 3 | use bytes::{Buf, IntoBuf, Bytes}; 4 | use std::io::{Cursor, self}; 5 | use crate::dot11::info::*; 6 | 7 | #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] 8 | pub enum FrameType { 9 | Management, 10 | Control, 11 | Data, 12 | Unknown, 13 | } 14 | 15 | #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] 16 | pub enum FrameSubType { 17 | AssoReq, 18 | AssoResp, 19 | ReassoReq, 20 | ReassoResp, 21 | ProbeReq, 22 | ProbeResp, 23 | Beacon, 24 | Atim, 25 | Disasso, 26 | Auth, 27 | Deauth, 28 | Data, 29 | DataCfAck, 30 | DataCfPull, 31 | DataCfAckCfPull, 32 | NullData, 33 | CfAck, 34 | CfPull, 35 | CfAckCfPull, 36 | QoS, 37 | QoSCfPull, 38 | QoSCfAckCfPull, 39 | QoSNullData, 40 | Reserved, 41 | UnHandled, 42 | } 43 | 44 | #[derive(Clone, Debug)] 45 | pub struct Dot11Header { 46 | pub frame_control: FrameControl, 47 | pub duration: [u8; 2], 48 | pub dst: String, 49 | pub src: String, 50 | pub bssid: String, 51 | pub seq_ctl: [u8; 2], 52 | pub info: BodyInformation, 53 | } 54 | 55 | impl Dot11Header { 56 | pub fn from_bytes(input: &[u8]) -> Result { 57 | use std::io::Read; 58 | 59 | let buf = Bytes::from(input).into_buf(); 60 | let mut reader = buf.reader(); 61 | 62 | let mut control = [0; 2]; 63 | reader.read(&mut control)?; 64 | let frame_control = FrameControl::from_bytes(&control)?; 65 | 66 | let mut duration = [0; 2]; 67 | reader.read(&mut duration)?; 68 | 69 | let mut mac_addresses = [0; 18]; 70 | reader.read(&mut mac_addresses)?; 71 | 72 | let (dst, src, bssid) = Dot11Header::parse_address(frame_control, &mac_addresses); 73 | 74 | let mut seq_ctl = [0; 2]; 75 | reader.read(&mut seq_ctl)?; 76 | 77 | let mut dst2 = vec![]; 78 | io::copy(&mut reader, &mut dst2)?; 79 | 80 | let body_information = Dot11Header::parse_body(frame_control, &dst2[..]); 81 | 82 | let header = Dot11Header { 83 | frame_control, 84 | duration, 85 | dst, 86 | src, 87 | bssid, 88 | seq_ctl, 89 | info: body_information, 90 | }; 91 | Ok(header) 92 | } 93 | 94 | fn parse_address(frame_control: FrameControl, input: &[u8]) -> (String, String, String) { 95 | let mut dst = String::from(""); 96 | let mut src = String::from(""); 97 | let mut bssid = String::from(""); 98 | 99 | let addresses = FrameAddresses::from_bytes(input).unwrap(); 100 | 101 | if frame_control.to_ds && frame_control.from_ds { 102 | dst.push_str(&addresses.addr3.addr); 103 | src.push_str(&addresses.addr4.addr); 104 | } else if frame_control.to_ds { 105 | dst.push_str(&addresses.addr2.addr); 106 | src.push_str(&addresses.addr3.addr); 107 | bssid.push_str(&addresses.addr1.addr); 108 | } else if frame_control.from_ds { 109 | dst.push_str(&addresses.addr3.addr); 110 | src.push_str(&addresses.addr1.addr); 111 | bssid.push_str(&addresses.addr2.addr); 112 | } else { 113 | dst.push_str(&addresses.addr1.addr); 114 | src.push_str(&addresses.addr2.addr); 115 | bssid.push_str(&addresses.addr3.addr); 116 | } 117 | 118 | (dst, src, bssid) 119 | } 120 | 121 | fn parse_body(frame_control: FrameControl, input: &[u8]) -> BodyInformation { 122 | match frame_control.frame_type { 123 | FrameType::Management => { 124 | if frame_control.frame_subtype == FrameSubType::Beacon { 125 | BodyInformation::Beacon(Beacon::from_bytes(input)) 126 | } else if frame_control.frame_subtype == FrameSubType::ProbeReq { 127 | BodyInformation::ProbeRequest(ProbeRequest::from_bytes(input)) 128 | } else if frame_control.frame_subtype == FrameSubType::ProbeResp { 129 | BodyInformation::ProbeResponse(ProbeResponse::from_bytes(input)) 130 | } else if frame_control.frame_subtype == FrameSubType::AssoReq { 131 | BodyInformation::AssociationRequest(AssociationRequest::from_bytes(input)) 132 | } else if frame_control.frame_subtype == FrameSubType::AssoResp { 133 | BodyInformation::AssociationResponse(AssociationResponse::from_bytes(input)) 134 | } else { 135 | BodyInformation::UnHandled(true) 136 | } 137 | } 138 | _ => BodyInformation::UnHandled(true), 139 | } 140 | } 141 | } 142 | 143 | #[derive(Copy, Clone, Debug)] 144 | pub struct FrameControl { 145 | pub frame_type: FrameType, 146 | pub frame_subtype: FrameSubType, 147 | pub to_ds: bool, 148 | pub from_ds: bool, 149 | pub more_flag: bool, 150 | pub retry: bool, 151 | pub pwr_mgmt: bool, 152 | pub more_data: bool, 153 | pub wep: bool, 154 | pub order: bool, 155 | } 156 | 157 | impl FrameControl { 158 | pub fn from_bytes(input: &[u8]) -> Result { 159 | let mut cursor = Cursor::new(input); 160 | let version_type_subtype = cursor.get_u8(); 161 | let flags = cursor.get_u8(); 162 | 163 | if FrameControl::protocol_version(version_type_subtype) != 0 { 164 | bail!("Unknow protocol version"); 165 | } 166 | 167 | let frame_type = FrameControl::frame_type(version_type_subtype); 168 | 169 | let frame_subtype = match frame_type { 170 | FrameType::Management => FrameControl::frame_subtype(version_type_subtype), 171 | FrameType::Data => FrameControl::data_frame_subtype(version_type_subtype), 172 | FrameType::Control => FrameControl::frame_subtype(version_type_subtype), 173 | FrameType::Unknown => FrameControl::frame_subtype(version_type_subtype), 174 | }; 175 | 176 | let fc = FrameControl { 177 | frame_type, 178 | frame_subtype, 179 | to_ds: flag_is_set(flags, 0), 180 | from_ds: flag_is_set(flags, 1), 181 | more_flag: flag_is_set(flags, 2), 182 | retry: flag_is_set(flags, 3), 183 | pwr_mgmt: flag_is_set(flags, 4), 184 | more_data: flag_is_set(flags, 5), 185 | wep: flag_is_set(flags, 6), 186 | order: flag_is_set(flags, 7), 187 | }; 188 | 189 | Ok(fc) 190 | } 191 | 192 | fn protocol_version(packet: u8) -> u8 { 193 | packet & 0b0000_0011 194 | } 195 | 196 | fn frame_type(packet: u8) -> FrameType { 197 | match (packet & 0b0000_1100) >> 2 { 198 | 0 => FrameType::Management, 199 | 1 => FrameType::Control, 200 | 2 => FrameType::Data, 201 | _ => FrameType::Unknown, 202 | } 203 | } 204 | 205 | fn frame_subtype(packet: u8) -> FrameSubType { 206 | match (packet & 0b1111_0000) >> 4 { 207 | 0 => FrameSubType::AssoReq, 208 | 1 => FrameSubType::AssoResp, 209 | 2 => FrameSubType::ReassoReq, 210 | 3 => FrameSubType::ReassoResp, 211 | 4 => FrameSubType::ProbeReq, 212 | 5 => FrameSubType::ProbeResp, 213 | 8 => FrameSubType::Beacon, 214 | 9 => FrameSubType::Atim, 215 | 10 => FrameSubType::Disasso, 216 | 11 => FrameSubType::Auth, 217 | 12 => FrameSubType::Deauth, 218 | _ => FrameSubType::UnHandled, 219 | } 220 | } 221 | 222 | fn data_frame_subtype(packet: u8) -> FrameSubType { 223 | match (packet & 0b1111_0000) >> 4 { 224 | 0 => FrameSubType::Data, 225 | 1 => FrameSubType::DataCfAck, 226 | 2 => FrameSubType::DataCfPull, 227 | 3 => FrameSubType::DataCfAckCfPull, 228 | 4 => FrameSubType::NullData, 229 | 5 => FrameSubType::CfAck, 230 | 6 => FrameSubType::CfPull, 231 | 7 => FrameSubType::CfAckCfPull, 232 | 8 => FrameSubType::QoS, 233 | 10 => FrameSubType::QoSCfPull, 234 | 11 => FrameSubType::QoSCfAckCfPull, 235 | 12 => FrameSubType::QoSNullData, 236 | 13 => FrameSubType::Reserved, 237 | _ => FrameSubType::UnHandled, 238 | } 239 | } 240 | } 241 | 242 | #[derive(Clone, Debug)] 243 | pub struct FrameAddresses { 244 | pub addr1: MACField, 245 | pub addr2: MACField, 246 | pub addr3: MACField, 247 | pub addr4: MACField, 248 | } 249 | 250 | impl FrameAddresses { 251 | pub fn from_bytes(s: &[u8]) -> Result { 252 | use std::io::Read; 253 | 254 | let buf = Bytes::from(s).into_buf(); 255 | let mut reader = buf.reader(); 256 | 257 | let mut mac_addr1 = [0; 6]; 258 | reader.read(&mut mac_addr1)?; 259 | let addr1 = MACField::from_slice(&mac_addr1); 260 | 261 | let mut mac_addr2 = [0; 6]; 262 | reader.read(&mut mac_addr2)?; 263 | let addr2 = MACField::from_slice(&mac_addr2); 264 | 265 | let mut mac_addr3 = [0; 6]; 266 | reader.read(&mut mac_addr3)?; 267 | let addr3 = MACField::from_slice(&mac_addr3); 268 | 269 | let mut seq_ctl = [0; 2]; 270 | reader.read(&mut seq_ctl)?; 271 | 272 | let mut mac_addr4 = [0; 6]; 273 | reader.read(&mut mac_addr4)?; 274 | let addr4 = MACField::from_slice(&mac_addr4); 275 | 276 | Ok(FrameAddresses { 277 | addr1, 278 | addr2, 279 | addr3, 280 | addr4, 281 | }) 282 | } 283 | } 284 | 285 | #[derive(Clone, Debug)] 286 | pub struct MACField { 287 | pub addr: String, 288 | } 289 | 290 | impl MACField { 291 | pub fn from_slice(s: &[u8]) -> MACField { 292 | let addr = format!( 293 | "{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}", 294 | s[0], s[1], s[2], s[3], s[4], s[5] 295 | ); 296 | 297 | MACField { addr } 298 | } 299 | } 300 | -------------------------------------------------------------------------------- /static/netjson/netjsongraph.js: -------------------------------------------------------------------------------- 1 | // version 0.1 2 | (function () { 3 | /** 4 | * vanilla JS implementation of jQuery.extend() 5 | */ 6 | d3._extend = function(defaults, options) { 7 | var extended = {}, 8 | prop; 9 | for(prop in defaults) { 10 | if(Object.prototype.hasOwnProperty.call(defaults, prop)) { 11 | extended[prop] = defaults[prop]; 12 | } 13 | } 14 | for(prop in options) { 15 | if(Object.prototype.hasOwnProperty.call(options, prop)) { 16 | extended[prop] = options[prop]; 17 | } 18 | } 19 | return extended; 20 | }; 21 | 22 | /** 23 | * @function 24 | * @name d3._pxToNumber 25 | * Convert strings like "10px" to 10 26 | * 27 | * @param {string} val The value to convert 28 | * @return {int} The converted integer 29 | */ 30 | d3._pxToNumber = function(val) { 31 | return parseFloat(val.replace('px')); 32 | }; 33 | 34 | /** 35 | * @function 36 | * @name d3._windowHeight 37 | * 38 | * Get window height 39 | * 40 | * @return {int} The window innerHeight 41 | */ 42 | d3._windowHeight = function() { 43 | return window.innerHeight || document.documentElement.clientHeight || 600; 44 | }; 45 | 46 | /** 47 | * @function 48 | * @name d3._getPosition 49 | * 50 | * Get the position of `element` relative to `container` 51 | * 52 | * @param {object} element 53 | * @param {object} container 54 | */ 55 | d3._getPosition = function(element, container) { 56 | var n = element.node(), 57 | nPos = n.getBoundingClientRect(); 58 | cPos = container.node().getBoundingClientRect(); 59 | return { 60 | top: nPos.top - cPos.top, 61 | left: nPos.left - cPos.left, 62 | width: nPos.width, 63 | bottom: nPos.bottom - cPos.top, 64 | height: nPos.height, 65 | right: nPos.right - cPos.left 66 | }; 67 | }; 68 | 69 | /** 70 | * netjsongraph.js main function 71 | * 72 | * @constructor 73 | * @param {string} url The NetJSON file url 74 | * @param {object} opts The object with parameters to override {@link d3.netJsonGraph.opts} 75 | */ 76 | d3.netJsonGraph = function(url, opts) { 77 | /** 78 | * Default options 79 | * 80 | * @param {string} el "body" The container element el: "body" [description] 81 | * @param {bool} metadata true Display NetJSON metadata at startup? 82 | * @param {bool} defaultStyle true Use css style? 83 | * @param {bool} animationAtStart false Animate nodes or not on load 84 | * @param {array} scaleExtent [0.25, 5] The zoom scale's allowed range. @see {@link https://github.com/mbostock/d3/wiki/Zoom-Behavior#scaleExtent} 85 | * @param {int} charge -130 The charge strength to the specified value. @see {@link https://github.com/mbostock/d3/wiki/Force-Layout#charge} 86 | * @param {int} linkDistance 50 The target distance between linked nodes to the specified value. @see {@link https://github.com/mbostock/d3/wiki/Force-Layout#linkDistance} 87 | * @param {float} linkStrength 0.2 The strength (rigidity) of links to the specified value in the range. @see {@link https://github.com/mbostock/d3/wiki/Force-Layout#linkStrength} 88 | * @param {float} friction 0.9 The friction coefficient to the specified value. @see {@link https://github.com/mbostock/d3/wiki/Force-Layout#friction} 89 | * @param {string} chargeDistance Infinity The maximum distance over which charge forces are applied. @see {@link https://github.com/mbostock/d3/wiki/Force-Layout#chargeDistance} 90 | * @param {float} theta 0.8 The Barnes–Hut approximation criterion to the specified value. @see {@link https://github.com/mbostock/d3/wiki/Force-Layout#theta} 91 | * @param {float} gravity 0.1 The gravitational strength to the specified numerical value. @see {@link https://github.com/mbostock/d3/wiki/Force-Layout#gravity} 92 | * @param {int} circleRadius 8 The radius of circles (nodes) in pixel 93 | * @param {string} labelDx "0" SVG dx (distance on x axis) attribute of node labels in graph 94 | * @param {string} labelDy "-1.3em" SVG dy (distance on y axis) attribute of node labels in graph 95 | * @param {function} onInit Callback function executed on initialization 96 | * @param {function} onLoad Callback function executed after data has been loaded 97 | * @param {function} onEnd Callback function executed when initial animation is complete 98 | * @param {function} linkDistanceFunc By default high density areas have longer links 99 | * @param {function} redraw Called when panning and zooming 100 | * @param {function} prepareData Used to convert NetJSON NetworkGraph to the javascript data 101 | * @param {function} onClickNode Called when a node is clicked 102 | * @param {function} onClickLink Called when a link is clicked 103 | */ 104 | opts = d3._extend({ 105 | el: "body", 106 | metadata: true, 107 | defaultStyle: true, 108 | animationAtStart: true, 109 | scaleExtent: [0.25, 5], 110 | charge: -130, 111 | linkDistance: 50, 112 | linkStrength: 0.2, 113 | friction: 0.9, // d3 default 114 | chargeDistance: Infinity, // d3 default 115 | theta: 0.8, // d3 default 116 | gravity: 0.1, 117 | circleRadius: 8, 118 | labelDx: "0", 119 | labelDy: "-1.3em", 120 | nodeClassProperty: null, 121 | linkClassProperty: null, 122 | /** 123 | * @function 124 | * @name onInit 125 | * 126 | * Callback function executed on initialization 127 | * @param {string|object} url The netJson remote url or object 128 | * @param {object} opts The object of passed arguments 129 | * @return {function} 130 | */ 131 | onInit: function(url, opts) {}, 132 | /** 133 | * @function 134 | * @name onLoad 135 | * 136 | * Callback function executed after data has been loaded 137 | * @param {string|object} url The netJson remote url or object 138 | * @param {object} opts The object of passed arguments 139 | * @return {function} 140 | */ 141 | onLoad: function(url, opts) {}, 142 | /** 143 | * @function 144 | * @name onEnd 145 | * 146 | * Callback function executed when initial animation is complete 147 | * @param {string|object} url The netJson remote url or object 148 | * @param {object} opts The object of passed arguments 149 | * @return {function} 150 | */ 151 | onEnd: function(url, opts) {}, 152 | /** 153 | * @function 154 | * @name linkDistanceFunc 155 | * 156 | * By default, high density areas have longer links 157 | */ 158 | linkDistanceFunc: function(d){ 159 | var val = opts.linkDistance; 160 | if(d.source.linkCount >= 4 && d.target.linkCount >= 4) { 161 | return val * 2; 162 | } 163 | return val; 164 | }, 165 | /** 166 | * @function 167 | * @name redraw 168 | * 169 | * Called on zoom and pan 170 | */ 171 | redraw: function() { 172 | panner.attr("transform", 173 | "translate(" + d3.event.translate + ") " + 174 | "scale(" + d3.event.scale + ")" 175 | ); 176 | }, 177 | /** 178 | * @function 179 | * @name prepareData 180 | * 181 | * Convert NetJSON NetworkGraph to the data structure consumed by d3 182 | * 183 | * @param graph {object} 184 | */ 185 | prepareData: function(graph) { 186 | var nodesMap = {}, 187 | nodes = graph.nodes.slice(), // copy 188 | links = graph.links.slice(), // copy 189 | nodes_length = graph.nodes.length, 190 | links_length = graph.links.length; 191 | 192 | for(var i = 0; i < nodes_length; i++) { 193 | // count how many links every node has 194 | nodes[i].linkCount = 0; 195 | nodesMap[nodes[i].id] = i; 196 | } 197 | for(var c = 0; c < links_length; c++) { 198 | var sourceIndex = nodesMap[links[c].source], 199 | targetIndex = nodesMap[links[c].target]; 200 | // ensure source and target exist 201 | if(!nodes[sourceIndex]) { throw("source '" + links[c].source + "' not found"); } 202 | if(!nodes[targetIndex]) { throw("target '" + links[c].target + "' not found"); } 203 | links[c].source = nodesMap[links[c].source]; 204 | links[c].target = nodesMap[links[c].target]; 205 | // add link count to both ends 206 | nodes[sourceIndex].linkCount++; 207 | nodes[targetIndex].linkCount++; 208 | } 209 | return { "nodes": nodes, "links": links }; 210 | }, 211 | /** 212 | * @function 213 | * @name onClickNode 214 | * 215 | * Called when a node is clicked 216 | */ 217 | onClickNode: function(n) { 218 | var overlay = d3.select(".njg-overlay"), 219 | overlayInner = d3.select(".njg-overlay > .njg-inner"), 220 | html = "

id: " + n.id + "

"; 221 | if(n.label) { html += "

label: " + n.label + "

"; } 222 | if(n.properties) { 223 | for(var key in n.properties) { 224 | if(!n.properties.hasOwnProperty(key)) { continue; } 225 | html += "

"+key.replace(/_/g, " ")+": " + n.properties[key] + "

"; 226 | } 227 | } 228 | if(n.linkCount) { html += "

links: " + n.linkCount + "

"; } 229 | if(n.local_addresses) { 230 | html += "

local addresses:
" + n.local_addresses.join('
') + "

"; 231 | } 232 | overlayInner.html(html); 233 | overlay.classed("njg-hidden", false); 234 | overlay.style("display", "block"); 235 | // set "open" class to current node 236 | removeOpenClass(); 237 | d3.select(this).classed("njg-open", true); 238 | }, 239 | /** 240 | * @function 241 | * @name onClickLink 242 | * 243 | * Called when a node is clicked 244 | */ 245 | onClickLink: function(l) { 246 | var overlay = d3.select(".njg-overlay"), 247 | overlayInner = d3.select(".njg-overlay > .njg-inner"), 248 | html = "

source: " + (l.source.label || l.source.id) + "

"; 249 | html += "

target: " + (l.target.label || l.target.id) + "

"; 250 | html += "

cost: " + l.cost + "

"; 251 | if(l.properties) { 252 | for(var key in l.properties) { 253 | if(!l.properties.hasOwnProperty(key)) { continue; } 254 | html += "

"+ key.replace(/_/g, " ") +": " + l.properties[key] + "

"; 255 | } 256 | } 257 | overlayInner.html(html); 258 | overlay.classed("njg-hidden", false); 259 | overlay.style("display", "block"); 260 | // set "open" class to current link 261 | removeOpenClass(); 262 | d3.select(this).classed("njg-open", true); 263 | } 264 | }, opts); 265 | 266 | // init callback 267 | opts.onInit(url, opts); 268 | 269 | if(!opts.animationAtStart) { 270 | opts.linkStrength = 2; 271 | opts.friction = 0.3; 272 | opts.gravity = 0; 273 | } 274 | if(opts.el == "body") { 275 | var body = d3.select(opts.el), 276 | rect = body.node().getBoundingClientRect(); 277 | if (d3._pxToNumber(d3.select("body").style("height")) < 60) { 278 | body.style("height", d3._windowHeight() - rect.top - rect.bottom + "px"); 279 | } 280 | } 281 | var el = d3.select(opts.el).style("position", "relative"), 282 | width = d3._pxToNumber(el.style('width')), 283 | height = d3._pxToNumber(el.style('height')), 284 | force = d3.layout.force() 285 | .charge(opts.charge) 286 | .linkStrength(opts.linkStrength) 287 | .linkDistance(opts.linkDistanceFunc) 288 | .friction(opts.friction) 289 | .chargeDistance(opts.chargeDistance) 290 | .theta(opts.theta) 291 | .gravity(opts.gravity) 292 | // width is easy to get, if height is 0 take the height of the body 293 | .size([width, height]), 294 | zoom = d3.behavior.zoom().scaleExtent(opts.scaleExtent), 295 | // panner is the element that allows zooming and panning 296 | panner = el.append("svg") 297 | .attr("width", width) 298 | .attr("height", height) 299 | .call(zoom.on("zoom", opts.redraw)) 300 | .append("g") 301 | .style("position", "absolute"), 302 | svg = d3.select(opts.el + " svg"), 303 | drag = force.drag(), 304 | overlay = d3.select(opts.el).append("div").attr("class", "njg-overlay"), 305 | closeOverlay = overlay.append("a").attr("class", "njg-close"), 306 | overlayInner = overlay.append("div").attr("class", "njg-inner"), 307 | metadata = d3.select(opts.el).append("div").attr("class", "njg-metadata"), 308 | metadataInner = metadata.append("div").attr("class", "njg-inner"), 309 | closeMetadata = metadata.append("a").attr("class", "njg-close"), 310 | // container of ungrouped networks 311 | str = [], 312 | selected = [], 313 | /** 314 | * @function 315 | * @name removeOpenClass 316 | * 317 | * Remove open classes from nodes and links 318 | */ 319 | removeOpenClass = function () { 320 | d3.selectAll("svg .njg-open").classed("njg-open", false); 321 | }; 322 | processJson = function(graph) { 323 | /** 324 | * Init netJsonGraph 325 | */ 326 | init = function(url, opts) { 327 | d3.netJsonGraph(url, opts); 328 | }; 329 | /** 330 | * Remove all instances 331 | */ 332 | destroy = function() { 333 | force.stop(); 334 | d3.select("#selectGroup").remove(); 335 | d3.select(".njg-overlay").remove(); 336 | d3.select(".njg-metadata").remove(); 337 | overlay.remove(); 338 | overlayInner.remove(); 339 | metadata.remove(); 340 | svg.remove(); 341 | node.remove(); 342 | link.remove(); 343 | nodes = []; 344 | links = []; 345 | }; 346 | /** 347 | * Destroy and e-init all instances 348 | * @return {[type]} [description] 349 | */ 350 | reInit = function() { 351 | destroy(); 352 | init(url, opts); 353 | }; 354 | 355 | var data = opts.prepareData(graph), 356 | links = data.links, 357 | nodes = data.nodes; 358 | 359 | // disable some transitions while dragging 360 | drag.on('dragstart', function(n){ 361 | d3.event.sourceEvent.stopPropagation(); 362 | zoom.on('zoom', null); 363 | }) 364 | // re-enable transitions when dragging stops 365 | .on('dragend', function(n){ 366 | zoom.on('zoom', opts.redraw); 367 | }) 368 | .on("drag", function(d) { 369 | // avoid pan & drag conflict 370 | d3.select(this).attr("x", d.x = d3.event.x).attr("y", d.y = d3.event.y); 371 | }); 372 | 373 | force.nodes(nodes).links(links).start(); 374 | 375 | var link = panner.selectAll(".link") 376 | .data(links) 377 | .enter().append("line") 378 | .attr("class", function (link) { 379 | var baseClass = "njg-link", 380 | addClass = null; 381 | value = link.properties && link.properties[opts.linkClassProperty]; 382 | if (opts.linkClassProperty && value) { 383 | // if value is stirng use that as class 384 | if (typeof(value) === "string") { 385 | addClass = value; 386 | } 387 | else if (typeof(value) === "number") { 388 | addClass = opts.linkClassProperty + value; 389 | } 390 | else if (value === true) { 391 | addClass = opts.linkClassProperty; 392 | } 393 | return baseClass + " " + addClass; 394 | } 395 | return baseClass; 396 | }) 397 | .on("click", opts.onClickLink), 398 | groups = panner.selectAll(".node") 399 | .data(nodes) 400 | .enter() 401 | .append("g"); 402 | node = groups.append("circle") 403 | .attr("class", function (node) { 404 | var baseClass = "njg-node", 405 | addClass = null; 406 | value = node.properties && node.properties[opts.nodeClassProperty]; 407 | if (opts.nodeClassProperty && value) { 408 | // if value is stirng use that as class 409 | if (typeof(value) === "string") { 410 | addClass = value; 411 | } 412 | else if (typeof(value) === "number") { 413 | addClass = opts.nodeClassProperty + value; 414 | } 415 | else if (value === true) { 416 | addClass = opts.nodeClassProperty; 417 | } 418 | return baseClass + " " + addClass; 419 | } 420 | return baseClass; 421 | }) 422 | .attr("r", opts.circleRadius) 423 | .on("click", opts.onClickNode) 424 | .call(drag); 425 | 426 | var labels = groups.append('text') 427 | .text(function(n){ return n.label || n.id }) 428 | .attr('dx', opts.labelDx) 429 | .attr('dy', opts.labelDy) 430 | .attr('class', 'njg-tooltip'); 431 | 432 | // Close overlay 433 | closeOverlay.on("click", function() { 434 | removeOpenClass(); 435 | overlay.classed("njg-hidden", true); 436 | }); 437 | // Close Metadata panel 438 | closeMetadata.on("click", function() { 439 | // Reinitialize the page 440 | if(graph.type === "NetworkCollection") { 441 | reInit(); 442 | } 443 | else { 444 | removeOpenClass(); 445 | metadata.classed("njg-hidden", true); 446 | } 447 | }); 448 | // default style 449 | // TODO: probably change defaultStyle 450 | // into something else 451 | if(opts.defaultStyle) { 452 | var colors = d3.scale.category20c(); 453 | node.style({ 454 | "fill": function(d){ return colors(d.linkCount); }, 455 | "cursor": "pointer" 456 | }); 457 | } 458 | // Metadata style 459 | if(opts.metadata) { 460 | metadata.attr("class", "njg-metadata").style("display", "block"); 461 | } 462 | 463 | var attrs = ["protocol", 464 | "version", 465 | "revision", 466 | "metric", 467 | "router_id", 468 | "topology_id"], 469 | html = ""; 470 | if(graph.label) { 471 | html += "

" + graph.label + "

"; 472 | } 473 | for(var i in attrs) { 474 | var attr = attrs[i]; 475 | if(graph[attr]) { 476 | html += "

" + attr + ": " + graph[attr] + "

"; 477 | } 478 | } 479 | // Add nodes and links count 480 | html += "

nodes: " + graph.nodes.length + "

"; 481 | html += "

links: " + graph.links.length + "

"; 482 | metadataInner.html(html); 483 | metadata.classed("njg-hidden", false); 484 | 485 | // onLoad callback 486 | opts.onLoad(url, opts); 487 | 488 | force.on("tick", function() { 489 | link.attr("x1", function(d) { 490 | return d.source.x; 491 | }) 492 | .attr("y1", function(d) { 493 | return d.source.y; 494 | }) 495 | .attr("x2", function(d) { 496 | return d.target.x; 497 | }) 498 | .attr("y2", function(d) { 499 | return d.target.y; 500 | }); 501 | 502 | node.attr("cx", function(d) { 503 | return d.x; 504 | }) 505 | .attr("cy", function(d) { 506 | return d.y; 507 | }); 508 | 509 | labels.attr("transform", function(d) { 510 | return "translate(" + d.x + "," + d.y + ")"; 511 | }); 512 | }) 513 | .on("end", function(){ 514 | force.stop(); 515 | // onEnd callback 516 | opts.onEnd(url, opts); 517 | }); 518 | 519 | return force; 520 | }; 521 | 522 | if(typeof(url) === "object") { 523 | processJson(url); 524 | } 525 | else { 526 | /** 527 | * Parse the provided json file 528 | * and call processJson() function 529 | * 530 | * @param {string} url The provided json file 531 | * @param {function} error 532 | */ 533 | d3.json(url, function(error, graph) { 534 | if(error) { throw error; } 535 | /** 536 | * Check if the json contains a NetworkCollection 537 | */ 538 | if(graph.type === "NetworkCollection") { 539 | var selectGroup = body.append("div").attr("id", "njg-select-group"), 540 | select = selectGroup.append("select") 541 | .attr("id", "select"); 542 | str = graph; 543 | select.append("option") 544 | .attr({ 545 | "value": "", 546 | "selected": "selected", 547 | "name": "default", 548 | "disabled": "disabled" 549 | }) 550 | .html("Choose the network to display"); 551 | graph.collection.forEach(function(structure) { 552 | select.append("option").attr("value", structure.type).html(structure.type); 553 | // Collect each network json structure 554 | selected[structure.type] = structure; 555 | }); 556 | select.on("change", function() { 557 | selectGroup.attr("class", "njg-hidden"); 558 | // Call selected json structure 559 | processJson(selected[this.options[this.selectedIndex].value]); 560 | }); 561 | } 562 | else { 563 | processJson(graph); 564 | } 565 | }); 566 | } 567 | }; 568 | })(); 569 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | [[package]] 4 | name = "actix" 5 | version = "0.7.9" 6 | source = "registry+https://github.com/rust-lang/crates.io-index" 7 | dependencies = [ 8 | "actix_derive 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 9 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 10 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 11 | "crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 12 | "failure 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 13 | "fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 14 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 15 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 16 | "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 17 | "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 18 | "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 19 | "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", 20 | "tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 21 | "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 22 | "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 23 | "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 24 | "tokio-signal 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", 25 | "tokio-tcp 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 26 | "tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", 27 | "trust-dns-proto 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 28 | "trust-dns-resolver 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", 29 | "uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", 30 | ] 31 | 32 | [[package]] 33 | name = "actix-net" 34 | version = "0.2.6" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | dependencies = [ 37 | "actix 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", 38 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 39 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 40 | "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 41 | "mio 0.6.22 (registry+https://github.com/rust-lang/crates.io-index)", 42 | "net2 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 43 | "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", 44 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 45 | "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", 46 | "tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 47 | "tokio-current-thread 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 48 | "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 49 | "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 50 | "tokio-tcp 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 51 | "tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", 52 | "tower-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 53 | "trust-dns-resolver 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", 54 | ] 55 | 56 | [[package]] 57 | name = "actix-web" 58 | version = "0.7.19" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | dependencies = [ 61 | "actix 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", 62 | "actix-net 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 63 | "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 64 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 65 | "brotli2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 66 | "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 67 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 68 | "cookie 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", 69 | "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 70 | "failure 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 71 | "flate2 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", 72 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 73 | "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 74 | "h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", 75 | "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", 76 | "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 77 | "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 78 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 79 | "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 80 | "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 81 | "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", 82 | "mime_guess 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 83 | "mio 0.6.22 (registry+https://github.com/rust-lang/crates.io-index)", 84 | "net2 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 85 | "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", 86 | "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 87 | "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 88 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 89 | "regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 90 | "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)", 91 | "serde_json 1.0.56 (registry+https://github.com/rust-lang/crates.io-index)", 92 | "serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", 93 | "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 94 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 95 | "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 96 | "time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", 97 | "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", 98 | "tokio-current-thread 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 99 | "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 100 | "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 101 | "tokio-tcp 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 102 | "tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", 103 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 104 | "v_htmlescape 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 105 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 106 | ] 107 | 108 | [[package]] 109 | name = "actix_derive" 110 | version = "0.3.2" 111 | source = "registry+https://github.com/rust-lang/crates.io-index" 112 | dependencies = [ 113 | "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", 114 | "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 115 | "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", 116 | ] 117 | 118 | [[package]] 119 | name = "addr2line" 120 | version = "0.13.0" 121 | source = "registry+https://github.com/rust-lang/crates.io-index" 122 | dependencies = [ 123 | "gimli 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)", 124 | ] 125 | 126 | [[package]] 127 | name = "adler" 128 | version = "0.2.3" 129 | source = "registry+https://github.com/rust-lang/crates.io-index" 130 | 131 | [[package]] 132 | name = "aead" 133 | version = "0.2.0" 134 | source = "registry+https://github.com/rust-lang/crates.io-index" 135 | dependencies = [ 136 | "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 137 | ] 138 | 139 | [[package]] 140 | name = "aes" 141 | version = "0.3.2" 142 | source = "registry+https://github.com/rust-lang/crates.io-index" 143 | dependencies = [ 144 | "aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 145 | "aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 146 | "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 147 | ] 148 | 149 | [[package]] 150 | name = "aes-gcm" 151 | version = "0.5.0" 152 | source = "registry+https://github.com/rust-lang/crates.io-index" 153 | dependencies = [ 154 | "aead 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 155 | "aes 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 156 | "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 157 | "ghash 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 158 | "subtle 2.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 159 | "zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 160 | ] 161 | 162 | [[package]] 163 | name = "aes-soft" 164 | version = "0.3.3" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | dependencies = [ 167 | "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 168 | "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 169 | "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 170 | ] 171 | 172 | [[package]] 173 | name = "aesni" 174 | version = "0.6.0" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | dependencies = [ 177 | "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 178 | "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 179 | ] 180 | 181 | [[package]] 182 | name = "aho-corasick" 183 | version = "0.7.13" 184 | source = "registry+https://github.com/rust-lang/crates.io-index" 185 | dependencies = [ 186 | "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 187 | ] 188 | 189 | [[package]] 190 | name = "ansi_term" 191 | version = "0.11.0" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | dependencies = [ 194 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 195 | ] 196 | 197 | [[package]] 198 | name = "arc-swap" 199 | version = "0.4.7" 200 | source = "registry+https://github.com/rust-lang/crates.io-index" 201 | 202 | [[package]] 203 | name = "atty" 204 | version = "0.2.14" 205 | source = "registry+https://github.com/rust-lang/crates.io-index" 206 | dependencies = [ 207 | "hermit-abi 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", 208 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 209 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 210 | ] 211 | 212 | [[package]] 213 | name = "autocfg" 214 | version = "0.1.7" 215 | source = "registry+https://github.com/rust-lang/crates.io-index" 216 | 217 | [[package]] 218 | name = "autocfg" 219 | version = "1.0.0" 220 | source = "registry+https://github.com/rust-lang/crates.io-index" 221 | 222 | [[package]] 223 | name = "backtrace" 224 | version = "0.3.50" 225 | source = "registry+https://github.com/rust-lang/crates.io-index" 226 | dependencies = [ 227 | "addr2line 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", 228 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 229 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 230 | "miniz_oxide 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 231 | "object 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", 232 | "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 233 | ] 234 | 235 | [[package]] 236 | name = "base64" 237 | version = "0.10.1" 238 | source = "registry+https://github.com/rust-lang/crates.io-index" 239 | dependencies = [ 240 | "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 241 | ] 242 | 243 | [[package]] 244 | name = "base64" 245 | version = "0.12.3" 246 | source = "registry+https://github.com/rust-lang/crates.io-index" 247 | 248 | [[package]] 249 | name = "bitflags" 250 | version = "1.2.1" 251 | source = "registry+https://github.com/rust-lang/crates.io-index" 252 | 253 | [[package]] 254 | name = "bitops" 255 | version = "0.1.0" 256 | source = "registry+https://github.com/rust-lang/crates.io-index" 257 | dependencies = [ 258 | "num-integer 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", 259 | ] 260 | 261 | [[package]] 262 | name = "block-buffer" 263 | version = "0.7.3" 264 | source = "registry+https://github.com/rust-lang/crates.io-index" 265 | dependencies = [ 266 | "block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 267 | "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 268 | "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 269 | "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 270 | ] 271 | 272 | [[package]] 273 | name = "block-cipher-trait" 274 | version = "0.6.2" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | dependencies = [ 277 | "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 278 | ] 279 | 280 | [[package]] 281 | name = "block-padding" 282 | version = "0.1.5" 283 | source = "registry+https://github.com/rust-lang/crates.io-index" 284 | dependencies = [ 285 | "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 286 | ] 287 | 288 | [[package]] 289 | name = "brotli-sys" 290 | version = "0.3.2" 291 | source = "registry+https://github.com/rust-lang/crates.io-index" 292 | dependencies = [ 293 | "cc 1.0.58 (registry+https://github.com/rust-lang/crates.io-index)", 294 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 295 | ] 296 | 297 | [[package]] 298 | name = "brotli2" 299 | version = "0.3.2" 300 | source = "registry+https://github.com/rust-lang/crates.io-index" 301 | dependencies = [ 302 | "brotli-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 303 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 304 | ] 305 | 306 | [[package]] 307 | name = "byte-tools" 308 | version = "0.3.1" 309 | source = "registry+https://github.com/rust-lang/crates.io-index" 310 | 311 | [[package]] 312 | name = "byteorder" 313 | version = "1.3.4" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | 316 | [[package]] 317 | name = "bytes" 318 | version = "0.4.12" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | dependencies = [ 321 | "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 322 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 323 | ] 324 | 325 | [[package]] 326 | name = "cc" 327 | version = "1.0.58" 328 | source = "registry+https://github.com/rust-lang/crates.io-index" 329 | 330 | [[package]] 331 | name = "cfg-if" 332 | version = "0.1.10" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | 335 | [[package]] 336 | name = "clap" 337 | version = "2.33.1" 338 | source = "registry+https://github.com/rust-lang/crates.io-index" 339 | dependencies = [ 340 | "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 341 | "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", 342 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 343 | "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 344 | "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 345 | "unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 346 | "vec_map 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", 347 | ] 348 | 349 | [[package]] 350 | name = "clicolors-control" 351 | version = "1.0.1" 352 | source = "registry+https://github.com/rust-lang/crates.io-index" 353 | dependencies = [ 354 | "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", 355 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 356 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 357 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 358 | ] 359 | 360 | [[package]] 361 | name = "cloudabi" 362 | version = "0.0.3" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | dependencies = [ 365 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 366 | ] 367 | 368 | [[package]] 369 | name = "console" 370 | version = "0.9.2" 371 | source = "registry+https://github.com/rust-lang/crates.io-index" 372 | dependencies = [ 373 | "clicolors-control 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 374 | "encode_unicode 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 375 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 376 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 377 | "regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 378 | "termios 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 379 | "unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 380 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 381 | ] 382 | 383 | [[package]] 384 | name = "cookie" 385 | version = "0.11.3" 386 | source = "registry+https://github.com/rust-lang/crates.io-index" 387 | dependencies = [ 388 | "aes-gcm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 389 | "base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 390 | "hkdf 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 391 | "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 392 | "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 393 | "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", 394 | "sha2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", 395 | "time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", 396 | ] 397 | 398 | [[package]] 399 | name = "crc32fast" 400 | version = "1.2.0" 401 | source = "registry+https://github.com/rust-lang/crates.io-index" 402 | dependencies = [ 403 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 404 | ] 405 | 406 | [[package]] 407 | name = "crossbeam-channel" 408 | version = "0.3.9" 409 | source = "registry+https://github.com/rust-lang/crates.io-index" 410 | dependencies = [ 411 | "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", 412 | ] 413 | 414 | [[package]] 415 | name = "crossbeam-channel" 416 | version = "0.4.2" 417 | source = "registry+https://github.com/rust-lang/crates.io-index" 418 | dependencies = [ 419 | "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 420 | "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 421 | ] 422 | 423 | [[package]] 424 | name = "crossbeam-deque" 425 | version = "0.7.3" 426 | source = "registry+https://github.com/rust-lang/crates.io-index" 427 | dependencies = [ 428 | "crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", 429 | "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 430 | "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 431 | ] 432 | 433 | [[package]] 434 | name = "crossbeam-epoch" 435 | version = "0.8.2" 436 | source = "registry+https://github.com/rust-lang/crates.io-index" 437 | dependencies = [ 438 | "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 439 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 440 | "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 441 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 442 | "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 443 | "memoffset 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", 444 | "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 445 | ] 446 | 447 | [[package]] 448 | name = "crossbeam-queue" 449 | version = "0.2.3" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | dependencies = [ 452 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 453 | "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 454 | "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 455 | ] 456 | 457 | [[package]] 458 | name = "crossbeam-utils" 459 | version = "0.6.6" 460 | source = "registry+https://github.com/rust-lang/crates.io-index" 461 | dependencies = [ 462 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 463 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 464 | ] 465 | 466 | [[package]] 467 | name = "crossbeam-utils" 468 | version = "0.7.2" 469 | source = "registry+https://github.com/rust-lang/crates.io-index" 470 | dependencies = [ 471 | "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 472 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 473 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 474 | ] 475 | 476 | [[package]] 477 | name = "crypto-mac" 478 | version = "0.7.0" 479 | source = "registry+https://github.com/rust-lang/crates.io-index" 480 | dependencies = [ 481 | "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 482 | "subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 483 | ] 484 | 485 | [[package]] 486 | name = "ctrlc" 487 | version = "3.1.5" 488 | source = "registry+https://github.com/rust-lang/crates.io-index" 489 | dependencies = [ 490 | "nix 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)", 491 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 492 | ] 493 | 494 | [[package]] 495 | name = "digest" 496 | version = "0.8.1" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | dependencies = [ 499 | "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 500 | ] 501 | 502 | [[package]] 503 | name = "dtoa" 504 | version = "0.4.6" 505 | source = "registry+https://github.com/rust-lang/crates.io-index" 506 | 507 | [[package]] 508 | name = "encode_unicode" 509 | version = "0.3.6" 510 | source = "registry+https://github.com/rust-lang/crates.io-index" 511 | 512 | [[package]] 513 | name = "encoding" 514 | version = "0.2.33" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | dependencies = [ 517 | "encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", 518 | "encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", 519 | "encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", 520 | "encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", 521 | "encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", 522 | ] 523 | 524 | [[package]] 525 | name = "encoding-index-japanese" 526 | version = "1.20141219.5" 527 | source = "registry+https://github.com/rust-lang/crates.io-index" 528 | dependencies = [ 529 | "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 530 | ] 531 | 532 | [[package]] 533 | name = "encoding-index-korean" 534 | version = "1.20141219.5" 535 | source = "registry+https://github.com/rust-lang/crates.io-index" 536 | dependencies = [ 537 | "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 538 | ] 539 | 540 | [[package]] 541 | name = "encoding-index-simpchinese" 542 | version = "1.20141219.5" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | dependencies = [ 545 | "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 546 | ] 547 | 548 | [[package]] 549 | name = "encoding-index-singlebyte" 550 | version = "1.20141219.5" 551 | source = "registry+https://github.com/rust-lang/crates.io-index" 552 | dependencies = [ 553 | "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 554 | ] 555 | 556 | [[package]] 557 | name = "encoding-index-tradchinese" 558 | version = "1.20141219.5" 559 | source = "registry+https://github.com/rust-lang/crates.io-index" 560 | dependencies = [ 561 | "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 562 | ] 563 | 564 | [[package]] 565 | name = "encoding_index_tests" 566 | version = "0.1.4" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | 569 | [[package]] 570 | name = "env_logger" 571 | version = "0.7.1" 572 | source = "registry+https://github.com/rust-lang/crates.io-index" 573 | dependencies = [ 574 | "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", 575 | "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 576 | "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 577 | "regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 578 | "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 579 | ] 580 | 581 | [[package]] 582 | name = "error-chain" 583 | version = "0.8.1" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | dependencies = [ 586 | "backtrace 0.3.50 (registry+https://github.com/rust-lang/crates.io-index)", 587 | ] 588 | 589 | [[package]] 590 | name = "error-chain" 591 | version = "0.12.2" 592 | source = "registry+https://github.com/rust-lang/crates.io-index" 593 | dependencies = [ 594 | "version_check 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", 595 | ] 596 | 597 | [[package]] 598 | name = "failure" 599 | version = "0.1.8" 600 | source = "registry+https://github.com/rust-lang/crates.io-index" 601 | dependencies = [ 602 | "backtrace 0.3.50 (registry+https://github.com/rust-lang/crates.io-index)", 603 | "failure_derive 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 604 | ] 605 | 606 | [[package]] 607 | name = "failure_derive" 608 | version = "0.1.8" 609 | source = "registry+https://github.com/rust-lang/crates.io-index" 610 | dependencies = [ 611 | "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", 612 | "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 613 | "syn 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)", 614 | "synstructure 0.12.4 (registry+https://github.com/rust-lang/crates.io-index)", 615 | ] 616 | 617 | [[package]] 618 | name = "fake-simd" 619 | version = "0.1.2" 620 | source = "registry+https://github.com/rust-lang/crates.io-index" 621 | 622 | [[package]] 623 | name = "flate2" 624 | version = "1.0.16" 625 | source = "registry+https://github.com/rust-lang/crates.io-index" 626 | dependencies = [ 627 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 628 | "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 629 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 630 | "miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 631 | "miniz_oxide 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 632 | ] 633 | 634 | [[package]] 635 | name = "fnv" 636 | version = "1.0.7" 637 | source = "registry+https://github.com/rust-lang/crates.io-index" 638 | 639 | [[package]] 640 | name = "fuchsia-cprng" 641 | version = "0.1.1" 642 | source = "registry+https://github.com/rust-lang/crates.io-index" 643 | 644 | [[package]] 645 | name = "fuchsia-zircon" 646 | version = "0.3.3" 647 | source = "registry+https://github.com/rust-lang/crates.io-index" 648 | dependencies = [ 649 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 650 | "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 651 | ] 652 | 653 | [[package]] 654 | name = "fuchsia-zircon-sys" 655 | version = "0.3.3" 656 | source = "registry+https://github.com/rust-lang/crates.io-index" 657 | 658 | [[package]] 659 | name = "futures" 660 | version = "0.1.29" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | 663 | [[package]] 664 | name = "futures-cpupool" 665 | version = "0.1.8" 666 | source = "registry+https://github.com/rust-lang/crates.io-index" 667 | dependencies = [ 668 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 669 | "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", 670 | ] 671 | 672 | [[package]] 673 | name = "generic-array" 674 | version = "0.12.3" 675 | source = "registry+https://github.com/rust-lang/crates.io-index" 676 | dependencies = [ 677 | "typenum 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", 678 | ] 679 | 680 | [[package]] 681 | name = "getrandom" 682 | version = "0.1.14" 683 | source = "registry+https://github.com/rust-lang/crates.io-index" 684 | dependencies = [ 685 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 686 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 687 | "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", 688 | ] 689 | 690 | [[package]] 691 | name = "ghash" 692 | version = "0.2.3" 693 | source = "registry+https://github.com/rust-lang/crates.io-index" 694 | dependencies = [ 695 | "polyval 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 696 | ] 697 | 698 | [[package]] 699 | name = "gimli" 700 | version = "0.22.0" 701 | source = "registry+https://github.com/rust-lang/crates.io-index" 702 | 703 | [[package]] 704 | name = "h2" 705 | version = "0.1.26" 706 | source = "registry+https://github.com/rust-lang/crates.io-index" 707 | dependencies = [ 708 | "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 709 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 710 | "fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 711 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 712 | "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", 713 | "indexmap 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 714 | "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 715 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 716 | "string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 717 | "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 718 | ] 719 | 720 | [[package]] 721 | name = "hashbrown" 722 | version = "0.8.1" 723 | source = "registry+https://github.com/rust-lang/crates.io-index" 724 | dependencies = [ 725 | "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 726 | ] 727 | 728 | [[package]] 729 | name = "hermit-abi" 730 | version = "0.1.15" 731 | source = "registry+https://github.com/rust-lang/crates.io-index" 732 | dependencies = [ 733 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 734 | ] 735 | 736 | [[package]] 737 | name = "hkdf" 738 | version = "0.8.0" 739 | source = "registry+https://github.com/rust-lang/crates.io-index" 740 | dependencies = [ 741 | "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 742 | "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 743 | ] 744 | 745 | [[package]] 746 | name = "hmac" 747 | version = "0.7.1" 748 | source = "registry+https://github.com/rust-lang/crates.io-index" 749 | dependencies = [ 750 | "crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 751 | "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 752 | ] 753 | 754 | [[package]] 755 | name = "hostname" 756 | version = "0.3.1" 757 | source = "registry+https://github.com/rust-lang/crates.io-index" 758 | dependencies = [ 759 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 760 | "match_cfg 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 761 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 762 | ] 763 | 764 | [[package]] 765 | name = "http" 766 | version = "0.1.21" 767 | source = "registry+https://github.com/rust-lang/crates.io-index" 768 | dependencies = [ 769 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 770 | "fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 771 | "itoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 772 | ] 773 | 774 | [[package]] 775 | name = "httparse" 776 | version = "1.3.4" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | 779 | [[package]] 780 | name = "humantime" 781 | version = "1.3.0" 782 | source = "registry+https://github.com/rust-lang/crates.io-index" 783 | dependencies = [ 784 | "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 785 | ] 786 | 787 | [[package]] 788 | name = "idna" 789 | version = "0.1.5" 790 | source = "registry+https://github.com/rust-lang/crates.io-index" 791 | dependencies = [ 792 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 793 | "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 794 | "unicode-normalization 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 795 | ] 796 | 797 | [[package]] 798 | name = "indexmap" 799 | version = "1.5.0" 800 | source = "registry+https://github.com/rust-lang/crates.io-index" 801 | dependencies = [ 802 | "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 803 | "hashbrown 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 804 | ] 805 | 806 | [[package]] 807 | name = "iovec" 808 | version = "0.1.4" 809 | source = "registry+https://github.com/rust-lang/crates.io-index" 810 | dependencies = [ 811 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 812 | ] 813 | 814 | [[package]] 815 | name = "ipconfig" 816 | version = "0.1.9" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | dependencies = [ 819 | "error-chain 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 820 | "socket2 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", 821 | "widestring 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 822 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 823 | "winreg 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 824 | ] 825 | 826 | [[package]] 827 | name = "itoa" 828 | version = "0.4.6" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | 831 | [[package]] 832 | name = "kernel32-sys" 833 | version = "0.2.2" 834 | source = "registry+https://github.com/rust-lang/crates.io-index" 835 | dependencies = [ 836 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 837 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 838 | ] 839 | 840 | [[package]] 841 | name = "language-tags" 842 | version = "0.2.2" 843 | source = "registry+https://github.com/rust-lang/crates.io-index" 844 | 845 | [[package]] 846 | name = "lazy_static" 847 | version = "1.4.0" 848 | source = "registry+https://github.com/rust-lang/crates.io-index" 849 | 850 | [[package]] 851 | name = "lazycell" 852 | version = "1.2.1" 853 | source = "registry+https://github.com/rust-lang/crates.io-index" 854 | 855 | [[package]] 856 | name = "libc" 857 | version = "0.2.72" 858 | source = "registry+https://github.com/rust-lang/crates.io-index" 859 | 860 | [[package]] 861 | name = "linked-hash-map" 862 | version = "0.5.3" 863 | source = "registry+https://github.com/rust-lang/crates.io-index" 864 | 865 | [[package]] 866 | name = "lock_api" 867 | version = "0.1.5" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | dependencies = [ 870 | "owning_ref 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 871 | "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 872 | ] 873 | 874 | [[package]] 875 | name = "lock_api" 876 | version = "0.3.4" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | dependencies = [ 879 | "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 880 | ] 881 | 882 | [[package]] 883 | name = "log" 884 | version = "0.4.11" 885 | source = "registry+https://github.com/rust-lang/crates.io-index" 886 | dependencies = [ 887 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 888 | ] 889 | 890 | [[package]] 891 | name = "lru-cache" 892 | version = "0.1.2" 893 | source = "registry+https://github.com/rust-lang/crates.io-index" 894 | dependencies = [ 895 | "linked-hash-map 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", 896 | ] 897 | 898 | [[package]] 899 | name = "match_cfg" 900 | version = "0.1.0" 901 | source = "registry+https://github.com/rust-lang/crates.io-index" 902 | 903 | [[package]] 904 | name = "matches" 905 | version = "0.1.8" 906 | source = "registry+https://github.com/rust-lang/crates.io-index" 907 | 908 | [[package]] 909 | name = "maybe-uninit" 910 | version = "2.0.0" 911 | source = "registry+https://github.com/rust-lang/crates.io-index" 912 | 913 | [[package]] 914 | name = "memchr" 915 | version = "2.3.3" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | 918 | [[package]] 919 | name = "memoffset" 920 | version = "0.5.5" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | dependencies = [ 923 | "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 924 | ] 925 | 926 | [[package]] 927 | name = "mime" 928 | version = "0.3.16" 929 | source = "registry+https://github.com/rust-lang/crates.io-index" 930 | 931 | [[package]] 932 | name = "mime_guess" 933 | version = "2.0.3" 934 | source = "registry+https://github.com/rust-lang/crates.io-index" 935 | dependencies = [ 936 | "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", 937 | "unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 938 | ] 939 | 940 | [[package]] 941 | name = "miniz-sys" 942 | version = "0.1.12" 943 | source = "registry+https://github.com/rust-lang/crates.io-index" 944 | dependencies = [ 945 | "cc 1.0.58 (registry+https://github.com/rust-lang/crates.io-index)", 946 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 947 | ] 948 | 949 | [[package]] 950 | name = "miniz_oxide" 951 | version = "0.4.0" 952 | source = "registry+https://github.com/rust-lang/crates.io-index" 953 | dependencies = [ 954 | "adler 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 955 | ] 956 | 957 | [[package]] 958 | name = "mio" 959 | version = "0.6.22" 960 | source = "registry+https://github.com/rust-lang/crates.io-index" 961 | dependencies = [ 962 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 963 | "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 964 | "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 965 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 966 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 967 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 968 | "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 969 | "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 970 | "net2 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 971 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 972 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 973 | ] 974 | 975 | [[package]] 976 | name = "mio-uds" 977 | version = "0.6.8" 978 | source = "registry+https://github.com/rust-lang/crates.io-index" 979 | dependencies = [ 980 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 981 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 982 | "mio 0.6.22 (registry+https://github.com/rust-lang/crates.io-index)", 983 | ] 984 | 985 | [[package]] 986 | name = "miow" 987 | version = "0.2.1" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | dependencies = [ 990 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 991 | "net2 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 992 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 993 | "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 994 | ] 995 | 996 | [[package]] 997 | name = "nearby" 998 | version = "0.1.5" 999 | dependencies = [ 1000 | "actix 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", 1001 | "actix-web 0.7.19 (registry+https://github.com/rust-lang/crates.io-index)", 1002 | "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 1003 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1004 | "clap 2.33.1 (registry+https://github.com/rust-lang/crates.io-index)", 1005 | "console 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", 1006 | "crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1007 | "ctrlc 3.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1008 | "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 1009 | "error-chain 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", 1010 | "pcap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 1011 | "radiotap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1012 | "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)", 1013 | "serde_json 1.0.56 (registry+https://github.com/rust-lang/crates.io-index)", 1014 | ] 1015 | 1016 | [[package]] 1017 | name = "net2" 1018 | version = "0.2.34" 1019 | source = "registry+https://github.com/rust-lang/crates.io-index" 1020 | dependencies = [ 1021 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1022 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 1023 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "nix" 1028 | version = "0.17.0" 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" 1030 | dependencies = [ 1031 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1032 | "cc 1.0.58 (registry+https://github.com/rust-lang/crates.io-index)", 1033 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1034 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 1035 | "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1036 | ] 1037 | 1038 | [[package]] 1039 | name = "nom" 1040 | version = "4.2.3" 1041 | source = "registry+https://github.com/rust-lang/crates.io-index" 1042 | dependencies = [ 1043 | "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 1044 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1045 | ] 1046 | 1047 | [[package]] 1048 | name = "num-integer" 1049 | version = "0.1.43" 1050 | source = "registry+https://github.com/rust-lang/crates.io-index" 1051 | dependencies = [ 1052 | "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 1053 | "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", 1054 | ] 1055 | 1056 | [[package]] 1057 | name = "num-traits" 1058 | version = "0.2.12" 1059 | source = "registry+https://github.com/rust-lang/crates.io-index" 1060 | dependencies = [ 1061 | "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 1062 | ] 1063 | 1064 | [[package]] 1065 | name = "num_cpus" 1066 | version = "1.13.0" 1067 | source = "registry+https://github.com/rust-lang/crates.io-index" 1068 | dependencies = [ 1069 | "hermit-abi 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", 1070 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 1071 | ] 1072 | 1073 | [[package]] 1074 | name = "object" 1075 | version = "0.20.0" 1076 | source = "registry+https://github.com/rust-lang/crates.io-index" 1077 | 1078 | [[package]] 1079 | name = "opaque-debug" 1080 | version = "0.2.3" 1081 | source = "registry+https://github.com/rust-lang/crates.io-index" 1082 | 1083 | [[package]] 1084 | name = "owning_ref" 1085 | version = "0.4.1" 1086 | source = "registry+https://github.com/rust-lang/crates.io-index" 1087 | dependencies = [ 1088 | "stable_deref_trait 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1089 | ] 1090 | 1091 | [[package]] 1092 | name = "parking_lot" 1093 | version = "0.7.1" 1094 | source = "registry+https://github.com/rust-lang/crates.io-index" 1095 | dependencies = [ 1096 | "lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1097 | "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1098 | ] 1099 | 1100 | [[package]] 1101 | name = "parking_lot" 1102 | version = "0.9.0" 1103 | source = "registry+https://github.com/rust-lang/crates.io-index" 1104 | dependencies = [ 1105 | "lock_api 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 1106 | "parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 1107 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1108 | ] 1109 | 1110 | [[package]] 1111 | name = "parking_lot_core" 1112 | version = "0.4.0" 1113 | source = "registry+https://github.com/rust-lang/crates.io-index" 1114 | dependencies = [ 1115 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 1116 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1117 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1118 | "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 1119 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 1120 | ] 1121 | 1122 | [[package]] 1123 | name = "parking_lot_core" 1124 | version = "0.6.2" 1125 | source = "registry+https://github.com/rust-lang/crates.io-index" 1126 | dependencies = [ 1127 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1128 | "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 1129 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 1130 | "redox_syscall 0.1.57 (registry+https://github.com/rust-lang/crates.io-index)", 1131 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1132 | "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 1133 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 1134 | ] 1135 | 1136 | [[package]] 1137 | name = "pcap" 1138 | version = "0.7.0" 1139 | source = "registry+https://github.com/rust-lang/crates.io-index" 1140 | dependencies = [ 1141 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 1142 | ] 1143 | 1144 | [[package]] 1145 | name = "percent-encoding" 1146 | version = "1.0.1" 1147 | source = "registry+https://github.com/rust-lang/crates.io-index" 1148 | 1149 | [[package]] 1150 | name = "percent-encoding" 1151 | version = "2.1.0" 1152 | source = "registry+https://github.com/rust-lang/crates.io-index" 1153 | 1154 | [[package]] 1155 | name = "polyval" 1156 | version = "0.3.3" 1157 | source = "registry+https://github.com/rust-lang/crates.io-index" 1158 | dependencies = [ 1159 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1160 | "universal-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1161 | ] 1162 | 1163 | [[package]] 1164 | name = "ppv-lite86" 1165 | version = "0.2.8" 1166 | source = "registry+https://github.com/rust-lang/crates.io-index" 1167 | 1168 | [[package]] 1169 | name = "proc-macro2" 1170 | version = "0.4.30" 1171 | source = "registry+https://github.com/rust-lang/crates.io-index" 1172 | dependencies = [ 1173 | "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1174 | ] 1175 | 1176 | [[package]] 1177 | name = "proc-macro2" 1178 | version = "1.0.18" 1179 | source = "registry+https://github.com/rust-lang/crates.io-index" 1180 | dependencies = [ 1181 | "unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1182 | ] 1183 | 1184 | [[package]] 1185 | name = "quick-error" 1186 | version = "1.2.3" 1187 | source = "registry+https://github.com/rust-lang/crates.io-index" 1188 | 1189 | [[package]] 1190 | name = "quote" 1191 | version = "0.6.13" 1192 | source = "registry+https://github.com/rust-lang/crates.io-index" 1193 | dependencies = [ 1194 | "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", 1195 | ] 1196 | 1197 | [[package]] 1198 | name = "quote" 1199 | version = "1.0.7" 1200 | source = "registry+https://github.com/rust-lang/crates.io-index" 1201 | dependencies = [ 1202 | "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", 1203 | ] 1204 | 1205 | [[package]] 1206 | name = "radiotap" 1207 | version = "1.3.0" 1208 | source = "registry+https://github.com/rust-lang/crates.io-index" 1209 | dependencies = [ 1210 | "bitops 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1211 | "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 1212 | "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1213 | ] 1214 | 1215 | [[package]] 1216 | name = "rand" 1217 | version = "0.5.6" 1218 | source = "registry+https://github.com/rust-lang/crates.io-index" 1219 | dependencies = [ 1220 | "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 1221 | "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1222 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 1223 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1224 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 1225 | ] 1226 | 1227 | [[package]] 1228 | name = "rand" 1229 | version = "0.6.5" 1230 | source = "registry+https://github.com/rust-lang/crates.io-index" 1231 | dependencies = [ 1232 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1233 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 1234 | "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1235 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1236 | "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1237 | "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1238 | "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1239 | "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1240 | "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1241 | "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1242 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 1243 | ] 1244 | 1245 | [[package]] 1246 | name = "rand" 1247 | version = "0.7.3" 1248 | source = "registry+https://github.com/rust-lang/crates.io-index" 1249 | dependencies = [ 1250 | "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 1251 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 1252 | "rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1253 | "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 1254 | "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1255 | ] 1256 | 1257 | [[package]] 1258 | name = "rand_chacha" 1259 | version = "0.1.1" 1260 | source = "registry+https://github.com/rust-lang/crates.io-index" 1261 | dependencies = [ 1262 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1263 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1264 | ] 1265 | 1266 | [[package]] 1267 | name = "rand_chacha" 1268 | version = "0.2.2" 1269 | source = "registry+https://github.com/rust-lang/crates.io-index" 1270 | dependencies = [ 1271 | "ppv-lite86 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 1272 | "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 1273 | ] 1274 | 1275 | [[package]] 1276 | name = "rand_core" 1277 | version = "0.3.1" 1278 | source = "registry+https://github.com/rust-lang/crates.io-index" 1279 | dependencies = [ 1280 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1281 | ] 1282 | 1283 | [[package]] 1284 | name = "rand_core" 1285 | version = "0.4.2" 1286 | source = "registry+https://github.com/rust-lang/crates.io-index" 1287 | 1288 | [[package]] 1289 | name = "rand_core" 1290 | version = "0.5.1" 1291 | source = "registry+https://github.com/rust-lang/crates.io-index" 1292 | dependencies = [ 1293 | "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 1294 | ] 1295 | 1296 | [[package]] 1297 | name = "rand_hc" 1298 | version = "0.1.0" 1299 | source = "registry+https://github.com/rust-lang/crates.io-index" 1300 | dependencies = [ 1301 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1302 | ] 1303 | 1304 | [[package]] 1305 | name = "rand_hc" 1306 | version = "0.2.0" 1307 | source = "registry+https://github.com/rust-lang/crates.io-index" 1308 | dependencies = [ 1309 | "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 1310 | ] 1311 | 1312 | [[package]] 1313 | name = "rand_isaac" 1314 | version = "0.1.1" 1315 | source = "registry+https://github.com/rust-lang/crates.io-index" 1316 | dependencies = [ 1317 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1318 | ] 1319 | 1320 | [[package]] 1321 | name = "rand_jitter" 1322 | version = "0.1.4" 1323 | source = "registry+https://github.com/rust-lang/crates.io-index" 1324 | dependencies = [ 1325 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 1326 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1327 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 1328 | ] 1329 | 1330 | [[package]] 1331 | name = "rand_os" 1332 | version = "0.1.3" 1333 | source = "registry+https://github.com/rust-lang/crates.io-index" 1334 | dependencies = [ 1335 | "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 1336 | "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1337 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 1338 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1339 | "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1340 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 1341 | ] 1342 | 1343 | [[package]] 1344 | name = "rand_pcg" 1345 | version = "0.1.2" 1346 | source = "registry+https://github.com/rust-lang/crates.io-index" 1347 | dependencies = [ 1348 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1349 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1350 | ] 1351 | 1352 | [[package]] 1353 | name = "rand_xorshift" 1354 | version = "0.1.1" 1355 | source = "registry+https://github.com/rust-lang/crates.io-index" 1356 | dependencies = [ 1357 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1358 | ] 1359 | 1360 | [[package]] 1361 | name = "rdrand" 1362 | version = "0.4.0" 1363 | source = "registry+https://github.com/rust-lang/crates.io-index" 1364 | dependencies = [ 1365 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1366 | ] 1367 | 1368 | [[package]] 1369 | name = "redox_syscall" 1370 | version = "0.1.57" 1371 | source = "registry+https://github.com/rust-lang/crates.io-index" 1372 | 1373 | [[package]] 1374 | name = "regex" 1375 | version = "1.3.9" 1376 | source = "registry+https://github.com/rust-lang/crates.io-index" 1377 | dependencies = [ 1378 | "aho-corasick 0.7.13 (registry+https://github.com/rust-lang/crates.io-index)", 1379 | "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 1380 | "regex-syntax 0.6.18 (registry+https://github.com/rust-lang/crates.io-index)", 1381 | "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 1382 | ] 1383 | 1384 | [[package]] 1385 | name = "regex-syntax" 1386 | version = "0.6.18" 1387 | source = "registry+https://github.com/rust-lang/crates.io-index" 1388 | 1389 | [[package]] 1390 | name = "resolv-conf" 1391 | version = "0.6.3" 1392 | source = "registry+https://github.com/rust-lang/crates.io-index" 1393 | dependencies = [ 1394 | "hostname 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1395 | "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1396 | ] 1397 | 1398 | [[package]] 1399 | name = "rustc-demangle" 1400 | version = "0.1.16" 1401 | source = "registry+https://github.com/rust-lang/crates.io-index" 1402 | 1403 | [[package]] 1404 | name = "rustc_version" 1405 | version = "0.2.3" 1406 | source = "registry+https://github.com/rust-lang/crates.io-index" 1407 | dependencies = [ 1408 | "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 1409 | ] 1410 | 1411 | [[package]] 1412 | name = "ryu" 1413 | version = "1.0.5" 1414 | source = "registry+https://github.com/rust-lang/crates.io-index" 1415 | 1416 | [[package]] 1417 | name = "scopeguard" 1418 | version = "0.3.3" 1419 | source = "registry+https://github.com/rust-lang/crates.io-index" 1420 | 1421 | [[package]] 1422 | name = "scopeguard" 1423 | version = "1.1.0" 1424 | source = "registry+https://github.com/rust-lang/crates.io-index" 1425 | 1426 | [[package]] 1427 | name = "semver" 1428 | version = "0.9.0" 1429 | source = "registry+https://github.com/rust-lang/crates.io-index" 1430 | dependencies = [ 1431 | "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 1432 | ] 1433 | 1434 | [[package]] 1435 | name = "semver-parser" 1436 | version = "0.7.0" 1437 | source = "registry+https://github.com/rust-lang/crates.io-index" 1438 | 1439 | [[package]] 1440 | name = "serde" 1441 | version = "1.0.114" 1442 | source = "registry+https://github.com/rust-lang/crates.io-index" 1443 | dependencies = [ 1444 | "serde_derive 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)", 1445 | ] 1446 | 1447 | [[package]] 1448 | name = "serde_derive" 1449 | version = "1.0.114" 1450 | source = "registry+https://github.com/rust-lang/crates.io-index" 1451 | dependencies = [ 1452 | "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", 1453 | "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 1454 | "syn 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)", 1455 | ] 1456 | 1457 | [[package]] 1458 | name = "serde_json" 1459 | version = "1.0.56" 1460 | source = "registry+https://github.com/rust-lang/crates.io-index" 1461 | dependencies = [ 1462 | "itoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1463 | "ryu 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", 1464 | "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)", 1465 | ] 1466 | 1467 | [[package]] 1468 | name = "serde_urlencoded" 1469 | version = "0.5.5" 1470 | source = "registry+https://github.com/rust-lang/crates.io-index" 1471 | dependencies = [ 1472 | "dtoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1473 | "itoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1474 | "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)", 1475 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1476 | ] 1477 | 1478 | [[package]] 1479 | name = "sha1" 1480 | version = "0.6.0" 1481 | source = "registry+https://github.com/rust-lang/crates.io-index" 1482 | 1483 | [[package]] 1484 | name = "sha2" 1485 | version = "0.8.2" 1486 | source = "registry+https://github.com/rust-lang/crates.io-index" 1487 | dependencies = [ 1488 | "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", 1489 | "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 1490 | "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1491 | "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1492 | ] 1493 | 1494 | [[package]] 1495 | name = "signal-hook-registry" 1496 | version = "1.2.0" 1497 | source = "registry+https://github.com/rust-lang/crates.io-index" 1498 | dependencies = [ 1499 | "arc-swap 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", 1500 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 1501 | ] 1502 | 1503 | [[package]] 1504 | name = "slab" 1505 | version = "0.4.2" 1506 | source = "registry+https://github.com/rust-lang/crates.io-index" 1507 | 1508 | [[package]] 1509 | name = "smallvec" 1510 | version = "0.6.13" 1511 | source = "registry+https://github.com/rust-lang/crates.io-index" 1512 | dependencies = [ 1513 | "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 1514 | ] 1515 | 1516 | [[package]] 1517 | name = "socket2" 1518 | version = "0.3.12" 1519 | source = "registry+https://github.com/rust-lang/crates.io-index" 1520 | dependencies = [ 1521 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1522 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 1523 | "redox_syscall 0.1.57 (registry+https://github.com/rust-lang/crates.io-index)", 1524 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 1525 | ] 1526 | 1527 | [[package]] 1528 | name = "stable_deref_trait" 1529 | version = "1.2.0" 1530 | source = "registry+https://github.com/rust-lang/crates.io-index" 1531 | 1532 | [[package]] 1533 | name = "string" 1534 | version = "0.2.1" 1535 | source = "registry+https://github.com/rust-lang/crates.io-index" 1536 | dependencies = [ 1537 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1538 | ] 1539 | 1540 | [[package]] 1541 | name = "strsim" 1542 | version = "0.8.0" 1543 | source = "registry+https://github.com/rust-lang/crates.io-index" 1544 | 1545 | [[package]] 1546 | name = "subtle" 1547 | version = "1.0.0" 1548 | source = "registry+https://github.com/rust-lang/crates.io-index" 1549 | 1550 | [[package]] 1551 | name = "subtle" 1552 | version = "2.2.3" 1553 | source = "registry+https://github.com/rust-lang/crates.io-index" 1554 | 1555 | [[package]] 1556 | name = "syn" 1557 | version = "0.15.44" 1558 | source = "registry+https://github.com/rust-lang/crates.io-index" 1559 | dependencies = [ 1560 | "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", 1561 | "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 1562 | "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1563 | ] 1564 | 1565 | [[package]] 1566 | name = "syn" 1567 | version = "1.0.34" 1568 | source = "registry+https://github.com/rust-lang/crates.io-index" 1569 | dependencies = [ 1570 | "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", 1571 | "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 1572 | "unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1573 | ] 1574 | 1575 | [[package]] 1576 | name = "synstructure" 1577 | version = "0.12.4" 1578 | source = "registry+https://github.com/rust-lang/crates.io-index" 1579 | dependencies = [ 1580 | "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", 1581 | "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 1582 | "syn 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)", 1583 | "unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1584 | ] 1585 | 1586 | [[package]] 1587 | name = "termcolor" 1588 | version = "1.1.0" 1589 | source = "registry+https://github.com/rust-lang/crates.io-index" 1590 | dependencies = [ 1591 | "winapi-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1592 | ] 1593 | 1594 | [[package]] 1595 | name = "termios" 1596 | version = "0.3.2" 1597 | source = "registry+https://github.com/rust-lang/crates.io-index" 1598 | dependencies = [ 1599 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 1600 | ] 1601 | 1602 | [[package]] 1603 | name = "textwrap" 1604 | version = "0.11.0" 1605 | source = "registry+https://github.com/rust-lang/crates.io-index" 1606 | dependencies = [ 1607 | "unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1608 | ] 1609 | 1610 | [[package]] 1611 | name = "thread_local" 1612 | version = "1.0.1" 1613 | source = "registry+https://github.com/rust-lang/crates.io-index" 1614 | dependencies = [ 1615 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1616 | ] 1617 | 1618 | [[package]] 1619 | name = "time" 1620 | version = "0.1.43" 1621 | source = "registry+https://github.com/rust-lang/crates.io-index" 1622 | dependencies = [ 1623 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 1624 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 1625 | ] 1626 | 1627 | [[package]] 1628 | name = "tinyvec" 1629 | version = "0.3.3" 1630 | source = "registry+https://github.com/rust-lang/crates.io-index" 1631 | 1632 | [[package]] 1633 | name = "tokio" 1634 | version = "0.1.22" 1635 | source = "registry+https://github.com/rust-lang/crates.io-index" 1636 | dependencies = [ 1637 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1638 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1639 | "mio 0.6.22 (registry+https://github.com/rust-lang/crates.io-index)", 1640 | "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", 1641 | "tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1642 | "tokio-current-thread 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1643 | "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1644 | "tokio-fs 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1645 | "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 1646 | "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1647 | "tokio-sync 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1648 | "tokio-tcp 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1649 | "tokio-threadpool 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", 1650 | "tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", 1651 | "tokio-udp 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1652 | "tokio-uds 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 1653 | ] 1654 | 1655 | [[package]] 1656 | name = "tokio-codec" 1657 | version = "0.1.2" 1658 | source = "registry+https://github.com/rust-lang/crates.io-index" 1659 | dependencies = [ 1660 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1661 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1662 | "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 1663 | ] 1664 | 1665 | [[package]] 1666 | name = "tokio-current-thread" 1667 | version = "0.1.7" 1668 | source = "registry+https://github.com/rust-lang/crates.io-index" 1669 | dependencies = [ 1670 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1671 | "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1672 | ] 1673 | 1674 | [[package]] 1675 | name = "tokio-executor" 1676 | version = "0.1.10" 1677 | source = "registry+https://github.com/rust-lang/crates.io-index" 1678 | dependencies = [ 1679 | "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1680 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1681 | ] 1682 | 1683 | [[package]] 1684 | name = "tokio-fs" 1685 | version = "0.1.7" 1686 | source = "registry+https://github.com/rust-lang/crates.io-index" 1687 | dependencies = [ 1688 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1689 | "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 1690 | "tokio-threadpool 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", 1691 | ] 1692 | 1693 | [[package]] 1694 | name = "tokio-io" 1695 | version = "0.1.13" 1696 | source = "registry+https://github.com/rust-lang/crates.io-index" 1697 | dependencies = [ 1698 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1699 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1700 | "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1701 | ] 1702 | 1703 | [[package]] 1704 | name = "tokio-reactor" 1705 | version = "0.1.12" 1706 | source = "registry+https://github.com/rust-lang/crates.io-index" 1707 | dependencies = [ 1708 | "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1709 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1710 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1711 | "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1712 | "mio 0.6.22 (registry+https://github.com/rust-lang/crates.io-index)", 1713 | "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", 1714 | "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 1715 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1716 | "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1717 | "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 1718 | "tokio-sync 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1719 | ] 1720 | 1721 | [[package]] 1722 | name = "tokio-signal" 1723 | version = "0.2.9" 1724 | source = "registry+https://github.com/rust-lang/crates.io-index" 1725 | dependencies = [ 1726 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1727 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 1728 | "mio 0.6.22 (registry+https://github.com/rust-lang/crates.io-index)", 1729 | "mio-uds 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", 1730 | "signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1731 | "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1732 | "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 1733 | "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1734 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 1735 | ] 1736 | 1737 | [[package]] 1738 | name = "tokio-sync" 1739 | version = "0.1.8" 1740 | source = "registry+https://github.com/rust-lang/crates.io-index" 1741 | dependencies = [ 1742 | "fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 1743 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1744 | ] 1745 | 1746 | [[package]] 1747 | name = "tokio-tcp" 1748 | version = "0.1.4" 1749 | source = "registry+https://github.com/rust-lang/crates.io-index" 1750 | dependencies = [ 1751 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1752 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1753 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1754 | "mio 0.6.22 (registry+https://github.com/rust-lang/crates.io-index)", 1755 | "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 1756 | "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1757 | ] 1758 | 1759 | [[package]] 1760 | name = "tokio-threadpool" 1761 | version = "0.1.18" 1762 | source = "registry+https://github.com/rust-lang/crates.io-index" 1763 | dependencies = [ 1764 | "crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", 1765 | "crossbeam-queue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1766 | "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1767 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1768 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1769 | "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1770 | "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", 1771 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1772 | "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1773 | ] 1774 | 1775 | [[package]] 1776 | name = "tokio-timer" 1777 | version = "0.2.13" 1778 | source = "registry+https://github.com/rust-lang/crates.io-index" 1779 | dependencies = [ 1780 | "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1781 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1782 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1783 | "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1784 | ] 1785 | 1786 | [[package]] 1787 | name = "tokio-udp" 1788 | version = "0.1.6" 1789 | source = "registry+https://github.com/rust-lang/crates.io-index" 1790 | dependencies = [ 1791 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1792 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1793 | "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1794 | "mio 0.6.22 (registry+https://github.com/rust-lang/crates.io-index)", 1795 | "tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1796 | "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 1797 | "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1798 | ] 1799 | 1800 | [[package]] 1801 | name = "tokio-uds" 1802 | version = "0.2.7" 1803 | source = "registry+https://github.com/rust-lang/crates.io-index" 1804 | dependencies = [ 1805 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1806 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1807 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1808 | "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", 1809 | "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1810 | "mio 0.6.22 (registry+https://github.com/rust-lang/crates.io-index)", 1811 | "mio-uds 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", 1812 | "tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1813 | "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 1814 | "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1815 | ] 1816 | 1817 | [[package]] 1818 | name = "tower-service" 1819 | version = "0.1.0" 1820 | source = "registry+https://github.com/rust-lang/crates.io-index" 1821 | dependencies = [ 1822 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1823 | ] 1824 | 1825 | [[package]] 1826 | name = "trust-dns-proto" 1827 | version = "0.5.0" 1828 | source = "registry+https://github.com/rust-lang/crates.io-index" 1829 | dependencies = [ 1830 | "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 1831 | "failure 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1832 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1833 | "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1834 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1835 | "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1836 | "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", 1837 | "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 1838 | "socket2 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", 1839 | "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1840 | "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 1841 | "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1842 | "tokio-tcp 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1843 | "tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", 1844 | "tokio-udp 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1845 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1846 | ] 1847 | 1848 | [[package]] 1849 | name = "trust-dns-proto" 1850 | version = "0.6.3" 1851 | source = "registry+https://github.com/rust-lang/crates.io-index" 1852 | dependencies = [ 1853 | "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 1854 | "failure 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1855 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1856 | "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1857 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1858 | "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1859 | "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", 1860 | "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 1861 | "socket2 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", 1862 | "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1863 | "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 1864 | "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1865 | "tokio-tcp 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1866 | "tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", 1867 | "tokio-udp 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1868 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1869 | ] 1870 | 1871 | [[package]] 1872 | name = "trust-dns-resolver" 1873 | version = "0.10.3" 1874 | source = "registry+https://github.com/rust-lang/crates.io-index" 1875 | dependencies = [ 1876 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1877 | "failure 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1878 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1879 | "ipconfig 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 1880 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1881 | "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1882 | "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1883 | "resolv-conf 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", 1884 | "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 1885 | "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", 1886 | "trust-dns-proto 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", 1887 | ] 1888 | 1889 | [[package]] 1890 | name = "typenum" 1891 | version = "1.12.0" 1892 | source = "registry+https://github.com/rust-lang/crates.io-index" 1893 | 1894 | [[package]] 1895 | name = "unicase" 1896 | version = "2.6.0" 1897 | source = "registry+https://github.com/rust-lang/crates.io-index" 1898 | dependencies = [ 1899 | "version_check 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", 1900 | ] 1901 | 1902 | [[package]] 1903 | name = "unicode-bidi" 1904 | version = "0.3.4" 1905 | source = "registry+https://github.com/rust-lang/crates.io-index" 1906 | dependencies = [ 1907 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1908 | ] 1909 | 1910 | [[package]] 1911 | name = "unicode-normalization" 1912 | version = "0.1.13" 1913 | source = "registry+https://github.com/rust-lang/crates.io-index" 1914 | dependencies = [ 1915 | "tinyvec 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 1916 | ] 1917 | 1918 | [[package]] 1919 | name = "unicode-width" 1920 | version = "0.1.8" 1921 | source = "registry+https://github.com/rust-lang/crates.io-index" 1922 | 1923 | [[package]] 1924 | name = "unicode-xid" 1925 | version = "0.1.0" 1926 | source = "registry+https://github.com/rust-lang/crates.io-index" 1927 | 1928 | [[package]] 1929 | name = "unicode-xid" 1930 | version = "0.2.1" 1931 | source = "registry+https://github.com/rust-lang/crates.io-index" 1932 | 1933 | [[package]] 1934 | name = "universal-hash" 1935 | version = "0.3.0" 1936 | source = "registry+https://github.com/rust-lang/crates.io-index" 1937 | dependencies = [ 1938 | "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 1939 | "subtle 2.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1940 | ] 1941 | 1942 | [[package]] 1943 | name = "url" 1944 | version = "1.7.2" 1945 | source = "registry+https://github.com/rust-lang/crates.io-index" 1946 | dependencies = [ 1947 | "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 1948 | "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1949 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1950 | "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 1951 | ] 1952 | 1953 | [[package]] 1954 | name = "uuid" 1955 | version = "0.7.4" 1956 | source = "registry+https://github.com/rust-lang/crates.io-index" 1957 | dependencies = [ 1958 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1959 | ] 1960 | 1961 | [[package]] 1962 | name = "v_escape" 1963 | version = "0.7.4" 1964 | source = "registry+https://github.com/rust-lang/crates.io-index" 1965 | dependencies = [ 1966 | "v_escape_derive 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", 1967 | ] 1968 | 1969 | [[package]] 1970 | name = "v_escape_derive" 1971 | version = "0.5.6" 1972 | source = "registry+https://github.com/rust-lang/crates.io-index" 1973 | dependencies = [ 1974 | "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1975 | "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", 1976 | "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 1977 | "syn 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)", 1978 | ] 1979 | 1980 | [[package]] 1981 | name = "v_htmlescape" 1982 | version = "0.4.5" 1983 | source = "registry+https://github.com/rust-lang/crates.io-index" 1984 | dependencies = [ 1985 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1986 | "v_escape 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", 1987 | ] 1988 | 1989 | [[package]] 1990 | name = "vec_map" 1991 | version = "0.8.2" 1992 | source = "registry+https://github.com/rust-lang/crates.io-index" 1993 | 1994 | [[package]] 1995 | name = "version_check" 1996 | version = "0.1.5" 1997 | source = "registry+https://github.com/rust-lang/crates.io-index" 1998 | 1999 | [[package]] 2000 | name = "version_check" 2001 | version = "0.9.2" 2002 | source = "registry+https://github.com/rust-lang/crates.io-index" 2003 | 2004 | [[package]] 2005 | name = "void" 2006 | version = "1.0.2" 2007 | source = "registry+https://github.com/rust-lang/crates.io-index" 2008 | 2009 | [[package]] 2010 | name = "wasi" 2011 | version = "0.9.0+wasi-snapshot-preview1" 2012 | source = "registry+https://github.com/rust-lang/crates.io-index" 2013 | 2014 | [[package]] 2015 | name = "widestring" 2016 | version = "0.2.2" 2017 | source = "registry+https://github.com/rust-lang/crates.io-index" 2018 | 2019 | [[package]] 2020 | name = "winapi" 2021 | version = "0.2.8" 2022 | source = "registry+https://github.com/rust-lang/crates.io-index" 2023 | 2024 | [[package]] 2025 | name = "winapi" 2026 | version = "0.3.9" 2027 | source = "registry+https://github.com/rust-lang/crates.io-index" 2028 | dependencies = [ 2029 | "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 2030 | "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 2031 | ] 2032 | 2033 | [[package]] 2034 | name = "winapi-build" 2035 | version = "0.1.1" 2036 | source = "registry+https://github.com/rust-lang/crates.io-index" 2037 | 2038 | [[package]] 2039 | name = "winapi-i686-pc-windows-gnu" 2040 | version = "0.4.0" 2041 | source = "registry+https://github.com/rust-lang/crates.io-index" 2042 | 2043 | [[package]] 2044 | name = "winapi-util" 2045 | version = "0.1.5" 2046 | source = "registry+https://github.com/rust-lang/crates.io-index" 2047 | dependencies = [ 2048 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 2049 | ] 2050 | 2051 | [[package]] 2052 | name = "winapi-x86_64-pc-windows-gnu" 2053 | version = "0.4.0" 2054 | source = "registry+https://github.com/rust-lang/crates.io-index" 2055 | 2056 | [[package]] 2057 | name = "winreg" 2058 | version = "0.5.1" 2059 | source = "registry+https://github.com/rust-lang/crates.io-index" 2060 | dependencies = [ 2061 | "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 2062 | ] 2063 | 2064 | [[package]] 2065 | name = "ws2_32-sys" 2066 | version = "0.2.1" 2067 | source = "registry+https://github.com/rust-lang/crates.io-index" 2068 | dependencies = [ 2069 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 2070 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 2071 | ] 2072 | 2073 | [[package]] 2074 | name = "zeroize" 2075 | version = "1.1.0" 2076 | source = "registry+https://github.com/rust-lang/crates.io-index" 2077 | 2078 | [metadata] 2079 | "checksum actix 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6c616db5fa4b0c40702fb75201c2af7f8aa8f3a2e2c1dda3b0655772aa949666" 2080 | "checksum actix-net 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8bebfbe6629e0131730746718c9e032b58f02c6ce06ed7c982b9fef6c8545acd" 2081 | "checksum actix-web 0.7.19 (registry+https://github.com/rust-lang/crates.io-index)" = "b0ac60f86c65a50b140139f499f4f7c6e49e4b5d88fbfba08e4e3975991f7bf4" 2082 | "checksum actix_derive 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4300e9431455322ae393d43a2ba1ef96b8080573c0fc23b196219efedfb6ba69" 2083 | "checksum addr2line 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b6a2d3371669ab3ca9797670853d61402b03d0b4b9ebf33d677dfa720203072" 2084 | "checksum adler 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" 2085 | "checksum aead 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4cf01b9b56e767bb57b94ebf91a58b338002963785cdd7013e21c0d4679471e4" 2086 | "checksum aes 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "54eb1d8fe354e5fc611daf4f2ea97dd45a765f4f1e4512306ec183ae2e8f20c9" 2087 | "checksum aes-gcm 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "834a6bda386024dbb7c8fc51322856c10ffe69559f972261c868485f5759c638" 2088 | "checksum aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" 2089 | "checksum aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f70a6b5f971e473091ab7cfb5ffac6cde81666c4556751d8d5620ead8abf100" 2090 | "checksum aho-corasick 0.7.13 (registry+https://github.com/rust-lang/crates.io-index)" = "043164d8ba5c4c3035fec9bbee8647c0261d788f3474306f93bb65901cae0e86" 2091 | "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" 2092 | "checksum arc-swap 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "4d25d88fd6b8041580a654f9d0c581a047baee2b3efee13275f2fc392fc75034" 2093 | "checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 2094 | "checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" 2095 | "checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" 2096 | "checksum backtrace 0.3.50 (registry+https://github.com/rust-lang/crates.io-index)" = "46254cf2fdcdf1badb5934448c1bcbe046a56537b3987d96c51a7afc5d03f293" 2097 | "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" 2098 | "checksum base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" 2099 | "checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" 2100 | "checksum bitops 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f41a723cb1fba322fe1bc95dd28dc7e7aadd8d3f81db31511df86c64c2d4a57e" 2101 | "checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" 2102 | "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" 2103 | "checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" 2104 | "checksum brotli-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4445dea95f4c2b41cde57cc9fee236ae4dbae88d8fcbdb4750fc1bb5d86aaecd" 2105 | "checksum brotli2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0cb036c3eade309815c15ddbacec5b22c4d1f3983a774ab2eac2e3e9ea85568e" 2106 | "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" 2107 | "checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" 2108 | "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" 2109 | "checksum cc 1.0.58 (registry+https://github.com/rust-lang/crates.io-index)" = "f9a06fb2e53271d7c279ec1efea6ab691c35a2ae67ec0d91d7acec0caf13b518" 2110 | "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 2111 | "checksum clap 2.33.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129" 2112 | "checksum clicolors-control 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90082ee5dcdd64dc4e9e0d37fbf3ee325419e39c0092191e0393df65518f741e" 2113 | "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" 2114 | "checksum console 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "45e0f3986890b3acbc782009e2629dfe2baa430ac091519ce3be26164a2ae6c0" 2115 | "checksum cookie 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5795cda0897252e34380a27baf884c53aa7ad9990329cdad96d4c5d027015d44" 2116 | "checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" 2117 | "checksum crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa" 2118 | "checksum crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cced8691919c02aac3cb0a1bc2e9b73d89e832bf9a06fc579d4e71b68a2da061" 2119 | "checksum crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" 2120 | "checksum crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" 2121 | "checksum crossbeam-queue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" 2122 | "checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" 2123 | "checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" 2124 | "checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" 2125 | "checksum ctrlc 3.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "54dedab740bc412d514cfbc4a1d9d5d16fed02c4b14a7be129003c07fdc33b9b" 2126 | "checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" 2127 | "checksum dtoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "134951f4028bdadb9b84baf4232681efbf277da25144b9b0ad65df75946c422b" 2128 | "checksum encode_unicode 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" 2129 | "checksum encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" 2130 | "checksum encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" 2131 | "checksum encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" 2132 | "checksum encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" 2133 | "checksum encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" 2134 | "checksum encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" 2135 | "checksum encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" 2136 | "checksum env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" 2137 | "checksum error-chain 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d371106cc88ffdfb1eabd7111e432da544f16f3e2d7bf1dfe8bf575f1df045cd" 2138 | "checksum error-chain 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6930e04918388a9a2e41d518c25cf679ccafe26733fb4127dbf21993f2575d46" 2139 | "checksum failure 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" 2140 | "checksum failure_derive 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" 2141 | "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" 2142 | "checksum flate2 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)" = "68c90b0fc46cf89d227cc78b40e494ff81287a92dd07631e5af0d06fe3cf885e" 2143 | "checksum fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 2144 | "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" 2145 | "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" 2146 | "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" 2147 | "checksum futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" 2148 | "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" 2149 | "checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" 2150 | "checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" 2151 | "checksum ghash 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9f0930ed19a7184089ea46d2fedead2f6dc2b674c5db4276b7da336c7cd83252" 2152 | "checksum gimli 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" 2153 | "checksum h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" 2154 | "checksum hashbrown 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34f595585f103464d8d2f6e9864682d74c1601fed5e07d62b1c9058dba8246fb" 2155 | "checksum hermit-abi 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "3deed196b6e7f9e44a2ae8d94225d80302d81208b1bb673fd21fe634645c85a9" 2156 | "checksum hkdf 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3fa08a006102488bd9cd5b8013aabe84955cf5ae22e304c2caf655b633aefae3" 2157 | "checksum hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695" 2158 | "checksum hostname 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" 2159 | "checksum http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" 2160 | "checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" 2161 | "checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" 2162 | "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" 2163 | "checksum indexmap 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b88cd59ee5f71fea89a62248fc8f387d44400cefe05ef548466d61ced9029a7" 2164 | "checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" 2165 | "checksum ipconfig 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "08f7eadeaf4b52700de180d147c4805f199854600b36faa963d91114827b2ffc" 2166 | "checksum itoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" 2167 | "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 2168 | "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" 2169 | "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 2170 | "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" 2171 | "checksum libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)" = "a9f8082297d534141b30c8d39e9b1773713ab50fdbe4ff30f750d063b3bfd701" 2172 | "checksum linked-hash-map 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd5a6d5999d9907cda8ed67bbd137d3af8085216c2ac62de5be860bd41f304a" 2173 | "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" 2174 | "checksum lock_api 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" 2175 | "checksum log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" 2176 | "checksum lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" 2177 | "checksum match_cfg 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" 2178 | "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" 2179 | "checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" 2180 | "checksum memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" 2181 | "checksum memoffset 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c198b026e1bbf08a937e94c6c60f9ec4a2267f5b0d2eec9c1b21b061ce2be55f" 2182 | "checksum mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 2183 | "checksum mime_guess 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" 2184 | "checksum miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" 2185 | "checksum miniz_oxide 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "be0f75932c1f6cfae3c04000e40114adf955636e19040f9c0a2c380702aa1c7f" 2186 | "checksum mio 0.6.22 (registry+https://github.com/rust-lang/crates.io-index)" = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430" 2187 | "checksum mio-uds 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" 2188 | "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" 2189 | "checksum net2 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)" = "2ba7c918ac76704fb42afcbbb43891e72731f3dcca3bef2a19786297baf14af7" 2190 | "checksum nix 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" 2191 | "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" 2192 | "checksum num-integer 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "8d59457e662d541ba17869cf51cf177c0b5f0cbf476c66bdc90bf1edac4f875b" 2193 | "checksum num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "ac267bcc07f48ee5f8935ab0d24f316fb722d7a1292e2913f0cc196b29ffd611" 2194 | "checksum num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" 2195 | "checksum object 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ab52be62400ca80aa00285d25253d7f7c437b7375c4de678f5405d3afe82ca5" 2196 | "checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" 2197 | "checksum owning_ref 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6ff55baddef9e4ad00f88b6c743a2a8062d4c6ade126c2a528644b8e444d52ce" 2198 | "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" 2199 | "checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" 2200 | "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" 2201 | "checksum parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" 2202 | "checksum pcap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f912b9e56d1d4851a5175c118fc6503c9f69a8fe1a0649a51aff20b92c757491" 2203 | "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" 2204 | "checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 2205 | "checksum polyval 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7ec3341498978de3bfd12d1b22f1af1de22818f5473a11e8a6ef997989e3a212" 2206 | "checksum ppv-lite86 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea" 2207 | "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" 2208 | "checksum proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa" 2209 | "checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" 2210 | "checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" 2211 | "checksum quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" 2212 | "checksum radiotap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e50757032799a2a41ed705169a87efea63fb0babfe69f418b3f5630df4c8394a" 2213 | "checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" 2214 | "checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" 2215 | "checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 2216 | "checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" 2217 | "checksum rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 2218 | "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" 2219 | "checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" 2220 | "checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 2221 | "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" 2222 | "checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 2223 | "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" 2224 | "checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" 2225 | "checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" 2226 | "checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" 2227 | "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" 2228 | "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" 2229 | "checksum redox_syscall 0.1.57 (registry+https://github.com/rust-lang/crates.io-index)" = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" 2230 | "checksum regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6" 2231 | "checksum regex-syntax 0.6.18 (registry+https://github.com/rust-lang/crates.io-index)" = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" 2232 | "checksum resolv-conf 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "11834e137f3b14e309437a8276714eed3a80d1ef894869e510f2c0c0b98b9f4a" 2233 | "checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" 2234 | "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 2235 | "checksum ryu 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" 2236 | "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" 2237 | "checksum scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 2238 | "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 2239 | "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 2240 | "checksum serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)" = "5317f7588f0a5078ee60ef675ef96735a1442132dc645eb1d12c018620ed8cd3" 2241 | "checksum serde_derive 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)" = "2a0be94b04690fbaed37cddffc5c134bf537c8e3329d53e982fe04c374978f8e" 2242 | "checksum serde_json 1.0.56 (registry+https://github.com/rust-lang/crates.io-index)" = "3433e879a558dde8b5e8feb2a04899cf34fdde1fafb894687e52105fc1162ac3" 2243 | "checksum serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a" 2244 | "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" 2245 | "checksum sha2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" 2246 | "checksum signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41" 2247 | "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" 2248 | "checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" 2249 | "checksum socket2 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)" = "03088793f677dce356f3ccc2edb1b314ad191ab702a5de3faf49304f7e104918" 2250 | "checksum stable_deref_trait 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2251 | "checksum string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" 2252 | "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" 2253 | "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" 2254 | "checksum subtle 2.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "502d53007c02d7605a05df1c1a73ee436952781653da5d0bf57ad608f66932c1" 2255 | "checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" 2256 | "checksum syn 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)" = "936cae2873c940d92e697597c5eee105fb570cd5689c695806f672883653349b" 2257 | "checksum synstructure 0.12.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" 2258 | "checksum termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" 2259 | "checksum termios 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6f0fcee7b24a25675de40d5bb4de6e41b0df07bc9856295e7e2b3a3600c400c2" 2260 | "checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" 2261 | "checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" 2262 | "checksum time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" 2263 | "checksum tinyvec 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "53953d2d3a5ad81d9f844a32f14ebb121f50b650cd59d0ee2a07cf13c617efed" 2264 | "checksum tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)" = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" 2265 | "checksum tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "25b2998660ba0e70d18684de5d06b70b70a3a747469af9dea7618cc59e75976b" 2266 | "checksum tokio-current-thread 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e" 2267 | "checksum tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" 2268 | "checksum tokio-fs 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "297a1206e0ca6302a0eed35b700d292b275256f596e2f3fea7729d5e629b6ff4" 2269 | "checksum tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" 2270 | "checksum tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351" 2271 | "checksum tokio-signal 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c34c6e548f101053321cba3da7cbb87a610b85555884c41b07da2eb91aff12" 2272 | "checksum tokio-sync 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee" 2273 | "checksum tokio-tcp 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72" 2274 | "checksum tokio-threadpool 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89" 2275 | "checksum tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" 2276 | "checksum tokio-udp 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e2a0b10e610b39c38b031a2fcab08e4b82f16ece36504988dcbd81dbba650d82" 2277 | "checksum tokio-uds 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "ab57a4ac4111c8c9dbcf70779f6fc8bc35ae4b2454809febac840ad19bd7e4e0" 2278 | "checksum tower-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b32f72af77f1bfe3d3d4da8516a238ebe7039b51dd8637a09841ac7f16d2c987" 2279 | "checksum trust-dns-proto 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0838272e89f1c693b4df38dc353412e389cf548ceed6f9fd1af5a8d6e0e7cf74" 2280 | "checksum trust-dns-proto 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "09144f0992b0870fa8d2972cc069cbf1e3c0fda64d1f3d45c4d68d0e0b52ad4e" 2281 | "checksum trust-dns-resolver 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8a9f877f7a1ad821ab350505e1f1b146a4960402991787191d6d8cab2ce2de2c" 2282 | "checksum typenum 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" 2283 | "checksum unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" 2284 | "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" 2285 | "checksum unicode-normalization 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6fb19cf769fa8c6a80a162df694621ebeb4dafb606470b2b2fce0be40a98a977" 2286 | "checksum unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" 2287 | "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" 2288 | "checksum unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" 2289 | "checksum universal-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df0c900f2f9b4116803415878ff48b63da9edb268668e08cf9292d7503114a01" 2290 | "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" 2291 | "checksum uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a" 2292 | "checksum v_escape 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "660b101c07b5d0863deb9e7fb3138777e858d6d2a79f9e6049a27d1cc77c6da6" 2293 | "checksum v_escape_derive 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c2ca2a14bc3fc5b64d188b087a7d3a927df87b152e941ccfbc66672e20c467ae" 2294 | "checksum v_htmlescape 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e33e939c0d8cf047514fb6ba7d5aac78bc56677a6938b2ee67000b91f2e97e41" 2295 | "checksum vec_map 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" 2296 | "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" 2297 | "checksum version_check 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" 2298 | "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" 2299 | "checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 2300 | "checksum widestring 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7157704c2e12e3d2189c507b7482c52820a16dfa4465ba91add92f266667cadb" 2301 | "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 2302 | "checksum winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2303 | "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 2304 | "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2305 | "checksum winapi-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 2306 | "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2307 | "checksum winreg 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a27a759395c1195c4cc5cda607ef6f8f6498f64e78f7900f5de0a127a424704a" 2308 | "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" 2309 | "checksum zeroize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3cbac2ed2ba24cc90f5e06485ac8c7c1e5449fe8911aef4d8877218af021a5b8" 2310 | --------------------------------------------------------------------------------