mirror of
				https://github.com/alacritty/alacritty.git
				synced 2025-10-30 23:36:53 -04:00 
			
		
		
		
	Add option to open URLs on click
This adds the option to automatically launch URLs with a specified program when clicking on them. The config option `mouse.url_launcher` has been added to specify which program should be used to open the URL. The URL is always passed as the last parameter to the specified command. It is not always desired for URLs to open automatically when clicking on them. To resolve this a new `modifiers` field has been introduced to the config, which allows specifying which keyboard modifiers need to be held down to launch URLs in the specified launcher. Some tests have been added to make sure that the edge-cases of the URL parsing are protected against future regressions. To make testing easier the parsing method has been moved into the `SemanticSearch` trait. The name of the trait has also been changed to just `Search` and it has been moved to `src/term/mod.rs` to fit the additional functionality. This fixes #113.
This commit is contained in:
		
							parent
							
								
									4380d0864b
								
							
						
					
					
						commit
						8ee0d2b5b2
					
				
					 13 changed files with 483 additions and 178 deletions
				
			
		| 
						 | 
				
			
			@ -33,6 +33,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 | 
			
		|||
- Add `save_to_clipboard` configuration option for copying selected text to the system clipboard
 | 
			
		||||
- New terminfo entry, `alacritty-direct`, that advertises 24-bit color support
 | 
			
		||||
- Add support for CSI sequences Cursor Next Line (`\e[nE`) and Cursor Previous Line (`\e[nF`)
 | 
			
		||||
- When `mouse.url.launcher` is set, clicking on URLs will now open them with the specified program
 | 
			
		||||
- New `mouse.url.modifiers` option to specify keyboard modifiers for opening URLs on click
 | 
			
		||||
 | 
			
		||||
### Changed
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										270
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										270
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
								
							| 
						 | 
				
			
			@ -49,14 +49,15 @@ dependencies = [
 | 
			
		|||
 "objc 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "reqwest 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde_json 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde_yaml 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "terminfo 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "vte 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "winit 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -122,7 +123,7 @@ version = "0.3.9"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -152,7 +153,7 @@ version = "0.33.2"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cexpr 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "clang-sys 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -248,7 +249,7 @@ dependencies = [
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "cfg-if"
 | 
			
		||||
version = "0.1.5"
 | 
			
		||||
version = "0.1.6"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -256,7 +257,7 @@ name = "cgl"
 | 
			
		|||
version = "0.2.3"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "gleam 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "gleam 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -456,7 +457,7 @@ dependencies = [
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "core-text"
 | 
			
		||||
version = "13.1.0"
 | 
			
		||||
version = "13.1.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "core-foundation 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -497,7 +498,7 @@ version = "0.3.1"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -511,7 +512,7 @@ version = "0.5.2"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -523,7 +524,7 @@ name = "crossbeam-utils"
 | 
			
		|||
version = "0.2.2"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -588,10 +589,10 @@ dependencies = [
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "encoding_rs"
 | 
			
		||||
version = "0.8.7"
 | 
			
		||||
version = "0.8.10"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -621,7 +622,7 @@ name = "errno-dragonfly"
 | 
			
		|||
version = "0.1.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -652,22 +653,22 @@ dependencies = [
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "failure"
 | 
			
		||||
version = "0.1.2"
 | 
			
		||||
version = "0.1.3"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "failure_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "failure_derive"
 | 
			
		||||
version = "0.1.2"
 | 
			
		||||
version = "0.1.3"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "synstructure 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "syn 0.15.13 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "synstructure 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -675,18 +676,18 @@ name = "filetime"
 | 
			
		|||
version = "0.2.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "flate2"
 | 
			
		||||
version = "1.0.2"
 | 
			
		||||
version = "1.0.4"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "miniz_oxide_c_api 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "miniz_oxide_c_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -701,7 +702,7 @@ dependencies = [
 | 
			
		|||
 "core-foundation 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "core-graphics 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "core-text 13.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "core-text 13.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "euclid 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "font-loader 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -755,7 +756,7 @@ version = "0.7.0"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libz-sys 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libz-sys 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -793,7 +794,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "futures"
 | 
			
		||||
version = "0.1.24"
 | 
			
		||||
version = "0.1.25"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -801,13 +802,13 @@ name = "futures-cpupool"
 | 
			
		|||
version = "0.1.8"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "gcc"
 | 
			
		||||
version = "0.3.54"
 | 
			
		||||
version = "0.3.55"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -821,7 +822,7 @@ dependencies = [
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "gif"
 | 
			
		||||
version = "0.10.0"
 | 
			
		||||
version = "0.10.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -840,7 +841,7 @@ dependencies = [
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "gleam"
 | 
			
		||||
version = "0.6.2"
 | 
			
		||||
version = "0.6.4"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "gl_generator 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -893,13 +894,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		|||
dependencies = [
 | 
			
		||||
 "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "mime 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "mime 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "relay 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -907,7 +908,7 @@ dependencies = [
 | 
			
		|||
 "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "want 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -916,7 +917,7 @@ name = "hyper-tls"
 | 
			
		|||
version = "0.1.4"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -941,10 +942,10 @@ version = "0.19.0"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "gif 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "gif 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "jpeg-decoder 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "num-derive 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "num-derive 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "num-rational 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -966,7 +967,7 @@ version = "0.6.1"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "inotify-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -1073,7 +1074,7 @@ dependencies = [
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "libz-sys"
 | 
			
		||||
version = "1.0.23"
 | 
			
		||||
version = "1.0.24"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -1109,7 +1110,7 @@ name = "log"
 | 
			
		|||
version = "0.4.5"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -1143,7 +1144,7 @@ name = "memchr"
 | 
			
		|||
version = "2.1.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			@ -1164,10 +1165,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "mime"
 | 
			
		||||
version = "0.3.9"
 | 
			
		||||
version = "0.3.12"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -1175,7 +1176,7 @@ name = "mime_guess"
 | 
			
		|||
version = "2.0.0-alpha.6"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "mime 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "mime 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "phf 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "phf_codegen 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -1183,22 +1184,21 @@ dependencies = [
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "miniz_oxide"
 | 
			
		||||
version = "0.1.3"
 | 
			
		||||
version = "0.2.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "miniz_oxide_c_api"
 | 
			
		||||
version = "0.1.3"
 | 
			
		||||
version = "0.2.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "miniz_oxide 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "miniz_oxide 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -1310,7 +1310,7 @@ name = "net2"
 | 
			
		|||
version = "0.2.33"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			@ -1322,7 +1322,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		|||
dependencies = [
 | 
			
		||||
 "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			@ -1342,7 +1342,7 @@ dependencies = [
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "nom"
 | 
			
		||||
version = "4.0.0"
 | 
			
		||||
version = "4.1.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "memchr 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -1368,13 +1368,13 @@ dependencies = [
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "num-derive"
 | 
			
		||||
version = "0.2.2"
 | 
			
		||||
version = "0.2.3"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "syn 0.15.13 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -1459,12 +1459,12 @@ dependencies = [
 | 
			
		|||
 "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "openssl-sys 0.9.36 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "openssl-sys"
 | 
			
		||||
version = "0.9.36"
 | 
			
		||||
version = "0.9.39"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -1607,7 +1607,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "proc-macro2"
 | 
			
		||||
version = "0.4.19"
 | 
			
		||||
version = "0.4.20"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -1628,7 +1628,7 @@ name = "quote"
 | 
			
		|||
version = "0.6.8"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -1649,13 +1649,21 @@ dependencies = [
 | 
			
		|||
 "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "rand_core 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "rand_core"
 | 
			
		||||
version = "0.2.1"
 | 
			
		||||
version = "0.2.2"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "rand_core"
 | 
			
		||||
version = "0.3.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -1698,7 +1706,7 @@ version = "0.2.0"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "failure 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			@ -1748,7 +1756,7 @@ name = "relay"
 | 
			
		|||
version = "0.1.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -1765,16 +1773,16 @@ version = "0.8.8"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "encoding_rs 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "encoding_rs 0.8.10 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "hyper-tls 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libflate 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde_json 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde_urlencoded 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -1883,27 +1891,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "serde"
 | 
			
		||||
version = "1.0.79"
 | 
			
		||||
version = "1.0.80"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "serde_derive"
 | 
			
		||||
version = "1.0.79"
 | 
			
		||||
version = "1.0.80"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "syn 0.15.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "syn 0.15.13 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "serde_json"
 | 
			
		||||
version = "1.0.31"
 | 
			
		||||
version = "1.0.32"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -1913,7 +1921,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		|||
dependencies = [
 | 
			
		||||
 "dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1924,7 +1932,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		|||
dependencies = [
 | 
			
		||||
 "dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "yaml-rust 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2008,7 +2016,7 @@ name = "socket2"
 | 
			
		|||
version = "0.3.8"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -2039,32 +2047,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "syn"
 | 
			
		||||
version = "0.14.9"
 | 
			
		||||
version = "0.15.13"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "syn"
 | 
			
		||||
version = "0.15.6"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "synstructure"
 | 
			
		||||
version = "0.9.0"
 | 
			
		||||
version = "0.10.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "syn 0.15.13 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2082,7 +2080,7 @@ name = "tempfile"
 | 
			
		|||
version = "3.0.4"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -2104,7 +2102,7 @@ version = "0.6.1"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "nom 4.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "nom 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "phf 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "phf_codegen 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			@ -2151,7 +2149,7 @@ version = "0.1.11"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "tokio-current-thread 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -2172,7 +2170,7 @@ version = "0.1.1"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2182,7 +2180,7 @@ version = "0.1.17"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -2199,7 +2197,7 @@ name = "tokio-current-thread"
 | 
			
		|||
version = "0.1.3"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2208,7 +2206,7 @@ name = "tokio-executor"
 | 
			
		|||
version = "0.1.5"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -2216,7 +2214,7 @@ name = "tokio-fs"
 | 
			
		|||
version = "0.1.3"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "tokio-threadpool 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			@ -2227,7 +2225,7 @@ version = "0.1.9"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2237,7 +2235,7 @@ version = "0.1.6"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -2253,7 +2251,7 @@ name = "tokio-service"
 | 
			
		|||
version = "0.1.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -2262,7 +2260,7 @@ version = "0.1.2"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -2276,7 +2274,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		|||
dependencies = [
 | 
			
		||||
 "crossbeam-deque 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -2289,7 +2287,7 @@ version = "0.2.7"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			@ -2299,7 +2297,7 @@ name = "tokio-tls"
 | 
			
		|||
version = "0.1.4"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -2311,7 +2309,7 @@ version = "0.1.2"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -2325,7 +2323,7 @@ version = "0.2.2"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -2355,7 +2353,7 @@ dependencies = [
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "unicase"
 | 
			
		||||
version = "2.1.0"
 | 
			
		||||
version = "2.2.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -2426,7 +2424,7 @@ name = "uuid"
 | 
			
		|||
version = "0.6.5"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2473,7 +2471,7 @@ name = "want"
 | 
			
		|||
version = "0.0.4"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "try-lock 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			@ -2700,7 +2698,7 @@ version = "0.4.2"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "bzip2 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "flate2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "flate2 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "msdos_time 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
| 
						 | 
				
			
			@ -2733,7 +2731,7 @@ dependencies = [
 | 
			
		|||
"checksum bzip2-sys 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2c5162604199bbb17690ede847eaa6120a3f33d5ab4dcc8e7c25b16d849ae79b"
 | 
			
		||||
"checksum cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "f159dfd43363c4d08055a07703eb7a3406b0dac4d0584d96965a3262db3c9d16"
 | 
			
		||||
"checksum cexpr 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "42aac45e9567d97474a834efdee3081b3c942b2205be932092f53354ce503d6c"
 | 
			
		||||
"checksum cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0c4e7bb64a8ebb0d856483e1e682ea3422f883c5f5615a90d51a2c82fe87fdd3"
 | 
			
		||||
"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4"
 | 
			
		||||
"checksum cgl 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "55e7ec0b74fe5897894cbc207092c577e87c52f8a59e8ca8d97ef37551f60a49"
 | 
			
		||||
"checksum cgmath 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)" = "64a4b57c8f4e3a2e9ac07e0f6abc9c24b6fc9e1b54c3478cfb598f3d0023e51c"
 | 
			
		||||
"checksum clang-sys 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)" = "939a1a34310b120d26eba35c29475933128b0ec58e24b43327f8dbe6036fc538"
 | 
			
		||||
| 
						 | 
				
			
			@ -2754,7 +2752,7 @@ dependencies = [
 | 
			
		|||
"checksum core-graphics 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb0ed45fdc32f9ab426238fba9407dfead7bacd7900c9b4dd3f396f46eafdae3"
 | 
			
		||||
"checksum core-graphics 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e54c4ab33705fa1fc8af375bb7929d68e1c1546c1ecef408966d8c3e49a1d84a"
 | 
			
		||||
"checksum core-graphics 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)" = "46a1b26242df9c08350ffede6684753773eab42289745f618fc42c2f41486ffa"
 | 
			
		||||
"checksum core-text 13.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a6705907bc253cee90b8551017836ce50904be305c99fec5ea74a8d72d799e58"
 | 
			
		||||
"checksum core-text 13.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7210eea4baa4b51d7319d90e4787d8a2b472c8d5d9926dc39be85fecac0e6df7"
 | 
			
		||||
"checksum core-text 9.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2bd581c37283d0c23311d179aefbb891f2324ee0405da58a26e8594ab76e5748"
 | 
			
		||||
"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb"
 | 
			
		||||
"checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3"
 | 
			
		||||
| 
						 | 
				
			
			@ -2771,17 +2769,17 @@ dependencies = [
 | 
			
		|||
"checksum dunce 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e86b07356baf1cc7058c95807ffba0bebe0c8cadd0df4c40b292c86194eabb37"
 | 
			
		||||
"checksum either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be565ca5c557d7f59e7cfcf1844f9e3033650c929c6566f511e8005f205c1d0"
 | 
			
		||||
"checksum embed-resource 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "59edbe56442f96505f79c9116006f2e26c7f5655cccdc2c1546b2528c63bd612"
 | 
			
		||||
"checksum encoding_rs 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)" = "21a550ec129ca2f8593227888625c7c5331c6ad878e2cee6b7ac25e1c7d05746"
 | 
			
		||||
"checksum encoding_rs 0.8.10 (registry+https://github.com/rust-lang/crates.io-index)" = "065f4d0c826fdaef059ac45487169d918558e3cf86c9d89f6e81cf52369126e5"
 | 
			
		||||
"checksum env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)" = "15b0a4d2e39f8420210be8b27eeda28029729e2fd4291019455016c348240c38"
 | 
			
		||||
"checksum errno 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c2a071601ed01b988f896ab14b95e67335d1eeb50190932a1320f7fe3cadc84e"
 | 
			
		||||
"checksum errno-dragonfly 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "14ca354e36190500e1e1fb267c647932382b54053c50b14970856c0b00a35067"
 | 
			
		||||
"checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3"
 | 
			
		||||
"checksum euclid 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c95fd0d455f114291a3109286bd387bd423770058474a2d3f38b712cd661df60"
 | 
			
		||||
"checksum expat-sys 2.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "658f19728920138342f68408b7cf7644d90d4784353d8ebc32e7e8663dbe45fa"
 | 
			
		||||
"checksum failure 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7efb22686e4a466b1ec1a15c2898f91fa9cb340452496dca654032de20ff95b9"
 | 
			
		||||
"checksum failure_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "946d0e98a50d9831f5d589038d2ca7f8f455b1c21028c0db0e84116a12696426"
 | 
			
		||||
"checksum failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6dd377bcc1b1b7ce911967e3ec24fa19c3224394ec05b54aa7b083d498341ac7"
 | 
			
		||||
"checksum failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "64c2d913fe8ed3b6c6518eedf4538255b989945c14c2a7d5cbff62a5e2120596"
 | 
			
		||||
"checksum filetime 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "da4b9849e77b13195302c174324b5ba73eec9b236b24c221a61000daefb95c5f"
 | 
			
		||||
"checksum flate2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "37847f133aae7acf82bb9577ccd8bda241df836787642654286e79679826a54b"
 | 
			
		||||
"checksum flate2 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3b0c7353385f92079524de3b7116cf99d73947c08a7472774e9b3b04bff3b901"
 | 
			
		||||
"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3"
 | 
			
		||||
"checksum font-loader 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2fbd86bafc9e14ab7076e084d31eed4633120f910d0c42a017e5382aac89937f"
 | 
			
		||||
"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
 | 
			
		||||
| 
						 | 
				
			
			@ -2792,13 +2790,13 @@ dependencies = [
 | 
			
		|||
"checksum fsevent-sys 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1a772d36c338d07a032d5375a36f15f9a7043bf0cb8ce7cee658e037c6032874"
 | 
			
		||||
"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
 | 
			
		||||
"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
 | 
			
		||||
"checksum futures 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "0c84b40c7e2de99ffd70602db314a7a8c26b2b3d830e6f7f7a142a8860ab3ca4"
 | 
			
		||||
"checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b"
 | 
			
		||||
"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4"
 | 
			
		||||
"checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb"
 | 
			
		||||
"checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2"
 | 
			
		||||
"checksum gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0912515a8ff24ba900422ecda800b52f4016a56251922d397c576bf92c690518"
 | 
			
		||||
"checksum gif 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff3414b424657317e708489d2857d9575f4403698428b040b609b9d1c1a84a2c"
 | 
			
		||||
"checksum gif 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4bca55ac1f213920ce3527ccd62386f1f15fa3f1714aeee1cf93f2c416903f"
 | 
			
		||||
"checksum gl_generator 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a795170cbd85b5a7baa58d6d7525cae6a03e486859860c220f7ebbbdd379d0a"
 | 
			
		||||
"checksum gleam 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "24ba6539d49223f6bca4f076d9490c001bdbfe07d59cb0ad4079033c75bdc92d"
 | 
			
		||||
"checksum gleam 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6a8901d6854a992b372214fd9cce664df1a29678e362b151de0d7a4efdcd47f"
 | 
			
		||||
"checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"
 | 
			
		||||
"checksum glutin 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "42fb2de780307bd2bedbe013bc585659a683e7c6307d0baa878aec3da9250fc1"
 | 
			
		||||
"checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83"
 | 
			
		||||
| 
						 | 
				
			
			@ -2823,7 +2821,7 @@ dependencies = [
 | 
			
		|||
"checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d"
 | 
			
		||||
"checksum libflate 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "21138fc6669f438ed7ae3559d5789a5f0ba32f28c1f0608d1e452b0bb06ee936"
 | 
			
		||||
"checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2"
 | 
			
		||||
"checksum libz-sys 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)" = "c7bdca442aa002a930e6eb2a71916cabe46d91ffec8df66db0abfb1bc83469ab"
 | 
			
		||||
"checksum libz-sys 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)" = "4401fe74560a0d46fce3464625ac8aa7a79d291dd28cee021d18852d5191c280"
 | 
			
		||||
"checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e"
 | 
			
		||||
"checksum lock_api 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775751a3e69bde4df9b38dd00a1b5d6ac13791e4223d4a0506577f0dd27cfb7a"
 | 
			
		||||
"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b"
 | 
			
		||||
| 
						 | 
				
			
			@ -2835,10 +2833,10 @@ dependencies = [
 | 
			
		|||
"checksum memchr 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b3629fe9fdbff6daa6c33b90f7c08355c1aca05a3d01fa8063b822fcf185f3b"
 | 
			
		||||
"checksum memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2ffa2c986de11a9df78620c01eeaaf27d94d3ff02bf81bfcca953102dd0c6ff"
 | 
			
		||||
"checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3"
 | 
			
		||||
"checksum mime 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "4b082692d3f6cf41b453af73839ce3dfc212c4411cbb2441dff80a716e38bd79"
 | 
			
		||||
"checksum mime 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)" = "0a907b83e7b9e987032439a387e187119cddafc92d5c2aaeb1d92580a793f630"
 | 
			
		||||
"checksum mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30de2e4613efcba1ec63d8133f344076952090c122992a903359be5a4f99c3ed"
 | 
			
		||||
"checksum miniz_oxide 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9ba430291c9d6cedae28bcd2d49d1c32fc57d60cd49086646c5dd5673a870eb5"
 | 
			
		||||
"checksum miniz_oxide_c_api 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5a5b8234d6103ebfba71e29786da4608540f862de5ce980a1c94f86a40ca0d51"
 | 
			
		||||
"checksum miniz_oxide 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5ad30a47319c16cde58d0314f5d98202a80c9083b5f61178457403dfb14e509c"
 | 
			
		||||
"checksum miniz_oxide_c_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "28edaef377517fd9fe3e085c37d892ce7acd1fbeab9239c5a36eec352d8a8b7e"
 | 
			
		||||
"checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432"
 | 
			
		||||
"checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40"
 | 
			
		||||
"checksum mio-more 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0063c5ac7d07a3f177ad237540ddf5d96b7c9a9882b337702c1994bfd844d3e0"
 | 
			
		||||
| 
						 | 
				
			
			@ -2852,9 +2850,9 @@ dependencies = [
 | 
			
		|||
"checksum nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d37e713a259ff641624b6cb20e3b12b2952313ba36b6823c0f16e6cfd9e5de17"
 | 
			
		||||
"checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2"
 | 
			
		||||
"checksum nom 3.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05aec50c70fd288702bcd93284a8444607f3292dbdf2a30de5ea5dcdbe72287b"
 | 
			
		||||
"checksum nom 4.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "898696750eb5c3ce5eb5afbfbe46e7f7c4e1936e19d3e97be4b7937da7b6d114"
 | 
			
		||||
"checksum nom 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9c349f68f25f596b9f44cf0e7c69752a5c633b0550c3ff849518bfba0233774a"
 | 
			
		||||
"checksum notify 4.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "873ecfd8c174964ae30f401329d140142312c8e5590719cf1199d5f1717d8078"
 | 
			
		||||
"checksum num-derive 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0d2c31b75c36a993d30c7a13d70513cb93f02acafdd5b7ba250f9b0e18615de7"
 | 
			
		||||
"checksum num-derive 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8af1847c907c2f04d7bfd572fb25bbb4385c637fe5be163cf2f8c5d778fe1e7d"
 | 
			
		||||
"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea"
 | 
			
		||||
"checksum num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "af3fdbbc3291a5464dc57b03860ec37ca6bf915ed6ee385e7c6c052c422b2124"
 | 
			
		||||
"checksum num-rational 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ee314c74bd753fc86b4780aa9475da469155f3848473a261d2d18e35245a784e"
 | 
			
		||||
| 
						 | 
				
			
			@ -2865,7 +2863,7 @@ dependencies = [
 | 
			
		|||
"checksum objc-foundation 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9"
 | 
			
		||||
"checksum objc_id 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b"
 | 
			
		||||
"checksum openssl 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)" = "a3605c298474a3aa69de92d21139fb5e2a81688d308262359d85cdd0d12a7985"
 | 
			
		||||
"checksum openssl-sys 0.9.36 (registry+https://github.com/rust-lang/crates.io-index)" = "409d77eeb492a1aebd6eb322b2ee72ff7c7496b4434d98b3bf8be038755de65e"
 | 
			
		||||
"checksum openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)" = "278c1ad40a89aa1e741a1eed089a2f60b18fab8089c3139b542140fc7d674106"
 | 
			
		||||
"checksum ordered-float 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7eb5259643245d3f292c7a146b2df53bba24d7eab159410e648eb73dc164669d"
 | 
			
		||||
"checksum osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b"
 | 
			
		||||
"checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37"
 | 
			
		||||
| 
						 | 
				
			
			@ -2882,13 +2880,14 @@ dependencies = [
 | 
			
		|||
"checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c"
 | 
			
		||||
"checksum png 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f54b9600d584d3b8a739e1662a595fab051329eff43f20e7d8cc22872962145b"
 | 
			
		||||
"checksum podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "780fb4b6698bbf9cf2444ea5d22411cef2953f0824b98f33cf454ec5615645bd"
 | 
			
		||||
"checksum proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)" = "ffe022fb8c8bd254524b0b3305906c1921fa37a84a644e29079a9e62200c3901"
 | 
			
		||||
"checksum proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)" = "3d7b7eaaa90b4a90a932a9ea6666c95a389e424eff347f0f793979289429feee"
 | 
			
		||||
"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0"
 | 
			
		||||
"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
 | 
			
		||||
"checksum quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dd636425967c33af890042c483632d33fa7a18f19ad1d7ea72e8998c6ef8dea5"
 | 
			
		||||
"checksum rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8356f47b32624fef5b3301c1be97e5944ecdd595409cc5da11d05f211db6cfbd"
 | 
			
		||||
"checksum rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e464cd887e869cddcae8792a4ee31d23c7edd516700695608f5b98c67ee0131c"
 | 
			
		||||
"checksum rand_core 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edecf0f94da5551fc9b492093e30b041a891657db7940ee221f9d2f66e82eef2"
 | 
			
		||||
"checksum rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1961a422c4d189dfb50ffa9320bf1f2a9bd54ecb92792fb9477f99a1045f3372"
 | 
			
		||||
"checksum rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0905b6b7079ec73b314d4c748701f6931eb79fd97c668caa3f1899b22b32c6db"
 | 
			
		||||
"checksum rayon 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "df7a791f788cb4c516f0e091301a29c2b71ef680db5e644a7d68835c8ae6dbfa"
 | 
			
		||||
"checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356"
 | 
			
		||||
"checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1"
 | 
			
		||||
| 
						 | 
				
			
			@ -2915,9 +2914,9 @@ dependencies = [
 | 
			
		|||
"checksum security-framework-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "5421621e836278a0b139268f36eee0dc7e389b784dc3f79d8f11aabadf41bead"
 | 
			
		||||
"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
 | 
			
		||||
"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
 | 
			
		||||
"checksum serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)" = "84257ccd054dc351472528c8587b4de2dbf0dc0fe2e634030c1a90bfdacebaa9"
 | 
			
		||||
"checksum serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)" = "31569d901045afbff7a9479f793177fe9259819aff10ab4f89ef69bbc5f567fe"
 | 
			
		||||
"checksum serde_json 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)" = "bb47a3d5c84320222f66d7db21157c4a7407755de41798f9b4c1c40593397b1a"
 | 
			
		||||
"checksum serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)" = "15c141fc7027dd265a47c090bf864cf62b42c4d228bbcf4e51a0c9e2b0d3f7ef"
 | 
			
		||||
"checksum serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)" = "225de307c6302bec3898c51ca302fc94a7a1697ef0845fcee6448f33c032249c"
 | 
			
		||||
"checksum serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)" = "43344e7ce05d0d8280c5940cabb4964bea626aa58b1ec0e8c73fa2a8512a38ce"
 | 
			
		||||
"checksum serde_urlencoded 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "aaed41d9fb1e2f587201b863356590c90c1157495d811430a0c0325fe8169650"
 | 
			
		||||
"checksum serde_yaml 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ef8099d3df28273c99a1728190c7a9f19d444c941044f64adf986bee7ec53051"
 | 
			
		||||
"checksum servo-fontconfig 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a088f8d775a5c5314aae09bd77340bc9c67d72b9a45258be34c83548b4814cd9"
 | 
			
		||||
| 
						 | 
				
			
			@ -2933,9 +2932,8 @@ dependencies = [
 | 
			
		|||
"checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5"
 | 
			
		||||
"checksum stb_truetype 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "48fa7d3136d8645909de1f7c7eb5416cc43057a75ace08fc39ae736bc9da8af1"
 | 
			
		||||
"checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550"
 | 
			
		||||
"checksum syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)" = "261ae9ecaa397c42b960649561949d69311f08eeaea86a65696e6e46517cf741"
 | 
			
		||||
"checksum syn 0.15.6 (registry+https://github.com/rust-lang/crates.io-index)" = "854b08a640fc8f54728fb95321e3ec485b365a97fe47609797c671addd1dde69"
 | 
			
		||||
"checksum synstructure 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "85bb9b7550d063ea184027c9b8c20ac167cd36d3e06b3a40bceb9d746dc1a7b7"
 | 
			
		||||
"checksum syn 0.15.13 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4439ee8325b4e4b57e59309c3724c9a4478eaeb4eb094b6f3fac180a3b2876"
 | 
			
		||||
"checksum synstructure 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ec37f4fab4bafaf6b5621c1d54e6aa5d4d059a8f84929e87abfdd7f9f04c6db2"
 | 
			
		||||
"checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
 | 
			
		||||
"checksum tempfile 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "55c1195ef8513f3273d55ff59fe5da6940287a0d7a98331254397f464833675b"
 | 
			
		||||
"checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f"
 | 
			
		||||
| 
						 | 
				
			
			@ -2962,7 +2960,7 @@ dependencies = [
 | 
			
		|||
"checksum try-lock 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee2aa4715743892880f70885373966c83d73ef1b0838a664ef0c76fffd35e7c2"
 | 
			
		||||
"checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d"
 | 
			
		||||
"checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33"
 | 
			
		||||
"checksum unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284b6d3db520d67fbe88fd778c21510d1b0ba4a551e5d0fbb023d33405f6de8a"
 | 
			
		||||
"checksum unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d3218ea14b4edcaccfa0df0a64a3792a2c32cc706f1b336e48867f9d3147f90"
 | 
			
		||||
"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
 | 
			
		||||
"checksum unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6a0180bc61fc5a987082bfa111f4cc95c4caff7f9799f3e46df09163a937aa25"
 | 
			
		||||
"checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,6 +42,7 @@ winit = { version = "0.15", features = ["icon_loading"] }
 | 
			
		|||
image = "0.19"
 | 
			
		||||
static_assertions = "0.2.5"
 | 
			
		||||
terminfo = "0.6.1"
 | 
			
		||||
url = "1.7.1"
 | 
			
		||||
 | 
			
		||||
[target.'cfg(any(target_os = "linux", target_os = "freebsd", target_os="dragonfly", target_os="openbsd"))'.dependencies]
 | 
			
		||||
x11-dl = "2"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -261,6 +261,19 @@ mouse:
 | 
			
		|||
  double_click: { threshold: 300 }
 | 
			
		||||
  triple_click: { threshold: 300 }
 | 
			
		||||
 | 
			
		||||
  url:
 | 
			
		||||
    # URL launcher
 | 
			
		||||
    #
 | 
			
		||||
    # This program is executed when clicking on a text which is recognized as a URL.
 | 
			
		||||
    # The URL is always added to the command as the last parameter.
 | 
			
		||||
    launcher: xdg-open
 | 
			
		||||
 | 
			
		||||
    # URL modifiers
 | 
			
		||||
    #
 | 
			
		||||
    # These are the modifiers that need to be held down for opening URLs when clicking
 | 
			
		||||
    # on them. The available modifiers are documented in the key binding section.
 | 
			
		||||
    #modifiers: Control|Shift
 | 
			
		||||
 | 
			
		||||
selection:
 | 
			
		||||
  semantic_escape_chars: ",│`|:\"' ()[]{}<>"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -260,6 +260,19 @@ mouse:
 | 
			
		|||
  double_click: { threshold: 300 }
 | 
			
		||||
  triple_click: { threshold: 300 }
 | 
			
		||||
 | 
			
		||||
  url:
 | 
			
		||||
    # URL launcher
 | 
			
		||||
    #
 | 
			
		||||
    # This program is executed when clicking on a text which is recognized as a URL.
 | 
			
		||||
    # The URL is always added to the command as the last parameter.
 | 
			
		||||
    launcher: open
 | 
			
		||||
 | 
			
		||||
    # URL modifiers
 | 
			
		||||
    #
 | 
			
		||||
    # These are the modifiers that need to be held down for opening URLs when clicking
 | 
			
		||||
    # on them. The available modifiers are documented in the key binding section.
 | 
			
		||||
    #modifiers: Control|Shift
 | 
			
		||||
 | 
			
		||||
selection:
 | 
			
		||||
  semantic_escape_chars: ",│`|:\"' ()[]{}<>"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -232,9 +232,27 @@ mouse_bindings:
 | 
			
		|||
  - { mouse: Middle, action: PasteSelection }
 | 
			
		||||
 | 
			
		||||
mouse:
 | 
			
		||||
  # Click settings
 | 
			
		||||
  #
 | 
			
		||||
  # The `double_click` and `triple_click` settings control the time
 | 
			
		||||
  # alacritty should wait for accepting multiple clicks as one double
 | 
			
		||||
  # or triple click.
 | 
			
		||||
  double_click: { threshold: 300 }
 | 
			
		||||
  triple_click: { threshold: 300 }
 | 
			
		||||
 | 
			
		||||
  url:
 | 
			
		||||
    # URL launcher
 | 
			
		||||
    #
 | 
			
		||||
    # This program is executed when clicking on a text which is recognized as a URL.
 | 
			
		||||
    # The URL is always added to the command as the last parameter.
 | 
			
		||||
    launcher: explorer
 | 
			
		||||
 | 
			
		||||
    # URL modifiers
 | 
			
		||||
    #
 | 
			
		||||
    # These are the modifiers that need to be held down for opening URLs when clicking
 | 
			
		||||
    # on them. The available modifiers are documented in the key binding section.
 | 
			
		||||
    #modifiers: Control|Shift
 | 
			
		||||
 | 
			
		||||
selection:
 | 
			
		||||
  semantic_escape_chars: ",│`|:\"' ()[]{}<>"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -87,12 +87,31 @@ pub struct Mouse {
 | 
			
		|||
    pub double_click: ClickHandler,
 | 
			
		||||
    #[serde(default, deserialize_with = "failure_default")]
 | 
			
		||||
    pub triple_click: ClickHandler,
 | 
			
		||||
    #[serde(default, deserialize_with = "failure_default")]
 | 
			
		||||
    pub url: Url,
 | 
			
		||||
 | 
			
		||||
    // TODO: DEPRECATED
 | 
			
		||||
    #[serde(default)]
 | 
			
		||||
    pub faux_scrollback_lines: Option<usize>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Default, Clone, Debug, Deserialize)]
 | 
			
		||||
pub struct Url {
 | 
			
		||||
    // Program for opening links
 | 
			
		||||
    #[serde(default, deserialize_with = "failure_default")]
 | 
			
		||||
    pub launcher: Option<CommandWrapper>,
 | 
			
		||||
 | 
			
		||||
    // Modifier used to open links
 | 
			
		||||
    #[serde(default, deserialize_with = "deserialize_modifiers")]
 | 
			
		||||
    pub modifiers: ModifiersState,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn deserialize_modifiers<'a, D>(deserializer: D) -> ::std::result::Result<ModifiersState, D::Error>
 | 
			
		||||
    where D: de::Deserializer<'a>
 | 
			
		||||
{
 | 
			
		||||
    ModsWrapper::deserialize(deserializer).map(|wrapper| wrapper.into_inner())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Default for Mouse {
 | 
			
		||||
    fn default() -> Mouse {
 | 
			
		||||
        Mouse {
 | 
			
		||||
| 
						 | 
				
			
			@ -102,6 +121,7 @@ impl Default for Mouse {
 | 
			
		|||
            triple_click: ClickHandler {
 | 
			
		||||
                threshold: Duration::from_millis(300),
 | 
			
		||||
            },
 | 
			
		||||
            url: Url::default(),
 | 
			
		||||
            faux_scrollback_lines: None,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -644,6 +664,7 @@ fn deserialize_scrolling_multiplier<'a, D>(deserializer: D) -> ::std::result::Re
 | 
			
		|||
///
 | 
			
		||||
/// Our deserialize impl wouldn't be covered by a derive(Deserialize); see the
 | 
			
		||||
/// impl below.
 | 
			
		||||
#[derive(Debug, Copy, Clone, Hash, Default, Eq, PartialEq)]
 | 
			
		||||
struct ModsWrapper(ModifiersState);
 | 
			
		||||
 | 
			
		||||
impl ModsWrapper {
 | 
			
		||||
| 
						 | 
				
			
			@ -735,9 +756,9 @@ impl<'a> de::Deserialize<'a> for ActionWrapper {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Deserialize)]
 | 
			
		||||
#[derive(Debug, Deserialize, Clone)]
 | 
			
		||||
#[serde(untagged)]
 | 
			
		||||
enum CommandWrapper {
 | 
			
		||||
pub enum CommandWrapper {
 | 
			
		||||
    Just(String),
 | 
			
		||||
    WithArgs {
 | 
			
		||||
        program: String,
 | 
			
		||||
| 
						 | 
				
			
			@ -746,6 +767,22 @@ enum CommandWrapper {
 | 
			
		|||
    },
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl CommandWrapper {
 | 
			
		||||
    pub fn program(&self) -> &str {
 | 
			
		||||
        match self {
 | 
			
		||||
            CommandWrapper::Just(program) => program,
 | 
			
		||||
            CommandWrapper::WithArgs { program, .. } => program,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn args(&self) -> &[String] {
 | 
			
		||||
        match self {
 | 
			
		||||
            CommandWrapper::Just(_) => &[],
 | 
			
		||||
            CommandWrapper::WithArgs { args, .. } => args,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
use ::term::{mode, TermMode};
 | 
			
		||||
 | 
			
		||||
struct ModeWrapper {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12
									
								
								src/event.rs
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								src/event.rs
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -19,7 +19,7 @@ use index::{Line, Column, Side, Point};
 | 
			
		|||
use input::{self, MouseBinding, KeyBinding};
 | 
			
		||||
use selection::Selection;
 | 
			
		||||
use sync::FairMutex;
 | 
			
		||||
use term::{Term, SizeInfo, TermMode};
 | 
			
		||||
use term::{Term, SizeInfo, TermMode, Search};
 | 
			
		||||
use util::limit;
 | 
			
		||||
use util::fmt::Red;
 | 
			
		||||
use window::Window;
 | 
			
		||||
| 
						 | 
				
			
			@ -76,6 +76,10 @@ impl<'a, N: Notify + 'a> input::ActionContext for ActionContext<'a, N> {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn selection_is_empty(&self) -> bool {
 | 
			
		||||
        self.terminal.selection().as_ref().map(|s| s.is_empty()).unwrap_or(true)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn clear_selection(&mut self) {
 | 
			
		||||
        *self.terminal.selection_mut() = None;
 | 
			
		||||
        self.terminal.dirty = true;
 | 
			
		||||
| 
						 | 
				
			
			@ -104,6 +108,10 @@ impl<'a, N: Notify + 'a> input::ActionContext for ActionContext<'a, N> {
 | 
			
		|||
        self.terminal.dirty = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn url(&self, point: Point<usize>) -> Option<String> {
 | 
			
		||||
        self.terminal.url_search(point)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn line_selection(&mut self, point: Point) {
 | 
			
		||||
        let point = self.terminal.visible_to_buffer(point);
 | 
			
		||||
        *self.terminal.selection_mut() = Some(Selection::lines(point));
 | 
			
		||||
| 
						 | 
				
			
			@ -196,6 +204,7 @@ pub struct Mouse {
 | 
			
		|||
    pub column: Column,
 | 
			
		||||
    pub cell_side: Side,
 | 
			
		||||
    pub lines_scrolled: f32,
 | 
			
		||||
    pub block_url_launcher: bool,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Default for Mouse {
 | 
			
		||||
| 
						 | 
				
			
			@ -213,6 +222,7 @@ impl Default for Mouse {
 | 
			
		|||
            column: Column(0),
 | 
			
		||||
            cell_side: Side::Left,
 | 
			
		||||
            lines_scrolled: 0.0,
 | 
			
		||||
            block_url_launcher: false,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,6 +64,12 @@ impl From<Point<isize>> for Point<usize> {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl From<Point> for Point<usize> {
 | 
			
		||||
    fn from(point: Point) -> Self {
 | 
			
		||||
        Point::new(point.line.0, point.col)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// A line
 | 
			
		||||
///
 | 
			
		||||
/// Newtype to avoid passing values incorrectly
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										94
									
								
								src/input.rs
									
										
									
									
									
								
							
							
						
						
									
										94
									
								
								src/input.rs
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -63,6 +63,7 @@ pub trait ActionContext {
 | 
			
		|||
    fn simple_selection(&mut self, point: Point, side: Side);
 | 
			
		||||
    fn semantic_selection(&mut self, point: Point);
 | 
			
		||||
    fn line_selection(&mut self, point: Point);
 | 
			
		||||
    fn selection_is_empty(&self) -> bool;
 | 
			
		||||
    fn mouse_mut(&mut self) -> &mut Mouse;
 | 
			
		||||
    fn mouse(&self) -> &Mouse;
 | 
			
		||||
    fn mouse_coords(&self) -> Option<Point>;
 | 
			
		||||
| 
						 | 
				
			
			@ -74,6 +75,7 @@ pub trait ActionContext {
 | 
			
		|||
    fn scroll(&mut self, scroll: Scroll);
 | 
			
		||||
    fn clear_history(&mut self);
 | 
			
		||||
    fn hide_window(&mut self);
 | 
			
		||||
    fn url(&self, _: Point<usize>) -> Option<String>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Describes a state and action to take in that state
 | 
			
		||||
| 
						 | 
				
			
			@ -326,16 +328,25 @@ impl<'a, A: ActionContext + 'a> Processor<'a, A> {
 | 
			
		|||
        let size_info = self.ctx.size_info();
 | 
			
		||||
        let point = size_info.pixels_to_coords(x, y);
 | 
			
		||||
 | 
			
		||||
        let cell_side = self.get_mouse_side();
 | 
			
		||||
        let prev_side = mem::replace(&mut self.ctx.mouse_mut().cell_side, cell_side);
 | 
			
		||||
        let prev_line = mem::replace(&mut self.ctx.mouse_mut().line, point.line);
 | 
			
		||||
        let prev_col = mem::replace(&mut self.ctx.mouse_mut().column, point.col);
 | 
			
		||||
 | 
			
		||||
        let motion_mode = TermMode::MOUSE_MOTION | TermMode::MOUSE_DRAG;
 | 
			
		||||
        let report_mode = TermMode::MOUSE_REPORT_CLICK | motion_mode;
 | 
			
		||||
 | 
			
		||||
        // Don't launch URLs if mouse has moved
 | 
			
		||||
        if prev_line != self.ctx.mouse().line
 | 
			
		||||
            || prev_col != self.ctx.mouse().column
 | 
			
		||||
            || prev_side != cell_side
 | 
			
		||||
        {
 | 
			
		||||
            self.ctx.mouse_mut().block_url_launcher = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if self.ctx.mouse().left_button_state == ElementState::Pressed &&
 | 
			
		||||
            ( modifiers.shift || !self.ctx.terminal_mode().intersects(report_mode))
 | 
			
		||||
        {
 | 
			
		||||
            let cell_side = self.get_mouse_side();
 | 
			
		||||
            self.ctx.update_selection(Point {
 | 
			
		||||
                line: point.line,
 | 
			
		||||
                col: point.col
 | 
			
		||||
| 
						 | 
				
			
			@ -357,6 +368,26 @@ impl<'a, A: ActionContext + 'a> Processor<'a, A> {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn get_mouse_side(&self) -> Side {
 | 
			
		||||
        let size_info = self.ctx.size_info();
 | 
			
		||||
        let x = self.ctx.mouse().x;
 | 
			
		||||
 | 
			
		||||
        let cell_x = x.saturating_sub(size_info.padding_x as usize) % size_info.cell_width as usize;
 | 
			
		||||
        let half_cell_width = (size_info.cell_width / 2.0) as usize;
 | 
			
		||||
 | 
			
		||||
        let additional_padding = (size_info.width - size_info.padding_x * 2.) % size_info.cell_width;
 | 
			
		||||
        let end_of_grid = size_info.width - size_info.padding_x - additional_padding;
 | 
			
		||||
 | 
			
		||||
        if cell_x > half_cell_width
 | 
			
		||||
            // Edge case when mouse leaves the window
 | 
			
		||||
            || x as f32 >= end_of_grid
 | 
			
		||||
        {
 | 
			
		||||
            Side::Right
 | 
			
		||||
        } else {
 | 
			
		||||
            Side::Left
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn normal_mouse_report(&mut self, button: u8) {
 | 
			
		||||
        let (line, column) = (self.ctx.mouse().line, self.ctx.mouse().column);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -427,19 +458,24 @@ impl<'a, A: ActionContext + 'a> Processor<'a, A> {
 | 
			
		|||
 | 
			
		||||
        self.ctx.mouse_mut().click_state = match self.ctx.mouse().click_state {
 | 
			
		||||
            ClickState::Click if elapsed < self.mouse_config.double_click.threshold => {
 | 
			
		||||
                self.ctx.mouse_mut().block_url_launcher = true;
 | 
			
		||||
                self.on_mouse_double_click();
 | 
			
		||||
                ClickState::DoubleClick
 | 
			
		||||
            },
 | 
			
		||||
            ClickState::DoubleClick if elapsed < self.mouse_config.triple_click.threshold => {
 | 
			
		||||
                self.ctx.mouse_mut().block_url_launcher = true;
 | 
			
		||||
                self.on_mouse_triple_click();
 | 
			
		||||
                ClickState::TripleClick
 | 
			
		||||
            },
 | 
			
		||||
            _ => {
 | 
			
		||||
                // Don't launch URLs if this click cleared the selection
 | 
			
		||||
                self.ctx.mouse_mut().block_url_launcher = !self.ctx.selection_is_empty();
 | 
			
		||||
 | 
			
		||||
                self.ctx.clear_selection();
 | 
			
		||||
 | 
			
		||||
                // Start new empty selection
 | 
			
		||||
                if let Some(point) = self.ctx.mouse_coords() {
 | 
			
		||||
                    let side = self.get_mouse_side();
 | 
			
		||||
                    let side = self.ctx.mouse().cell_side;
 | 
			
		||||
                    self.ctx.simple_selection(point, side);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -460,26 +496,6 @@ impl<'a, A: ActionContext + 'a> Processor<'a, A> {
 | 
			
		|||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn get_mouse_side(&self) -> Side {
 | 
			
		||||
        let size_info = self.ctx.size_info();
 | 
			
		||||
        let x = self.ctx.mouse().x;
 | 
			
		||||
 | 
			
		||||
        let cell_x = x.saturating_sub(size_info.padding_x as usize) % size_info.cell_width as usize;
 | 
			
		||||
        let half_cell_width = (size_info.cell_width / 2.0) as usize;
 | 
			
		||||
 | 
			
		||||
        let additional_padding = (size_info.width - size_info.padding_x * 2.) % size_info.cell_width;
 | 
			
		||||
        let end_of_grid = size_info.width - size_info.padding_x - additional_padding;
 | 
			
		||||
 | 
			
		||||
        if cell_x > half_cell_width
 | 
			
		||||
            // Edge case when mouse leaves the window
 | 
			
		||||
            || x as f32 >= end_of_grid
 | 
			
		||||
        {
 | 
			
		||||
            Side::Right
 | 
			
		||||
        } else {
 | 
			
		||||
            Side::Left
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn on_mouse_release(&mut self, button: MouseButton, modifiers: ModifiersState) {
 | 
			
		||||
        let report_modes = TermMode::MOUSE_REPORT_CLICK | TermMode::MOUSE_DRAG | TermMode::MOUSE_MOTION;
 | 
			
		||||
        if !modifiers.shift && self.ctx.terminal_mode().intersects(report_modes)
 | 
			
		||||
| 
						 | 
				
			
			@ -492,6 +508,8 @@ impl<'a, A: ActionContext + 'a> Processor<'a, A> {
 | 
			
		|||
                MouseButton::Other(_) => (),
 | 
			
		||||
            };
 | 
			
		||||
            return;
 | 
			
		||||
        } else {
 | 
			
		||||
            self.launch_url(modifiers);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if self.save_to_clipboard {
 | 
			
		||||
| 
						 | 
				
			
			@ -500,6 +518,27 @@ impl<'a, A: ActionContext + 'a> Processor<'a, A> {
 | 
			
		|||
        self.ctx.copy_selection(ClipboardBuffer::Selection);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Spawn URL launcher when clicking on URLs
 | 
			
		||||
    fn launch_url(&self, modifiers: ModifiersState) -> Option<()> {
 | 
			
		||||
        if modifiers != self.mouse_config.url.modifiers || self.ctx.mouse().block_url_launcher {
 | 
			
		||||
            return None;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let point = self.ctx.mouse_coords()?;
 | 
			
		||||
        let text = self.ctx.url(point.into())?;
 | 
			
		||||
 | 
			
		||||
        let launcher = self.mouse_config.url.launcher.as_ref()?;
 | 
			
		||||
        let mut args = launcher.args().to_vec();
 | 
			
		||||
        args.push(text);
 | 
			
		||||
 | 
			
		||||
        match Command::new(launcher.program()).args(&args).spawn() {
 | 
			
		||||
            Ok(_) => debug!("Launched: {} {:?}", launcher.program(), args),
 | 
			
		||||
            Err(_) => warn!("Unable to launch: {} {:?}", launcher.program(), args),
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Some(())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn on_mouse_wheel(&mut self, delta: MouseScrollDelta, phase: TouchPhase, modifiers: ModifiersState) {
 | 
			
		||||
        match delta {
 | 
			
		||||
            MouseScrollDelta::LineDelta(_columns, lines) => {
 | 
			
		||||
| 
						 | 
				
			
			@ -777,6 +816,10 @@ mod tests {
 | 
			
		|||
            self.last_action = MultiClick::TripleClick;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        fn selection_is_empty(&self) -> bool {
 | 
			
		||||
            true
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        fn scroll(&mut self, scroll: Scroll) {
 | 
			
		||||
            self.terminal.scroll_display(scroll);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -795,6 +838,10 @@ mod tests {
 | 
			
		|||
            self.mouse
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        fn url(&self, _: Point<usize>) -> Option<String> {
 | 
			
		||||
            None
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        fn received_count(&mut self) -> &mut usize {
 | 
			
		||||
            &mut self.received_count
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -863,11 +910,12 @@ mod tests {
 | 
			
		|||
                            threshold: Duration::from_millis(1000),
 | 
			
		||||
                        },
 | 
			
		||||
                        faux_scrollback_lines: None,
 | 
			
		||||
                        url: Default::default(),
 | 
			
		||||
                    },
 | 
			
		||||
                    scrolling_config: &config::Scrolling::default(),
 | 
			
		||||
                    key_bindings: &config.key_bindings()[..],
 | 
			
		||||
                    mouse_bindings: &config.mouse_bindings()[..],
 | 
			
		||||
                    save_to_clipboard: config.selection().save_to_clipboard
 | 
			
		||||
                    save_to_clipboard: config.selection().save_to_clipboard,
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                if let Event::WindowEvent { event: WindowEvent::MouseInput { state, button, modifiers, .. }, .. } = $input {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -65,6 +65,7 @@ extern crate vte;
 | 
			
		|||
extern crate xdg;
 | 
			
		||||
extern crate base64;
 | 
			
		||||
extern crate terminfo;
 | 
			
		||||
extern crate url;
 | 
			
		||||
 | 
			
		||||
#[macro_use]
 | 
			
		||||
pub mod macros;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,6 +22,7 @@ use std::cmp::{min, max};
 | 
			
		|||
use std::ops::Range;
 | 
			
		||||
 | 
			
		||||
use index::{Point, Column, Side};
 | 
			
		||||
use term::Search;
 | 
			
		||||
 | 
			
		||||
/// Describes a region of a 2-dimensional area
 | 
			
		||||
///
 | 
			
		||||
| 
						 | 
				
			
			@ -71,17 +72,6 @@ impl Anchor {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// A type that can expand a given point to a region
 | 
			
		||||
///
 | 
			
		||||
/// Usually this is implemented for some 2-D array type since
 | 
			
		||||
/// points are two dimensional indices.
 | 
			
		||||
pub trait SemanticSearch {
 | 
			
		||||
    /// Find the nearest semantic boundary _to the left_ of provided point.
 | 
			
		||||
    fn semantic_search_left(&self, _: Point<usize>) -> Point<usize>;
 | 
			
		||||
    /// Find the nearest semantic boundary _to the point_ of provided point.
 | 
			
		||||
    fn semantic_search_right(&self, _: Point<usize>) -> Point<usize>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// A type that has 2-dimensional boundaries
 | 
			
		||||
pub trait Dimensions {
 | 
			
		||||
    /// Get the size of the area
 | 
			
		||||
| 
						 | 
				
			
			@ -151,7 +141,7 @@ impl Selection {
 | 
			
		|||
 | 
			
		||||
    pub fn to_span<G>(&self, grid: &G, alt_screen: bool) -> Option<Span>
 | 
			
		||||
    where
 | 
			
		||||
        G: SemanticSearch + Dimensions,
 | 
			
		||||
        G: Search + Dimensions,
 | 
			
		||||
    {
 | 
			
		||||
        match *self {
 | 
			
		||||
            Selection::Simple { ref region } => {
 | 
			
		||||
| 
						 | 
				
			
			@ -166,12 +156,24 @@ impl Selection {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn is_empty(&self) -> bool
 | 
			
		||||
    {
 | 
			
		||||
        match *self {
 | 
			
		||||
            Selection::Simple { ref region } => {
 | 
			
		||||
                region.start == region.end && region.start.side == region.end.side
 | 
			
		||||
            },
 | 
			
		||||
            Selection::Semantic { .. } | Selection::Lines { .. } => {
 | 
			
		||||
                false
 | 
			
		||||
            },
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn span_semantic<G>(
 | 
			
		||||
        grid: &G,
 | 
			
		||||
        region: &Range<Point<isize>>,
 | 
			
		||||
        alt_screen: bool,
 | 
			
		||||
    ) -> Option<Span>
 | 
			
		||||
        where G: SemanticSearch + Dimensions
 | 
			
		||||
        where G: Search + Dimensions
 | 
			
		||||
    {
 | 
			
		||||
        let cols = grid.dimensions().col;
 | 
			
		||||
        let lines = grid.dimensions().line.0 as isize;
 | 
			
		||||
| 
						 | 
				
			
			@ -448,9 +450,10 @@ mod test {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    impl super::SemanticSearch for Dimensions {
 | 
			
		||||
    impl super::Search for Dimensions {
 | 
			
		||||
        fn semantic_search_left(&self, point: Point<usize>) -> Point<usize> { point }
 | 
			
		||||
        fn semantic_search_right(&self, point: Point<usize>) -> Point<usize> { point }
 | 
			
		||||
        fn url_search(&self, _: Point<usize>) -> Option<String> { None }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Test case of single cell selection
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										159
									
								
								src/term/mod.rs
									
										
									
									
									
								
							
							
						
						
									
										159
									
								
								src/term/mod.rs
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -20,6 +20,7 @@ use std::time::{Duration, Instant};
 | 
			
		|||
 | 
			
		||||
use arraydeque::ArrayDeque;
 | 
			
		||||
use unicode_width::UnicodeWidthChar;
 | 
			
		||||
use url::Url;
 | 
			
		||||
 | 
			
		||||
use font::{self, Size};
 | 
			
		||||
use ansi::{self, Color, NamedColor, Attr, Handler, CharsetIndex, StandardCharset, CursorStyle};
 | 
			
		||||
| 
						 | 
				
			
			@ -36,7 +37,22 @@ pub mod color;
 | 
			
		|||
pub use self::cell::Cell;
 | 
			
		||||
use self::cell::LineLength;
 | 
			
		||||
 | 
			
		||||
impl selection::SemanticSearch for Term {
 | 
			
		||||
const URL_SEPARATOR_CHARS: [char; 3] = [' ', '"', '\''];
 | 
			
		||||
 | 
			
		||||
/// A type that can expand a given point to a region
 | 
			
		||||
///
 | 
			
		||||
/// Usually this is implemented for some 2-D array type since
 | 
			
		||||
/// points are two dimensional indices.
 | 
			
		||||
pub trait Search {
 | 
			
		||||
    /// Find the nearest semantic boundary _to the left_ of provided point.
 | 
			
		||||
    fn semantic_search_left(&self, _: Point<usize>) -> Point<usize>;
 | 
			
		||||
    /// Find the nearest semantic boundary _to the point_ of provided point.
 | 
			
		||||
    fn semantic_search_right(&self, _: Point<usize>) -> Point<usize>;
 | 
			
		||||
    /// Find the nearest URL boundary in both directions.
 | 
			
		||||
    fn url_search(&self, _: Point<usize>) -> Option<String>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Search for Term {
 | 
			
		||||
    fn semantic_search_left(&self, mut point: Point<usize>) -> Point<usize> {
 | 
			
		||||
        // Limit the starting point to the last line in the history
 | 
			
		||||
        point.line = min(point.line, self.grid.len() - 1);
 | 
			
		||||
| 
						 | 
				
			
			@ -80,6 +96,52 @@ impl selection::SemanticSearch for Term {
 | 
			
		|||
 | 
			
		||||
        point
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn url_search(&self, mut point: Point<usize>) -> Option<String> {
 | 
			
		||||
        point.line = self.grid.num_lines().0 - point.line - 1;
 | 
			
		||||
 | 
			
		||||
        // Limit the starting point to the last line in the history
 | 
			
		||||
        point.line = min(point.line, self.grid.len() - 1);
 | 
			
		||||
 | 
			
		||||
        // Create forwards and backwards iterators
 | 
			
		||||
        let iterf = self.grid.iter_from(point);
 | 
			
		||||
        point.col += 1;
 | 
			
		||||
        let mut iterb = self.grid.iter_from(point);
 | 
			
		||||
 | 
			
		||||
        // Put all characters until separators into a string
 | 
			
		||||
        let mut buf = String::new();
 | 
			
		||||
        while let Some(cell) = iterb.prev() {
 | 
			
		||||
            if URL_SEPARATOR_CHARS.contains(&cell.c) {
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            buf.insert(0, cell.c);
 | 
			
		||||
        }
 | 
			
		||||
        for cell in iterf {
 | 
			
		||||
            if URL_SEPARATOR_CHARS.contains(&cell.c) {
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            buf.push(cell.c);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Heuristic to remove all leading '('
 | 
			
		||||
        while buf.starts_with('(') {
 | 
			
		||||
            buf.remove(0);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Heuristic to remove all ')' from end of URLs without matching '('
 | 
			
		||||
        let str_count = |text: &str, c: char| {
 | 
			
		||||
            text.chars().filter(|tc| *tc == c).count()
 | 
			
		||||
        };
 | 
			
		||||
        while buf.ends_with(')') && str_count(&buf, '(') < str_count(&buf, ')') {
 | 
			
		||||
            buf.pop();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Check if string is valid url
 | 
			
		||||
        match Url::parse(&buf) {
 | 
			
		||||
            Ok(_) => Some(buf),
 | 
			
		||||
            Err(_) => None,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl selection::Dimensions for Term {
 | 
			
		||||
| 
						 | 
				
			
			@ -1999,7 +2061,7 @@ mod tests {
 | 
			
		|||
    extern crate serde_json;
 | 
			
		||||
 | 
			
		||||
    use super::{Cell, Term, SizeInfo};
 | 
			
		||||
    use term::cell;
 | 
			
		||||
    use term::{cell, Search};
 | 
			
		||||
 | 
			
		||||
    use grid::{Grid, Scroll};
 | 
			
		||||
    use index::{Point, Line, Column, Side};
 | 
			
		||||
| 
						 | 
				
			
			@ -2231,6 +2293,99 @@ mod tests {
 | 
			
		|||
        scrolled_grid.scroll_display(Scroll::Top);
 | 
			
		||||
        assert_eq!(term.grid, scrolled_grid);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // `((ftp://a.de))` -> `Some("ftp://a.de")`
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn url_trim_unmatched_parens() {
 | 
			
		||||
        let size = SizeInfo {
 | 
			
		||||
            width: 21.0,
 | 
			
		||||
            height: 51.0,
 | 
			
		||||
            cell_width: 3.0,
 | 
			
		||||
            cell_height: 3.0,
 | 
			
		||||
            padding_x: 0.0,
 | 
			
		||||
            padding_y: 0.0,
 | 
			
		||||
        };
 | 
			
		||||
        let mut term = Term::new(&Default::default(), size);
 | 
			
		||||
        let mut grid: Grid<Cell> = Grid::new(Line(1), Column(15), 0, Cell::default());
 | 
			
		||||
        grid[Line(0)][Column(0)].c = '(';
 | 
			
		||||
        grid[Line(0)][Column(1)].c = '(';
 | 
			
		||||
        grid[Line(0)][Column(2)].c = 'f';
 | 
			
		||||
        grid[Line(0)][Column(3)].c = 't';
 | 
			
		||||
        grid[Line(0)][Column(4)].c = 'p';
 | 
			
		||||
        grid[Line(0)][Column(5)].c = ':';
 | 
			
		||||
        grid[Line(0)][Column(6)].c = '/';
 | 
			
		||||
        grid[Line(0)][Column(7)].c = '/';
 | 
			
		||||
        grid[Line(0)][Column(8)].c = 'a';
 | 
			
		||||
        grid[Line(0)][Column(9)].c = '.';
 | 
			
		||||
        grid[Line(0)][Column(10)].c = 'd';
 | 
			
		||||
        grid[Line(0)][Column(11)].c = 'e';
 | 
			
		||||
        grid[Line(0)][Column(12)].c = ')';
 | 
			
		||||
        grid[Line(0)][Column(13)].c = ')';
 | 
			
		||||
        mem::swap(&mut term.grid, &mut grid);
 | 
			
		||||
 | 
			
		||||
        // Search for URL in grid
 | 
			
		||||
        let url = term.url_search(Point::new(0, Column(4)));
 | 
			
		||||
 | 
			
		||||
        assert_eq!(url, Some("ftp://a.de".into()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // `ftp://a.de/()` -> `Some("ftp://a.de/()")`
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn url_allow_matching_parens() {
 | 
			
		||||
        let size = SizeInfo {
 | 
			
		||||
            width: 21.0,
 | 
			
		||||
            height: 51.0,
 | 
			
		||||
            cell_width: 3.0,
 | 
			
		||||
            cell_height: 3.0,
 | 
			
		||||
            padding_x: 0.0,
 | 
			
		||||
            padding_y: 0.0,
 | 
			
		||||
        };
 | 
			
		||||
        let mut term = Term::new(&Default::default(), size);
 | 
			
		||||
        let mut grid: Grid<Cell> = Grid::new(Line(1), Column(15), 0, Cell::default());
 | 
			
		||||
        grid[Line(0)][Column(0)].c = 'f';
 | 
			
		||||
        grid[Line(0)][Column(1)].c = 't';
 | 
			
		||||
        grid[Line(0)][Column(2)].c = 'p';
 | 
			
		||||
        grid[Line(0)][Column(3)].c = ':';
 | 
			
		||||
        grid[Line(0)][Column(4)].c = '/';
 | 
			
		||||
        grid[Line(0)][Column(5)].c = '/';
 | 
			
		||||
        grid[Line(0)][Column(6)].c = 'a';
 | 
			
		||||
        grid[Line(0)][Column(7)].c = '.';
 | 
			
		||||
        grid[Line(0)][Column(8)].c = 'd';
 | 
			
		||||
        grid[Line(0)][Column(9)].c = 'e';
 | 
			
		||||
        grid[Line(0)][Column(10)].c = '/';
 | 
			
		||||
        grid[Line(0)][Column(11)].c = '(';
 | 
			
		||||
        grid[Line(0)][Column(12)].c = ')';
 | 
			
		||||
        mem::swap(&mut term.grid, &mut grid);
 | 
			
		||||
 | 
			
		||||
        // Search for URL in grid
 | 
			
		||||
        let url = term.url_search(Point::new(0, Column(4)));
 | 
			
		||||
 | 
			
		||||
        assert_eq!(url, Some("ftp://a.de/()".into()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // `aze` -> `None`
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn url_skip_invalid() {
 | 
			
		||||
        let size = SizeInfo {
 | 
			
		||||
            width: 21.0,
 | 
			
		||||
            height: 51.0,
 | 
			
		||||
            cell_width: 3.0,
 | 
			
		||||
            cell_height: 3.0,
 | 
			
		||||
            padding_x: 0.0,
 | 
			
		||||
            padding_y: 0.0,
 | 
			
		||||
        };
 | 
			
		||||
        let mut term = Term::new(&Default::default(), size);
 | 
			
		||||
        let mut grid: Grid<Cell> = Grid::new(Line(1), Column(15), 0, Cell::default());
 | 
			
		||||
        grid[Line(0)][Column(0)].c = 'a';
 | 
			
		||||
        grid[Line(0)][Column(1)].c = 'z';
 | 
			
		||||
        grid[Line(0)][Column(2)].c = 'e';
 | 
			
		||||
        mem::swap(&mut term.grid, &mut grid);
 | 
			
		||||
 | 
			
		||||
        // Search for URL in grid
 | 
			
		||||
        let url = term.url_search(Point::new(0, Column(1)));
 | 
			
		||||
 | 
			
		||||
        assert_eq!(url, None);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[cfg(all(test, feature = "bench"))]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue