on master help sign in
108 files changed+9935−15024
since splitsnapshots
unifiedsplit
.gitignore+1 .travis.yml+19−10 Cargo.lock+667−364 Cargo.toml+69−26 README.md+60−23 benches/benches.rs+118 build.sh+3−26 compile-tests/Cargo.toml−11 compile-tests/compile-fail/cached_uaf.rs−58 compile-tests/src/main.rs−26 crates/js-api/Cargo.toml+22 crates/js-api/src/lib.rs+324 examples/counter/.gitignore−7 examples/counter/.travis.yml−11 examples/counter/crate/Cargo.toml → examples/counter/Cargo.toml+8−8 examples/counter/LICENSE-APACHE−201 examples/counter/LICENSE-MIT−25 examples/counter/README.md+12−20 examples/counter/crate/src/lib.rs−80 examples/counter/index.html+4 examples/counter/js/index.js−3 examples/counter/package-lock.json−5790 examples/counter/package.json−18 examples/counter/src/lib.rs+87 examples/counter/webpack.config.js−25 examples/game-of-life/Cargo.toml+29 examples/game-of-life/README.md+23 examples/game-of-life/index.html+44 examples/game-of-life/src/lib.rs+218 examples/hello-world/.gitignore−7 examples/hello-world/.travis.yml−11 examples/hello-world/Cargo.toml+5−5 examples/hello-world/LICENSE-APACHE−201 examples/hello-world/LICENSE-MIT−25 examples/hello-world/README.md+12−20 examples/hello-world/index.html+3−3 examples/hello-world/src/lib.rs+18−23 examples/input-form/.gitignore−7 examples/input-form/.travis.yml−11 examples/input-form/crate/Cargo.toml → examples/input-form/Cargo.toml+6−6 examples/input-form/LICENSE-APACHE−201 examples/input-form/LICENSE-MIT−25 examples/input-form/README.md+13−20 examples/input-form/crate/src/lib.rs−76 examples/input-form/index.html+4 examples/input-form/js/index.js−3 examples/input-form/package-lock.json−5790 examples/input-form/package.json−18 examples/input-form/src/lib.rs+81 examples/input-form/webpack.config.js−25 examples/js-component/Cargo.toml+26 examples/js-component/README.md+23 examples/js-component/greeting.js+41 examples/js-component/index.html+14 examples/js-component/src/lib.rs+63 examples/moire/Cargo.toml+43 examples/moire/README.md+26 examples/moire/index.html+67 examples/moire/src/colors.rs+162 examples/moire/src/lib.rs+259 examples/sierpinski-triangle/Cargo.toml+28 examples/sierpinski-triangle/README.md+24 examples/sierpinski-triangle/ferris.png examples/sierpinski-triangle/index.html+69 examples/sierpinski-triangle/src/lib.rs+157 examples/todomvc/Cargo.toml+47 examples/todomvc/README.md+33 examples/todomvc/index.html+21 examples/todomvc/src/controller.rs+140 examples/todomvc/src/keys.rs+7 examples/todomvc/src/lib.rs+60 examples/todomvc/src/router.rs+68 examples/todomvc/src/todo.rs+229 examples/todomvc/src/todos.rs+300 examples/todomvc/src/utils.rs+32 examples/todomvc/src/visibility.rs+51 js/change-list-interpreter.js+377 js/change-list.js−263 js/package-lock.json−5 js/package.json−11 js/strace.js+80 publish.sh+11 src/builder.rs+1075 src/cached.rs+141−75 src/cached_set.rs+186 src/change_list.rs−381 src/change_list/emitter.rs+292 src/change_list/js.rs+40 src/change_list/mod.rs+353 src/change_list/strings.rs+66 src/change_list/traversal.rs+344 src/diff.rs+1125 src/events.rs+123−84 src/lib.rs+86−128 src/logging.rs+65 src/node.rs+183−102 src/render.rs+168 src/render_context.rs+104 src/strace.rs+22 src/vdom.rs+186−340 tests/web/cached.js+11 tests/web/cached.rs+242−52 tests/web/events.rs+70−191 tests/web/js_api.rs+153 tests/web/keyed.js+25 tests/web/keyed.rs+269 tests/web/main.rs+65−41 tests/web/render.rs+233−142
.gitignore+1
@@ -1,3 +1,4 @@
11/target
22**/*.rs.bk
33wasm-pack.log
4+/.vscode
.travis.yml+19−10
@@ -16,7 +16,6 @@ install:
1616 - *INSTALL_NODE_VIA_NVM
1717 - *INSTALL_WASM_PACK
1818 - rustup target add wasm32-unknown-unknown
19− - rustup component add rustfmt
2019
2120matrix:
2221 include:
@@ -26,20 +25,30 @@ matrix:
2625 - name: "build (beta)"
2726 rust: beta
2827 script: INSTALL=1 ./build.sh
29− - name: "build (nightly)"
30− rust: nightly
31− script: INSTALL=1 ./build.sh
3228 - name: "headless browser tests (firefox)"
3329 rust: stable
3430 addons:
3531 firefox: latest
36− script: wasm-pack test --firefox --headless
37− - name: "headless browser tests (chrome)"
38− rust: stable
39− addons:
40− chrome: stable
41− script: wasm-pack test --chrome --headless
32+ script: wasm-pack test --firefox --headless -- --features xxx-unstable-internal-use-only
4233 - name: "native tests"
4334 rust: stable
4435 install: echo "no install"
4536 script: cargo test --all
37+
38+ # TODO: A bug in `rustc` is making `js-sys` broken on nightly:
39+ # https://github.com/rust-lang/rust/issues/69315
40+ # - name: "build (nightly)"
41+ # rust: nightly
42+ # script: INSTALL=1 ./build.sh
43+ # - name: "check native benches"
44+ # rust: nightly
45+ # install: echo "no install"
46+ # script: cargo check --benches --features xxx-unstable-internal-use-only
47+
48+ # TODO: `chromedriver` is complaining about ports or something. Temporarily
49+ # disable in CI until we figure it out.
50+ # - name: "headless browser tests (chrome)"
51+ # rust: stable
52+ # addons:
53+ # chrome: stable
54+ # script: wasm-pack test --chrome --headless -- --features xxx-unstable-internal-use-only
Cargo.lock+667−364
@@ -1,644 +1,922 @@
11# This file is automatically @generated by Cargo.
22# It is not intended for manual editing.
33[[package]]
4−name = "aho-corasick"
5−version = "0.6.9"
4+name = "anyhow"
5+version = "1.0.25"
66source = "registry+https://github.com/rust-lang/crates.io-index"
7−dependencies = [
8− "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
9−]
107
118[[package]]
129name = "atty"
13−version = "0.2.11"
10+version = "0.2.13"
1411source = "registry+https://github.com/rust-lang/crates.io-index"
1512dependencies = [
16− "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
17− "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
18− "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
13+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
14+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
1915]
2016
2117[[package]]
2218name = "autocfg"
23−version = "0.1.2"
19+version = "0.1.7"
2420source = "registry+https://github.com/rust-lang/crates.io-index"
2521
2622[[package]]
27−name = "backtrace"
28−version = "0.3.13"
23+name = "bitflags"
24+version = "1.2.1"
2925source = "registry+https://github.com/rust-lang/crates.io-index"
30−dependencies = [
31− "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
32− "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
33− "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
34− "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
35− "rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
36− "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
37−]
3826
3927[[package]]
40−name = "backtrace-sys"
41−version = "0.1.28"
28+name = "bstr"
29+version = "0.2.8"
4230source = "registry+https://github.com/rust-lang/crates.io-index"
4331dependencies = [
44− "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)",
45− "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
32+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
33+ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
34+ "regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
35+ "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
4636]
4737
4838[[package]]
4939name = "bumpalo"
50−version = "1.2.0"
40+version = "2.6.0"
41+source = "registry+https://github.com/rust-lang/crates.io-index"
5142
5243[[package]]
53−name = "cc"
54−version = "1.0.28"
44+name = "byteorder"
45+version = "1.3.2"
5546source = "registry+https://github.com/rust-lang/crates.io-index"
5647
48+[[package]]
49+name = "cast"
50+version = "0.2.3"
51+source = "registry+https://github.com/rust-lang/crates.io-index"
52+dependencies = [
53+ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
54+]
55+
5756[[package]]
5857name = "cfg-if"
58+version = "0.1.10"
59+source = "registry+https://github.com/rust-lang/crates.io-index"
60+
61+[[package]]
62+name = "clap"
63+version = "2.33.0"
64+source = "registry+https://github.com/rust-lang/crates.io-index"
65+dependencies = [
66+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
67+ "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
68+ "unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
69+]
70+
71+[[package]]
72+name = "console_error_panic_hook"
5973version = "0.1.6"
6074source = "registry+https://github.com/rust-lang/crates.io-index"
75+dependencies = [
76+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
77+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
78+]
6179
6280[[package]]
63−name = "compile-tests"
64−version = "0.1.0"
81+name = "console_log"
82+version = "0.2.0"
83+source = "registry+https://github.com/rust-lang/crates.io-index"
6584dependencies = [
66− "compiletest_rs 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
67− "dodrio 0.1.0",
85+ "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
86+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
6887]
6988
7089[[package]]
71−name = "compiletest_rs"
72−version = "0.3.18"
90+name = "criterion"
91+version = "0.3.3"
7392source = "registry+https://github.com/rust-lang/crates.io-index"
7493dependencies = [
75− "diff 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
76− "filetime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
77− "getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
78− "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
79− "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
80− "miow 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
81− "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
82− "rustfix 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
83− "serde 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)",
84− "serde_derive 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)",
85− "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)",
86− "tester 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
87− "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
94+ "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
95+ "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
96+ "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
97+ "criterion-plot 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
98+ "csv 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
99+ "itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
100+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
101+ "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
102+ "oorandom 11.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
103+ "plotters 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)",
104+ "rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
105+ "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
106+ "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
107+ "serde_cbor 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
108+ "serde_derive 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
109+ "serde_json 1.0.57 (registry+https://github.com/rust-lang/crates.io-index)",
110+ "tinytemplate 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
111+ "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
88112]
89113
90114[[package]]
91−name = "console_error_panic_hook"
92−version = "0.1.5"
115+name = "criterion-plot"
116+version = "0.4.3"
117+source = "registry+https://github.com/rust-lang/crates.io-index"
93118dependencies = [
94− "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
95− "wasm-bindgen 0.2.33",
119+ "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
120+ "itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
96121]
97122
98123[[package]]
99−name = "console_log"
100−version = "0.1.2"
124+name = "crossbeam-deque"
125+version = "0.7.2"
126+source = "registry+https://github.com/rust-lang/crates.io-index"
127+dependencies = [
128+ "crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
129+ "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
130+]
131+
132+[[package]]
133+name = "crossbeam-epoch"
134+version = "0.8.0"
135+source = "registry+https://github.com/rust-lang/crates.io-index"
136+dependencies = [
137+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
138+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
139+ "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
140+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
141+ "memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
142+ "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
143+]
144+
145+[[package]]
146+name = "crossbeam-queue"
147+version = "0.2.0"
101148source = "registry+https://github.com/rust-lang/crates.io-index"
102149dependencies = [
103− "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
104− "web-sys 0.3.10",
150+ "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
105151]
106152
107153[[package]]
108−name = "diff"
109−version = "0.1.11"
154+name = "crossbeam-utils"
155+version = "0.7.0"
110156source = "registry+https://github.com/rust-lang/crates.io-index"
157+dependencies = [
158+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
159+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
160+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
161+]
162+
163+[[package]]
164+name = "csv"
165+version = "1.1.1"
166+source = "registry+https://github.com/rust-lang/crates.io-index"
167+dependencies = [
168+ "bstr 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
169+ "csv-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
170+ "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
171+ "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
172+ "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
173+]
174+
175+[[package]]
176+name = "csv-core"
177+version = "0.1.6"
178+source = "registry+https://github.com/rust-lang/crates.io-index"
179+dependencies = [
180+ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
181+]
111182
112183[[package]]
113184name = "dodrio"
114−version = "0.1.0"
185+version = "0.2.0"
115186dependencies = [
116− "bumpalo 1.2.0",
117− "console_log 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
118− "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
119− "js-sys 0.3.10",
120− "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
121− "wasm-bindgen 0.2.33",
122− "wasm-bindgen-futures 0.3.10",
123− "wasm-bindgen-test 0.2.33",
124− "web-sys 0.3.10",
187+ "bumpalo 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
188+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
189+ "console_log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
190+ "criterion 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
191+ "dodrio-js-api 0.2.0",
192+ "futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
193+ "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
194+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
195+ "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
196+ "longest-increasing-subsequence 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
197+ "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
198+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
199+ "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
200+ "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
201+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
125202]
126203
127204[[package]]
128205name = "dodrio-counter"
129206version = "0.1.0"
130207dependencies = [
131− "console_error_panic_hook 0.1.5",
132− "console_log 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
133− "dodrio 0.1.0",
134− "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
135− "wasm-bindgen 0.2.33",
136− "wasm-bindgen-test 0.2.33",
137− "web-sys 0.3.10",
208+ "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
209+ "console_log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
210+ "dodrio 0.2.0",
211+ "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
212+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
213+ "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
214+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
215+]
216+
217+[[package]]
218+name = "dodrio-game-of-life"
219+version = "0.1.0"
220+dependencies = [
221+ "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
222+ "dodrio 0.2.0",
223+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
224+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
225+ "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
226+ "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
227+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
138228]
139229
140230[[package]]
141231name = "dodrio-hello-world"
142232version = "0.1.0"
143233dependencies = [
144− "console_error_panic_hook 0.1.5",
145− "dodrio 0.1.0",
146− "wasm-bindgen 0.2.33",
147− "wasm-bindgen-test 0.2.33",
148− "web-sys 0.3.10",
234+ "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
235+ "dodrio 0.2.0",
236+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
237+ "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
238+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
149239]
150240
151241[[package]]
152242name = "dodrio-input-form"
153243version = "0.1.0"
154244dependencies = [
155− "console_error_panic_hook 0.1.5",
156− "dodrio 0.1.0",
157− "wasm-bindgen 0.2.33",
158− "wasm-bindgen-test 0.2.33",
159− "web-sys 0.3.10",
245+ "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
246+ "dodrio 0.2.0",
247+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
248+ "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
249+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
250+]
251+
252+[[package]]
253+name = "dodrio-js-api"
254+version = "0.2.0"
255+dependencies = [
256+ "dodrio 0.2.0",
257+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
258+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
259+ "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
260+ "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
261+]
262+
263+[[package]]
264+name = "dodrio-js-component"
265+version = "0.1.0"
266+dependencies = [
267+ "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
268+ "dodrio 0.2.0",
269+ "dodrio-js-api 0.2.0",
270+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
271+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
272+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
273+]
274+
275+[[package]]
276+name = "dodrio-moire"
277+version = "0.1.0"
278+dependencies = [
279+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
280+ "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
281+ "console_log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
282+ "dodrio 0.2.0",
283+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
284+ "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
285+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
286+ "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
287+ "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
288+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
160289]
161290
162291[[package]]
163−name = "env_logger"
164−version = "0.6.0"
292+name = "dodrio-sierpinski"
293+version = "0.1.0"
294+dependencies = [
295+ "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
296+ "dodrio 0.2.0",
297+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
298+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
299+ "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
300+ "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
301+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
302+]
303+
304+[[package]]
305+name = "dodrio-todomvc"
306+version = "0.1.0"
307+dependencies = [
308+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
309+ "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
310+ "console_log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
311+ "dodrio 0.2.0",
312+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
313+ "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
314+ "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
315+ "serde_json 1.0.57 (registry+https://github.com/rust-lang/crates.io-index)",
316+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
317+ "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
318+ "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
319+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
320+]
321+
322+[[package]]
323+name = "either"
324+version = "1.5.3"
325+source = "registry+https://github.com/rust-lang/crates.io-index"
326+
327+[[package]]
328+name = "futures"
329+version = "0.3.5"
165330source = "registry+https://github.com/rust-lang/crates.io-index"
166331dependencies = [
167− "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
168− "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
169− "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
170− "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
171− "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
332+ "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
333+ "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
334+ "futures-executor 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
335+ "futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
336+ "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
337+ "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
338+ "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
172339]
173340
174341[[package]]
175−name = "failure"
176−version = "0.1.5"
342+name = "futures-channel"
343+version = "0.3.5"
177344source = "registry+https://github.com/rust-lang/crates.io-index"
178345dependencies = [
179− "backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)",
180− "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
346+ "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
347+ "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
181348]
182349
183350[[package]]
184−name = "failure_derive"
185−version = "0.1.5"
351+name = "futures-core"
352+version = "0.3.5"
353+source = "registry+https://github.com/rust-lang/crates.io-index"
354+
355+[[package]]
356+name = "futures-executor"
357+version = "0.3.5"
186358source = "registry+https://github.com/rust-lang/crates.io-index"
187359dependencies = [
188− "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
189− "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
190− "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)",
191− "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
360+ "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
361+ "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
362+ "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
192363]
193364
194365[[package]]
195−name = "filetime"
196−version = "0.2.4"
366+name = "futures-io"
367+version = "0.3.5"
368+source = "registry+https://github.com/rust-lang/crates.io-index"
369+
370+[[package]]
371+name = "futures-macro"
372+version = "0.3.5"
197373source = "registry+https://github.com/rust-lang/crates.io-index"
198374dependencies = [
199− "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
200− "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
201− "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)",
375+ "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)",
376+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
377+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
378+ "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
202379]
203380
204381[[package]]
205−name = "futures"
206−version = "0.1.25"
382+name = "futures-sink"
383+version = "0.3.5"
207384source = "registry+https://github.com/rust-lang/crates.io-index"
208385
209386[[package]]
210−name = "getopts"
211−version = "0.2.18"
387+name = "futures-task"
388+version = "0.3.5"
212389source = "registry+https://github.com/rust-lang/crates.io-index"
213390dependencies = [
214− "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
391+ "once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
215392]
216393
217394[[package]]
218−name = "heck"
219−version = "0.3.1"
395+name = "futures-util"
396+version = "0.3.5"
220397source = "registry+https://github.com/rust-lang/crates.io-index"
221398dependencies = [
222− "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
399+ "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
400+ "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
401+ "futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
402+ "futures-macro 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
403+ "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
404+ "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
405+ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
406+ "pin-project 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)",
407+ "pin-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
408+ "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)",
409+ "proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
410+ "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
223411]
224412
225413[[package]]
226−name = "humantime"
227−version = "1.2.0"
414+name = "fxhash"
415+version = "0.2.1"
228416source = "registry+https://github.com/rust-lang/crates.io-index"
229417dependencies = [
230− "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
418+ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
231419]
232420
233421[[package]]
234−name = "itoa"
235−version = "0.4.3"
422+name = "half"
423+version = "1.6.0"
236424source = "registry+https://github.com/rust-lang/crates.io-index"
237425
238426[[package]]
239−name = "js-sys"
240−version = "0.3.10"
427+name = "heck"
428+version = "0.3.1"
429+source = "registry+https://github.com/rust-lang/crates.io-index"
241430dependencies = [
242− "wasm-bindgen 0.2.33",
431+ "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
243432]
244433
245434[[package]]
246−name = "kernel32-sys"
247−version = "0.2.2"
435+name = "hermit-abi"
436+version = "0.1.3"
437+source = "registry+https://github.com/rust-lang/crates.io-index"
438+dependencies = [
439+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
440+]
441+
442+[[package]]
443+name = "itertools"
444+version = "0.9.0"
248445source = "registry+https://github.com/rust-lang/crates.io-index"
249446dependencies = [
250− "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
251− "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
447+ "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
448+]
449+
450+[[package]]
451+name = "itoa"
452+version = "0.4.4"
453+source = "registry+https://github.com/rust-lang/crates.io-index"
454+
455+[[package]]
456+name = "js-sys"
457+version = "0.3.32"
458+source = "registry+https://github.com/rust-lang/crates.io-index"
459+dependencies = [
460+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
252461]
253462
254463[[package]]
255464name = "lazy_static"
256−version = "1.2.0"
465+version = "1.4.0"
257466source = "registry+https://github.com/rust-lang/crates.io-index"
258467
259468[[package]]
260469name = "libc"
261−version = "0.2.48"
470+version = "0.2.66"
262471source = "registry+https://github.com/rust-lang/crates.io-index"
263472
264473[[package]]
265474name = "log"
266−version = "0.4.6"
475+version = "0.4.11"
267476source = "registry+https://github.com/rust-lang/crates.io-index"
268477dependencies = [
269− "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
478+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
270479]
271480
481+[[package]]
482+name = "longest-increasing-subsequence"
483+version = "0.1.0"
484+source = "registry+https://github.com/rust-lang/crates.io-index"
485+
272486[[package]]
273487name = "memchr"
274−version = "2.1.3"
488+version = "2.2.1"
275489source = "registry+https://github.com/rust-lang/crates.io-index"
276490dependencies = [
277− "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
278− "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
491+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
279492]
280493
281494[[package]]
282−name = "miow"
283−version = "0.3.3"
495+name = "memoffset"
496+version = "0.5.3"
284497source = "registry+https://github.com/rust-lang/crates.io-index"
285498dependencies = [
286− "socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
287− "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
499+ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
288500]
289501
290502[[package]]
291503name = "nom"
292−version = "4.2.0"
504+version = "4.2.3"
293505source = "registry+https://github.com/rust-lang/crates.io-index"
294506dependencies = [
295− "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
507+ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
296508 "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
297509]
298510
299511[[package]]
300−name = "proc-macro2"
301−version = "0.4.27"
512+name = "num-traits"
513+version = "0.2.10"
302514source = "registry+https://github.com/rust-lang/crates.io-index"
303515dependencies = [
304− "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
516+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
305517]
306518
307519[[package]]
308−name = "quick-error"
309−version = "1.2.2"
520+name = "num_cpus"
521+version = "1.11.1"
310522source = "registry+https://github.com/rust-lang/crates.io-index"
523+dependencies = [
524+ "hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
525+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
526+]
311527
312528[[package]]
313−name = "quote"
314−version = "0.6.11"
529+name = "once_cell"
530+version = "1.3.1"
315531source = "registry+https://github.com/rust-lang/crates.io-index"
316−dependencies = [
317− "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
318−]
319532
320533[[package]]
321−name = "redox_syscall"
322−version = "0.1.51"
534+name = "oorandom"
535+version = "11.1.0"
323536source = "registry+https://github.com/rust-lang/crates.io-index"
324537
325538[[package]]
326−name = "redox_termios"
327−version = "0.1.1"
539+name = "pin-project"
540+version = "0.4.16"
328541source = "registry+https://github.com/rust-lang/crates.io-index"
329542dependencies = [
330− "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)",
543+ "pin-project-internal 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)",
331544]
332545
333546[[package]]
334−name = "regex"
335−version = "1.1.0"
547+name = "pin-project-internal"
548+version = "0.4.16"
336549source = "registry+https://github.com/rust-lang/crates.io-index"
337550dependencies = [
338− "aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)",
339− "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
340− "regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
341− "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
342− "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
551+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
552+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
553+ "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
343554]
344555
345556[[package]]
346−name = "regex-syntax"
347−version = "0.6.5"
557+name = "pin-utils"
558+version = "0.1.0"
559+source = "registry+https://github.com/rust-lang/crates.io-index"
560+
561+[[package]]
562+name = "plotters"
563+version = "0.2.12"
348564source = "registry+https://github.com/rust-lang/crates.io-index"
349565dependencies = [
350− "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
566+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
567+ "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
568+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
569+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
351570]
352571
353572[[package]]
354−name = "rustc-demangle"
355−version = "0.1.13"
573+name = "proc-macro-hack"
574+version = "0.5.11"
356575source = "registry+https://github.com/rust-lang/crates.io-index"
576+dependencies = [
577+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
578+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
579+ "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
580+]
357581
358582[[package]]
359−name = "rustfix"
360−version = "0.4.4"
583+name = "proc-macro-nested"
584+version = "0.1.3"
585+source = "registry+https://github.com/rust-lang/crates.io-index"
586+
587+[[package]]
588+name = "proc-macro2"
589+version = "1.0.18"
361590source = "registry+https://github.com/rust-lang/crates.io-index"
362591dependencies = [
363− "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
364− "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
365− "serde 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)",
366− "serde_derive 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)",
367− "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)",
592+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
368593]
369594
370595[[package]]
371−name = "ryu"
372−version = "0.2.7"
596+name = "quote"
597+version = "1.0.2"
373598source = "registry+https://github.com/rust-lang/crates.io-index"
599+dependencies = [
600+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
601+]
374602
375603[[package]]
376−name = "scoped-tls"
377−version = "0.1.2"
604+name = "rayon"
605+version = "1.3.0"
378606source = "registry+https://github.com/rust-lang/crates.io-index"
607+dependencies = [
608+ "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
609+ "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
610+ "rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
611+]
379612
380613[[package]]
381−name = "serde"
382−version = "1.0.85"
614+name = "rayon-core"
615+version = "1.7.0"
383616source = "registry+https://github.com/rust-lang/crates.io-index"
617+dependencies = [
618+ "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
619+ "crossbeam-queue 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
620+ "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
621+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
622+ "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
623+]
384624
385625[[package]]
386−name = "serde_derive"
387−version = "1.0.85"
626+name = "regex"
627+version = "1.3.3"
388628source = "registry+https://github.com/rust-lang/crates.io-index"
389629dependencies = [
390− "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
391− "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
392− "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)",
630+ "regex-syntax 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
393631]
394632
395633[[package]]
396−name = "serde_json"
397−version = "1.0.38"
634+name = "regex-automata"
635+version = "0.1.8"
398636source = "registry+https://github.com/rust-lang/crates.io-index"
399637dependencies = [
400− "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
401− "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
402− "serde 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)",
638+ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
403639]
404640
405641[[package]]
406−name = "socket2"
407−version = "0.3.8"
642+name = "regex-syntax"
643+version = "0.6.13"
644+source = "registry+https://github.com/rust-lang/crates.io-index"
645+
646+[[package]]
647+name = "rustc_version"
648+version = "0.2.3"
408649source = "registry+https://github.com/rust-lang/crates.io-index"
409650dependencies = [
410− "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
411− "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
412− "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)",
413− "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
651+ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
414652]
415653
416654[[package]]
417−name = "sourcefile"
418−version = "0.1.4"
655+name = "ryu"
656+version = "1.0.2"
419657source = "registry+https://github.com/rust-lang/crates.io-index"
420658
421659[[package]]
422−name = "syn"
423−version = "0.15.26"
660+name = "same-file"
661+version = "1.0.5"
424662source = "registry+https://github.com/rust-lang/crates.io-index"
425663dependencies = [
426− "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
427− "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
428− "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
664+ "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
429665]
430666
431667[[package]]
432−name = "synstructure"
433−version = "0.10.1"
668+name = "scoped-tls"
669+version = "1.0.0"
670+source = "registry+https://github.com/rust-lang/crates.io-index"
671+
672+[[package]]
673+name = "scopeguard"
674+version = "1.0.0"
675+source = "registry+https://github.com/rust-lang/crates.io-index"
676+
677+[[package]]
678+name = "semver"
679+version = "0.9.0"
434680source = "registry+https://github.com/rust-lang/crates.io-index"
435681dependencies = [
436− "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
437− "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
438− "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)",
439− "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
682+ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
440683]
441684
442685[[package]]
443−name = "term"
444−version = "0.4.6"
686+name = "semver-parser"
687+version = "0.7.0"
688+source = "registry+https://github.com/rust-lang/crates.io-index"
689+
690+[[package]]
691+name = "serde"
692+version = "1.0.114"
445693source = "registry+https://github.com/rust-lang/crates.io-index"
446694dependencies = [
447− "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
448− "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
695+ "serde_derive 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
449696]
450697
451698[[package]]
452−name = "termcolor"
453−version = "1.0.4"
699+name = "serde_cbor"
700+version = "0.11.1"
454701source = "registry+https://github.com/rust-lang/crates.io-index"
455702dependencies = [
456− "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
703+ "half 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
704+ "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
457705]
458706
459707[[package]]
460−name = "termion"
461−version = "1.5.1"
708+name = "serde_derive"
709+version = "1.0.114"
462710source = "registry+https://github.com/rust-lang/crates.io-index"
463711dependencies = [
464− "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
465− "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)",
466− "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
712+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
713+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
714+ "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
467715]
468716
469717[[package]]
470−name = "tester"
471−version = "0.5.0"
718+name = "serde_json"
719+version = "1.0.57"
472720source = "registry+https://github.com/rust-lang/crates.io-index"
473721dependencies = [
474− "getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
475− "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
476− "term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
722+ "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
723+ "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
724+ "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
477725]
478726
479727[[package]]
480−name = "thread_local"
481−version = "0.3.6"
728+name = "slab"
729+version = "0.4.2"
730+source = "registry+https://github.com/rust-lang/crates.io-index"
731+
732+[[package]]
733+name = "sourcefile"
734+version = "0.1.4"
735+source = "registry+https://github.com/rust-lang/crates.io-index"
736+
737+[[package]]
738+name = "syn"
739+version = "1.0.33"
482740source = "registry+https://github.com/rust-lang/crates.io-index"
483741dependencies = [
484− "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
742+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
743+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
744+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
485745]
486746
487747[[package]]
488−name = "ucd-util"
489−version = "0.1.3"
748+name = "textwrap"
749+version = "0.11.0"
490750source = "registry+https://github.com/rust-lang/crates.io-index"
751+dependencies = [
752+ "unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
753+]
754+
755+[[package]]
756+name = "tinytemplate"
757+version = "1.1.0"
758+source = "registry+https://github.com/rust-lang/crates.io-index"
759+dependencies = [
760+ "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
761+ "serde_json 1.0.57 (registry+https://github.com/rust-lang/crates.io-index)",
762+]
491763
492764[[package]]
493765name = "unicode-segmentation"
494−version = "1.2.1"
766+version = "1.6.0"
495767source = "registry+https://github.com/rust-lang/crates.io-index"
496768
497769[[package]]
498770name = "unicode-width"
499−version = "0.1.5"
771+version = "0.1.6"
500772source = "registry+https://github.com/rust-lang/crates.io-index"
501773
502774[[package]]
503775name = "unicode-xid"
504−version = "0.1.0"
776+version = "0.2.0"
505777source = "registry+https://github.com/rust-lang/crates.io-index"
506778
507779[[package]]
508−name = "utf8-ranges"
509−version = "1.0.2"
780+name = "version_check"
781+version = "0.1.5"
510782source = "registry+https://github.com/rust-lang/crates.io-index"
511783
512784[[package]]
513−name = "version_check"
514−version = "0.1.5"
785+name = "walkdir"
786+version = "2.3.1"
515787source = "registry+https://github.com/rust-lang/crates.io-index"
788+dependencies = [
789+ "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
790+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
791+ "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
792+]
516793
517794[[package]]
518795name = "wasm-bindgen"
519−version = "0.2.33"
796+version = "0.2.55"
797+source = "registry+https://github.com/rust-lang/crates.io-index"
520798dependencies = [
521− "wasm-bindgen-macro 0.2.33",
799+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
800+ "wasm-bindgen-macro 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
522801]
523802
524803[[package]]
525804name = "wasm-bindgen-backend"
526−version = "0.2.33"
805+version = "0.2.55"
806+source = "registry+https://github.com/rust-lang/crates.io-index"
527807dependencies = [
528− "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
529− "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
530− "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
531− "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
532− "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)",
533− "wasm-bindgen-shared 0.2.33",
808+ "bumpalo 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
809+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
810+ "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
811+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
812+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
813+ "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
814+ "wasm-bindgen-shared 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
534815]
535816
536817[[package]]
537818name = "wasm-bindgen-futures"
538−version = "0.3.10"
819+version = "0.4.5"
820+source = "registry+https://github.com/rust-lang/crates.io-index"
539821dependencies = [
540− "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
541− "js-sys 0.3.10",
542− "wasm-bindgen 0.2.33",
822+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
823+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
824+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
825+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
543826]
544827
545828[[package]]
546829name = "wasm-bindgen-macro"
547−version = "0.2.33"
830+version = "0.2.55"
831+source = "registry+https://github.com/rust-lang/crates.io-index"
548832dependencies = [
549− "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
550− "wasm-bindgen-macro-support 0.2.33",
833+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
834+ "wasm-bindgen-macro-support 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
551835]
552836
553837[[package]]
554838name = "wasm-bindgen-macro-support"
555−version = "0.2.33"
839+version = "0.2.55"
840+source = "registry+https://github.com/rust-lang/crates.io-index"
556841dependencies = [
557− "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
558− "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
559− "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)",
560− "wasm-bindgen-backend 0.2.33",
561− "wasm-bindgen-shared 0.2.33",
842+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
843+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
844+ "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
845+ "wasm-bindgen-backend 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
846+ "wasm-bindgen-shared 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
562847]
563848
564849[[package]]
565850name = "wasm-bindgen-shared"
566−version = "0.2.33"
851+version = "0.2.55"
852+source = "registry+https://github.com/rust-lang/crates.io-index"
567853
568854[[package]]
569855name = "wasm-bindgen-test"
570−version = "0.2.33"
856+version = "0.3.5"
857+source = "registry+https://github.com/rust-lang/crates.io-index"
571858dependencies = [
572− "console_error_panic_hook 0.1.5",
573− "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
574− "js-sys 0.3.10",
575− "scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
576− "wasm-bindgen 0.2.33",
577− "wasm-bindgen-futures 0.3.10",
578− "wasm-bindgen-test-macro 0.2.33",
859+ "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
860+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
861+ "scoped-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
862+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
863+ "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
864+ "wasm-bindgen-test-macro 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
579865]
580866
581867[[package]]
582868name = "wasm-bindgen-test-macro"
583−version = "0.2.33"
869+version = "0.3.5"
870+source = "registry+https://github.com/rust-lang/crates.io-index"
584871dependencies = [
585− "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
586− "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
872+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
873+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
587874]
588875
589876[[package]]
590877name = "wasm-bindgen-webidl"
591−version = "0.2.27"
878+version = "0.2.55"
879+source = "registry+https://github.com/rust-lang/crates.io-index"
592880dependencies = [
593− "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
881+ "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
594882 "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
595− "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
596− "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
597− "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
598− "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)",
599− "wasm-bindgen-backend 0.2.33",
600− "weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
883+ "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
884+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
885+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
886+ "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
887+ "wasm-bindgen-backend 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
888+ "weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
601889]
602890
603891[[package]]
604892name = "web-sys"
605−version = "0.3.10"
893+version = "0.3.32"
894+source = "registry+https://github.com/rust-lang/crates.io-index"
606895dependencies = [
607− "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
608− "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
609− "js-sys 0.3.10",
896+ "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
897+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
610898 "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
611− "wasm-bindgen 0.2.33",
612− "wasm-bindgen-webidl 0.2.27",
899+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
900+ "wasm-bindgen-webidl 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
613901]
614902
615903[[package]]
616904name = "weedle"
617−version = "0.8.0"
905+version = "0.10.0"
618906source = "registry+https://github.com/rust-lang/crates.io-index"
619907dependencies = [
620− "nom 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
908+ "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
621909]
622910
623911[[package]]
624912name = "winapi"
625−version = "0.2.8"
626−source = "registry+https://github.com/rust-lang/crates.io-index"
627−
628−[[package]]
629−name = "winapi"
630−version = "0.3.6"
913+version = "0.3.8"
631914source = "registry+https://github.com/rust-lang/crates.io-index"
632915dependencies = [
633916 "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
634917 "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
635918]
636919
637−[[package]]
638−name = "winapi-build"
639−version = "0.1.1"
640−source = "registry+https://github.com/rust-lang/crates.io-index"
641−
642920[[package]]
643921name = "winapi-i686-pc-windows-gnu"
644922version = "0.4.0"
@@ -649,7 +927,7 @@ name = "winapi-util"
649927version = "0.1.2"
650928source = "registry+https://github.com/rust-lang/crates.io-index"
651929dependencies = [
652− "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
930+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
653931]
654932
655933[[package]]
@@ -657,76 +935,101 @@ name = "winapi-x86_64-pc-windows-gnu"
657935version = "0.4.0"
658936source = "registry+https://github.com/rust-lang/crates.io-index"
659937
660−[[package]]
661−name = "wincolor"
662−version = "1.0.1"
663−source = "registry+https://github.com/rust-lang/crates.io-index"
664−dependencies = [
665− "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
666− "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
667−]
668−
669938[metadata]
670−"checksum aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9a933f4e58658d7b12defcf96dc5c720f20832deebe3e0a19efd3b6aaeeb9e"
671−"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
672−"checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799"
673−"checksum backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "b5b493b66e03090ebc4343eb02f94ff944e0cbc9ac6571491d170ba026741eb5"
674−"checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6"
675−"checksum cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4a8b715cb4597106ea87c7c84b2f1d452c7492033765df7f32651e66fcf749"
676−"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4"
677−"checksum compiletest_rs 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)" = "0d76d4322a40f6b0db7259d4f2c8a65ed8b0d84fce0bbc61b98cf47f8ec6eec3"
678−"checksum console_log 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1e7871d2947441b0fdd8e2bd1ce2a2f75304f896582c0d572162d48290683c48"
679−"checksum diff 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "3c2b69f912779fbb121ceb775d74d51e915af17aaebc38d28a592843a2dd0a3a"
680−"checksum env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "afb070faf94c85d17d50ca44f6ad076bce18ae92f0037d350947240a36e9d42e"
681−"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2"
682−"checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1"
683−"checksum filetime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a2df5c1a8c4be27e7707789dc42ae65976e60b394afd293d1419ab915833e646"
684−"checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b"
685−"checksum getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "0a7292d30132fb5424b354f5dc02512a86e4c516fe544bb7a25e7f266951b797"
939+"checksum anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "9267dff192e68f3399525901e709a48c1d3982c9c072fa32f2127a0cb0babf14"
940+"checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90"
941+"checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2"
942+"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
943+"checksum bstr 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8d6c2c5b58ab920a4f5aeaaca34b4488074e8cc7596af94e6f8c6ff247c60245"
944+"checksum bumpalo 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad807f2fc2bf185eeb98ff3a901bd46dc5ad58163d0fa4577ba0d25674d71708"
945+"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5"
946+"checksum cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0"
947+"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
948+"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9"
949+"checksum console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b8d976903543e0c48546a91908f21588a680a8c8f984df9a5d69feccb2b2a211"
950+"checksum console_log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "501a375961cef1a0d44767200e66e4a559283097e91d0730b1d75dfb2f8a1494"
951+"checksum criterion 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "70daa7ceec6cf143990669a04c7df13391d55fb27bd4079d252fca774ba244d8"
952+"checksum criterion-plot 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e022feadec601fba1649cfa83586381a4ad31c6bf3a9ab7d408118b05dd9889d"
953+"checksum crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca"
954+"checksum crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac"
955+"checksum crossbeam-queue 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dfd6515864a82d2f877b42813d4553292c6659498c9a2aa31bab5a15243c2700"
956+"checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4"
957+"checksum csv 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "37519ccdfd73a75821cac9319d4fce15a81b9fcf75f951df5b9988aa3a0af87d"
958+"checksum csv-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9b5cadb6b25c77aeff80ba701712494213f4a8418fcda2ee11b6560c3ad0bf4c"
959+"checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
960+"checksum futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613"
961+"checksum futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5"
962+"checksum futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399"
963+"checksum futures-executor 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314"
964+"checksum futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789"
965+"checksum futures-macro 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39"
966+"checksum futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc"
967+"checksum futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626"
968+"checksum futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6"
969+"checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
970+"checksum half 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d36fab90f82edc3c747f9d438e06cf0a491055896f2a279638bb5beed6c40177"
686971"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
687−"checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114"
688−"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b"
689−"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
690−"checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1"
691−"checksum libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "e962c7641008ac010fa60a7dfdc1712449f29c44ef2d4702394aea943ee75047"
692−"checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6"
693−"checksum memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1dd4eaac298c32ce07eb6ed9242eda7d82955b9170b7d6db59b2e02cc63fcb8"
694−"checksum miow 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "396aa0f2003d7df8395cb93e09871561ccc3e785f0acb369170e8cc74ddf9226"
695−"checksum nom 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b30adc557058ce00c9d0d7cb3c6e0b5bc6f36e2e2eabe74b0ba726d194abd588"
696−"checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915"
697−"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0"
698−"checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1"
699−"checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85"
700−"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
701−"checksum regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37e7cbbd370869ce2e8dff25c7018702d10b21a20ef7135316f8daecd6c25b7f"
702−"checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861"
703−"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619"
704−"checksum rustfix 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "af7c21531a91512a4a51b490be6ba1c8eff34fdda0dc5bf87dc28d86748aac56"
705−"checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7"
706−"checksum scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "332ffa32bf586782a3efaeb58f127980944bbc8c4d6913a86107ac2a5ab24b28"
707−"checksum serde 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)" = "534b8b91a95e0f71bca3ed5824752d558da048d4248c91af873b63bd60519752"
708−"checksum serde_derive 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)" = "a915306b0f1ac5607797697148c223bedeaa36bcc2e28a01441cd638cc6567b4"
709−"checksum serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)" = "27dce848e7467aa0e2fcaf0a413641499c0b745452aaca1194d24dedde9e13c9"
710−"checksum socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d11a52082057d87cb5caa31ad812f4504b97ab44732cd8359df2e9ff9f48e7"
972+"checksum hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "307c3c9f937f38e3534b1d6447ecf090cafcc9744e4a6360e8b037b2cf5af120"
973+"checksum itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
974+"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f"
975+"checksum js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)" = "1c840fdb2167497b0bd0db43d6dfe61e91637fa72f9d061f8bd17ddc44ba6414"
976+"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
977+"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558"
978+"checksum log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
979+"checksum longest-increasing-subsequence 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86"
980+"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"
981+"checksum memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9"
982+"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6"
983+"checksum num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c81ffc11c212fa327657cb19dd85eb7419e163b5b076bede2bdb5c974c07e4"
984+"checksum num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76dac5ed2a876980778b8b85f75a71b6cbf0db0b1232ee12f826bccb00d09d72"
985+"checksum once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1c601810575c99596d4afc46f78a678c80105117c379eb3650cf99b8a21ce5b"
986+"checksum oorandom 11.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebcec7c9c2a95cacc7cd0ecb89d8a8454eca13906f6deb55258ffff0adeb9405"
987+"checksum pin-project 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)" = "81d480cb4e89522ccda96d0eed9af94180b7a5f93fb28f66e1fd7d68431663d1"
988+"checksum pin-project-internal 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)" = "a82996f11efccb19b685b14b5df818de31c1edcee3daa256ab5775dd98e72feb"
989+"checksum pin-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
990+"checksum plotters 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "4e3bb8da247d27ae212529352020f3e5ee16e83c0c258061d27b08ab92675eeb"
991+"checksum proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5"
992+"checksum proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e"
993+"checksum proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa"
994+"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
995+"checksum rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098"
996+"checksum rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9"
997+"checksum regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b5508c1941e4e7cb19965abef075d35a9a8b5cdf0846f30b4050e9b55dc55e87"
998+"checksum regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9"
999+"checksum regex-syntax 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e734e891f5b408a29efbf8309e656876276f49ab6a6ac208600b4419bd893d90"
1000+"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
1001+"checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8"
1002+"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421"
1003+"checksum scoped-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2"
1004+"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d"
1005+"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
1006+"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
1007+"checksum serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)" = "5317f7588f0a5078ee60ef675ef96735a1442132dc645eb1d12c018620ed8cd3"
1008+"checksum serde_cbor 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e18acfa2f90e8b735b2836ab8d538de304cbb6729a7360729ea5a895d15a622"
1009+"checksum serde_derive 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)" = "2a0be94b04690fbaed37cddffc5c134bf537c8e3329d53e982fe04c374978f8e"
1010+"checksum serde_json 1.0.57 (registry+https://github.com/rust-lang/crates.io-index)" = "164eacbdb13512ec2745fb09d51fd5b22b0d65ed294a1dcf7285a360c80a675c"
1011+"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
7111012"checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3"
712−"checksum syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)" = "f92e629aa1d9c827b2bb8297046c1ccffc57c99b947a680d3ccff1f136a3bee9"
713−"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015"
714−"checksum term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1"
715−"checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f"
716−"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
717−"checksum tester 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e812cb26c597f86a49b26dbb58b878bd2a2b4b93fc069dc39499228fe556ff6"
718−"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
719−"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86"
720−"checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1"
721−"checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526"
722−"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
723−"checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737"
1013+"checksum syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)" = "e8d5d96e8cbb005d6959f119f773bfaebb5684296108fb32600c00cde305b2cd"
1014+"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
1015+"checksum tinytemplate 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d3dc76004a03cec1c5932bca4cdc2e39aaa798e3f82363dd94f9adf6098c12f"
1016+"checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0"
1017+"checksum unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7007dbd421b92cc6e28410fe7362e2e0a2503394908f417b68ec8d1c364c4e20"
1018+"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
7241019"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
725−"checksum weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26a4c67f132386d965390b8a734d5d10adbcd30eb5cc74bd9229af8b83f10044"
726−"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
727−"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0"
728−"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
1020+"checksum walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d"
1021+"checksum wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "29ae32af33bacd663a9a28241abecf01f2be64e6a185c6139b04f18b6385c5f2"
1022+"checksum wasm-bindgen-backend 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "1845584bd3593442dc0de6e6d9f84454a59a057722f36f005e44665d6ab19d85"
1023+"checksum wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1458706aa1b8fe6898d19433c9f110d93a05d1f22ae6adf55810409a94df34b4"
1024+"checksum wasm-bindgen-macro 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "87fcc747e6b73c93d22c947a6334644d22cfec5abd8b66238484dc2b0aeb9fe4"
1025+"checksum wasm-bindgen-macro-support 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "3dc4b3f2c4078c8c4a5f363b92fcf62604c5913cbd16c6ff5aaf0f74ec03f570"
1026+"checksum wasm-bindgen-shared 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "ca0b78d6d3be8589b95d1d49cdc0794728ca734adf36d7c9f07e6459508bb53d"
1027+"checksum wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ed5833682054e941db0b7e2b4877b61bbaafd680608e40d268e070d34558b305"
1028+"checksum wasm-bindgen-test-macro 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "9c5dcf70d21d0ff0ea5cdb97dba9a9b56ddad4a9bd10c8912eedc55618be022f"
1029+"checksum wasm-bindgen-webidl 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "3126356474ceb717c8fb5549ae387c9fbf4872818454f4d87708bee997214bb5"
1030+"checksum web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)" = "98405c0a2e722ed3db341b4c5b70eb9fe0021621f7350bab76df93b09b649bbf"
1031+"checksum weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bb43f70885151e629e2a19ce9e50bd730fd436cfd4b666894c9ce4de9141164"
1032+"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
7291033"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
7301034"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9"
7311035"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
732−"checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba"
Cargo.toml+69−26
@@ -1,22 +1,59 @@
11[package]
2−name = "dodrio"
3−version = "0.1.0"
42authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
3+categories = ["wasm", "web-programming"]
4+description = "A fast, bump-allocated virtual DOM library."
55edition = "2018"
6+keywords = ["virtual-dom", "vdom", "render", "bump"]
7+license = "MPL-2.0"
8+name = "dodrio"
9+readme = "./README.md"
10+repository = "https://github.com/fitzgen/dodrio"
11+version = "0.2.0"
12+
13+[badges]
14+travis-ci = { repository = "fitzgen/dodrio" }
15+
16+[lib]
17+path = "src/lib.rs"
18+bench = false
19+
20+[[test]]
21+name = "web"
22+path = "tests/web/main.rs"
23+required-features = ["xxx-unstable-internal-use-only"]
24+
25+[[bench]]
26+name = "benches"
27+path = "benches/benches.rs"
28+harness = false
29+required-features = ["xxx-unstable-internal-use-only"]
630
731[features]
8−default = []
32+# Don't rely on this feature! Its behavior will change and it could go away at
33+# any time. This enables monkey-patching DOM methods so that we wrap them and
34+# trace what DOM methods are used and how many times they are invoked when
35+# applying our emitted change lists to the physical DOM. This is useful for
36+# evaluating the differences between how Dodrio applies changes from virtual
37+# nodes to the physical DOM versus how other virtual DOM libraries do the same.
38+xxx-unstable-strace = []
39+
40+# Don't use this feature! It only exists for exposing otherwise-internal APIs
41+# for testing and benchmarks.
42+xxx-unstable-internal-use-only = []
943
1044[dependencies]
11−bumpalo = "1.0.2"
12−futures = "0.1"
13−wasm-bindgen = "0.2.33"
14−wasm-bindgen-futures = "0.3.10"
15−js-sys = "0.3.10"
16−log = "0.4.6"
45+bumpalo = "2.6.0"
46+cfg-if = "0.1.10"
47+fxhash = "0.2.1"
48+js-sys = "0.3.32"
49+log = { version = "0.4.11", optional = true }
50+longest-increasing-subsequence = "0.1.0"
51+serde = { version = "1.0.114", optional = true }
52+wasm-bindgen = "0.2.55"
53+wasm-bindgen-futures = "0.4.5"
1754
1855[dependencies.web-sys]
19−version = "0.3.10"
56+version = "0.3.32"
2057features = [
2158 "console",
2259 "Document",
@@ -27,11 +64,14 @@ features = [
2764]
2865
2966[dev-dependencies]
30−wasm-bindgen-test = "0.2"
31−console_log = "0.1.2"
67+console_log = "0.2.0"
68+dodrio-js-api = { version = "=0.2.0", path = "./crates/js-api" }
69+futures = "0.3.5"
70+log = "0.4.11"
71+wasm-bindgen-test = "0.3.5"
3272
3373[dev-dependencies.web-sys]
34−version = "0.3.10"
74+version = "0.3.32"
3575features = [
3676 "Attr",
3777 "EventTarget",
@@ -40,23 +80,26 @@ features = [
4080 "NodeList",
4181]
4282
83+[target.'cfg(not(target_arch = "wasm32"))'.dev-dependencies]
84+criterion = "0.3.3"
85+
86+[profile.bench]
87+debug = true
88+
4389[profile.release]
44−# Tell `rustc` to optimize for small code size.
90+incremental = false
91+lto = true
4592opt-level = "s"
4693
4794[workspace]
4895members = [
49− "./compile-tests",
50− "./examples/counter/crate",
96+ "./crates/js-api",
97+ "./examples/counter",
98+ "./examples/game-of-life",
5199 "./examples/hello-world",
52− "./examples/input-form/crate",
100+ "./examples/input-form",
101+ "./examples/js-component",
102+ "./examples/moire",
103+ "./examples/sierpinski-triangle",
104+ "./examples/todomvc",
53105]
54−
55−[patch.crates-io]
56−wasm-bindgen = { path = "../wasm-bindgen" }
57−web-sys = { path = "../wasm-bindgen/crates/web-sys" }
58−js-sys = { path = "../wasm-bindgen/crates/js-sys" }
59−wasm-bindgen-futures = { path = "../wasm-bindgen/crates/futures" }
60−wasm-bindgen-test = { path = "../wasm-bindgen/crates/test" }
61−bumpalo = { path = "../bumpalo" }
62−console_error_panic_hook = { path = "../console_error_panic_hook" }
README.md+60−23
@@ -1,15 +1,14 @@
1−# `dodrio`
1+# Dodrio
22
3−`dodrio` is an **experimental** virtual DOM library for Rust and WebAssembly. It
4−is a proving ground for a bump allocation-based virtual DOM architecture, that I
5−believe is the best way to take advantage of WebAssembly's strengths in the
6−context of a virtual DOM library.
3+A fast, bump-allocated virtual DOM library for Rust and WebAssembly. Note that
4+Dodrio is still **experimental**.
75
86<!-- START doctoc generated TOC please keep comment here to allow auto update -->
97<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
108
119
1210- [Warning](#warning)
11+- [Examples](#examples)
1312- [Design](#design)
1413 - [Bump Allocation](#bump-allocation)
1514 - [Change List as Stack Machine](#change-list-as-stack-machine)
@@ -19,11 +18,53 @@ context of a virtual DOM library.
1918
2019## Warning
2120
22−I reiterate that `dodrio` is in a very **experimental** state. It has not
23−actually been profiled or tuned for performance yet, so while I think the design
24−should yield a very fast virtual DOM library, `dodrio` is almost certainly not
25−fast right now. Additionally, it is probably riddled with bugs, and is assuredly
26−missing features that are critical for actually building Web applications.
21+I reiterate that Dodrio is in a very **experimental** state. It probably has
22+bugs, and no one is using it in production.
23+
24+## Examples
25+
26+Here is the classic "Hello, World!" example:
27+
28+```rust
29+struct Hello {
30+ who: String,
31+}
32+
33+impl Render for Hello {
34+ fn render<'a>(&self, cx: &mut RenderContext<a>) -> Node<'a> {
35+ let who = bumpalo::format!(in cx.bump, "Hello, {}!", self.who);
36+ div(cx)
37+ .children([text(who.into_bump_str())])
38+ .finish()
39+ }
40+}
41+```
42+
43+More examples can be found in [the `examples`
44+directory](https://github.com/fitzgen/dodrio/tree/master/examples), including:
45+
46+* [`counter`](https://github.com/fitzgen/dodrio/tree/master/examples/counter):
47+ Incrementing and decrementing a counter.
48+* [`input-form`](https://github.com/fitzgen/dodrio/tree/master/examples/input-form):
49+ Reading an `<input>` and displaying its contents.
50+* [`todomvc`](https://github.com/fitzgen/dodrio/tree/master/examples/todomvc):
51+ An implementation of the infamous TodoMVC application.
52+* [`moire`](https://github.com/fitzgen/dodrio/tree/master/examples/moire): The
53+ WebRender Moiré patterns demo.
54+* [`game-of-life`](https://github.com/fitzgen/dodrio/tree/master/examples/game-of-life):
55+ The Rust and WebAssembly book's Game of Life tutorial rendered with Dodrio
56+ instead of to 2D canvas.
57+* [`js-component`](https://github.com/fitzgen/dodrio/tree/master/examples/js-component):
58+ Defines a rendering component in JavaScript with the `dodrio-js-api` crate.
59+
60+## Cargo Features
61+
62+* `log` &mdash; enable debugging-oriented log messages with the `log` crate's
63+ facade. You still have to initialize a logger for the messages to go anywhere,
64+ such as [`console_log`](https://github.com/iamcodemaker/console_log).
65+
66+* `serde` &mdash; enable `serde::{Serialize, Deserialize}` implementations for
67+ `Cached<R>` where `R` is serializable and deserializable.
2768
2869## Design
2970
@@ -33,7 +74,7 @@ Bump allocation is essentially the fastest method of allocating objects. It has
3374constraints, but works particularly well when allocation lifetimes match program
3475phases. And virtual DOMs are very phase oriented.
3576
36−`dodrio` maintains three bump allocation arenas:
77+Dodrio maintains three bump allocation arenas:
3778
38791. The newest, most up-to-date virtual DOM. The virtual DOM nodes themselves and
3980 any temporary containers needed while creating them are allocated into this
@@ -46,12 +87,12 @@ phases. And virtual DOMs are very phase oriented.
4687
4788Rendering happens as follows:
4889
49−* The application state is rendered into bump allocation arena (1).
50−* (1) diffed with (2) and the changes are emitted into (3).
51−* JavaScript code applies the change list in (3) to the physical DOM.
52−* (1) and (2) are swapped, double-buffering style, and the new (1) has its bump
53− allocation pointer reset, as does (3).
54−* Rinse and repeat.
90+1. The application state is rendered into bump allocation arena (1).
91+2. (1) is diffed with (2) and the changes are emitted into (3).
92+3. JavaScript code applies the change list in (3) to the physical DOM.
93+4. (1) and (2) are swapped, double-buffering style, and the new (1) has its bump
94+ allocation pointer reset, as does (3).
95+5. Rinse and repeat.
5596
5697### Change List as Stack Machine
5798
@@ -62,10 +103,6 @@ diffs, a task that is essentially a tree traversal.
62103
63104### Library — Not Framework
64105
65−`dodrio` is just a library. (And did I mention it is experimental?!) It is not a
106+Dodrio is just a library. (And did I mention it is experimental?!) It is not a
66107full-fledged, complete, batteries-included solution for all frontend Web
67−development. And it never intends to become that either. Its highest ambition is
68−to prove that its bump allocation-based design is a good one, and maaaayyyyyybe
69−become a production-grade virtual DOM library that you could plug into a larger
70−application or toolkit eventually. But it will never be a complete,
71−batteries-included framework.
108+development. And it never intends to become that either.
benches/benches.rsnew file+118
@@ -0,0 +1,118 @@
1+#![cfg(all(
2+ feature = "xxx-unstable-internal-use-only",
3+ not(target_arch = "wasm32")
4+))]
5+
6+use criterion::{
7+ black_box, criterion_group, criterion_main, Benchmark, Criterion, ParameterizedBenchmark,
8+ Throughput,
9+};
10+use dodrio::{
11+ builder::*,
12+ bumpalo::{self, Bump},
13+ CachedSet, Node, Render, RenderContext, Vdom,
14+};
15+use std::cell::RefCell;
16+use std::convert::TryInto;
17+
18+/// The simplest thing we can render: `<div/>`.
19+struct Empty;
20+impl<'a> Render<'a> for Empty {
21+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
22+ div(&cx).finish()
23+ }
24+}
25+
26+/// Render a list that is `self.0` items long, has attributes and listeners.
27+struct SimpleList(usize);
28+impl<'a> Render<'a> for SimpleList {
29+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
30+ let mut children = bumpalo::collections::Vec::with_capacity_in(self.0, cx.bump);
31+ children.extend((0..self.0).map(|_| {
32+ li(&cx)
33+ .attr("class", "my-list-item")
34+ .on("click", |_root, _vdom, _event| {
35+ panic!("no one should call this")
36+ })
37+ .children([text("a list item")])
38+ .finish()
39+ }));
40+ ol(&cx).attr("id", "my-list").children(children).finish()
41+ }
42+}
43+
44+fn criterion_benchmark(c: &mut Criterion) {
45+ c.bench(
46+ "render",
47+ Benchmark::new("empty", {
48+ let mut bump = Bump::new();
49+ let cached_set = RefCell::new(CachedSet::default());
50+ let mut templates = Default::default();
51+ move |b| {
52+ bump.reset();
53+ let mut cx = RenderContext::new(&bump, &cached_set, &mut templates);
54+ b.iter(|| {
55+ black_box(Empty.render(&mut cx));
56+ })
57+ }
58+ }),
59+ );
60+
61+ c.bench(
62+ "render",
63+ ParameterizedBenchmark::new(
64+ "list",
65+ {
66+ let mut bump = Bump::new();
67+ let cached_set = RefCell::new(CachedSet::default());
68+ let mut templates = Default::default();
69+ move |b, n| {
70+ bump.reset();
71+ let mut cx = RenderContext::new(&bump, &cached_set, &mut templates);
72+ b.iter(|| {
73+ black_box(SimpleList(*n).render(&mut cx));
74+ })
75+ }
76+ },
77+ vec![100, 1_000, 10_000],
78+ )
79+ .throughput(|n| Throughput::Elements((*n).try_into().unwrap())),
80+ );
81+
82+ c.bench(
83+ "render-and-diff",
84+ ParameterizedBenchmark::new(
85+ "same-list",
86+ |b, &n| {
87+ let vdom = Vdom::new(&(), SimpleList(n));
88+ b.iter(|| {
89+ vdom.immediately_render_and_diff(SimpleList(n));
90+ black_box(&vdom);
91+ })
92+ },
93+ vec![100, 1_000, 10_000],
94+ )
95+ .with_function("empty-to-full-list-to-empty", |b, &n| {
96+ b.iter(|| {
97+ let vdom = Vdom::new(&(), Empty);
98+ vdom.immediately_render_and_diff(SimpleList(n));
99+ black_box(&vdom);
100+ vdom.immediately_render_and_diff(Empty);
101+ black_box(&vdom);
102+ });
103+ })
104+ .with_function("append-one-and-remove-one", |b, &n| {
105+ let vdom = Vdom::new(&(), SimpleList(n));
106+ b.iter(|| {
107+ vdom.immediately_render_and_diff(SimpleList(n + 1));
108+ black_box(&vdom);
109+ vdom.immediately_render_and_diff(SimpleList(n));
110+ black_box(&vdom);
111+ })
112+ })
113+ .throughput(|n| Throughput::Elements((*n).try_into().unwrap())),
114+ );
115+}
116+
117+criterion_group!(benches, criterion_benchmark);
118+criterion_main!(benches);
build.sh+3−26
@@ -3,32 +3,9 @@
33cd $(dirname $0)
44set -eux
55
6−INSTALL=${INSTALL:-""}
7−
8−function with_dir {
9− pushd $1
10− shift
11− $@
12− popd
13−}
14−
15−cargo fmt --all
16−cargo check --all --target wasm32-unknown-unknown
17−
18−if test "$INSTALL" != ""; then
19− with_dir ./js npm link
20−fi
6+cargo fmt --all || true
7+cargo build --all --target wasm32-unknown-unknown
218
229for x in ./examples/*; do
23− wasm-pack build "$x/crate"
24−
25− if test "$INSTALL" != ""; then
26− with_dir "$x/crate/pkg" npm link
27− with_dir "$x/crate/pkg" npm link dodrio
28− with_dir "$x/js" npm audit fix
29− with_dir "$x/js" npm install
30− with_dir "$x/js" npm link dodrio
31− fi
32−
33− with_dir "$x/js/" npm run build
10+ wasm-pack build --target web "$x"
3411done
compile-tests/Cargo.tomldeleted−11
@@ -1,11 +0,0 @@
1−[package]
2−name = "compile-tests"
3−version = "0.1.0"
4−authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
5−publish = false
6−
7−[dependencies]
8−dodrio = { path = ".." }
9−
10−[dev-dependencies]
11−compiletest_rs = { version = "0.3.18", features = ["norustc", "stable"] }
compile-tests/compile-fail/cached_uaf.rsdeleted−58
@@ -1,58 +0,0 @@
1−extern crate bumpalo;
2−extern crate dodrio;
3−extern crate web_sys;
4−
5−use bumpalo::Bump;
6−use dodrio::{Cached, Node, Render, Vdom};
7−use std::cell::Cell;
8−
9−pub struct CountRenders {
10− render_count: Cell<usize>,
11−}
12−
13−impl CountRenders {
14− pub fn new() -> CountRenders {
15− CountRenders {
16− render_count: Cell::new(0),
17− }
18− }
19−}
20−
21−impl Render for CountRenders {
22− fn render<'a, 'bump>(&'a self, bump: &'bump Bump) -> Node<'bump>
23− where
24− 'a: 'bump,
25− {
26− let count = self.render_count.get() + 1;
27− self.render_count.set(count);
28−
29− let s = bumpalo::format!(in bump, "{}", count);
30− Node::text(s.into_bump_str())
31− }
32−}
33−
34−fn use_after_free_with_cached_components() {
35− let container = web_sys::window()
36− .unwrap()
37− .document()
38− .unwrap()
39− .create_element("div")
40− .unwrap();
41−
42− // Create a component that caches its own rendered results.
43− let mut cached = Cached::new(CountRenders::new());
44−
45− // The vdom's current root is pointing into cached's bump memory.
46− let mut vdom = Vdom::new(&container, &cached);
47−
48− // Drop the cached component and its bump memory.
49− drop(cached);
50− //~^ ERROR
51−
52− // Rendering a new component will diff against the current component's last
53− // render, which will be stored in the (now freed) bump inside
54− // `Cached`. Yikes!
55− vdom.render_component(&CountRenders::new());
56−}
57−
58−fn main() {}
compile-tests/src/main.rsdeleted−26
@@ -1,26 +0,0 @@
1−fn main() {}
2−
3−#[cfg(test)]
4−mod tests {
5− extern crate compiletest_rs as compiletest;
6− use std::path::PathBuf;
7−
8− fn run_mode(mode: &'static str) {
9− let mut config = self::compiletest::Config::default();
10−
11− config.mode = mode.parse().expect("Invalid mode");
12− config.src_base = PathBuf::from(format!("{}", mode));
13−
14− // Populate config.target_rustcflags with dependencies on the path.
15− config.link_deps();
16− // If your tests import the parent crate, this helps with E0464
17− config.clean_rmeta();
18−
19− compiletest::run_tests(&config);
20− }
21−
22− #[test]
23− fn compile_test() {
24− run_mode("compile-fail");
25− }
26−}
crates/js-api/Cargo.tomlnew file+22
@@ -0,0 +1,22 @@
1+[package]
2+authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
3+categories = ["wasm", "web-programming"]
4+description = "An API for implementing Dodrio rendering components with JavaScript"
5+edition = "2018"
6+keywords = ["javascript", "js", "vdom", "virtual-dom"]
7+license = "MPL-2.0"
8+name = "dodrio-js-api"
9+repository = "https://github.com/fitzgen/dodrio"
10+version = "0.2.0"
11+
12+[badges]
13+travis-ci = { repository = "fitzgen/dodrio" }
14+
15+[dependencies]
16+dodrio = { version = "=0.2.0", path = "../.." }
17+wasm-bindgen = "0.2.55"
18+js-sys = "0.3.32"
19+wasm-bindgen-futures = "0.4.5"
20+
21+[dev-dependencies]
22+wasm-bindgen-test = "0.3.5"
crates/js-api/src/lib.rsnew file+324
@@ -0,0 +1,324 @@
1+/*!
2+
3+Implementing `dodrio` render components with JavaScript.
4+
5+This crate provides a Rust type `JsRender` that wraps a JavaScript object with a
6+`render` method. `JsRender` implements `dodrio::Render` by calling its wrapped
7+object's `render` method to get a JavaScript virtual DOM represented as a tree
8+of JavaScript values. It then converts this tree of JavaScript values into
9+`dodrio`'s normal bump-allocated virtual DOM representation.
10+
11+This is likely much slower than rendering virtual DOMs directly into the bump
12+allocator from the Rust side of things! Additionally, the shape of the
13+JavaScript virtual DOM is a bit funky and unidiomatic. Keep in mind that this
14+crate exists as a proof of concept for integrating JavaScript components into
15+`dodrio` -- which is itself *also* experimental -- and so this crate definitely
16+has some rough edges.
17+
18+# Example
19+
20+Here is a JavaScript implementation of a rendering component:
21+
22+```javascript
23+class Greeting {
24+ constructor(who) {
25+ this.who = who;
26+ }
27+
28+ render() {
29+ return {
30+ tagName: "p",
31+ attributes: [
32+ {
33+ name: "class",
34+ value: "greeting",
35+ },
36+ ],
37+ listeners: [
38+ {
39+ on: "click",
40+ callback: this.onClick.bind(this),
41+ }
42+ ],
43+ children: [
44+ "Hello, ",
45+ {
46+ tagName: "strong",
47+ children: [this.who],
48+ }
49+ ],
50+ };
51+ }
52+
53+ async onClick(vdom, event) {
54+ // Be more excited!
55+ this.who += "!";
56+
57+ // Schedule a re-render.
58+ await vdom.render();
59+
60+ console.log("re-rendering finished!");
61+ }
62+}
63+```
64+
65+And here is a Rust rendering component that internally uses the JS rendering
66+component:
67+
68+```rust,no_run
69+use dodrio::{Node, Render, RenderContext, Vdom};
70+use dodrio_js_api::JsRender;
71+use js_sys::Object;
72+use wasm_bindgen::prelude::*;
73+
74+#[wasm_bindgen]
75+extern {
76+ // Import the JS `Greeting` class.
77+ #[wasm_bindgen(extends = Object)]
78+ #[derive(Clone, Debug)]
79+ type Greeting;
80+
81+ // And the `Greeting` class's constructor.
82+ #[wasm_bindgen(constructor)]
83+ fn new(who: &str) -> Greeting;
84+}
85+
86+/// This is our Rust rendering component that wraps the JS rendering component.
87+pub struct GreetingViaJs {
88+ js: JsRender,
89+}
90+
91+impl GreetingViaJs {
92+ /// Create a new `GreetingViaJs`, which will internally create a new JS
93+ /// `Greeting`.
94+ pub fn new(who: &str) -> GreetingViaJs {
95+ let js = JsRender::new(Greeting::new(who));
96+ GreetingViaJs { js }
97+ }
98+}
99+
100+/// And finally the `Render` implementation! This adds a `<p>` element and some
101+/// text around whatever the inner JS `Greeting` component renders.
102+impl<'a> Render<'a> for GreetingViaJs {
103+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
104+ use dodrio::builder::*;
105+ p(&cx)
106+ .children([
107+ text("JavaScript says: "),
108+ self.js.render(cx),
109+ ])
110+ .finish()
111+ }
112+}
113+```
114+
115+ */
116+#![deny(missing_docs, missing_debug_implementations)]
117+
118+use dodrio::{builder, bumpalo, Node, Render, RenderContext};
119+use js_sys::{Object, Promise, Reflect};
120+use wasm_bindgen::prelude::*;
121+use wasm_bindgen::JsCast;
122+
123+#[wasm_bindgen]
124+extern "C" {
125+ /// A rendering component implemented in JavaScript.
126+ ///
127+ /// The rendering API is a bit duck-typed: any JS object with a `render`
128+ /// method that returns a virtual DOM as JS values with the right shape
129+ /// works.
130+ ///
131+ /// See `JsRender::new` for converting existing JS objects into `JsRender`s.
132+ #[derive(Debug, Clone)]
133+ pub type JsRender;
134+ #[wasm_bindgen(structural, method)]
135+ fn render(this: &JsRender) -> JsValue;
136+
137+ #[wasm_bindgen(extends = Object)]
138+ #[derive(Debug, Clone)]
139+ type Element;
140+ #[wasm_bindgen(structural, getter, method, js_name = tagName)]
141+ fn tag_name(this: &Element) -> String;
142+ #[wasm_bindgen(structural, getter, method)]
143+ fn listeners(this: &Element) -> js_sys::Array;
144+ #[wasm_bindgen(structural, getter, method)]
145+ fn attributes(this: &Element) -> js_sys::Array;
146+ #[wasm_bindgen(structural, getter, method)]
147+ fn children(this: &Element) -> js_sys::Array;
148+
149+ #[wasm_bindgen(extends = Object)]
150+ #[derive(Debug, Clone)]
151+ type Listener;
152+ #[wasm_bindgen(structural, getter, method)]
153+ fn on(this: &Listener) -> String;
154+ #[wasm_bindgen(structural, getter, method)]
155+ fn callback(this: &Listener) -> js_sys::Function;
156+
157+ #[wasm_bindgen(extends = Object)]
158+ #[derive(Debug, Clone)]
159+ type Attribute;
160+ #[wasm_bindgen(structural, getter, method)]
161+ fn name(this: &Attribute) -> String;
162+ #[wasm_bindgen(structural, getter, method)]
163+ fn value(this: &Attribute) -> String;
164+}
165+
166+/// A weak handle to a virtual DOM.
167+///
168+/// This is essentially the same as `dodrio::VdomWeak`, but exposed to
169+/// JavaScript.
170+#[wasm_bindgen]
171+#[derive(Clone, Debug)]
172+pub struct VdomWeak {
173+ inner: dodrio::VdomWeak,
174+}
175+
176+impl VdomWeak {
177+ fn new(inner: dodrio::VdomWeak) -> VdomWeak {
178+ VdomWeak { inner }
179+ }
180+}
181+
182+#[wasm_bindgen]
183+impl VdomWeak {
184+ /// Schedule re-rendering of the virtual DOM. A promise is returned that is
185+ /// resolved after the rendering has happened.
186+ pub fn render(&self) -> Promise {
187+ let future = self.inner.render();
188+
189+ wasm_bindgen_futures::future_to_promise(async move {
190+ if let Err(e) = future.await {
191+ let msg = e.to_string();
192+ Err(js_sys::Error::new(&msg).into())
193+ } else {
194+ Ok(JsValue::null())
195+ }
196+ })
197+ }
198+}
199+
200+impl JsRender {
201+ /// Convert a `js_sys::Object` into a `JsRender`.
202+ ///
203+ /// The given object must have a `render` method that conforms to the
204+ /// duck-typed virtual DOM interface which is described in the crate-level
205+ /// documentation.
206+ pub fn new<O>(object: O) -> JsRender
207+ where
208+ O: Into<Object>,
209+ {
210+ let object = object.into();
211+ debug_assert!(
212+ has_property(&object, "render"),
213+ "JS rendering components must have a `render` method"
214+ );
215+ object.unchecked_into::<JsRender>()
216+ }
217+}
218+
219+impl<'a> Render<'a> for JsRender {
220+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
221+ create(cx, self.render())
222+ }
223+}
224+
225+fn has_property(obj: &Object, property: &str) -> bool {
226+ Reflect::has(obj, &property.into()).unwrap_or_default()
227+}
228+
229+fn create<'a>(cx: &mut RenderContext<'a>, val: JsValue) -> Node<'a> {
230+ if let Some(txt) = val.as_string() {
231+ let text = bumpalo::collections::String::from_str_in(&txt, cx.bump);
232+ return builder::text(text.into_bump_str());
233+ }
234+
235+ let elem = val.unchecked_into::<Element>();
236+ debug_assert!(
237+ elem.is_instance_of::<Object>(),
238+ "JS render methods should only return strings for text nodes or objects for elements"
239+ );
240+ debug_assert!(
241+ has_property(&elem, "tagName"),
242+ "element objects returned by JS render methods must have a `tagName` property"
243+ );
244+
245+ let tag_name = elem.tag_name();
246+ let tag_name = bumpalo::collections::String::from_str_in(&tag_name, cx.bump);
247+
248+ builder::ElementBuilder::new(cx.bump, tag_name.into_bump_str())
249+ .listeners({
250+ let mut listeners =
251+ bumpalo::collections::Vec::new_in(cx.bump);
252+ if has_property(&elem, "listeners") {
253+ let js_listeners = elem.listeners();
254+ listeners.reserve(js_listeners.length() as usize);
255+ js_listeners.for_each(&mut |listener, _index, _array| {
256+ let listener = listener.unchecked_into::<Listener>();
257+ debug_assert!(
258+ listener.is_instance_of::<Object>(),
259+ "listeners returned by JS render methods must be objects"
260+ );
261+ debug_assert!(
262+ has_property(&listener, "on"),
263+ "listener objects returned by JS render methods must have an `on` property"
264+ );
265+ debug_assert!(
266+ has_property(&listener, "callback"),
267+ "listener objects returned by JS render methods must have an `callback` property"
268+ );
269+ let on = listener.on();
270+ let on = bumpalo::collections::String::from_str_in(&on, cx.bump);
271+ let callback = listener.callback();
272+ let elem = elem.clone();
273+ listeners.push(builder::on(cx.bump, on.into_bump_str(), move |_root, vdom, event| {
274+ let vdom = VdomWeak::new(vdom);
275+ let vdom: JsValue = vdom.into();
276+ if let Err(e) = callback.call2(&elem, &vdom, &event) {
277+ wasm_bindgen::throw_val(e);
278+ }
279+ }));
280+ });
281+ }
282+ listeners
283+ })
284+ .attributes({
285+ let mut attributes = bumpalo::collections::Vec::new_in(cx.bump);
286+ if has_property(&elem, "attributes") {
287+ let js_attributes = elem.attributes();
288+ attributes.reserve(js_attributes.length() as usize);
289+ js_attributes.for_each(&mut |attribute, _index, _array| {
290+ let attribute = attribute.unchecked_into::<Attribute>();
291+ debug_assert!(
292+ attribute.is_instance_of::<Object>(),
293+ "attributes returned by JS render methods must be objects"
294+ );
295+ debug_assert!(
296+ has_property(&attribute, "name"),
297+ "attribute objects returned by JS render methods must have a `name` property"
298+ );
299+ debug_assert!(
300+ has_property(&attribute, "value"),
301+ "attribute objects returned by JS render methods must have a `value` property"
302+ );
303+ let name = attribute.name();
304+ let name = bumpalo::collections::String::from_str_in(&name, cx.bump);
305+ let value = attribute.value();
306+ let value = bumpalo::collections::String::from_str_in(&value, cx.bump);
307+ attributes.push(builder::attr(name.into_bump_str(), value.into_bump_str()));
308+ });
309+ }
310+ attributes
311+ })
312+ .children({
313+ let mut children = bumpalo::collections::Vec::new_in(cx.bump);
314+ if has_property(&elem, "children") {
315+ let js_children = elem.children();
316+ children.reserve(js_children.length() as usize);
317+ js_children.for_each(&mut |child, _index, _array| {
318+ children.push(create(cx, child));
319+ });
320+ }
321+ children
322+ })
323+ .finish()
324+}
examples/counter/.gitignoredeleted−7
@@ -1,7 +0,0 @@
1−dist
2−node_modules
3−crate/bin
4−crate/pkg
5−crate/target
6−crate/wasm-pack.log
7−crate/Cargo.lock
examples/counter/.travis.ymldeleted−11
@@ -1,11 +0,0 @@
1−language: rust
2−
3−install:
4− - curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
5− - source ~/.nvm/nvm.sh
6− - nvm install v10.5
7− - curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh -s -- -f
8−
9−script:
10− - npm install
11− - npm run build
examples/counter/crate/Cargo.toml → examples/counter/Cargo.tomlrenamed+8−8
@@ -5,19 +5,19 @@ authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
55edition = "2018"
66
77[lib]
8−crate-type = ["cdylib", "rlib"]
8+crate-type = ["cdylib"]
99
1010[features]
1111
1212[dependencies]
13−console_error_panic_hook = "0.1.1"
14−console_log = "0.1.2"
15−dodrio = { path = "../../.." }
16−log = "0.4.6"
17−wasm-bindgen = "0.2"
13+console_error_panic_hook = "0.1.6"
14+console_log = "0.2.0"
15+dodrio = { path = "../.." }
16+log = "0.4.11"
17+wasm-bindgen = "0.2.55"
1818
1919[dependencies.web-sys]
20−version = "0.3.8"
20+version = "0.3.32"
2121features = [
2222 "console",
2323 "Document",
@@ -30,4 +30,4 @@ features = [
3030]
3131
3232[dev-dependencies]
33−wasm-bindgen-test = "0.2"
33+wasm-bindgen-test = "0.3.5"
examples/counter/LICENSE-APACHEdeleted−201
@@ -1,201 +0,0 @@
1− Apache License
2− Version 2.0, January 2004
3− http://www.apache.org/licenses/
4−
5−TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6−
7−1. Definitions.
8−
9− "License" shall mean the terms and conditions for use, reproduction,
10− and distribution as defined by Sections 1 through 9 of this document.
11−
12− "Licensor" shall mean the copyright owner or entity authorized by
13− the copyright owner that is granting the License.
14−
15− "Legal Entity" shall mean the union of the acting entity and all
16− other entities that control, are controlled by, or are under common
17− control with that entity. For the purposes of this definition,
18− "control" means (i) the power, direct or indirect, to cause the
19− direction or management of such entity, whether by contract or
20− otherwise, or (ii) ownership of fifty percent (50%) or more of the
21− outstanding shares, or (iii) beneficial ownership of such entity.
22−
23− "You" (or "Your") shall mean an individual or Legal Entity
24− exercising permissions granted by this License.
25−
26− "Source" form shall mean the preferred form for making modifications,
27− including but not limited to software source code, documentation
28− source, and configuration files.
29−
30− "Object" form shall mean any form resulting from mechanical
31− transformation or translation of a Source form, including but
32− not limited to compiled object code, generated documentation,
33− and conversions to other media types.
34−
35− "Work" shall mean the work of authorship, whether in Source or
36− Object form, made available under the License, as indicated by a
37− copyright notice that is included in or attached to the work
38− (an example is provided in the Appendix below).
39−
40− "Derivative Works" shall mean any work, whether in Source or Object
41− form, that is based on (or derived from) the Work and for which the
42− editorial revisions, annotations, elaborations, or other modifications
43− represent, as a whole, an original work of authorship. For the purposes
44− of this License, Derivative Works shall not include works that remain
45− separable from, or merely link (or bind by name) to the interfaces of,
46− the Work and Derivative Works thereof.
47−
48− "Contribution" shall mean any work of authorship, including
49− the original version of the Work and any modifications or additions
50− to that Work or Derivative Works thereof, that is intentionally
51− submitted to Licensor for inclusion in the Work by the copyright owner
52− or by an individual or Legal Entity authorized to submit on behalf of
53− the copyright owner. For the purposes of this definition, "submitted"
54− means any form of electronic, verbal, or written communication sent
55− to the Licensor or its representatives, including but not limited to
56− communication on electronic mailing lists, source code control systems,
57− and issue tracking systems that are managed by, or on behalf of, the
58− Licensor for the purpose of discussing and improving the Work, but
59− excluding communication that is conspicuously marked or otherwise
60− designated in writing by the copyright owner as "Not a Contribution."
61−
62− "Contributor" shall mean Licensor and any individual or Legal Entity
63− on behalf of whom a Contribution has been received by Licensor and
64− subsequently incorporated within the Work.
65−
66−2. Grant of Copyright License. Subject to the terms and conditions of
67− this License, each Contributor hereby grants to You a perpetual,
68− worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69− copyright license to reproduce, prepare Derivative Works of,
70− publicly display, publicly perform, sublicense, and distribute the
71− Work and such Derivative Works in Source or Object form.
72−
73−3. Grant of Patent License. Subject to the terms and conditions of
74− this License, each Contributor hereby grants to You a perpetual,
75− worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76− (except as stated in this section) patent license to make, have made,
77− use, offer to sell, sell, import, and otherwise transfer the Work,
78− where such license applies only to those patent claims licensable
79− by such Contributor that are necessarily infringed by their
80− Contribution(s) alone or by combination of their Contribution(s)
81− with the Work to which such Contribution(s) was submitted. If You
82− institute patent litigation against any entity (including a
83− cross-claim or counterclaim in a lawsuit) alleging that the Work
84− or a Contribution incorporated within the Work constitutes direct
85− or contributory patent infringement, then any patent licenses
86− granted to You under this License for that Work shall terminate
87− as of the date such litigation is filed.
88−
89−4. Redistribution. You may reproduce and distribute copies of the
90− Work or Derivative Works thereof in any medium, with or without
91− modifications, and in Source or Object form, provided that You
92− meet the following conditions:
93−
94− (a) You must give any other recipients of the Work or
95− Derivative Works a copy of this License; and
96−
97− (b) You must cause any modified files to carry prominent notices
98− stating that You changed the files; and
99−
100− (c) You must retain, in the Source form of any Derivative Works
101− that You distribute, all copyright, patent, trademark, and
102− attribution notices from the Source form of the Work,
103− excluding those notices that do not pertain to any part of
104− the Derivative Works; and
105−
106− (d) If the Work includes a "NOTICE" text file as part of its
107− distribution, then any Derivative Works that You distribute must
108− include a readable copy of the attribution notices contained
109− within such NOTICE file, excluding those notices that do not
110− pertain to any part of the Derivative Works, in at least one
111− of the following places: within a NOTICE text file distributed
112− as part of the Derivative Works; within the Source form or
113− documentation, if provided along with the Derivative Works; or,
114− within a display generated by the Derivative Works, if and
115− wherever such third-party notices normally appear. The contents
116− of the NOTICE file are for informational purposes only and
117− do not modify the License. You may add Your own attribution
118− notices within Derivative Works that You distribute, alongside
119− or as an addendum to the NOTICE text from the Work, provided
120− that such additional attribution notices cannot be construed
121− as modifying the License.
122−
123− You may add Your own copyright statement to Your modifications and
124− may provide additional or different license terms and conditions
125− for use, reproduction, or distribution of Your modifications, or
126− for any such Derivative Works as a whole, provided Your use,
127− reproduction, and distribution of the Work otherwise complies with
128− the conditions stated in this License.
129−
130−5. Submission of Contributions. Unless You explicitly state otherwise,
131− any Contribution intentionally submitted for inclusion in the Work
132− by You to the Licensor shall be under the terms and conditions of
133− this License, without any additional terms or conditions.
134− Notwithstanding the above, nothing herein shall supersede or modify
135− the terms of any separate license agreement you may have executed
136− with Licensor regarding such Contributions.
137−
138−6. Trademarks. This License does not grant permission to use the trade
139− names, trademarks, service marks, or product names of the Licensor,
140− except as required for reasonable and customary use in describing the
141− origin of the Work and reproducing the content of the NOTICE file.
142−
143−7. Disclaimer of Warranty. Unless required by applicable law or
144− agreed to in writing, Licensor provides the Work (and each
145− Contributor provides its Contributions) on an "AS IS" BASIS,
146− WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147− implied, including, without limitation, any warranties or conditions
148− of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149− PARTICULAR PURPOSE. You are solely responsible for determining the
150− appropriateness of using or redistributing the Work and assume any
151− risks associated with Your exercise of permissions under this License.
152−
153−8. Limitation of Liability. In no event and under no legal theory,
154− whether in tort (including negligence), contract, or otherwise,
155− unless required by applicable law (such as deliberate and grossly
156− negligent acts) or agreed to in writing, shall any Contributor be
157− liable to You for damages, including any direct, indirect, special,
158− incidental, or consequential damages of any character arising as a
159− result of this License or out of the use or inability to use the
160− Work (including but not limited to damages for loss of goodwill,
161− work stoppage, computer failure or malfunction, or any and all
162− other commercial damages or losses), even if such Contributor
163− has been advised of the possibility of such damages.
164−
165−9. Accepting Warranty or Additional Liability. While redistributing
166− the Work or Derivative Works thereof, You may choose to offer,
167− and charge a fee for, acceptance of support, warranty, indemnity,
168− or other liability obligations and/or rights consistent with this
169− License. However, in accepting such obligations, You may act only
170− on Your own behalf and on Your sole responsibility, not on behalf
171− of any other Contributor, and only if You agree to indemnify,
172− defend, and hold each Contributor harmless for any liability
173− incurred by, or claims asserted against, such Contributor by reason
174− of your accepting any such warranty or additional liability.
175−
176−END OF TERMS AND CONDITIONS
177−
178−APPENDIX: How to apply the Apache License to your work.
179−
180− To apply the Apache License to your work, attach the following
181− boilerplate notice, with the fields enclosed by brackets "[]"
182− replaced with your own identifying information. (Don't include
183− the brackets!) The text should be enclosed in the appropriate
184− comment syntax for the file format. We also recommend that a
185− file or class name and description of purpose be included on the
186− same "printed page" as the copyright notice for easier
187− identification within third-party archives.
188−
189−Copyright [yyyy] [name of copyright owner]
190−
191−Licensed under the Apache License, Version 2.0 (the "License");
192−you may not use this file except in compliance with the License.
193−You may obtain a copy of the License at
194−
195− http://www.apache.org/licenses/LICENSE-2.0
196−
197−Unless required by applicable law or agreed to in writing, software
198−distributed under the License is distributed on an "AS IS" BASIS,
199−WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200−See the License for the specific language governing permissions and
201−limitations under the License.
examples/counter/LICENSE-MITdeleted−25
@@ -1,25 +0,0 @@
1−Copyright (c) 2015 The Rust Project Developers
2−
3−Permission is hereby granted, free of charge, to any
4−person obtaining a copy of this software and associated
5−documentation files (the "Software"), to deal in the
6−Software without restriction, including without
7−limitation the rights to use, copy, modify, merge,
8−publish, distribute, sublicense, and/or sell copies of
9−the Software, and to permit persons to whom the Software
10−is furnished to do so, subject to the following
11−conditions:
12−
13−The above copyright notice and this permission notice
14−shall be included in all copies or substantial portions
15−of the Software.
16−
17−THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
18−ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
19−TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
20−PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
21−SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
22−CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23−OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
24−IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25−DEALINGS IN THE SOFTWARE.
examples/counter/README.md+12−20
@@ -1,29 +1,21 @@
1−# 🦀🕸 `rust-webpack-template`
1+# Counter
22
3−> **Kickstart your Rust, WebAssembly, and Webpack project!**
3+A counter that can be incremented and decremented.
44
5−This template is designed for creating monorepo-style Web applications with
6−Rust-generated WebAssembly and Webpack without publishing your wasm to NPM.
5+## Source
76
8−* Want to create and publish NPM packages with Rust and WebAssembly? [Check out
9− `wasm-pack-template`.](https://github.com/rustwasm/wasm-pack-template)
7+See `src/lib.rs`.
108
11−## 🔋 Batteries Included
9+## Build
1210
13−This template comes pre-configured with all the boilerplate for compiling Rust
14−to WebAssembly and hooking into a Webpack build pipeline.
15−
16−* `npm run start` -- Serve the project locally for development at
17− `http://localhost:8080`.
18−
19−* `npm run build` -- Bundle the project (in production mode).
20−
21−## 🚴 Using This Template
11+```
12+wasm-pack build --target web
13+```
2214
23−First, [install `wasm-pack`!](https://rustwasm.github.io/wasm-pack/installer/)
15+## Serve
2416
25−Then, use `npm init` to clone this template:
17+Use any HTTP server, for example:
2618
27−```sh
28−npm init rust-webpack my-app
19+```
20+python -m SimpleHTTPServer
2921```
examples/counter/crate/src/lib.rsdeleted−80
@@ -1,80 +0,0 @@
1−use dodrio::bumpalo::{self, Bump};
2−use dodrio::{on, Node, Render};
3−use log::*;
4−use wasm_bindgen::prelude::*;
5−
6−struct Counter {
7− val: isize,
8−}
9−
10−impl Counter {
11− fn new() -> Counter {
12− Counter { val: 0 }
13− }
14−
15− fn increment(&mut self) {
16− self.val += 1;
17− }
18−
19− fn decrement(&mut self) {
20− self.val -= 1;
21− }
22−}
23−
24−impl Render for Counter {
25− fn render<'a, 'bump>(&'a self, bump: &'bump Bump) -> dodrio::Node<'bump>
26− where
27− 'a: 'bump,
28− {
29− let val = bumpalo::format!(in bump, "{}", self.val);
30−
31− Node::element(
32− bump,
33− "div",
34− [],
35− [],
36− [
37− Node::element(
38− bump,
39− "button",
40− [on(bump, "click", |root, vdom, _event| {
41− root.unwrap_mut::<Counter>().increment();
42− vdom.schedule_render();
43− })],
44− [],
45− [Node::text("+")],
46− ),
47− Node::text(val.into_bump_str()),
48− Node::element(
49− bump,
50− "button",
51− [on(bump, "click", |root, vdom, _event| {
52− root.unwrap_mut::<Counter>().decrement();
53− vdom.schedule_render();
54− })],
55− [],
56− [Node::text("-")],
57− ),
58− ],
59− )
60− }
61−}
62−
63−#[wasm_bindgen]
64−pub fn run() {
65− console_error_panic_hook::set_once();
66− console_log::init_with_level(Level::Trace).expect("should initialize logging OK");
67−
68− let window = web_sys::window().unwrap();
69− let document = window.document().unwrap();
70− let body = document.body().unwrap();
71−
72− // Construct a new counter component.
73− let counter = Counter::new();
74−
75− // Mount our counter component to the `<body>`.
76− let vdom = dodrio::Vdom::new(&body, counter);
77−
78− // Run the virtual DOM and its listeners forever.
79− vdom.forget();
80−}
examples/counter/index.html+4
@@ -5,5 +5,9 @@
55 <title>Counter</title>
66 </head>
77 <body>
8+ <script type="module">
9+ import init from "./pkg/dodrio_counter.js";
10+ init("./pkg/dodrio_counter_bg.wasm");
11+ </script>
812 </body>
913</html>
examples/counter/js/index.jsdeleted−3
@@ -1,3 +0,0 @@
1−import("../crate/pkg").then(module => {
2− module.run();
3−});
examples/counter/package-lock.jsondeleted−5790
@@ -1,5790 +0,0 @@
1−{
2− "name": "create-rust-webpack",
3− "version": "0.1.5",
4− "lockfileVersion": 1,
5− "requires": true,
6− "dependencies": {
7− "@wasm-tool/wasm-pack-plugin": {
8− "version": "0.1.6",
9− "resolved": "https://registry.npmjs.org/@wasm-tool/wasm-pack-plugin/-/wasm-pack-plugin-0.1.6.tgz",
10− "integrity": "sha512-Nk6IqWSpvSnfjHOIElcol4aXLusl+/XKeuC2ViqbHOKHIClfN1r9KK9/KvGTslw7Qyjg4pVBYjGrTTRFqvvvvw==",
11− "dev": true,
12− "requires": {
13− "chalk": "^2.4.1",
14− "command-exists": "^1.2.7",
15− "glob": "^7.1.2",
16− "watchpack": "^1.6.0"
17− }
18− },
19− "@webassemblyjs/ast": {
20− "version": "1.7.11",
21− "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz",
22− "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==",
23− "dev": true,
24− "requires": {
25− "@webassemblyjs/helper-module-context": "1.7.11",
26− "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
27− "@webassemblyjs/wast-parser": "1.7.11"
28− }
29− },
30− "@webassemblyjs/floating-point-hex-parser": {
31− "version": "1.7.11",
32− "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz",
33− "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==",
34− "dev": true
35− },
36− "@webassemblyjs/helper-api-error": {
37− "version": "1.7.11",
38− "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz",
39− "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==",
40− "dev": true
41− },
42− "@webassemblyjs/helper-buffer": {
43− "version": "1.7.11",
44− "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz",
45− "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==",
46− "dev": true
47− },
48− "@webassemblyjs/helper-code-frame": {
49− "version": "1.7.11",
50− "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz",
51− "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==",
52− "dev": true,
53− "requires": {
54− "@webassemblyjs/wast-printer": "1.7.11"
55− }
56− },
57− "@webassemblyjs/helper-fsm": {
58− "version": "1.7.11",
59− "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz",
60− "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==",
61− "dev": true
62− },
63− "@webassemblyjs/helper-module-context": {
64− "version": "1.7.11",
65− "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz",
66− "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==",
67− "dev": true
68− },
69− "@webassemblyjs/helper-wasm-bytecode": {
70− "version": "1.7.11",
71− "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz",
72− "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==",
73− "dev": true
74− },
75− "@webassemblyjs/helper-wasm-section": {
76− "version": "1.7.11",
77− "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz",
78− "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==",
79− "dev": true,
80− "requires": {
81− "@webassemblyjs/ast": "1.7.11",
82− "@webassemblyjs/helper-buffer": "1.7.11",
83− "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
84− "@webassemblyjs/wasm-gen": "1.7.11"
85− }
86− },
87− "@webassemblyjs/ieee754": {
88− "version": "1.7.11",
89− "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz",
90− "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==",
91− "dev": true,
92− "requires": {
93− "@xtuc/ieee754": "^1.2.0"
94− }
95− },
96− "@webassemblyjs/leb128": {
97− "version": "1.7.11",
98− "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz",
99− "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==",
100− "dev": true,
101− "requires": {
102− "@xtuc/long": "4.2.1"
103− }
104− },
105− "@webassemblyjs/utf8": {
106− "version": "1.7.11",
107− "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz",
108− "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==",
109− "dev": true
110− },
111− "@webassemblyjs/wasm-edit": {
112− "version": "1.7.11",
113− "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz",
114− "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==",
115− "dev": true,
116− "requires": {
117− "@webassemblyjs/ast": "1.7.11",
118− "@webassemblyjs/helper-buffer": "1.7.11",
119− "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
120− "@webassemblyjs/helper-wasm-section": "1.7.11",
121− "@webassemblyjs/wasm-gen": "1.7.11",
122− "@webassemblyjs/wasm-opt": "1.7.11",
123− "@webassemblyjs/wasm-parser": "1.7.11",
124− "@webassemblyjs/wast-printer": "1.7.11"
125− }
126− },
127− "@webassemblyjs/wasm-gen": {
128− "version": "1.7.11",
129− "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz",
130− "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==",
131− "dev": true,
132− "requires": {
133− "@webassemblyjs/ast": "1.7.11",
134− "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
135− "@webassemblyjs/ieee754": "1.7.11",
136− "@webassemblyjs/leb128": "1.7.11",
137− "@webassemblyjs/utf8": "1.7.11"
138− }
139− },
140− "@webassemblyjs/wasm-opt": {
141− "version": "1.7.11",
142− "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz",
143− "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==",
144− "dev": true,
145− "requires": {
146− "@webassemblyjs/ast": "1.7.11",
147− "@webassemblyjs/helper-buffer": "1.7.11",
148− "@webassemblyjs/wasm-gen": "1.7.11",
149− "@webassemblyjs/wasm-parser": "1.7.11"
150− }
151− },
152− "@webassemblyjs/wasm-parser": {
153− "version": "1.7.11",
154− "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz",
155− "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==",
156− "dev": true,
157− "requires": {
158− "@webassemblyjs/ast": "1.7.11",
159− "@webassemblyjs/helper-api-error": "1.7.11",
160− "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
161− "@webassemblyjs/ieee754": "1.7.11",
162− "@webassemblyjs/leb128": "1.7.11",
163− "@webassemblyjs/utf8": "1.7.11"
164− }
165− },
166− "@webassemblyjs/wast-parser": {
167− "version": "1.7.11",
168− "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz",
169− "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==",
170− "dev": true,
171− "requires": {
172− "@webassemblyjs/ast": "1.7.11",
173− "@webassemblyjs/floating-point-hex-parser": "1.7.11",
174− "@webassemblyjs/helper-api-error": "1.7.11",
175− "@webassemblyjs/helper-code-frame": "1.7.11",
176− "@webassemblyjs/helper-fsm": "1.7.11",
177− "@xtuc/long": "4.2.1"
178− }
179− },
180− "@webassemblyjs/wast-printer": {
181− "version": "1.7.11",
182− "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz",
183− "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==",
184− "dev": true,
185− "requires": {
186− "@webassemblyjs/ast": "1.7.11",
187− "@webassemblyjs/wast-parser": "1.7.11",
188− "@xtuc/long": "4.2.1"
189− }
190− },
191− "@xtuc/ieee754": {
192− "version": "1.2.0",
193− "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
194− "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
195− "dev": true
196− },
197− "@xtuc/long": {
198− "version": "4.2.1",
199− "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz",
200− "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==",
201− "dev": true
202− },
203− "accepts": {
204− "version": "1.3.5",
205− "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
206− "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
207− "dev": true,
208− "requires": {
209− "mime-types": "~2.1.18",
210− "negotiator": "0.6.1"
211− }
212− },
213− "acorn": {
214− "version": "5.7.3",
215− "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
216− "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
217− "dev": true
218− },
219− "acorn-dynamic-import": {
220− "version": "3.0.0",
221− "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz",
222− "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==",
223− "dev": true,
224− "requires": {
225− "acorn": "^5.0.0"
226− }
227− },
228− "ajv": {
229− "version": "6.5.3",
230− "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz",
231− "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==",
232− "dev": true,
233− "requires": {
234− "fast-deep-equal": "^2.0.1",
235− "fast-json-stable-stringify": "^2.0.0",
236− "json-schema-traverse": "^0.4.1",
237− "uri-js": "^4.2.2"
238− }
239− },
240− "ajv-errors": {
241− "version": "1.0.1",
242− "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
243− "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
244− "dev": true
245− },
246− "ajv-keywords": {
247− "version": "3.2.0",
248− "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
249− "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=",
250− "dev": true
251− },
252− "ansi-colors": {
253− "version": "3.2.3",
254− "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
255− "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
256− "dev": true
257− },
258− "ansi-html": {
259− "version": "0.0.7",
260− "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
261− "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
262− "dev": true
263− },
264− "ansi-regex": {
265− "version": "2.1.1",
266− "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
267− "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
268− "dev": true
269− },
270− "ansi-styles": {
271− "version": "3.2.1",
272− "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
273− "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
274− "dev": true,
275− "requires": {
276− "color-convert": "^1.9.0"
277− }
278− },
279− "anymatch": {
280− "version": "2.0.0",
281− "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
282− "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
283− "dev": true,
284− "requires": {
285− "micromatch": "^3.1.4",
286− "normalize-path": "^2.1.1"
287− }
288− },
289− "aproba": {
290− "version": "1.2.0",
291− "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
292− "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
293− "dev": true
294− },
295− "arr-diff": {
296− "version": "4.0.0",
297− "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
298− "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
299− "dev": true
300− },
301− "arr-flatten": {
302− "version": "1.1.0",
303− "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
304− "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
305− "dev": true
306− },
307− "arr-union": {
308− "version": "3.1.0",
309− "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
310− "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
311− "dev": true
312− },
313− "array-flatten": {
314− "version": "2.1.2",
315− "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
316− "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
317− "dev": true
318− },
319− "array-union": {
320− "version": "1.0.2",
321− "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
322− "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
323− "dev": true,
324− "requires": {
325− "array-uniq": "^1.0.1"
326− }
327− },
328− "array-uniq": {
329− "version": "1.0.3",
330− "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
331− "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
332− "dev": true
333− },
334− "array-unique": {
335− "version": "0.3.2",
336− "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
337− "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
338− "dev": true
339− },
340− "asn1.js": {
341− "version": "4.10.1",
342− "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
343− "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
344− "dev": true,
345− "requires": {
346− "bn.js": "^4.0.0",
347− "inherits": "^2.0.1",
348− "minimalistic-assert": "^1.0.0"
349− }
350− },
351− "assert": {
352− "version": "1.4.1",
353− "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
354− "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
355− "dev": true,
356− "requires": {
357− "util": "0.10.3"
358− },
359− "dependencies": {
360− "inherits": {
361− "version": "2.0.1",
362− "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
363− "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
364− "dev": true
365− },
366− "util": {
367− "version": "0.10.3",
368− "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
369− "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
370− "dev": true,
371− "requires": {
372− "inherits": "2.0.1"
373− }
374− }
375− }
376− },
377− "assign-symbols": {
378− "version": "1.0.0",
379− "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
380− "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
381− "dev": true
382− },
383− "async": {
384− "version": "1.5.2",
385− "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz",
386− "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
387− "dev": true
388− },
389− "async-each": {
390− "version": "1.0.1",
391− "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
392− "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
393− "dev": true
394− },
395− "atob": {
396− "version": "2.1.1",
397− "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz",
398− "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=",
399− "dev": true
400− },
401− "balanced-match": {
402− "version": "1.0.0",
403− "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
404− "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
405− "dev": true
406− },
407− "base": {
408− "version": "0.11.2",
409− "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
410− "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
411− "dev": true,
412− "requires": {
413− "cache-base": "^1.0.1",
414− "class-utils": "^0.3.5",
415− "component-emitter": "^1.2.1",
416− "define-property": "^1.0.0",
417− "isobject": "^3.0.1",
418− "mixin-deep": "^1.2.0",
419− "pascalcase": "^0.1.1"
420− },
421− "dependencies": {
422− "define-property": {
423− "version": "1.0.0",
424− "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
425− "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
426− "dev": true,
427− "requires": {
428− "is-descriptor": "^1.0.0"
429− }
430− },
431− "is-accessor-descriptor": {
432− "version": "1.0.0",
433− "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
434− "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
435− "dev": true,
436− "requires": {
437− "kind-of": "^6.0.0"
438− }
439− },
440− "is-data-descriptor": {
441− "version": "1.0.0",
442− "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
443− "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
444− "dev": true,
445− "requires": {
446− "kind-of": "^6.0.0"
447− }
448− },
449− "is-descriptor": {
450− "version": "1.0.2",
451− "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
452− "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
453− "dev": true,
454− "requires": {
455− "is-accessor-descriptor": "^1.0.0",
456− "is-data-descriptor": "^1.0.0",
457− "kind-of": "^6.0.2"
458− }
459− }
460− }
461− },
462− "base64-js": {
463− "version": "1.3.0",
464− "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
465− "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
466− "dev": true
467− },
468− "batch": {
469− "version": "0.6.1",
470− "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
471− "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
472− "dev": true
473− },
474− "big.js": {
475− "version": "3.2.0",
476− "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
477− "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
478− "dev": true
479− },
480− "binary-extensions": {
481− "version": "1.11.0",
482− "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
483− "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
484− "dev": true
485− },
486− "bluebird": {
487− "version": "3.5.2",
488− "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz",
489− "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==",
490− "dev": true
491− },
492− "bn.js": {
493− "version": "4.11.8",
494− "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
495− "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
496− "dev": true
497− },
498− "body-parser": {
499− "version": "1.18.3",
500− "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
501− "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
502− "dev": true,
503− "requires": {
504− "bytes": "3.0.0",
505− "content-type": "~1.0.4",
506− "debug": "2.6.9",
507− "depd": "~1.1.2",
508− "http-errors": "~1.6.3",
509− "iconv-lite": "0.4.23",
510− "on-finished": "~2.3.0",
511− "qs": "6.5.2",
512− "raw-body": "2.3.3",
513− "type-is": "~1.6.16"
514− },
515− "dependencies": {
516− "debug": {
517− "version": "2.6.9",
518− "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
519− "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
520− "dev": true,
521− "requires": {
522− "ms": "2.0.0"
523− }
524− }
525− }
526− },
527− "bonjour": {
528− "version": "3.5.0",
529− "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
530− "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
531− "dev": true,
532− "requires": {
533− "array-flatten": "^2.1.0",
534− "deep-equal": "^1.0.1",
535− "dns-equal": "^1.0.0",
536− "dns-txt": "^2.0.2",
537− "multicast-dns": "^6.0.1",
538− "multicast-dns-service-types": "^1.1.0"
539− }
540− },
541− "boolbase": {
542− "version": "1.0.0",
543− "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
544− "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
545− "dev": true
546− },
547− "brace-expansion": {
548− "version": "1.1.11",
549− "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
550− "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
551− "dev": true,
552− "requires": {
553− "balanced-match": "^1.0.0",
554− "concat-map": "0.0.1"
555− }
556− },
557− "braces": {
558− "version": "2.3.2",
559− "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
560− "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
561− "dev": true,
562− "requires": {
563− "arr-flatten": "^1.1.0",
564− "array-unique": "^0.3.2",
565− "extend-shallow": "^2.0.1",
566− "fill-range": "^4.0.0",
567− "isobject": "^3.0.1",
568− "repeat-element": "^1.1.2",
569− "snapdragon": "^0.8.1",
570− "snapdragon-node": "^2.0.1",
571− "split-string": "^3.0.2",
572− "to-regex": "^3.0.1"
573− },
574− "dependencies": {
575− "extend-shallow": {
576− "version": "2.0.1",
577− "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
578− "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
579− "dev": true,
580− "requires": {
581− "is-extendable": "^0.1.0"
582− }
583− }
584− }
585− },
586− "brorand": {
587− "version": "1.1.0",
588− "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
589− "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
590− "dev": true
591− },
592− "browserify-aes": {
593− "version": "1.2.0",
594− "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
595− "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
596− "dev": true,
597− "requires": {
598− "buffer-xor": "^1.0.3",
599− "cipher-base": "^1.0.0",
600− "create-hash": "^1.1.0",
601− "evp_bytestokey": "^1.0.3",
602− "inherits": "^2.0.1",
603− "safe-buffer": "^5.0.1"
604− }
605− },
606− "browserify-cipher": {
607− "version": "1.0.1",
608− "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
609− "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
610− "dev": true,
611− "requires": {
612− "browserify-aes": "^1.0.4",
613− "browserify-des": "^1.0.0",
614− "evp_bytestokey": "^1.0.0"
615− }
616− },
617− "browserify-des": {
618− "version": "1.0.2",
619− "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
620− "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
621− "dev": true,
622− "requires": {
623− "cipher-base": "^1.0.1",
624− "des.js": "^1.0.0",
625− "inherits": "^2.0.1",
626− "safe-buffer": "^5.1.2"
627− }
628− },
629− "browserify-rsa": {
630− "version": "4.0.1",
631− "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
632− "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
633− "dev": true,
634− "requires": {
635− "bn.js": "^4.1.0",
636− "randombytes": "^2.0.1"
637− }
638− },
639− "browserify-sign": {
640− "version": "4.0.4",
641− "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
642− "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
643− "dev": true,
644− "requires": {
645− "bn.js": "^4.1.1",
646− "browserify-rsa": "^4.0.0",
647− "create-hash": "^1.1.0",
648− "create-hmac": "^1.1.2",
649− "elliptic": "^6.0.0",
650− "inherits": "^2.0.1",
651− "parse-asn1": "^5.0.0"
652− }
653− },
654− "browserify-zlib": {
655− "version": "0.2.0",
656− "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
657− "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
658− "dev": true,
659− "requires": {
660− "pako": "~1.0.5"
661− }
662− },
663− "buffer": {
664− "version": "4.9.1",
665− "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
666− "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
667− "dev": true,
668− "requires": {
669− "base64-js": "^1.0.2",
670− "ieee754": "^1.1.4",
671− "isarray": "^1.0.0"
672− }
673− },
674− "buffer-from": {
675− "version": "1.1.1",
676− "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
677− "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
678− "dev": true
679− },
680− "buffer-indexof": {
681− "version": "1.1.1",
682− "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
683− "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
684− "dev": true
685− },
686− "buffer-xor": {
687− "version": "1.0.3",
688− "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
689− "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
690− "dev": true
691− },
692− "builtin-status-codes": {
693− "version": "3.0.0",
694− "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
695− "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
696− "dev": true
697− },
698− "bytes": {
699− "version": "3.0.0",
700− "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
701− "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
702− "dev": true
703− },
704− "cacache": {
705− "version": "10.0.4",
706− "resolved": "http://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz",
707− "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==",
708− "dev": true,
709− "requires": {
710− "bluebird": "^3.5.1",
711− "chownr": "^1.0.1",
712− "glob": "^7.1.2",
713− "graceful-fs": "^4.1.11",
714− "lru-cache": "^4.1.1",
715− "mississippi": "^2.0.0",
716− "mkdirp": "^0.5.1",
717− "move-concurrently": "^1.0.1",
718− "promise-inflight": "^1.0.1",
719− "rimraf": "^2.6.2",
720− "ssri": "^5.2.4",
721− "unique-filename": "^1.1.0",
722− "y18n": "^4.0.0"
723− }
724− },
725− "cache-base": {
726− "version": "1.0.1",
727− "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
728− "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
729− "dev": true,
730− "requires": {
731− "collection-visit": "^1.0.0",
732− "component-emitter": "^1.2.1",
733− "get-value": "^2.0.6",
734− "has-value": "^1.0.0",
735− "isobject": "^3.0.1",
736− "set-value": "^2.0.0",
737− "to-object-path": "^0.3.0",
738− "union-value": "^1.0.0",
739− "unset-value": "^1.0.0"
740− }
741− },
742− "camel-case": {
743− "version": "3.0.0",
744− "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
745− "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
746− "dev": true,
747− "requires": {
748− "no-case": "^2.2.0",
749− "upper-case": "^1.1.1"
750− }
751− },
752− "camelcase": {
753− "version": "4.1.0",
754− "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
755− "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
756− "dev": true
757− },
758− "chalk": {
759− "version": "2.4.1",
760− "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
761− "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
762− "dev": true,
763− "requires": {
764− "ansi-styles": "^3.2.1",
765− "escape-string-regexp": "^1.0.5",
766− "supports-color": "^5.3.0"
767− }
768− },
769− "chokidar": {
770− "version": "2.0.4",
771− "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
772− "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
773− "dev": true,
774− "requires": {
775− "anymatch": "^2.0.0",
776− "async-each": "^1.0.0",
777− "braces": "^2.3.0",
778− "fsevents": "^1.2.2",
779− "glob-parent": "^3.1.0",
780− "inherits": "^2.0.1",
781− "is-binary-path": "^1.0.0",
782− "is-glob": "^4.0.0",
783− "lodash.debounce": "^4.0.8",
784− "normalize-path": "^2.1.1",
785− "path-is-absolute": "^1.0.0",
786− "readdirp": "^2.0.0",
787− "upath": "^1.0.5"
788− }
789− },
790− "chownr": {
791− "version": "1.1.1",
792− "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
793− "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
794− "dev": true
795− },
796− "chrome-trace-event": {
797− "version": "1.0.0",
798− "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz",
799− "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==",
800− "dev": true,
801− "requires": {
802− "tslib": "^1.9.0"
803− }
804− },
805− "cipher-base": {
806− "version": "1.0.4",
807− "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
808− "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
809− "dev": true,
810− "requires": {
811− "inherits": "^2.0.1",
812− "safe-buffer": "^5.0.1"
813− }
814− },
815− "class-utils": {
816− "version": "0.3.6",
817− "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
818− "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
819− "dev": true,
820− "requires": {
821− "arr-union": "^3.1.0",
822− "define-property": "^0.2.5",
823− "isobject": "^3.0.0",
824− "static-extend": "^0.1.1"
825− },
826− "dependencies": {
827− "define-property": {
828− "version": "0.2.5",
829− "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
830− "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
831− "dev": true,
832− "requires": {
833− "is-descriptor": "^0.1.0"
834− }
835− }
836− }
837− },
838− "clean-css": {
839− "version": "4.1.11",
840− "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz",
841− "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=",
842− "dev": true,
843− "requires": {
844− "source-map": "0.5.x"
845− }
846− },
847− "cliui": {
848− "version": "4.1.0",
849− "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
850− "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
851− "dev": true,
852− "requires": {
853− "string-width": "^2.1.1",
854− "strip-ansi": "^4.0.0",
855− "wrap-ansi": "^2.0.0"
856− },
857− "dependencies": {
858− "ansi-regex": {
859− "version": "3.0.0",
860− "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
861− "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
862− "dev": true
863− },
864− "strip-ansi": {
865− "version": "4.0.0",
866− "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
867− "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
868− "dev": true,
869− "requires": {
870− "ansi-regex": "^3.0.0"
871− }
872− }
873− }
874− },
875− "code-point-at": {
876− "version": "1.1.0",
877− "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
878− "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
879− "dev": true
880− },
881− "collection-visit": {
882− "version": "1.0.0",
883− "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
884− "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
885− "dev": true,
886− "requires": {
887− "map-visit": "^1.0.0",
888− "object-visit": "^1.0.0"
889− }
890− },
891− "color-convert": {
892− "version": "1.9.2",
893− "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz",
894− "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==",
895− "dev": true,
896− "requires": {
897− "color-name": "1.1.1"
898− }
899− },
900− "color-name": {
901− "version": "1.1.1",
902− "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz",
903− "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=",
904− "dev": true
905− },
906− "command-exists": {
907− "version": "1.2.8",
908− "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz",
909− "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==",
910− "dev": true
911− },
912− "commander": {
913− "version": "2.13.0",
914− "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
915− "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==",
916− "dev": true
917− },
918− "commondir": {
919− "version": "1.0.1",
920− "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
921− "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
922− "dev": true
923− },
924− "component-emitter": {
925− "version": "1.2.1",
926− "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
927− "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
928− "dev": true
929− },
930− "compressible": {
931− "version": "2.0.15",
932− "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz",
933− "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==",
934− "dev": true,
935− "requires": {
936− "mime-db": ">= 1.36.0 < 2"
937− }
938− },
939− "compression": {
940− "version": "1.7.3",
941− "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz",
942− "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==",
943− "dev": true,
944− "requires": {
945− "accepts": "~1.3.5",
946− "bytes": "3.0.0",
947− "compressible": "~2.0.14",
948− "debug": "2.6.9",
949− "on-headers": "~1.0.1",
950− "safe-buffer": "5.1.2",
951− "vary": "~1.1.2"
952− },
953− "dependencies": {
954− "debug": {
955− "version": "2.6.9",
956− "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
957− "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
958− "dev": true,
959− "requires": {
960− "ms": "2.0.0"
961− }
962− }
963− }
964− },
965− "concat-map": {
966− "version": "0.0.1",
967− "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
968− "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
969− "dev": true
970− },
971− "concat-stream": {
972− "version": "1.6.2",
973− "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
974− "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
975− "dev": true,
976− "requires": {
977− "buffer-from": "^1.0.0",
978− "inherits": "^2.0.3",
979− "readable-stream": "^2.2.2",
980− "typedarray": "^0.0.6"
981− }
982− },
983− "connect-history-api-fallback": {
984− "version": "1.6.0",
985− "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
986− "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
987− "dev": true
988− },
989− "console-browserify": {
990− "version": "1.1.0",
991− "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
992− "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
993− "dev": true,
994− "requires": {
995− "date-now": "^0.1.4"
996− }
997− },
998− "constants-browserify": {
999− "version": "1.0.0",
1000− "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
1001− "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
1002− "dev": true
1003− },
1004− "content-disposition": {
1005− "version": "0.5.2",
1006− "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
1007− "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
1008− "dev": true
1009− },
1010− "content-type": {
1011− "version": "1.0.4",
1012− "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
1013− "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
1014− "dev": true
1015− },
1016− "cookie": {
1017− "version": "0.3.1",
1018− "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
1019− "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
1020− "dev": true
1021− },
1022− "cookie-signature": {
1023− "version": "1.0.6",
1024− "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
1025− "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
1026− "dev": true
1027− },
1028− "copy-concurrently": {
1029− "version": "1.0.5",
1030− "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
1031− "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
1032− "dev": true,
1033− "requires": {
1034− "aproba": "^1.1.1",
1035− "fs-write-stream-atomic": "^1.0.8",
1036− "iferr": "^0.1.5",
1037− "mkdirp": "^0.5.1",
1038− "rimraf": "^2.5.4",
1039− "run-queue": "^1.0.0"
1040− }
1041− },
1042− "copy-descriptor": {
1043− "version": "0.1.1",
1044− "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
1045− "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
1046− "dev": true
1047− },
1048− "core-util-is": {
1049− "version": "1.0.2",
1050− "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
1051− "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
1052− "dev": true
1053− },
1054− "create-ecdh": {
1055− "version": "4.0.3",
1056− "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
1057− "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
1058− "dev": true,
1059− "requires": {
1060− "bn.js": "^4.1.0",
1061− "elliptic": "^6.0.0"
1062− }
1063− },
1064− "create-hash": {
1065− "version": "1.2.0",
1066− "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
1067− "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
1068− "dev": true,
1069− "requires": {
1070− "cipher-base": "^1.0.1",
1071− "inherits": "^2.0.1",
1072− "md5.js": "^1.3.4",
1073− "ripemd160": "^2.0.1",
1074− "sha.js": "^2.4.0"
1075− }
1076− },
1077− "create-hmac": {
1078− "version": "1.1.7",
1079− "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
1080− "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
1081− "dev": true,
1082− "requires": {
1083− "cipher-base": "^1.0.3",
1084− "create-hash": "^1.1.0",
1085− "inherits": "^2.0.1",
1086− "ripemd160": "^2.0.0",
1087− "safe-buffer": "^5.0.1",
1088− "sha.js": "^2.4.8"
1089− }
1090− },
1091− "cross-spawn": {
1092− "version": "6.0.5",
1093− "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
1094− "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
1095− "dev": true,
1096− "requires": {
1097− "nice-try": "^1.0.4",
1098− "path-key": "^2.0.1",
1099− "semver": "^5.5.0",
1100− "shebang-command": "^1.2.0",
1101− "which": "^1.2.9"
1102− }
1103− },
1104− "crypto-browserify": {
1105− "version": "3.12.0",
1106− "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
1107− "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
1108− "dev": true,
1109− "requires": {
1110− "browserify-cipher": "^1.0.0",
1111− "browserify-sign": "^4.0.0",
1112− "create-ecdh": "^4.0.0",
1113− "create-hash": "^1.1.0",
1114− "create-hmac": "^1.1.0",
1115− "diffie-hellman": "^5.0.0",
1116− "inherits": "^2.0.1",
1117− "pbkdf2": "^3.0.3",
1118− "public-encrypt": "^4.0.0",
1119− "randombytes": "^2.0.0",
1120− "randomfill": "^1.0.3"
1121− }
1122− },
1123− "css-select": {
1124− "version": "1.2.0",
1125− "resolved": "http://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
1126− "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
1127− "dev": true,
1128− "requires": {
1129− "boolbase": "~1.0.0",
1130− "css-what": "2.1",
1131− "domutils": "1.5.1",
1132− "nth-check": "~1.0.1"
1133− }
1134− },
1135− "css-what": {
1136− "version": "2.1.0",
1137− "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
1138− "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=",
1139− "dev": true
1140− },
1141− "cyclist": {
1142− "version": "0.2.2",
1143− "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
1144− "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=",
1145− "dev": true
1146− },
1147− "date-now": {
1148− "version": "0.1.4",
1149− "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
1150− "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
1151− "dev": true
1152− },
1153− "debug": {
1154− "version": "3.2.6",
1155− "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
1156− "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
1157− "dev": true,
1158− "requires": {
1159− "ms": "^2.1.1"
1160− },
1161− "dependencies": {
1162− "ms": {
1163− "version": "2.1.1",
1164− "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1165− "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
1166− "dev": true
1167− }
1168− }
1169− },
1170− "decamelize": {
1171− "version": "2.0.0",
1172− "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz",
1173− "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==",
1174− "dev": true,
1175− "requires": {
1176− "xregexp": "4.0.0"
1177− }
1178− },
1179− "decode-uri-component": {
1180− "version": "0.2.0",
1181− "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
1182− "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
1183− "dev": true
1184− },
1185− "deep-equal": {
1186− "version": "1.0.1",
1187− "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
1188− "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
1189− "dev": true
1190− },
1191− "default-gateway": {
1192− "version": "2.7.2",
1193− "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz",
1194− "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==",
1195− "dev": true,
1196− "requires": {
1197− "execa": "^0.10.0",
1198− "ip-regex": "^2.1.0"
1199− }
1200− },
1201− "define-properties": {
1202− "version": "1.1.2",
1203− "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
1204− "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
1205− "dev": true,
1206− "requires": {
1207− "foreach": "^2.0.5",
1208− "object-keys": "^1.0.8"
1209− }
1210− },
1211− "define-property": {
1212− "version": "2.0.2",
1213− "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
1214− "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
1215− "dev": true,
1216− "requires": {
1217− "is-descriptor": "^1.0.2",
1218− "isobject": "^3.0.1"
1219− },
1220− "dependencies": {
1221− "is-accessor-descriptor": {
1222− "version": "1.0.0",
1223− "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
1224− "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
1225− "dev": true,
1226− "requires": {
1227− "kind-of": "^6.0.0"
1228− }
1229− },
1230− "is-data-descriptor": {
1231− "version": "1.0.0",
1232− "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
1233− "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
1234− "dev": true,
1235− "requires": {
1236− "kind-of": "^6.0.0"
1237− }
1238− },
1239− "is-descriptor": {
1240− "version": "1.0.2",
1241− "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
1242− "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
1243− "dev": true,
1244− "requires": {
1245− "is-accessor-descriptor": "^1.0.0",
1246− "is-data-descriptor": "^1.0.0",
1247− "kind-of": "^6.0.2"
1248− }
1249− }
1250− }
1251− },
1252− "del": {
1253− "version": "3.0.0",
1254− "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
1255− "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
1256− "dev": true,
1257− "requires": {
1258− "globby": "^6.1.0",
1259− "is-path-cwd": "^1.0.0",
1260− "is-path-in-cwd": "^1.0.0",
1261− "p-map": "^1.1.1",
1262− "pify": "^3.0.0",
1263− "rimraf": "^2.2.8"
1264− }
1265− },
1266− "depd": {
1267− "version": "1.1.2",
1268− "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
1269− "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
1270− "dev": true
1271− },
1272− "des.js": {
1273− "version": "1.0.0",
1274− "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
1275− "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
1276− "dev": true,
1277− "requires": {
1278− "inherits": "^2.0.1",
1279− "minimalistic-assert": "^1.0.0"
1280− }
1281− },
1282− "destroy": {
1283− "version": "1.0.4",
1284− "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
1285− "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
1286− "dev": true
1287− },
1288− "detect-node": {
1289− "version": "2.0.4",
1290− "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
1291− "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
1292− "dev": true
1293− },
1294− "diffie-hellman": {
1295− "version": "5.0.3",
1296− "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
1297− "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
1298− "dev": true,
1299− "requires": {
1300− "bn.js": "^4.1.0",
1301− "miller-rabin": "^4.0.0",
1302− "randombytes": "^2.0.0"
1303− }
1304− },
1305− "dns-equal": {
1306− "version": "1.0.0",
1307− "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
1308− "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
1309− "dev": true
1310− },
1311− "dns-packet": {
1312− "version": "1.3.1",
1313− "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
1314− "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
1315− "dev": true,
1316− "requires": {
1317− "ip": "^1.1.0",
1318− "safe-buffer": "^5.0.1"
1319− }
1320− },
1321− "dns-txt": {
1322− "version": "2.0.2",
1323− "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
1324− "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
1325− "dev": true,
1326− "requires": {
1327− "buffer-indexof": "^1.0.0"
1328− }
1329− },
1330− "dom-converter": {
1331− "version": "0.1.4",
1332− "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz",
1333− "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=",
1334− "dev": true,
1335− "requires": {
1336− "utila": "~0.3"
1337− },
1338− "dependencies": {
1339− "utila": {
1340− "version": "0.3.3",
1341− "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz",
1342− "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=",
1343− "dev": true
1344− }
1345− }
1346− },
1347− "dom-serializer": {
1348− "version": "0.1.0",
1349− "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
1350− "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
1351− "dev": true,
1352− "requires": {
1353− "domelementtype": "~1.1.1",
1354− "entities": "~1.1.1"
1355− },
1356− "dependencies": {
1357− "domelementtype": {
1358− "version": "1.1.3",
1359− "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
1360− "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
1361− "dev": true
1362− }
1363− }
1364− },
1365− "domain-browser": {
1366− "version": "1.2.0",
1367− "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
1368− "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
1369− "dev": true
1370− },
1371− "domelementtype": {
1372− "version": "1.3.0",
1373− "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
1374− "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
1375− "dev": true
1376− },
1377− "domhandler": {
1378− "version": "2.1.0",
1379− "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz",
1380− "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=",
1381− "dev": true,
1382− "requires": {
1383− "domelementtype": "1"
1384− }
1385− },
1386− "domutils": {
1387− "version": "1.5.1",
1388− "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
1389− "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
1390− "dev": true,
1391− "requires": {
1392− "dom-serializer": "0",
1393− "domelementtype": "1"
1394− }
1395− },
1396− "duplexify": {
1397− "version": "3.6.1",
1398− "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz",
1399− "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==",
1400− "dev": true,
1401− "requires": {
1402− "end-of-stream": "^1.0.0",
1403− "inherits": "^2.0.1",
1404− "readable-stream": "^2.0.0",
1405− "stream-shift": "^1.0.0"
1406− }
1407− },
1408− "ee-first": {
1409− "version": "1.1.1",
1410− "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
1411− "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
1412− "dev": true
1413− },
1414− "elliptic": {
1415− "version": "6.4.1",
1416− "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz",
1417− "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==",
1418− "dev": true,
1419− "requires": {
1420− "bn.js": "^4.4.0",
1421− "brorand": "^1.0.1",
1422− "hash.js": "^1.0.0",
1423− "hmac-drbg": "^1.0.0",
1424− "inherits": "^2.0.1",
1425− "minimalistic-assert": "^1.0.0",
1426− "minimalistic-crypto-utils": "^1.0.0"
1427− }
1428− },
1429− "emojis-list": {
1430− "version": "2.1.0",
1431− "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
1432− "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
1433− "dev": true
1434− },
1435− "encodeurl": {
1436− "version": "1.0.2",
1437− "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
1438− "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
1439− "dev": true
1440− },
1441− "end-of-stream": {
1442− "version": "1.4.1",
1443− "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
1444− "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
1445− "dev": true,
1446− "requires": {
1447− "once": "^1.4.0"
1448− }
1449− },
1450− "enhanced-resolve": {
1451− "version": "4.1.0",
1452− "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
1453− "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
1454− "dev": true,
1455− "requires": {
1456− "graceful-fs": "^4.1.2",
1457− "memory-fs": "^0.4.0",
1458− "tapable": "^1.0.0"
1459− }
1460− },
1461− "entities": {
1462− "version": "1.1.1",
1463− "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
1464− "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
1465− "dev": true
1466− },
1467− "errno": {
1468− "version": "0.1.7",
1469− "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
1470− "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
1471− "dev": true,
1472− "requires": {
1473− "prr": "~1.0.1"
1474− }
1475− },
1476− "es-abstract": {
1477− "version": "1.12.0",
1478− "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
1479− "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
1480− "dev": true,
1481− "requires": {
1482− "es-to-primitive": "^1.1.1",
1483− "function-bind": "^1.1.1",
1484− "has": "^1.0.1",
1485− "is-callable": "^1.1.3",
1486− "is-regex": "^1.0.4"
1487− }
1488− },
1489− "es-to-primitive": {
1490− "version": "1.1.1",
1491− "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
1492− "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
1493− "dev": true,
1494− "requires": {
1495− "is-callable": "^1.1.1",
1496− "is-date-object": "^1.0.1",
1497− "is-symbol": "^1.0.1"
1498− }
1499− },
1500− "escape-html": {
1501− "version": "1.0.3",
1502− "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
1503− "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
1504− "dev": true
1505− },
1506− "escape-string-regexp": {
1507− "version": "1.0.5",
1508− "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
1509− "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
1510− "dev": true
1511− },
1512− "eslint-scope": {
1513− "version": "4.0.0",
1514− "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
1515− "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
1516− "dev": true,
1517− "requires": {
1518− "esrecurse": "^4.1.0",
1519− "estraverse": "^4.1.1"
1520− }
1521− },
1522− "esrecurse": {
1523− "version": "4.2.1",
1524− "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
1525− "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
1526− "dev": true,
1527− "requires": {
1528− "estraverse": "^4.1.0"
1529− }
1530− },
1531− "estraverse": {
1532− "version": "4.2.0",
1533− "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
1534− "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
1535− "dev": true
1536− },
1537− "etag": {
1538− "version": "1.8.1",
1539− "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
1540− "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
1541− "dev": true
1542− },
1543− "eventemitter3": {
1544− "version": "3.1.0",
1545− "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
1546− "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==",
1547− "dev": true
1548− },
1549− "events": {
1550− "version": "1.1.1",
1551− "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz",
1552− "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
1553− "dev": true
1554− },
1555− "eventsource": {
1556− "version": "1.0.7",
1557− "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
1558− "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
1559− "dev": true,
1560− "requires": {
1561− "original": "^1.0.0"
1562− }
1563− },
1564− "evp_bytestokey": {
1565− "version": "1.0.3",
1566− "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
1567− "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
1568− "dev": true,
1569− "requires": {
1570− "md5.js": "^1.3.4",
1571− "safe-buffer": "^5.1.1"
1572− }
1573− },
1574− "execa": {
1575− "version": "0.10.0",
1576− "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz",
1577− "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==",
1578− "dev": true,
1579− "requires": {
1580− "cross-spawn": "^6.0.0",
1581− "get-stream": "^3.0.0",
1582− "is-stream": "^1.1.0",
1583− "npm-run-path": "^2.0.0",
1584− "p-finally": "^1.0.0",
1585− "signal-exit": "^3.0.0",
1586− "strip-eof": "^1.0.0"
1587− }
1588− },
1589− "expand-brackets": {
1590− "version": "2.1.4",
1591− "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
1592− "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
1593− "dev": true,
1594− "requires": {
1595− "debug": "^2.3.3",
1596− "define-property": "^0.2.5",
1597− "extend-shallow": "^2.0.1",
1598− "posix-character-classes": "^0.1.0",
1599− "regex-not": "^1.0.0",
1600− "snapdragon": "^0.8.1",
1601− "to-regex": "^3.0.1"
1602− },
1603− "dependencies": {
1604− "debug": {
1605− "version": "2.6.9",
1606− "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1607− "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1608− "dev": true,
1609− "requires": {
1610− "ms": "2.0.0"
1611− }
1612− },
1613− "define-property": {
1614− "version": "0.2.5",
1615− "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
1616− "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
1617− "dev": true,
1618− "requires": {
1619− "is-descriptor": "^0.1.0"
1620− }
1621− },
1622− "extend-shallow": {
1623− "version": "2.0.1",
1624− "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1625− "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1626− "dev": true,
1627− "requires": {
1628− "is-extendable": "^0.1.0"
1629− }
1630− }
1631− }
1632− },
1633− "express": {
1634− "version": "4.16.4",
1635− "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
1636− "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==",
1637− "dev": true,
1638− "requires": {
1639− "accepts": "~1.3.5",
1640− "array-flatten": "1.1.1",
1641− "body-parser": "1.18.3",
1642− "content-disposition": "0.5.2",
1643− "content-type": "~1.0.4",
1644− "cookie": "0.3.1",
1645− "cookie-signature": "1.0.6",
1646− "debug": "2.6.9",
1647− "depd": "~1.1.2",
1648− "encodeurl": "~1.0.2",
1649− "escape-html": "~1.0.3",
1650− "etag": "~1.8.1",
1651− "finalhandler": "1.1.1",
1652− "fresh": "0.5.2",
1653− "merge-descriptors": "1.0.1",
1654− "methods": "~1.1.2",
1655− "on-finished": "~2.3.0",
1656− "parseurl": "~1.3.2",
1657− "path-to-regexp": "0.1.7",
1658− "proxy-addr": "~2.0.4",
1659− "qs": "6.5.2",
1660− "range-parser": "~1.2.0",
1661− "safe-buffer": "5.1.2",
1662− "send": "0.16.2",
1663− "serve-static": "1.13.2",
1664− "setprototypeof": "1.1.0",
1665− "statuses": "~1.4.0",
1666− "type-is": "~1.6.16",
1667− "utils-merge": "1.0.1",
1668− "vary": "~1.1.2"
1669− },
1670− "dependencies": {
1671− "array-flatten": {
1672− "version": "1.1.1",
1673− "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
1674− "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
1675− "dev": true
1676− },
1677− "debug": {
1678− "version": "2.6.9",
1679− "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1680− "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1681− "dev": true,
1682− "requires": {
1683− "ms": "2.0.0"
1684− }
1685− }
1686− }
1687− },
1688− "extend-shallow": {
1689− "version": "3.0.2",
1690− "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
1691− "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
1692− "dev": true,
1693− "requires": {
1694− "assign-symbols": "^1.0.0",
1695− "is-extendable": "^1.0.1"
1696− },
1697− "dependencies": {
1698− "is-extendable": {
1699− "version": "1.0.1",
1700− "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
1701− "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
1702− "dev": true,
1703− "requires": {
1704− "is-plain-object": "^2.0.4"
1705− }
1706− }
1707− }
1708− },
1709− "extglob": {
1710− "version": "2.0.4",
1711− "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
1712− "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
1713− "dev": true,
1714− "requires": {
1715− "array-unique": "^0.3.2",
1716− "define-property": "^1.0.0",
1717− "expand-brackets": "^2.1.4",
1718− "extend-shallow": "^2.0.1",
1719− "fragment-cache": "^0.2.1",
1720− "regex-not": "^1.0.0",
1721− "snapdragon": "^0.8.1",
1722− "to-regex": "^3.0.1"
1723− },
1724− "dependencies": {
1725− "define-property": {
1726− "version": "1.0.0",
1727− "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
1728− "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
1729− "dev": true,
1730− "requires": {
1731− "is-descriptor": "^1.0.0"
1732− }
1733− },
1734− "extend-shallow": {
1735− "version": "2.0.1",
1736− "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1737− "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1738− "dev": true,
1739− "requires": {
1740− "is-extendable": "^0.1.0"
1741− }
1742− },
1743− "is-accessor-descriptor": {
1744− "version": "1.0.0",
1745− "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
1746− "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
1747− "dev": true,
1748− "requires": {
1749− "kind-of": "^6.0.0"
1750− }
1751− },
1752− "is-data-descriptor": {
1753− "version": "1.0.0",
1754− "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
1755− "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
1756− "dev": true,
1757− "requires": {
1758− "kind-of": "^6.0.0"
1759− }
1760− },
1761− "is-descriptor": {
1762− "version": "1.0.2",
1763− "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
1764− "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
1765− "dev": true,
1766− "requires": {
1767− "is-accessor-descriptor": "^1.0.0",
1768− "is-data-descriptor": "^1.0.0",
1769− "kind-of": "^6.0.2"
1770− }
1771− }
1772− }
1773− },
1774− "fast-deep-equal": {
1775− "version": "2.0.1",
1776− "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
1777− "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
1778− "dev": true
1779− },
1780− "fast-json-stable-stringify": {
1781− "version": "2.0.0",
1782− "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
1783− "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
1784− "dev": true
1785− },
1786− "faye-websocket": {
1787− "version": "0.10.0",
1788− "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
1789− "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
1790− "dev": true,
1791− "requires": {
1792− "websocket-driver": ">=0.5.1"
1793− }
1794− },
1795− "fill-range": {
1796− "version": "4.0.0",
1797− "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
1798− "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
1799− "dev": true,
1800− "requires": {
1801− "extend-shallow": "^2.0.1",
1802− "is-number": "^3.0.0",
1803− "repeat-string": "^1.6.1",
1804− "to-regex-range": "^2.1.0"
1805− },
1806− "dependencies": {
1807− "extend-shallow": {
1808− "version": "2.0.1",
1809− "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1810− "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1811− "dev": true,
1812− "requires": {
1813− "is-extendable": "^0.1.0"
1814− }
1815− }
1816− }
1817− },
1818− "finalhandler": {
1819− "version": "1.1.1",
1820− "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
1821− "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
1822− "dev": true,
1823− "requires": {
1824− "debug": "2.6.9",
1825− "encodeurl": "~1.0.2",
1826− "escape-html": "~1.0.3",
1827− "on-finished": "~2.3.0",
1828− "parseurl": "~1.3.2",
1829− "statuses": "~1.4.0",
1830− "unpipe": "~1.0.0"
1831− },
1832− "dependencies": {
1833− "debug": {
1834− "version": "2.6.9",
1835− "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1836− "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1837− "dev": true,
1838− "requires": {
1839− "ms": "2.0.0"
1840− }
1841− }
1842− }
1843− },
1844− "find-cache-dir": {
1845− "version": "1.0.0",
1846− "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz",
1847− "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=",
1848− "dev": true,
1849− "requires": {
1850− "commondir": "^1.0.1",
1851− "make-dir": "^1.0.0",
1852− "pkg-dir": "^2.0.0"
1853− }
1854− },
1855− "find-up": {
1856− "version": "2.1.0",
1857− "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
1858− "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
1859− "dev": true,
1860− "requires": {
1861− "locate-path": "^2.0.0"
1862− }
1863− },
1864− "flush-write-stream": {
1865− "version": "1.0.3",
1866− "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz",
1867− "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==",
1868− "dev": true,
1869− "requires": {
1870− "inherits": "^2.0.1",
1871− "readable-stream": "^2.0.4"
1872− }
1873− },
1874− "follow-redirects": {
1875− "version": "1.6.1",
1876− "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.1.tgz",
1877− "integrity": "sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ==",
1878− "dev": true,
1879− "requires": {
1880− "debug": "=3.1.0"
1881− },
1882− "dependencies": {
1883− "debug": {
1884− "version": "3.1.0",
1885− "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
1886− "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
1887− "dev": true,
1888− "requires": {
1889− "ms": "2.0.0"
1890− }
1891− }
1892− }
1893− },
1894− "for-in": {
1895− "version": "1.0.2",
1896− "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
1897− "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
1898− "dev": true
1899− },
1900− "foreach": {
1901− "version": "2.0.5",
1902− "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
1903− "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
1904− "dev": true
1905− },
1906− "forwarded": {
1907− "version": "0.1.2",
1908− "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
1909− "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
1910− "dev": true
1911− },
1912− "fragment-cache": {
1913− "version": "0.2.1",
1914− "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
1915− "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
1916− "dev": true,
1917− "requires": {
1918− "map-cache": "^0.2.2"
1919− }
1920− },
1921− "fresh": {
1922− "version": "0.5.2",
1923− "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
1924− "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
1925− "dev": true
1926− },
1927− "from2": {
1928− "version": "2.3.0",
1929− "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
1930− "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
1931− "dev": true,
1932− "requires": {
1933− "inherits": "^2.0.1",
1934− "readable-stream": "^2.0.0"
1935− }
1936− },
1937− "fs-write-stream-atomic": {
1938− "version": "1.0.10",
1939− "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
1940− "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
1941− "dev": true,
1942− "requires": {
1943− "graceful-fs": "^4.1.2",
1944− "iferr": "^0.1.5",
1945− "imurmurhash": "^0.1.4",
1946− "readable-stream": "1 || 2"
1947− }
1948− },
1949− "fs.realpath": {
1950− "version": "1.0.0",
1951− "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1952− "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
1953− "dev": true
1954− },
1955− "fsevents": {
1956− "version": "1.2.4",
1957− "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
1958− "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
1959− "dev": true,
1960− "optional": true,
1961− "requires": {
1962− "nan": "^2.9.2",
1963− "node-pre-gyp": "^0.10.0"
1964− },
1965− "dependencies": {
1966− "abbrev": {
1967− "version": "1.1.1",
1968− "bundled": true,
1969− "dev": true,
1970− "optional": true
1971− },
1972− "ansi-regex": {
1973− "version": "2.1.1",
1974− "bundled": true,
1975− "dev": true
1976− },
1977− "aproba": {
1978− "version": "1.2.0",
1979− "bundled": true,
1980− "dev": true,
1981− "optional": true
1982− },
1983− "are-we-there-yet": {
1984− "version": "1.1.4",
1985− "bundled": true,
1986− "dev": true,
1987− "optional": true,
1988− "requires": {
1989− "delegates": "^1.0.0",
1990− "readable-stream": "^2.0.6"
1991− }
1992− },
1993− "balanced-match": {
1994− "version": "1.0.0",
1995− "bundled": true,
1996− "dev": true
1997− },
1998− "brace-expansion": {
1999− "version": "1.1.11",
2000− "bundled": true,
2001− "dev": true,
2002− "requires": {
2003− "balanced-match": "^1.0.0",
2004− "concat-map": "0.0.1"
2005− }
2006− },
2007− "chownr": {
2008− "version": "1.0.1",
2009− "bundled": true,
2010− "dev": true,
2011− "optional": true
2012− },
2013− "code-point-at": {
2014− "version": "1.1.0",
2015− "bundled": true,
2016− "dev": true
2017− },
2018− "concat-map": {
2019− "version": "0.0.1",
2020− "bundled": true,
2021− "dev": true
2022− },
2023− "console-control-strings": {
2024− "version": "1.1.0",
2025− "bundled": true,
2026− "dev": true
2027− },
2028− "core-util-is": {
2029− "version": "1.0.2",
2030− "bundled": true,
2031− "dev": true,
2032− "optional": true
2033− },
2034− "debug": {
2035− "version": "2.6.9",
2036− "bundled": true,
2037− "dev": true,
2038− "optional": true,
2039− "requires": {
2040− "ms": "2.0.0"
2041− }
2042− },
2043− "deep-extend": {
2044− "version": "0.5.1",
2045− "bundled": true,
2046− "dev": true,
2047− "optional": true
2048− },
2049− "delegates": {
2050− "version": "1.0.0",
2051− "bundled": true,
2052− "dev": true,
2053− "optional": true
2054− },
2055− "detect-libc": {
2056− "version": "1.0.3",
2057− "bundled": true,
2058− "dev": true,
2059− "optional": true
2060− },
2061− "fs-minipass": {
2062− "version": "1.2.5",
2063− "bundled": true,
2064− "dev": true,
2065− "optional": true,
2066− "requires": {
2067− "minipass": "^2.2.1"
2068− }
2069− },
2070− "fs.realpath": {
2071− "version": "1.0.0",
2072− "bundled": true,
2073− "dev": true,
2074− "optional": true
2075− },
2076− "gauge": {
2077− "version": "2.7.4",
2078− "bundled": true,
2079− "dev": true,
2080− "optional": true,
2081− "requires": {
2082− "aproba": "^1.0.3",
2083− "console-control-strings": "^1.0.0",
2084− "has-unicode": "^2.0.0",
2085− "object-assign": "^4.1.0",
2086− "signal-exit": "^3.0.0",
2087− "string-width": "^1.0.1",
2088− "strip-ansi": "^3.0.1",
2089− "wide-align": "^1.1.0"
2090− }
2091− },
2092− "glob": {
2093− "version": "7.1.2",
2094− "bundled": true,
2095− "dev": true,
2096− "optional": true,
2097− "requires": {
2098− "fs.realpath": "^1.0.0",
2099− "inflight": "^1.0.4",
2100− "inherits": "2",
2101− "minimatch": "^3.0.4",
2102− "once": "^1.3.0",
2103− "path-is-absolute": "^1.0.0"
2104− }
2105− },
2106− "has-unicode": {
2107− "version": "2.0.1",
2108− "bundled": true,
2109− "dev": true,
2110− "optional": true
2111− },
2112− "iconv-lite": {
2113− "version": "0.4.21",
2114− "bundled": true,
2115− "dev": true,
2116− "optional": true,
2117− "requires": {
2118− "safer-buffer": "^2.1.0"
2119− }
2120− },
2121− "ignore-walk": {
2122− "version": "3.0.1",
2123− "bundled": true,
2124− "dev": true,
2125− "optional": true,
2126− "requires": {
2127− "minimatch": "^3.0.4"
2128− }
2129− },
2130− "inflight": {
2131− "version": "1.0.6",
2132− "bundled": true,
2133− "dev": true,
2134− "optional": true,
2135− "requires": {
2136− "once": "^1.3.0",
2137− "wrappy": "1"
2138− }
2139− },
2140− "inherits": {
2141− "version": "2.0.3",
2142− "bundled": true,
2143− "dev": true
2144− },
2145− "ini": {
2146− "version": "1.3.5",
2147− "bundled": true,
2148− "dev": true,
2149− "optional": true
2150− },
2151− "is-fullwidth-code-point": {
2152− "version": "1.0.0",
2153− "bundled": true,
2154− "dev": true,
2155− "requires": {
2156− "number-is-nan": "^1.0.0"
2157− }
2158− },
2159− "isarray": {
2160− "version": "1.0.0",
2161− "bundled": true,
2162− "dev": true,
2163− "optional": true
2164− },
2165− "minimatch": {
2166− "version": "3.0.4",
2167− "bundled": true,
2168− "dev": true,
2169− "requires": {
2170− "brace-expansion": "^1.1.7"
2171− }
2172− },
2173− "minimist": {
2174− "version": "0.0.8",
2175− "bundled": true,
2176− "dev": true
2177− },
2178− "minipass": {
2179− "version": "2.2.4",
2180− "bundled": true,
2181− "dev": true,
2182− "requires": {
2183− "safe-buffer": "^5.1.1",
2184− "yallist": "^3.0.0"
2185− }
2186− },
2187− "minizlib": {
2188− "version": "1.1.0",
2189− "bundled": true,
2190− "dev": true,
2191− "optional": true,
2192− "requires": {
2193− "minipass": "^2.2.1"
2194− }
2195− },
2196− "mkdirp": {
2197− "version": "0.5.1",
2198− "bundled": true,
2199− "dev": true,
2200− "requires": {
2201− "minimist": "0.0.8"
2202− }
2203− },
2204− "ms": {
2205− "version": "2.0.0",
2206− "bundled": true,
2207− "dev": true,
2208− "optional": true
2209− },
2210− "needle": {
2211− "version": "2.2.0",
2212− "bundled": true,
2213− "dev": true,
2214− "optional": true,
2215− "requires": {
2216− "debug": "^2.1.2",
2217− "iconv-lite": "^0.4.4",
2218− "sax": "^1.2.4"
2219− }
2220− },
2221− "node-pre-gyp": {
2222− "version": "0.10.0",
2223− "bundled": true,
2224− "dev": true,
2225− "optional": true,
2226− "requires": {
2227− "detect-libc": "^1.0.2",
2228− "mkdirp": "^0.5.1",
2229− "needle": "^2.2.0",
2230− "nopt": "^4.0.1",
2231− "npm-packlist": "^1.1.6",
2232− "npmlog": "^4.0.2",
2233− "rc": "^1.1.7",
2234− "rimraf": "^2.6.1",
2235− "semver": "^5.3.0",
2236− "tar": "^4"
2237− }
2238− },
2239− "nopt": {
2240− "version": "4.0.1",
2241− "bundled": true,
2242− "dev": true,
2243− "optional": true,
2244− "requires": {
2245− "abbrev": "1",
2246− "osenv": "^0.1.4"
2247− }
2248− },
2249− "npm-bundled": {
2250− "version": "1.0.3",
2251− "bundled": true,
2252− "dev": true,
2253− "optional": true
2254− },
2255− "npm-packlist": {
2256− "version": "1.1.10",
2257− "bundled": true,
2258− "dev": true,
2259− "optional": true,
2260− "requires": {
2261− "ignore-walk": "^3.0.1",
2262− "npm-bundled": "^1.0.1"
2263− }
2264− },
2265− "npmlog": {
2266− "version": "4.1.2",
2267− "bundled": true,
2268− "dev": true,
2269− "optional": true,
2270− "requires": {
2271− "are-we-there-yet": "~1.1.2",
2272− "console-control-strings": "~1.1.0",
2273− "gauge": "~2.7.3",
2274− "set-blocking": "~2.0.0"
2275− }
2276− },
2277− "number-is-nan": {
2278− "version": "1.0.1",
2279− "bundled": true,
2280− "dev": true
2281− },
2282− "object-assign": {
2283− "version": "4.1.1",
2284− "bundled": true,
2285− "dev": true,
2286− "optional": true
2287− },
2288− "once": {
2289− "version": "1.4.0",
2290− "bundled": true,
2291− "dev": true,
2292− "requires": {
2293− "wrappy": "1"
2294− }
2295− },
2296− "os-homedir": {
2297− "version": "1.0.2",
2298− "bundled": true,
2299− "dev": true,
2300− "optional": true
2301− },
2302− "os-tmpdir": {
2303− "version": "1.0.2",
2304− "bundled": true,
2305− "dev": true,
2306− "optional": true
2307− },
2308− "osenv": {
2309− "version": "0.1.5",
2310− "bundled": true,
2311− "dev": true,
2312− "optional": true,
2313− "requires": {
2314− "os-homedir": "^1.0.0",
2315− "os-tmpdir": "^1.0.0"
2316− }
2317− },
2318− "path-is-absolute": {
2319− "version": "1.0.1",
2320− "bundled": true,
2321− "dev": true,
2322− "optional": true
2323− },
2324− "process-nextick-args": {
2325− "version": "2.0.0",
2326− "bundled": true,
2327− "dev": true,
2328− "optional": true
2329− },
2330− "rc": {
2331− "version": "1.2.7",
2332− "bundled": true,
2333− "dev": true,
2334− "optional": true,
2335− "requires": {
2336− "deep-extend": "^0.5.1",
2337− "ini": "~1.3.0",
2338− "minimist": "^1.2.0",
2339− "strip-json-comments": "~2.0.1"
2340− },
2341− "dependencies": {
2342− "minimist": {
2343− "version": "1.2.0",
2344− "bundled": true,
2345− "dev": true,
2346− "optional": true
2347− }
2348− }
2349− },
2350− "readable-stream": {
2351− "version": "2.3.6",
2352− "bundled": true,
2353− "dev": true,
2354− "optional": true,
2355− "requires": {
2356− "core-util-is": "~1.0.0",
2357− "inherits": "~2.0.3",
2358− "isarray": "~1.0.0",
2359− "process-nextick-args": "~2.0.0",
2360− "safe-buffer": "~5.1.1",
2361− "string_decoder": "~1.1.1",
2362− "util-deprecate": "~1.0.1"
2363− }
2364− },
2365− "rimraf": {
2366− "version": "2.6.2",
2367− "bundled": true,
2368− "dev": true,
2369− "optional": true,
2370− "requires": {
2371− "glob": "^7.0.5"
2372− }
2373− },
2374− "safe-buffer": {
2375− "version": "5.1.1",
2376− "bundled": true,
2377− "dev": true
2378− },
2379− "safer-buffer": {
2380− "version": "2.1.2",
2381− "bundled": true,
2382− "dev": true,
2383− "optional": true
2384− },
2385− "sax": {
2386− "version": "1.2.4",
2387− "bundled": true,
2388− "dev": true,
2389− "optional": true
2390− },
2391− "semver": {
2392− "version": "5.5.0",
2393− "bundled": true,
2394− "dev": true,
2395− "optional": true
2396− },
2397− "set-blocking": {
2398− "version": "2.0.0",
2399− "bundled": true,
2400− "dev": true,
2401− "optional": true
2402− },
2403− "signal-exit": {
2404− "version": "3.0.2",
2405− "bundled": true,
2406− "dev": true,
2407− "optional": true
2408− },
2409− "string-width": {
2410− "version": "1.0.2",
2411− "bundled": true,
2412− "dev": true,
2413− "requires": {
2414− "code-point-at": "^1.0.0",
2415− "is-fullwidth-code-point": "^1.0.0",
2416− "strip-ansi": "^3.0.0"
2417− }
2418− },
2419− "string_decoder": {
2420− "version": "1.1.1",
2421− "bundled": true,
2422− "dev": true,
2423− "optional": true,
2424− "requires": {
2425− "safe-buffer": "~5.1.0"
2426− }
2427− },
2428− "strip-ansi": {
2429− "version": "3.0.1",
2430− "bundled": true,
2431− "dev": true,
2432− "requires": {
2433− "ansi-regex": "^2.0.0"
2434− }
2435− },
2436− "strip-json-comments": {
2437− "version": "2.0.1",
2438− "bundled": true,
2439− "dev": true,
2440− "optional": true
2441− },
2442− "tar": {
2443− "version": "4.4.1",
2444− "bundled": true,
2445− "dev": true,
2446− "optional": true,
2447− "requires": {
2448− "chownr": "^1.0.1",
2449− "fs-minipass": "^1.2.5",
2450− "minipass": "^2.2.4",
2451− "minizlib": "^1.1.0",
2452− "mkdirp": "^0.5.0",
2453− "safe-buffer": "^5.1.1",
2454− "yallist": "^3.0.2"
2455− }
2456− },
2457− "util-deprecate": {
2458− "version": "1.0.2",
2459− "bundled": true,
2460− "dev": true,
2461− "optional": true
2462− },
2463− "wide-align": {
2464− "version": "1.1.2",
2465− "bundled": true,
2466− "dev": true,
2467− "optional": true,
2468− "requires": {
2469− "string-width": "^1.0.2"
2470− }
2471− },
2472− "wrappy": {
2473− "version": "1.0.2",
2474− "bundled": true,
2475− "dev": true
2476− },
2477− "yallist": {
2478− "version": "3.0.2",
2479− "bundled": true,
2480− "dev": true
2481− }
2482− }
2483− },
2484− "function-bind": {
2485− "version": "1.1.1",
2486− "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
2487− "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
2488− "dev": true
2489− },
2490− "get-caller-file": {
2491− "version": "1.0.3",
2492− "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
2493− "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
2494− "dev": true
2495− },
2496− "get-stream": {
2497− "version": "3.0.0",
2498− "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
2499− "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
2500− "dev": true
2501− },
2502− "get-value": {
2503− "version": "2.0.6",
2504− "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
2505− "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
2506− "dev": true
2507− },
2508− "glob": {
2509− "version": "7.1.2",
2510− "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
2511− "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
2512− "dev": true,
2513− "requires": {
2514− "fs.realpath": "^1.0.0",
2515− "inflight": "^1.0.4",
2516− "inherits": "2",
2517− "minimatch": "^3.0.4",
2518− "once": "^1.3.0",
2519− "path-is-absolute": "^1.0.0"
2520− }
2521− },
2522− "glob-parent": {
2523− "version": "3.1.0",
2524− "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
2525− "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
2526− "dev": true,
2527− "requires": {
2528− "is-glob": "^3.1.0",
2529− "path-dirname": "^1.0.0"
2530− },
2531− "dependencies": {
2532− "is-glob": {
2533− "version": "3.1.0",
2534− "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
2535− "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
2536− "dev": true,
2537− "requires": {
2538− "is-extglob": "^2.1.0"
2539− }
2540− }
2541− }
2542− },
2543− "global-modules-path": {
2544− "version": "2.3.0",
2545− "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz",
2546− "integrity": "sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==",
2547− "dev": true
2548− },
2549− "globby": {
2550− "version": "6.1.0",
2551− "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
2552− "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
2553− "dev": true,
2554− "requires": {
2555− "array-union": "^1.0.1",
2556− "glob": "^7.0.3",
2557− "object-assign": "^4.0.1",
2558− "pify": "^2.0.0",
2559− "pinkie-promise": "^2.0.0"
2560− },
2561− "dependencies": {
2562− "pify": {
2563− "version": "2.3.0",
2564− "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
2565− "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
2566− "dev": true
2567− }
2568− }
2569− },
2570− "graceful-fs": {
2571− "version": "4.1.11",
2572− "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
2573− "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
2574− "dev": true
2575− },
2576− "handle-thing": {
2577− "version": "2.0.0",
2578− "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz",
2579− "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==",
2580− "dev": true
2581− },
2582− "has": {
2583− "version": "1.0.3",
2584− "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
2585− "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
2586− "dev": true,
2587− "requires": {
2588− "function-bind": "^1.1.1"
2589− }
2590− },
2591− "has-flag": {
2592− "version": "3.0.0",
2593− "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
2594− "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
2595− "dev": true
2596− },
2597− "has-value": {
2598− "version": "1.0.0",
2599− "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
2600− "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
2601− "dev": true,
2602− "requires": {
2603− "get-value": "^2.0.6",
2604− "has-values": "^1.0.0",
2605− "isobject": "^3.0.0"
2606− }
2607− },
2608− "has-values": {
2609− "version": "1.0.0",
2610− "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
2611− "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
2612− "dev": true,
2613− "requires": {
2614− "is-number": "^3.0.0",
2615− "kind-of": "^4.0.0"
2616− },
2617− "dependencies": {
2618− "kind-of": {
2619− "version": "4.0.0",
2620− "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
2621− "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
2622− "dev": true,
2623− "requires": {
2624− "is-buffer": "^1.1.5"
2625− }
2626− }
2627− }
2628− },
2629− "hash-base": {
2630− "version": "3.0.4",
2631− "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
2632− "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
2633− "dev": true,
2634− "requires": {
2635− "inherits": "^2.0.1",
2636− "safe-buffer": "^5.0.1"
2637− }
2638− },
2639− "hash.js": {
2640− "version": "1.1.5",
2641− "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz",
2642− "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==",
2643− "dev": true,
2644− "requires": {
2645− "inherits": "^2.0.3",
2646− "minimalistic-assert": "^1.0.1"
2647− }
2648− },
2649− "he": {
2650− "version": "1.1.1",
2651− "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
2652− "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
2653− "dev": true
2654− },
2655− "hmac-drbg": {
2656− "version": "1.0.1",
2657− "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
2658− "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
2659− "dev": true,
2660− "requires": {
2661− "hash.js": "^1.0.3",
2662− "minimalistic-assert": "^1.0.0",
2663− "minimalistic-crypto-utils": "^1.0.1"
2664− }
2665− },
2666− "hpack.js": {
2667− "version": "2.1.6",
2668− "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
2669− "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
2670− "dev": true,
2671− "requires": {
2672− "inherits": "^2.0.1",
2673− "obuf": "^1.0.0",
2674− "readable-stream": "^2.0.1",
2675− "wbuf": "^1.1.0"
2676− }
2677− },
2678− "html-entities": {
2679− "version": "1.2.1",
2680− "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
2681− "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
2682− "dev": true
2683− },
2684− "html-minifier": {
2685− "version": "3.5.19",
2686− "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.19.tgz",
2687− "integrity": "sha512-Qr2JC9nsjK8oCrEmuB430ZIA8YWbF3D5LSjywD75FTuXmeqacwHgIM8wp3vHYzzPbklSjp53RdmDuzR4ub2HzA==",
2688− "dev": true,
2689− "requires": {
2690− "camel-case": "3.0.x",
2691− "clean-css": "4.1.x",
2692− "commander": "2.16.x",
2693− "he": "1.1.x",
2694− "param-case": "2.1.x",
2695− "relateurl": "0.2.x",
2696− "uglify-js": "3.4.x"
2697− },
2698− "dependencies": {
2699− "commander": {
2700− "version": "2.16.0",
2701− "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz",
2702− "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==",
2703− "dev": true
2704− },
2705− "source-map": {
2706− "version": "0.6.1",
2707− "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2708− "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2709− "dev": true
2710− },
2711− "uglify-js": {
2712− "version": "3.4.7",
2713− "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.7.tgz",
2714− "integrity": "sha512-J0M2i1mQA+ze3EdN9SBi751DNdAXmeFLfJrd/MDIkRc3G3Gbb9OPVSx7GIQvVwfWxQARcYV2DTxIkMyDAk3o9Q==",
2715− "dev": true,
2716− "requires": {
2717− "commander": "~2.16.0",
2718− "source-map": "~0.6.1"
2719− }
2720− }
2721− }
2722− },
2723− "html-webpack-plugin": {
2724− "version": "3.2.0",
2725− "resolved": "http://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz",
2726− "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=",
2727− "dev": true,
2728− "requires": {
2729− "html-minifier": "^3.2.3",
2730− "loader-utils": "^0.2.16",
2731− "lodash": "^4.17.3",
2732− "pretty-error": "^2.0.2",
2733− "tapable": "^1.0.0",
2734− "toposort": "^1.0.0",
2735− "util.promisify": "1.0.0"
2736− },
2737− "dependencies": {
2738− "loader-utils": {
2739− "version": "0.2.17",
2740− "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
2741− "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
2742− "dev": true,
2743− "requires": {
2744− "big.js": "^3.1.3",
2745− "emojis-list": "^2.0.0",
2746− "json5": "^0.5.0",
2747− "object-assign": "^4.0.1"
2748− }
2749− }
2750− }
2751− },
2752− "htmlparser2": {
2753− "version": "3.3.0",
2754− "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz",
2755− "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=",
2756− "dev": true,
2757− "requires": {
2758− "domelementtype": "1",
2759− "domhandler": "2.1",
2760− "domutils": "1.1",
2761− "readable-stream": "1.0"
2762− },
2763− "dependencies": {
2764− "domutils": {
2765− "version": "1.1.6",
2766− "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz",
2767− "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=",
2768− "dev": true,
2769− "requires": {
2770− "domelementtype": "1"
2771− }
2772− },
2773− "isarray": {
2774− "version": "0.0.1",
2775− "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
2776− "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
2777− "dev": true
2778− },
2779− "readable-stream": {
2780− "version": "1.0.34",
2781− "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
2782− "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
2783− "dev": true,
2784− "requires": {
2785− "core-util-is": "~1.0.0",
2786− "inherits": "~2.0.1",
2787− "isarray": "0.0.1",
2788− "string_decoder": "~0.10.x"
2789− }
2790− },
2791− "string_decoder": {
2792− "version": "0.10.31",
2793− "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
2794− "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
2795− "dev": true
2796− }
2797− }
2798− },
2799− "http-deceiver": {
2800− "version": "1.2.7",
2801− "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
2802− "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
2803− "dev": true
2804− },
2805− "http-errors": {
2806− "version": "1.6.3",
2807− "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
2808− "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
2809− "dev": true,
2810− "requires": {
2811− "depd": "~1.1.2",
2812− "inherits": "2.0.3",
2813− "setprototypeof": "1.1.0",
2814− "statuses": ">= 1.4.0 < 2"
2815− }
2816− },
2817− "http-parser-js": {
2818− "version": "0.5.0",
2819− "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz",
2820− "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==",
2821− "dev": true
2822− },
2823− "http-proxy": {
2824− "version": "1.17.0",
2825− "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
2826− "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
2827− "dev": true,
2828− "requires": {
2829− "eventemitter3": "^3.0.0",
2830− "follow-redirects": "^1.0.0",
2831− "requires-port": "^1.0.0"
2832− }
2833− },
2834− "http-proxy-middleware": {
2835− "version": "0.18.0",
2836− "resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz",
2837− "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==",
2838− "dev": true,
2839− "requires": {
2840− "http-proxy": "^1.16.2",
2841− "is-glob": "^4.0.0",
2842− "lodash": "^4.17.5",
2843− "micromatch": "^3.1.9"
2844− }
2845− },
2846− "https-browserify": {
2847− "version": "1.0.0",
2848− "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
2849− "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
2850− "dev": true
2851− },
2852− "iconv-lite": {
2853− "version": "0.4.23",
2854− "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
2855− "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
2856− "dev": true,
2857− "requires": {
2858− "safer-buffer": ">= 2.1.2 < 3"
2859− }
2860− },
2861− "ieee754": {
2862− "version": "1.1.12",
2863− "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
2864− "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==",
2865− "dev": true
2866− },
2867− "iferr": {
2868− "version": "0.1.5",
2869− "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
2870− "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
2871− "dev": true
2872− },
2873− "import-local": {
2874− "version": "2.0.0",
2875− "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
2876− "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
2877− "dev": true,
2878− "requires": {
2879− "pkg-dir": "^3.0.0",
2880− "resolve-cwd": "^2.0.0"
2881− },
2882− "dependencies": {
2883− "find-up": {
2884− "version": "3.0.0",
2885− "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
2886− "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
2887− "dev": true,
2888− "requires": {
2889− "locate-path": "^3.0.0"
2890− }
2891− },
2892− "locate-path": {
2893− "version": "3.0.0",
2894− "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
2895− "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
2896− "dev": true,
2897− "requires": {
2898− "p-locate": "^3.0.0",
2899− "path-exists": "^3.0.0"
2900− }
2901− },
2902− "p-limit": {
2903− "version": "2.0.0",
2904− "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
2905− "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
2906− "dev": true,
2907− "requires": {
2908− "p-try": "^2.0.0"
2909− }
2910− },
2911− "p-locate": {
2912− "version": "3.0.0",
2913− "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
2914− "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
2915− "dev": true,
2916− "requires": {
2917− "p-limit": "^2.0.0"
2918− }
2919− },
2920− "p-try": {
2921− "version": "2.0.0",
2922− "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
2923− "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
2924− "dev": true
2925− },
2926− "pkg-dir": {
2927− "version": "3.0.0",
2928− "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
2929− "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
2930− "dev": true,
2931− "requires": {
2932− "find-up": "^3.0.0"
2933− }
2934− }
2935− }
2936− },
2937− "imurmurhash": {
2938− "version": "0.1.4",
2939− "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
2940− "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
2941− "dev": true
2942− },
2943− "indexof": {
2944− "version": "0.0.1",
2945− "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
2946− "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
2947− "dev": true
2948− },
2949− "inflight": {
2950− "version": "1.0.6",
2951− "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
2952− "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
2953− "dev": true,
2954− "requires": {
2955− "once": "^1.3.0",
2956− "wrappy": "1"
2957− }
2958− },
2959− "inherits": {
2960− "version": "2.0.3",
2961− "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
2962− "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
2963− "dev": true
2964− },
2965− "internal-ip": {
2966− "version": "3.0.1",
2967− "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz",
2968− "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==",
2969− "dev": true,
2970− "requires": {
2971− "default-gateway": "^2.6.0",
2972− "ipaddr.js": "^1.5.2"
2973− }
2974− },
2975− "interpret": {
2976− "version": "1.1.0",
2977− "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
2978− "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
2979− "dev": true
2980− },
2981− "invert-kv": {
2982− "version": "2.0.0",
2983− "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
2984− "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
2985− "dev": true
2986− },
2987− "ip": {
2988− "version": "1.1.5",
2989− "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
2990− "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
2991− "dev": true
2992− },
2993− "ip-regex": {
2994− "version": "2.1.0",
2995− "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
2996− "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
2997− "dev": true
2998− },
2999− "ipaddr.js": {
3000− "version": "1.8.0",
3001− "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
3002− "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=",
3003− "dev": true
3004− },
3005− "is-accessor-descriptor": {
3006− "version": "0.1.6",
3007− "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
3008− "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
3009− "dev": true,
3010− "requires": {
3011− "kind-of": "^3.0.2"
3012− },
3013− "dependencies": {
3014− "kind-of": {
3015− "version": "3.2.2",
3016− "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3017− "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3018− "dev": true,
3019− "requires": {
3020− "is-buffer": "^1.1.5"
3021− }
3022− }
3023− }
3024− },
3025− "is-binary-path": {
3026− "version": "1.0.1",
3027− "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
3028− "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
3029− "dev": true,
3030− "requires": {
3031− "binary-extensions": "^1.0.0"
3032− }
3033− },
3034− "is-buffer": {
3035− "version": "1.1.6",
3036− "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
3037− "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
3038− "dev": true
3039− },
3040− "is-callable": {
3041− "version": "1.1.4",
3042− "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
3043− "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
3044− "dev": true
3045− },
3046− "is-data-descriptor": {
3047− "version": "0.1.4",
3048− "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
3049− "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
3050− "dev": true,
3051− "requires": {
3052− "kind-of": "^3.0.2"
3053− },
3054− "dependencies": {
3055− "kind-of": {
3056− "version": "3.2.2",
3057− "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3058− "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3059− "dev": true,
3060− "requires": {
3061− "is-buffer": "^1.1.5"
3062− }
3063− }
3064− }
3065− },
3066− "is-date-object": {
3067− "version": "1.0.1",
3068− "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
3069− "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
3070− "dev": true
3071− },
3072− "is-descriptor": {
3073− "version": "0.1.6",
3074− "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
3075− "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
3076− "dev": true,
3077− "requires": {
3078− "is-accessor-descriptor": "^0.1.6",
3079− "is-data-descriptor": "^0.1.4",
3080− "kind-of": "^5.0.0"
3081− },
3082− "dependencies": {
3083− "kind-of": {
3084− "version": "5.1.0",
3085− "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
3086− "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
3087− "dev": true
3088− }
3089− }
3090− },
3091− "is-extendable": {
3092− "version": "0.1.1",
3093− "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
3094− "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
3095− "dev": true
3096− },
3097− "is-extglob": {
3098− "version": "2.1.1",
3099− "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
3100− "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
3101− "dev": true
3102− },
3103− "is-fullwidth-code-point": {
3104− "version": "2.0.0",
3105− "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
3106− "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
3107− "dev": true
3108− },
3109− "is-glob": {
3110− "version": "4.0.0",
3111− "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
3112− "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
3113− "dev": true,
3114− "requires": {
3115− "is-extglob": "^2.1.1"
3116− }
3117− },
3118− "is-number": {
3119− "version": "3.0.0",
3120− "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
3121− "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
3122− "dev": true,
3123− "requires": {
3124− "kind-of": "^3.0.2"
3125− },
3126− "dependencies": {
3127− "kind-of": {
3128− "version": "3.2.2",
3129− "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3130− "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3131− "dev": true,
3132− "requires": {
3133− "is-buffer": "^1.1.5"
3134− }
3135− }
3136− }
3137− },
3138− "is-path-cwd": {
3139− "version": "1.0.0",
3140− "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
3141− "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
3142− "dev": true
3143− },
3144− "is-path-in-cwd": {
3145− "version": "1.0.1",
3146− "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
3147− "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
3148− "dev": true,
3149− "requires": {
3150− "is-path-inside": "^1.0.0"
3151− }
3152− },
3153− "is-path-inside": {
3154− "version": "1.0.1",
3155− "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
3156− "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
3157− "dev": true,
3158− "requires": {
3159− "path-is-inside": "^1.0.1"
3160− }
3161− },
3162− "is-plain-object": {
3163− "version": "2.0.4",
3164− "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
3165− "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
3166− "dev": true,
3167− "requires": {
3168− "isobject": "^3.0.1"
3169− }
3170− },
3171− "is-regex": {
3172− "version": "1.0.4",
3173− "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
3174− "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
3175− "dev": true,
3176− "requires": {
3177− "has": "^1.0.1"
3178− }
3179− },
3180− "is-stream": {
3181− "version": "1.1.0",
3182− "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
3183− "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
3184− "dev": true
3185− },
3186− "is-symbol": {
3187− "version": "1.0.1",
3188− "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz",
3189− "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=",
3190− "dev": true
3191− },
3192− "is-windows": {
3193− "version": "1.0.2",
3194− "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
3195− "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
3196− "dev": true
3197− },
3198− "is-wsl": {
3199− "version": "1.1.0",
3200− "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
3201− "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
3202− "dev": true
3203− },
3204− "isarray": {
3205− "version": "1.0.0",
3206− "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
3207− "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
3208− "dev": true
3209− },
3210− "isexe": {
3211− "version": "2.0.0",
3212− "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
3213− "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
3214− "dev": true
3215− },
3216− "isobject": {
3217− "version": "3.0.1",
3218− "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
3219− "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
3220− "dev": true
3221− },
3222− "json-parse-better-errors": {
3223− "version": "1.0.2",
3224− "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
3225− "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
3226− "dev": true
3227− },
3228− "json-schema-traverse": {
3229− "version": "0.4.1",
3230− "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
3231− "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
3232− "dev": true
3233− },
3234− "json3": {
3235− "version": "3.3.2",
3236− "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
3237− "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
3238− "dev": true
3239− },
3240− "json5": {
3241− "version": "0.5.1",
3242− "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
3243− "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
3244− "dev": true
3245− },
3246− "killable": {
3247− "version": "1.0.1",
3248− "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
3249− "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
3250− "dev": true
3251− },
3252− "kind-of": {
3253− "version": "6.0.2",
3254− "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
3255− "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
3256− "dev": true
3257− },
3258− "lcid": {
3259− "version": "2.0.0",
3260− "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
3261− "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
3262− "dev": true,
3263− "requires": {
3264− "invert-kv": "^2.0.0"
3265− }
3266− },
3267− "loader-runner": {
3268− "version": "2.3.1",
3269− "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz",
3270− "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==",
3271− "dev": true
3272− },
3273− "loader-utils": {
3274− "version": "1.1.0",
3275− "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
3276− "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
3277− "dev": true,
3278− "requires": {
3279− "big.js": "^3.1.3",
3280− "emojis-list": "^2.0.0",
3281− "json5": "^0.5.0"
3282− }
3283− },
3284− "locate-path": {
3285− "version": "2.0.0",
3286− "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
3287− "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
3288− "dev": true,
3289− "requires": {
3290− "p-locate": "^2.0.0",
3291− "path-exists": "^3.0.0"
3292− }
3293− },
3294− "lodash": {
3295− "version": "4.17.10",
3296− "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
3297− "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
3298− "dev": true
3299− },
3300− "lodash.debounce": {
3301− "version": "4.0.8",
3302− "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
3303− "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
3304− "dev": true
3305− },
3306− "loglevel": {
3307− "version": "1.6.1",
3308− "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz",
3309− "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=",
3310− "dev": true
3311− },
3312− "lower-case": {
3313− "version": "1.1.4",
3314− "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
3315− "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
3316− "dev": true
3317− },
3318− "lru-cache": {
3319− "version": "4.1.3",
3320− "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
3321− "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
3322− "dev": true,
3323− "requires": {
3324− "pseudomap": "^1.0.2",
3325− "yallist": "^2.1.2"
3326− }
3327− },
3328− "make-dir": {
3329− "version": "1.3.0",
3330− "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
3331− "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
3332− "dev": true,
3333− "requires": {
3334− "pify": "^3.0.0"
3335− }
3336− },
3337− "map-age-cleaner": {
3338− "version": "0.1.2",
3339− "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz",
3340− "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==",
3341− "dev": true,
3342− "requires": {
3343− "p-defer": "^1.0.0"
3344− }
3345− },
3346− "map-cache": {
3347− "version": "0.2.2",
3348− "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
3349− "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
3350− "dev": true
3351− },
3352− "map-visit": {
3353− "version": "1.0.0",
3354− "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
3355− "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
3356− "dev": true,
3357− "requires": {
3358− "object-visit": "^1.0.0"
3359− }
3360− },
3361− "md5.js": {
3362− "version": "1.3.5",
3363− "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
3364− "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
3365− "dev": true,
3366− "requires": {
3367− "hash-base": "^3.0.0",
3368− "inherits": "^2.0.1",
3369− "safe-buffer": "^5.1.2"
3370− }
3371− },
3372− "media-typer": {
3373− "version": "0.3.0",
3374− "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
3375− "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
3376− "dev": true
3377− },
3378− "mem": {
3379− "version": "4.0.0",
3380− "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz",
3381− "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==",
3382− "dev": true,
3383− "requires": {
3384− "map-age-cleaner": "^0.1.1",
3385− "mimic-fn": "^1.0.0",
3386− "p-is-promise": "^1.1.0"
3387− }
3388− },
3389− "memory-fs": {
3390− "version": "0.4.1",
3391− "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
3392− "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
3393− "dev": true,
3394− "requires": {
3395− "errno": "^0.1.3",
3396− "readable-stream": "^2.0.1"
3397− },
3398− "dependencies": {
3399− "isarray": {
3400− "version": "1.0.0",
3401− "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
3402− "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
3403− "dev": true
3404− },
3405− "readable-stream": {
3406− "version": "2.3.6",
3407− "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
3408− "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
3409− "dev": true,
3410− "requires": {
3411− "core-util-is": "~1.0.0",
3412− "inherits": "~2.0.3",
3413− "isarray": "~1.0.0",
3414− "process-nextick-args": "~2.0.0",
3415− "safe-buffer": "~5.1.1",
3416− "string_decoder": "~1.1.1",
3417− "util-deprecate": "~1.0.1"
3418− }
3419− },
3420− "string_decoder": {
3421− "version": "1.1.1",
3422− "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
3423− "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
3424− "dev": true,
3425− "requires": {
3426− "safe-buffer": "~5.1.0"
3427− }
3428− }
3429− }
3430− },
3431− "merge-descriptors": {
3432− "version": "1.0.1",
3433− "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
3434− "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
3435− "dev": true
3436− },
3437− "methods": {
3438− "version": "1.1.2",
3439− "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
3440− "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
3441− "dev": true
3442− },
3443− "micromatch": {
3444− "version": "3.1.10",
3445− "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
3446− "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
3447− "dev": true,
3448− "requires": {
3449− "arr-diff": "^4.0.0",
3450− "array-unique": "^0.3.2",
3451− "braces": "^2.3.1",
3452− "define-property": "^2.0.2",
3453− "extend-shallow": "^3.0.2",
3454− "extglob": "^2.0.4",
3455− "fragment-cache": "^0.2.1",
3456− "kind-of": "^6.0.2",
3457− "nanomatch": "^1.2.9",
3458− "object.pick": "^1.3.0",
3459− "regex-not": "^1.0.0",
3460− "snapdragon": "^0.8.1",
3461− "to-regex": "^3.0.2"
3462− }
3463− },
3464− "miller-rabin": {
3465− "version": "4.0.1",
3466− "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
3467− "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
3468− "dev": true,
3469− "requires": {
3470− "bn.js": "^4.0.0",
3471− "brorand": "^1.0.1"
3472− }
3473− },
3474− "mime": {
3475− "version": "1.4.1",
3476− "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
3477− "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
3478− "dev": true
3479− },
3480− "mime-db": {
3481− "version": "1.37.0",
3482− "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
3483− "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
3484− "dev": true
3485− },
3486− "mime-types": {
3487− "version": "2.1.21",
3488− "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
3489− "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
3490− "dev": true,
3491− "requires": {
3492− "mime-db": "~1.37.0"
3493− }
3494− },
3495− "mimic-fn": {
3496− "version": "1.2.0",
3497− "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
3498− "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
3499− "dev": true
3500− },
3501− "minimalistic-assert": {
3502− "version": "1.0.1",
3503− "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
3504− "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
3505− "dev": true
3506− },
3507− "minimalistic-crypto-utils": {
3508− "version": "1.0.1",
3509− "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
3510− "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
3511− "dev": true
3512− },
3513− "minimatch": {
3514− "version": "3.0.4",
3515− "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
3516− "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
3517− "dev": true,
3518− "requires": {
3519− "brace-expansion": "^1.1.7"
3520− }
3521− },
3522− "minimist": {
3523− "version": "0.0.8",
3524− "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
3525− "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
3526− "dev": true
3527− },
3528− "mississippi": {
3529− "version": "2.0.0",
3530− "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz",
3531− "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==",
3532− "dev": true,
3533− "requires": {
3534− "concat-stream": "^1.5.0",
3535− "duplexify": "^3.4.2",
3536− "end-of-stream": "^1.1.0",
3537− "flush-write-stream": "^1.0.0",
3538− "from2": "^2.1.0",
3539− "parallel-transform": "^1.1.0",
3540− "pump": "^2.0.1",
3541− "pumpify": "^1.3.3",
3542− "stream-each": "^1.1.0",
3543− "through2": "^2.0.0"
3544− }
3545− },
3546− "mixin-deep": {
3547− "version": "1.3.1",
3548− "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
3549− "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
3550− "dev": true,
3551− "requires": {
3552− "for-in": "^1.0.2",
3553− "is-extendable": "^1.0.1"
3554− },
3555− "dependencies": {
3556− "is-extendable": {
3557− "version": "1.0.1",
3558− "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
3559− "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
3560− "dev": true,
3561− "requires": {
3562− "is-plain-object": "^2.0.4"
3563− }
3564− }
3565− }
3566− },
3567− "mkdirp": {
3568− "version": "0.5.1",
3569− "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
3570− "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
3571− "dev": true,
3572− "requires": {
3573− "minimist": "0.0.8"
3574− }
3575− },
3576− "move-concurrently": {
3577− "version": "1.0.1",
3578− "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
3579− "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
3580− "dev": true,
3581− "requires": {
3582− "aproba": "^1.1.1",
3583− "copy-concurrently": "^1.0.0",
3584− "fs-write-stream-atomic": "^1.0.8",
3585− "mkdirp": "^0.5.1",
3586− "rimraf": "^2.5.4",
3587− "run-queue": "^1.0.3"
3588− }
3589− },
3590− "ms": {
3591− "version": "2.0.0",
3592− "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
3593− "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
3594− "dev": true
3595− },
3596− "multicast-dns": {
3597− "version": "6.2.3",
3598− "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
3599− "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
3600− "dev": true,
3601− "requires": {
3602− "dns-packet": "^1.3.1",
3603− "thunky": "^1.0.2"
3604− }
3605− },
3606− "multicast-dns-service-types": {
3607− "version": "1.1.0",
3608− "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
3609− "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
3610− "dev": true
3611− },
3612− "nan": {
3613− "version": "2.11.1",
3614− "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz",
3615− "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==",
3616− "dev": true,
3617− "optional": true
3618− },
3619− "nanomatch": {
3620− "version": "1.2.13",
3621− "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
3622− "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
3623− "dev": true,
3624− "requires": {
3625− "arr-diff": "^4.0.0",
3626− "array-unique": "^0.3.2",
3627− "define-property": "^2.0.2",
3628− "extend-shallow": "^3.0.2",
3629− "fragment-cache": "^0.2.1",
3630− "is-windows": "^1.0.2",
3631− "kind-of": "^6.0.2",
3632− "object.pick": "^1.3.0",
3633− "regex-not": "^1.0.0",
3634− "snapdragon": "^0.8.1",
3635− "to-regex": "^3.0.1"
3636− }
3637− },
3638− "negotiator": {
3639− "version": "0.6.1",
3640− "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
3641− "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
3642− "dev": true
3643− },
3644− "neo-async": {
3645− "version": "2.5.1",
3646− "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz",
3647− "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==",
3648− "dev": true
3649− },
3650− "nice-try": {
3651− "version": "1.0.4",
3652− "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz",
3653− "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==",
3654− "dev": true
3655− },
3656− "no-case": {
3657− "version": "2.3.2",
3658− "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
3659− "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
3660− "dev": true,
3661− "requires": {
3662− "lower-case": "^1.1.1"
3663− }
3664− },
3665− "node-forge": {
3666− "version": "0.7.5",
3667− "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz",
3668− "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==",
3669− "dev": true
3670− },
3671− "node-libs-browser": {
3672− "version": "2.1.0",
3673− "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz",
3674− "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==",
3675− "dev": true,
3676− "requires": {
3677− "assert": "^1.1.1",
3678− "browserify-zlib": "^0.2.0",
3679− "buffer": "^4.3.0",
3680− "console-browserify": "^1.1.0",
3681− "constants-browserify": "^1.0.0",
3682− "crypto-browserify": "^3.11.0",
3683− "domain-browser": "^1.1.1",
3684− "events": "^1.0.0",
3685− "https-browserify": "^1.0.0",
3686− "os-browserify": "^0.3.0",
3687− "path-browserify": "0.0.0",
3688− "process": "^0.11.10",
3689− "punycode": "^1.2.4",
3690− "querystring-es3": "^0.2.0",
3691− "readable-stream": "^2.3.3",
3692− "stream-browserify": "^2.0.1",
3693− "stream-http": "^2.7.2",
3694− "string_decoder": "^1.0.0",
3695− "timers-browserify": "^2.0.4",
3696− "tty-browserify": "0.0.0",
3697− "url": "^0.11.0",
3698− "util": "^0.10.3",
3699− "vm-browserify": "0.0.4"
3700− },
3701− "dependencies": {
3702− "punycode": {
3703− "version": "1.4.1",
3704− "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
3705− "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
3706− "dev": true
3707− }
3708− }
3709− },
3710− "normalize-path": {
3711− "version": "2.1.1",
3712− "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
3713− "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
3714− "dev": true,
3715− "requires": {
3716− "remove-trailing-separator": "^1.0.1"
3717− }
3718− },
3719− "npm-run-path": {
3720− "version": "2.0.2",
3721− "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
3722− "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
3723− "dev": true,
3724− "requires": {
3725− "path-key": "^2.0.0"
3726− }
3727− },
3728− "nth-check": {
3729− "version": "1.0.1",
3730− "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
3731− "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
3732− "dev": true,
3733− "requires": {
3734− "boolbase": "~1.0.0"
3735− }
3736− },
3737− "number-is-nan": {
3738− "version": "1.0.1",
3739− "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
3740− "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
3741− "dev": true
3742− },
3743− "object-assign": {
3744− "version": "4.1.1",
3745− "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
3746− "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
3747− "dev": true
3748− },
3749− "object-copy": {
3750− "version": "0.1.0",
3751− "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
3752− "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
3753− "dev": true,
3754− "requires": {
3755− "copy-descriptor": "^0.1.0",
3756− "define-property": "^0.2.5",
3757− "kind-of": "^3.0.3"
3758− },
3759− "dependencies": {
3760− "define-property": {
3761− "version": "0.2.5",
3762− "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
3763− "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
3764− "dev": true,
3765− "requires": {
3766− "is-descriptor": "^0.1.0"
3767− }
3768− },
3769− "kind-of": {
3770− "version": "3.2.2",
3771− "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3772− "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3773− "dev": true,
3774− "requires": {
3775− "is-buffer": "^1.1.5"
3776− }
3777− }
3778− }
3779− },
3780− "object-keys": {
3781− "version": "1.0.12",
3782− "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
3783− "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
3784− "dev": true
3785− },
3786− "object-visit": {
3787− "version": "1.0.1",
3788− "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
3789− "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
3790− "dev": true,
3791− "requires": {
3792− "isobject": "^3.0.0"
3793− }
3794− },
3795− "object.getownpropertydescriptors": {
3796− "version": "2.0.3",
3797− "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
3798− "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
3799− "dev": true,
3800− "requires": {
3801− "define-properties": "^1.1.2",
3802− "es-abstract": "^1.5.1"
3803− }
3804− },
3805− "object.pick": {
3806− "version": "1.3.0",
3807− "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
3808− "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
3809− "dev": true,
3810− "requires": {
3811− "isobject": "^3.0.1"
3812− }
3813− },
3814− "obuf": {
3815− "version": "1.1.2",
3816− "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
3817− "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
3818− "dev": true
3819− },
3820− "on-finished": {
3821− "version": "2.3.0",
3822− "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
3823− "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
3824− "dev": true,
3825− "requires": {
3826− "ee-first": "1.1.1"
3827− }
3828− },
3829− "on-headers": {
3830− "version": "1.0.1",
3831− "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
3832− "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
3833− "dev": true
3834− },
3835− "once": {
3836− "version": "1.4.0",
3837− "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
3838− "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
3839− "dev": true,
3840− "requires": {
3841− "wrappy": "1"
3842− }
3843− },
3844− "opn": {
3845− "version": "5.4.0",
3846− "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz",
3847− "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==",
3848− "dev": true,
3849− "requires": {
3850− "is-wsl": "^1.1.0"
3851− }
3852− },
3853− "original": {
3854− "version": "1.0.2",
3855− "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
3856− "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
3857− "dev": true,
3858− "requires": {
3859− "url-parse": "^1.4.3"
3860− }
3861− },
3862− "os-browserify": {
3863− "version": "0.3.0",
3864− "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
3865− "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
3866− "dev": true
3867− },
3868− "os-locale": {
3869− "version": "3.0.1",
3870− "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz",
3871− "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==",
3872− "dev": true,
3873− "requires": {
3874− "execa": "^0.10.0",
3875− "lcid": "^2.0.0",
3876− "mem": "^4.0.0"
3877− }
3878− },
3879− "p-defer": {
3880− "version": "1.0.0",
3881− "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
3882− "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
3883− "dev": true
3884− },
3885− "p-finally": {
3886− "version": "1.0.0",
3887− "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
3888− "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
3889− "dev": true
3890− },
3891− "p-is-promise": {
3892− "version": "1.1.0",
3893− "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
3894− "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
3895− "dev": true
3896− },
3897− "p-limit": {
3898− "version": "1.3.0",
3899− "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
3900− "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
3901− "dev": true,
3902− "requires": {
3903− "p-try": "^1.0.0"
3904− }
3905− },
3906− "p-locate": {
3907− "version": "2.0.0",
3908− "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
3909− "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
3910− "dev": true,
3911− "requires": {
3912− "p-limit": "^1.1.0"
3913− }
3914− },
3915− "p-map": {
3916− "version": "1.2.0",
3917− "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
3918− "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
3919− "dev": true
3920− },
3921− "p-try": {
3922− "version": "1.0.0",
3923− "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
3924− "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
3925− "dev": true
3926− },
3927− "pako": {
3928− "version": "1.0.6",
3929− "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
3930− "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==",
3931− "dev": true
3932− },
3933− "parallel-transform": {
3934− "version": "1.1.0",
3935− "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz",
3936− "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
3937− "dev": true,
3938− "requires": {
3939− "cyclist": "~0.2.2",
3940− "inherits": "^2.0.3",
3941− "readable-stream": "^2.1.5"
3942− }
3943− },
3944− "param-case": {
3945− "version": "2.1.1",
3946− "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
3947− "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
3948− "dev": true,
3949− "requires": {
3950− "no-case": "^2.2.0"
3951− }
3952− },
3953− "parse-asn1": {
3954− "version": "5.1.1",
3955− "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
3956− "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==",
3957− "dev": true,
3958− "requires": {
3959− "asn1.js": "^4.0.0",
3960− "browserify-aes": "^1.0.0",
3961− "create-hash": "^1.1.0",
3962− "evp_bytestokey": "^1.0.0",
3963− "pbkdf2": "^3.0.3"
3964− }
3965− },
3966− "parseurl": {
3967− "version": "1.3.2",
3968− "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
3969− "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
3970− "dev": true
3971− },
3972− "pascalcase": {
3973− "version": "0.1.1",
3974− "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
3975− "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
3976− "dev": true
3977− },
3978− "path-browserify": {
3979− "version": "0.0.0",
3980− "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
3981− "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
3982− "dev": true
3983− },
3984− "path-dirname": {
3985− "version": "1.0.2",
3986− "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
3987− "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
3988− "dev": true
3989− },
3990− "path-exists": {
3991− "version": "3.0.0",
3992− "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
3993− "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
3994− "dev": true
3995− },
3996− "path-is-absolute": {
3997− "version": "1.0.1",
3998− "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
3999− "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
4000− "dev": true
4001− },
4002− "path-is-inside": {
4003− "version": "1.0.2",
4004− "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
4005− "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
4006− "dev": true
4007− },
4008− "path-key": {
4009− "version": "2.0.1",
4010− "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
4011− "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
4012− "dev": true
4013− },
4014− "path-to-regexp": {
4015− "version": "0.1.7",
4016− "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
4017− "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
4018− "dev": true
4019− },
4020− "pbkdf2": {
4021− "version": "3.0.17",
4022− "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
4023− "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
4024− "dev": true,
4025− "requires": {
4026− "create-hash": "^1.1.2",
4027− "create-hmac": "^1.1.4",
4028− "ripemd160": "^2.0.1",
4029− "safe-buffer": "^5.0.1",
4030− "sha.js": "^2.4.8"
4031− }
4032− },
4033− "pify": {
4034− "version": "3.0.0",
4035− "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
4036− "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
4037− "dev": true
4038− },
4039− "pinkie": {
4040− "version": "2.0.4",
4041− "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
4042− "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
4043− "dev": true
4044− },
4045− "pinkie-promise": {
4046− "version": "2.0.1",
4047− "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
4048− "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
4049− "dev": true,
4050− "requires": {
4051− "pinkie": "^2.0.0"
4052− }
4053− },
4054− "pkg-dir": {
4055− "version": "2.0.0",
4056− "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
4057− "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
4058− "dev": true,
4059− "requires": {
4060− "find-up": "^2.1.0"
4061− }
4062− },
4063− "portfinder": {
4064− "version": "1.0.20",
4065− "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz",
4066− "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==",
4067− "dev": true,
4068− "requires": {
4069− "async": "^1.5.2",
4070− "debug": "^2.2.0",
4071− "mkdirp": "0.5.x"
4072− },
4073− "dependencies": {
4074− "debug": {
4075− "version": "2.6.9",
4076− "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4077− "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4078− "dev": true,
4079− "requires": {
4080− "ms": "2.0.0"
4081− }
4082− }
4083− }
4084− },
4085− "posix-character-classes": {
4086− "version": "0.1.1",
4087− "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
4088− "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
4089− "dev": true
4090− },
4091− "pretty-error": {
4092− "version": "2.1.1",
4093− "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
4094− "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
4095− "dev": true,
4096− "requires": {
4097− "renderkid": "^2.0.1",
4098− "utila": "~0.4"
4099− }
4100− },
4101− "process": {
4102− "version": "0.11.10",
4103− "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
4104− "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
4105− "dev": true
4106− },
4107− "process-nextick-args": {
4108− "version": "2.0.0",
4109− "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
4110− "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
4111− "dev": true
4112− },
4113− "promise-inflight": {
4114− "version": "1.0.1",
4115− "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
4116− "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
4117− "dev": true
4118− },
4119− "proxy-addr": {
4120− "version": "2.0.4",
4121− "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
4122− "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
4123− "dev": true,
4124− "requires": {
4125− "forwarded": "~0.1.2",
4126− "ipaddr.js": "1.8.0"
4127− }
4128− },
4129− "prr": {
4130− "version": "1.0.1",
4131− "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
4132− "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
4133− "dev": true
4134− },
4135− "pseudomap": {
4136− "version": "1.0.2",
4137− "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
4138− "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
4139− "dev": true
4140− },
4141− "public-encrypt": {
4142− "version": "4.0.3",
4143− "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
4144− "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
4145− "dev": true,
4146− "requires": {
4147− "bn.js": "^4.1.0",
4148− "browserify-rsa": "^4.0.0",
4149− "create-hash": "^1.1.0",
4150− "parse-asn1": "^5.0.0",
4151− "randombytes": "^2.0.1",
4152− "safe-buffer": "^5.1.2"
4153− }
4154− },
4155− "pump": {
4156− "version": "2.0.1",
4157− "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
4158− "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
4159− "dev": true,
4160− "requires": {
4161− "end-of-stream": "^1.1.0",
4162− "once": "^1.3.1"
4163− }
4164− },
4165− "pumpify": {
4166− "version": "1.5.1",
4167− "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
4168− "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
4169− "dev": true,
4170− "requires": {
4171− "duplexify": "^3.6.0",
4172− "inherits": "^2.0.3",
4173− "pump": "^2.0.0"
4174− }
4175− },
4176− "punycode": {
4177− "version": "2.1.1",
4178− "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
4179− "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
4180− "dev": true
4181− },
4182− "qs": {
4183− "version": "6.5.2",
4184− "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
4185− "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
4186− "dev": true
4187− },
4188− "querystring": {
4189− "version": "0.2.0",
4190− "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
4191− "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
4192− "dev": true
4193− },
4194− "querystring-es3": {
4195− "version": "0.2.1",
4196− "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
4197− "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
4198− "dev": true
4199− },
4200− "querystringify": {
4201− "version": "2.1.0",
4202− "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz",
4203− "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==",
4204− "dev": true
4205− },
4206− "randombytes": {
4207− "version": "2.0.6",
4208− "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
4209− "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
4210− "dev": true,
4211− "requires": {
4212− "safe-buffer": "^5.1.0"
4213− }
4214− },
4215− "randomfill": {
4216− "version": "1.0.4",
4217− "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
4218− "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
4219− "dev": true,
4220− "requires": {
4221− "randombytes": "^2.0.5",
4222− "safe-buffer": "^5.1.0"
4223− }
4224− },
4225− "range-parser": {
4226− "version": "1.2.0",
4227− "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
4228− "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
4229− "dev": true
4230− },
4231− "raw-body": {
4232− "version": "2.3.3",
4233− "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
4234− "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
4235− "dev": true,
4236− "requires": {
4237− "bytes": "3.0.0",
4238− "http-errors": "1.6.3",
4239− "iconv-lite": "0.4.23",
4240− "unpipe": "1.0.0"
4241− }
4242− },
4243− "readable-stream": {
4244− "version": "2.3.6",
4245− "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
4246− "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
4247− "dev": true,
4248− "requires": {
4249− "core-util-is": "~1.0.0",
4250− "inherits": "~2.0.3",
4251− "isarray": "~1.0.0",
4252− "process-nextick-args": "~2.0.0",
4253− "safe-buffer": "~5.1.1",
4254− "string_decoder": "~1.1.1",
4255− "util-deprecate": "~1.0.1"
4256− }
4257− },
4258− "readdirp": {
4259− "version": "2.1.0",
4260− "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
4261− "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
4262− "dev": true,
4263− "requires": {
4264− "graceful-fs": "^4.1.2",
4265− "minimatch": "^3.0.2",
4266− "readable-stream": "^2.0.2",
4267− "set-immediate-shim": "^1.0.1"
4268− },
4269− "dependencies": {
4270− "isarray": {
4271− "version": "1.0.0",
4272− "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
4273− "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
4274− "dev": true
4275− },
4276− "readable-stream": {
4277− "version": "2.3.6",
4278− "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
4279− "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
4280− "dev": true,
4281− "requires": {
4282− "core-util-is": "~1.0.0",
4283− "inherits": "~2.0.3",
4284− "isarray": "~1.0.0",
4285− "process-nextick-args": "~2.0.0",
4286− "safe-buffer": "~5.1.1",
4287− "string_decoder": "~1.1.1",
4288− "util-deprecate": "~1.0.1"
4289− }
4290− },
4291− "string_decoder": {
4292− "version": "1.1.1",
4293− "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
4294− "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
4295− "dev": true,
4296− "requires": {
4297− "safe-buffer": "~5.1.0"
4298− }
4299− }
4300− }
4301− },
4302− "regex-not": {
4303− "version": "1.0.2",
4304− "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
4305− "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
4306− "dev": true,
4307− "requires": {
4308− "extend-shallow": "^3.0.2",
4309− "safe-regex": "^1.1.0"
4310− }
4311− },
4312− "relateurl": {
4313− "version": "0.2.7",
4314− "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
4315− "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
4316− "dev": true
4317− },
4318− "remove-trailing-separator": {
4319− "version": "1.1.0",
4320− "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
4321− "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
4322− "dev": true
4323− },
4324− "renderkid": {
4325− "version": "2.0.1",
4326− "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz",
4327− "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=",
4328− "dev": true,
4329− "requires": {
4330− "css-select": "^1.1.0",
4331− "dom-converter": "~0.1",
4332− "htmlparser2": "~3.3.0",
4333− "strip-ansi": "^3.0.0",
4334− "utila": "~0.3"
4335− },
4336− "dependencies": {
4337− "utila": {
4338− "version": "0.3.3",
4339− "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz",
4340− "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=",
4341− "dev": true
4342− }
4343− }
4344− },
4345− "repeat-element": {
4346− "version": "1.1.2",
4347− "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
4348− "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
4349− "dev": true
4350− },
4351− "repeat-string": {
4352− "version": "1.6.1",
4353− "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
4354− "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
4355− "dev": true
4356− },
4357− "require-directory": {
4358− "version": "2.1.1",
4359− "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
4360− "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
4361− "dev": true
4362− },
4363− "require-main-filename": {
4364− "version": "1.0.1",
4365− "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
4366− "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
4367− "dev": true
4368− },
4369− "requires-port": {
4370− "version": "1.0.0",
4371− "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
4372− "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
4373− "dev": true
4374− },
4375− "resolve-cwd": {
4376− "version": "2.0.0",
4377− "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
4378− "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
4379− "dev": true,
4380− "requires": {
4381− "resolve-from": "^3.0.0"
4382− }
4383− },
4384− "resolve-from": {
4385− "version": "3.0.0",
4386− "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
4387− "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
4388− "dev": true
4389− },
4390− "resolve-url": {
4391− "version": "0.2.1",
4392− "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
4393− "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
4394− "dev": true
4395− },
4396− "ret": {
4397− "version": "0.1.15",
4398− "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
4399− "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
4400− "dev": true
4401− },
4402− "rimraf": {
4403− "version": "2.6.2",
4404− "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
4405− "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
4406− "dev": true,
4407− "requires": {
4408− "glob": "^7.0.5"
4409− }
4410− },
4411− "ripemd160": {
4412− "version": "2.0.2",
4413− "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
4414− "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
4415− "dev": true,
4416− "requires": {
4417− "hash-base": "^3.0.0",
4418− "inherits": "^2.0.1"
4419− }
4420− },
4421− "run-queue": {
4422− "version": "1.0.3",
4423− "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
4424− "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
4425− "dev": true,
4426− "requires": {
4427− "aproba": "^1.1.1"
4428− }
4429− },
4430− "safe-buffer": {
4431− "version": "5.1.2",
4432− "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
4433− "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
4434− "dev": true
4435− },
4436− "safe-regex": {
4437− "version": "1.1.0",
4438− "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
4439− "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
4440− "dev": true,
4441− "requires": {
4442− "ret": "~0.1.10"
4443− }
4444− },
4445− "safer-buffer": {
4446− "version": "2.1.2",
4447− "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
4448− "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
4449− "dev": true
4450− },
4451− "schema-utils": {
4452− "version": "0.4.7",
4453− "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
4454− "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
4455− "dev": true,
4456− "requires": {
4457− "ajv": "^6.1.0",
4458− "ajv-keywords": "^3.1.0"
4459− }
4460− },
4461− "select-hose": {
4462− "version": "2.0.0",
4463− "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
4464− "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
4465− "dev": true
4466− },
4467− "selfsigned": {
4468− "version": "1.10.4",
4469− "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz",
4470− "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==",
4471− "dev": true,
4472− "requires": {
4473− "node-forge": "0.7.5"
4474− }
4475− },
4476− "semver": {
4477− "version": "5.5.0",
4478− "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
4479− "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
4480− "dev": true
4481− },
4482− "send": {
4483− "version": "0.16.2",
4484− "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
4485− "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
4486− "dev": true,
4487− "requires": {
4488− "debug": "2.6.9",
4489− "depd": "~1.1.2",
4490− "destroy": "~1.0.4",
4491− "encodeurl": "~1.0.2",
4492− "escape-html": "~1.0.3",
4493− "etag": "~1.8.1",
4494− "fresh": "0.5.2",
4495− "http-errors": "~1.6.2",
4496− "mime": "1.4.1",
4497− "ms": "2.0.0",
4498− "on-finished": "~2.3.0",
4499− "range-parser": "~1.2.0",
4500− "statuses": "~1.4.0"
4501− },
4502− "dependencies": {
4503− "debug": {
4504− "version": "2.6.9",
4505− "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4506− "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4507− "dev": true,
4508− "requires": {
4509− "ms": "2.0.0"
4510− }
4511− }
4512− }
4513− },
4514− "serialize-javascript": {
4515− "version": "1.5.0",
4516− "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz",
4517− "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==",
4518− "dev": true
4519− },
4520− "serve-index": {
4521− "version": "1.9.1",
4522− "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
4523− "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
4524− "dev": true,
4525− "requires": {
4526− "accepts": "~1.3.4",
4527− "batch": "0.6.1",
4528− "debug": "2.6.9",
4529− "escape-html": "~1.0.3",
4530− "http-errors": "~1.6.2",
4531− "mime-types": "~2.1.17",
4532− "parseurl": "~1.3.2"
4533− },
4534− "dependencies": {
4535− "debug": {
4536− "version": "2.6.9",
4537− "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4538− "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4539− "dev": true,
4540− "requires": {
4541− "ms": "2.0.0"
4542− }
4543− }
4544− }
4545− },
4546− "serve-static": {
4547− "version": "1.13.2",
4548− "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
4549− "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
4550− "dev": true,
4551− "requires": {
4552− "encodeurl": "~1.0.2",
4553− "escape-html": "~1.0.3",
4554− "parseurl": "~1.3.2",
4555− "send": "0.16.2"
4556− }
4557− },
4558− "set-blocking": {
4559− "version": "2.0.0",
4560− "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
4561− "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
4562− "dev": true
4563− },
4564− "set-immediate-shim": {
4565− "version": "1.0.1",
4566− "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
4567− "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
4568− "dev": true
4569− },
4570− "set-value": {
4571− "version": "2.0.0",
4572− "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
4573− "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
4574− "dev": true,
4575− "requires": {
4576− "extend-shallow": "^2.0.1",
4577− "is-extendable": "^0.1.1",
4578− "is-plain-object": "^2.0.3",
4579− "split-string": "^3.0.1"
4580− },
4581− "dependencies": {
4582− "extend-shallow": {
4583− "version": "2.0.1",
4584− "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
4585− "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
4586− "dev": true,
4587− "requires": {
4588− "is-extendable": "^0.1.0"
4589− }
4590− }
4591− }
4592− },
4593− "setimmediate": {
4594− "version": "1.0.5",
4595− "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
4596− "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
4597− "dev": true
4598− },
4599− "setprototypeof": {
4600− "version": "1.1.0",
4601− "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
4602− "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
4603− "dev": true
4604− },
4605− "sha.js": {
4606− "version": "2.4.11",
4607− "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
4608− "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
4609− "dev": true,
4610− "requires": {
4611− "inherits": "^2.0.1",
4612− "safe-buffer": "^5.0.1"
4613− }
4614− },
4615− "shebang-command": {
4616− "version": "1.2.0",
4617− "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
4618− "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
4619− "dev": true,
4620− "requires": {
4621− "shebang-regex": "^1.0.0"
4622− }
4623− },
4624− "shebang-regex": {
4625− "version": "1.0.0",
4626− "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
4627− "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
4628− "dev": true
4629− },
4630− "signal-exit": {
4631− "version": "3.0.2",
4632− "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
4633− "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
4634− "dev": true
4635− },
4636− "snapdragon": {
4637− "version": "0.8.2",
4638− "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
4639− "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
4640− "dev": true,
4641− "requires": {
4642− "base": "^0.11.1",
4643− "debug": "^2.2.0",
4644− "define-property": "^0.2.5",
4645− "extend-shallow": "^2.0.1",
4646− "map-cache": "^0.2.2",
4647− "source-map": "^0.5.6",
4648− "source-map-resolve": "^0.5.0",
4649− "use": "^3.1.0"
4650− },
4651− "dependencies": {
4652− "debug": {
4653− "version": "2.6.9",
4654− "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4655− "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4656− "dev": true,
4657− "requires": {
4658− "ms": "2.0.0"
4659− }
4660− },
4661− "define-property": {
4662− "version": "0.2.5",
4663− "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
4664− "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
4665− "dev": true,
4666− "requires": {
4667− "is-descriptor": "^0.1.0"
4668− }
4669− },
4670− "extend-shallow": {
4671− "version": "2.0.1",
4672− "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
4673− "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
4674− "dev": true,
4675− "requires": {
4676− "is-extendable": "^0.1.0"
4677− }
4678− }
4679− }
4680− },
4681− "snapdragon-node": {
4682− "version": "2.1.1",
4683− "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
4684− "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
4685− "dev": true,
4686− "requires": {
4687− "define-property": "^1.0.0",
4688− "isobject": "^3.0.0",
4689− "snapdragon-util": "^3.0.1"
4690− },
4691− "dependencies": {
4692− "define-property": {
4693− "version": "1.0.0",
4694− "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
4695− "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
4696− "dev": true,
4697− "requires": {
4698− "is-descriptor": "^1.0.0"
4699− }
4700− },
4701− "is-accessor-descriptor": {
4702− "version": "1.0.0",
4703− "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
4704− "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
4705− "dev": true,
4706− "requires": {
4707− "kind-of": "^6.0.0"
4708− }
4709− },
4710− "is-data-descriptor": {
4711− "version": "1.0.0",
4712− "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
4713− "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
4714− "dev": true,
4715− "requires": {
4716− "kind-of": "^6.0.0"
4717− }
4718− },
4719− "is-descriptor": {
4720− "version": "1.0.2",
4721− "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
4722− "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
4723− "dev": true,
4724− "requires": {
4725− "is-accessor-descriptor": "^1.0.0",
4726− "is-data-descriptor": "^1.0.0",
4727− "kind-of": "^6.0.2"
4728− }
4729− }
4730− }
4731− },
4732− "snapdragon-util": {
4733− "version": "3.0.1",
4734− "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
4735− "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
4736− "dev": true,
4737− "requires": {
4738− "kind-of": "^3.2.0"
4739− },
4740− "dependencies": {
4741− "kind-of": {
4742− "version": "3.2.2",
4743− "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
4744− "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
4745− "dev": true,
4746− "requires": {
4747− "is-buffer": "^1.1.5"
4748− }
4749− }
4750− }
4751− },
4752− "sockjs": {
4753− "version": "0.3.19",
4754− "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
4755− "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
4756− "dev": true,
4757− "requires": {
4758− "faye-websocket": "^0.10.0",
4759− "uuid": "^3.0.1"
4760− }
4761− },
4762− "sockjs-client": {
4763− "version": "1.3.0",
4764− "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz",
4765− "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==",
4766− "dev": true,
4767− "requires": {
4768− "debug": "^3.2.5",
4769− "eventsource": "^1.0.7",
4770− "faye-websocket": "~0.11.1",
4771− "inherits": "^2.0.3",
4772− "json3": "^3.3.2",
4773− "url-parse": "^1.4.3"
4774− },
4775− "dependencies": {
4776− "faye-websocket": {
4777− "version": "0.11.1",
4778− "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz",
4779− "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=",
4780− "dev": true,
4781− "requires": {
4782− "websocket-driver": ">=0.5.1"
4783− }
4784− }
4785− }
4786− },
4787− "source-list-map": {
4788− "version": "2.0.1",
4789− "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
4790− "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
4791− "dev": true
4792− },
4793− "source-map": {
4794− "version": "0.5.7",
4795− "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
4796− "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
4797− "dev": true
4798− },
4799− "source-map-resolve": {
4800− "version": "0.5.2",
4801− "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
4802− "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
4803− "dev": true,
4804− "requires": {
4805− "atob": "^2.1.1",
4806− "decode-uri-component": "^0.2.0",
4807− "resolve-url": "^0.2.1",
4808− "source-map-url": "^0.4.0",
4809− "urix": "^0.1.0"
4810− }
4811− },
4812− "source-map-url": {
4813− "version": "0.4.0",
4814− "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
4815− "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
4816− "dev": true
4817− },
4818− "spdy": {
4819− "version": "4.0.0",
4820− "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz",
4821− "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==",
4822− "dev": true,
4823− "requires": {
4824− "debug": "^4.1.0",
4825− "handle-thing": "^2.0.0",
4826− "http-deceiver": "^1.2.7",
4827− "select-hose": "^2.0.0",
4828− "spdy-transport": "^3.0.0"
4829− },
4830− "dependencies": {
4831− "debug": {
4832− "version": "4.1.1",
4833− "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
4834− "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
4835− "dev": true,
4836− "requires": {
4837− "ms": "^2.1.1"
4838− }
4839− },
4840− "ms": {
4841− "version": "2.1.1",
4842− "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
4843− "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
4844− "dev": true
4845− }
4846− }
4847− },
4848− "spdy-transport": {
4849− "version": "3.0.0",
4850− "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
4851− "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
4852− "dev": true,
4853− "requires": {
4854− "debug": "^4.1.0",
4855− "detect-node": "^2.0.4",
4856− "hpack.js": "^2.1.6",
4857− "obuf": "^1.1.2",
4858− "readable-stream": "^3.0.6",
4859− "wbuf": "^1.7.3"
4860− },
4861− "dependencies": {
4862− "debug": {
4863− "version": "4.1.1",
4864− "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
4865− "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
4866− "dev": true,
4867− "requires": {
4868− "ms": "^2.1.1"
4869− }
4870− },
4871− "ms": {
4872− "version": "2.1.1",
4873− "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
4874− "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
4875− "dev": true
4876− },
4877− "readable-stream": {
4878− "version": "3.1.1",
4879− "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz",
4880− "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==",
4881− "dev": true,
4882− "requires": {
4883− "inherits": "^2.0.3",
4884− "string_decoder": "^1.1.1",
4885− "util-deprecate": "^1.0.1"
4886− }
4887− }
4888− }
4889− },
4890− "split-string": {
4891− "version": "3.1.0",
4892− "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
4893− "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
4894− "dev": true,
4895− "requires": {
4896− "extend-shallow": "^3.0.0"
4897− }
4898− },
4899− "ssri": {
4900− "version": "5.3.0",
4901− "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz",
4902− "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==",
4903− "dev": true,
4904− "requires": {
4905− "safe-buffer": "^5.1.1"
4906− }
4907− },
4908− "static-extend": {
4909− "version": "0.1.2",
4910− "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
4911− "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
4912− "dev": true,
4913− "requires": {
4914− "define-property": "^0.2.5",
4915− "object-copy": "^0.1.0"
4916− },
4917− "dependencies": {
4918− "define-property": {
4919− "version": "0.2.5",
4920− "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
4921− "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
4922− "dev": true,
4923− "requires": {
4924− "is-descriptor": "^0.1.0"
4925− }
4926− }
4927− }
4928− },
4929− "statuses": {
4930− "version": "1.4.0",
4931− "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
4932− "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
4933− "dev": true
4934− },
4935− "stream-browserify": {
4936− "version": "2.0.1",
4937− "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
4938− "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
4939− "dev": true,
4940− "requires": {
4941− "inherits": "~2.0.1",
4942− "readable-stream": "^2.0.2"
4943− }
4944− },
4945− "stream-each": {
4946− "version": "1.2.3",
4947− "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
4948− "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
4949− "dev": true,
4950− "requires": {
4951− "end-of-stream": "^1.1.0",
4952− "stream-shift": "^1.0.0"
4953− }
4954− },
4955− "stream-http": {
4956− "version": "2.8.3",
4957− "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
4958− "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
4959− "dev": true,
4960− "requires": {
4961− "builtin-status-codes": "^3.0.0",
4962− "inherits": "^2.0.1",
4963− "readable-stream": "^2.3.6",
4964− "to-arraybuffer": "^1.0.0",
4965− "xtend": "^4.0.0"
4966− }
4967− },
4968− "stream-shift": {
4969− "version": "1.0.0",
4970− "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
4971− "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
4972− "dev": true
4973− },
4974− "string-width": {
4975− "version": "2.1.1",
4976− "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
4977− "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
4978− "dev": true,
4979− "requires": {
4980− "is-fullwidth-code-point": "^2.0.0",
4981− "strip-ansi": "^4.0.0"
4982− },
4983− "dependencies": {
4984− "ansi-regex": {
4985− "version": "3.0.0",
4986− "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
4987− "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
4988− "dev": true
4989− },
4990− "strip-ansi": {
4991− "version": "4.0.0",
4992− "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
4993− "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
4994− "dev": true,
4995− "requires": {
4996− "ansi-regex": "^3.0.0"
4997− }
4998− }
4999− }
5000− },
5001− "string_decoder": {
5002− "version": "1.1.1",
5003− "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
5004− "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
5005− "dev": true,
5006− "requires": {
5007− "safe-buffer": "~5.1.0"
5008− }
5009− },
5010− "strip-ansi": {
5011− "version": "3.0.1",
5012− "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
5013− "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
5014− "dev": true,
5015− "requires": {
5016− "ansi-regex": "^2.0.0"
5017− }
5018− },
5019− "strip-eof": {
5020− "version": "1.0.0",
5021− "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
5022− "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
5023− "dev": true
5024− },
5025− "supports-color": {
5026− "version": "5.4.0",
5027− "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
5028− "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
5029− "dev": true,
5030− "requires": {
5031− "has-flag": "^3.0.0"
5032− }
5033− },
5034− "tapable": {
5035− "version": "1.0.0",
5036− "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz",
5037− "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==",
5038− "dev": true
5039− },
5040− "through2": {
5041− "version": "2.0.3",
5042− "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
5043− "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
5044− "dev": true,
5045− "requires": {
5046− "readable-stream": "^2.1.5",
5047− "xtend": "~4.0.1"
5048− }
5049− },
5050− "thunky": {
5051− "version": "1.0.3",
5052− "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz",
5053− "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==",
5054− "dev": true
5055− },
5056− "timers-browserify": {
5057− "version": "2.0.10",
5058− "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
5059− "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==",
5060− "dev": true,
5061− "requires": {
5062− "setimmediate": "^1.0.4"
5063− }
5064− },
5065− "to-arraybuffer": {
5066− "version": "1.0.1",
5067− "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
5068− "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
5069− "dev": true
5070− },
5071− "to-object-path": {
5072− "version": "0.3.0",
5073− "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
5074− "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
5075− "dev": true,
5076− "requires": {
5077− "kind-of": "^3.0.2"
5078− },
5079− "dependencies": {
5080− "kind-of": {
5081− "version": "3.2.2",
5082− "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
5083− "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
5084− "dev": true,
5085− "requires": {
5086− "is-buffer": "^1.1.5"
5087− }
5088− }
5089− }
5090− },
5091− "to-regex": {
5092− "version": "3.0.2",
5093− "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
5094− "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
5095− "dev": true,
5096− "requires": {
5097− "define-property": "^2.0.2",
5098− "extend-shallow": "^3.0.2",
5099− "regex-not": "^1.0.2",
5100− "safe-regex": "^1.1.0"
5101− }
5102− },
5103− "to-regex-range": {
5104− "version": "2.1.1",
5105− "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
5106− "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
5107− "dev": true,
5108− "requires": {
5109− "is-number": "^3.0.0",
5110− "repeat-string": "^1.6.1"
5111− }
5112− },
5113− "toposort": {
5114− "version": "1.0.7",
5115− "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz",
5116− "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=",
5117− "dev": true
5118− },
5119− "tslib": {
5120− "version": "1.9.3",
5121− "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
5122− "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
5123− "dev": true
5124− },
5125− "tty-browserify": {
5126− "version": "0.0.0",
5127− "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
5128− "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
5129− "dev": true
5130− },
5131− "type-is": {
5132− "version": "1.6.16",
5133− "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
5134− "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
5135− "dev": true,
5136− "requires": {
5137− "media-typer": "0.3.0",
5138− "mime-types": "~2.1.18"
5139− }
5140− },
5141− "typedarray": {
5142− "version": "0.0.6",
5143− "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
5144− "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
5145− "dev": true
5146− },
5147− "uglify-es": {
5148− "version": "3.3.9",
5149− "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
5150− "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==",
5151− "dev": true,
5152− "requires": {
5153− "commander": "~2.13.0",
5154− "source-map": "~0.6.1"
5155− },
5156− "dependencies": {
5157− "source-map": {
5158− "version": "0.6.1",
5159− "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
5160− "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
5161− "dev": true
5162− }
5163− }
5164− },
5165− "uglifyjs-webpack-plugin": {
5166− "version": "1.3.0",
5167− "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz",
5168− "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==",
5169− "dev": true,
5170− "requires": {
5171− "cacache": "^10.0.4",
5172− "find-cache-dir": "^1.0.0",
5173− "schema-utils": "^0.4.5",
5174− "serialize-javascript": "^1.4.0",
5175− "source-map": "^0.6.1",
5176− "uglify-es": "^3.3.4",
5177− "webpack-sources": "^1.1.0",
5178− "worker-farm": "^1.5.2"
5179− },
5180− "dependencies": {
5181− "source-map": {
5182− "version": "0.6.1",
5183− "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
5184− "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
5185− "dev": true
5186− }
5187− }
5188− },
5189− "union-value": {
5190− "version": "1.0.0",
5191− "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
5192− "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
5193− "dev": true,
5194− "requires": {
5195− "arr-union": "^3.1.0",
5196− "get-value": "^2.0.6",
5197− "is-extendable": "^0.1.1",
5198− "set-value": "^0.4.3"
5199− },
5200− "dependencies": {
5201− "extend-shallow": {
5202− "version": "2.0.1",
5203− "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
5204− "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
5205− "dev": true,
5206− "requires": {
5207− "is-extendable": "^0.1.0"
5208− }
5209− },
5210− "set-value": {
5211− "version": "0.4.3",
5212− "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
5213− "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
5214− "dev": true,
5215− "requires": {
5216− "extend-shallow": "^2.0.1",
5217− "is-extendable": "^0.1.1",
5218− "is-plain-object": "^2.0.1",
5219− "to-object-path": "^0.3.0"
5220− }
5221− }
5222− }
5223− },
5224− "unique-filename": {
5225− "version": "1.1.1",
5226− "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
5227− "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
5228− "dev": true,
5229− "requires": {
5230− "unique-slug": "^2.0.0"
5231− }
5232− },
5233− "unique-slug": {
5234− "version": "2.0.1",
5235− "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz",
5236− "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==",
5237− "dev": true,
5238− "requires": {
5239− "imurmurhash": "^0.1.4"
5240− }
5241− },
5242− "unpipe": {
5243− "version": "1.0.0",
5244− "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
5245− "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
5246− "dev": true
5247− },
5248− "unset-value": {
5249− "version": "1.0.0",
5250− "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
5251− "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
5252− "dev": true,
5253− "requires": {
5254− "has-value": "^0.3.1",
5255− "isobject": "^3.0.0"
5256− },
5257− "dependencies": {
5258− "has-value": {
5259− "version": "0.3.1",
5260− "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
5261− "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
5262− "dev": true,
5263− "requires": {
5264− "get-value": "^2.0.3",
5265− "has-values": "^0.1.4",
5266− "isobject": "^2.0.0"
5267− },
5268− "dependencies": {
5269− "isobject": {
5270− "version": "2.1.0",
5271− "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
5272− "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
5273− "dev": true,
5274− "requires": {
5275− "isarray": "1.0.0"
5276− }
5277− }
5278− }
5279− },
5280− "has-values": {
5281− "version": "0.1.4",
5282− "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
5283− "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
5284− "dev": true
5285− },
5286− "isarray": {
5287− "version": "1.0.0",
5288− "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
5289− "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
5290− "dev": true
5291− }
5292− }
5293− },
5294− "upath": {
5295− "version": "1.1.0",
5296− "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
5297− "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==",
5298− "dev": true
5299− },
5300− "upper-case": {
5301− "version": "1.1.3",
5302− "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
5303− "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
5304− "dev": true
5305− },
5306− "uri-js": {
5307− "version": "4.2.2",
5308− "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
5309− "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
5310− "dev": true,
5311− "requires": {
5312− "punycode": "^2.1.0"
5313− }
5314− },
5315− "urix": {
5316− "version": "0.1.0",
5317− "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
5318− "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
5319− "dev": true
5320− },
5321− "url": {
5322− "version": "0.11.0",
5323− "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
5324− "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
5325− "dev": true,
5326− "requires": {
5327− "punycode": "1.3.2",
5328− "querystring": "0.2.0"
5329− },
5330− "dependencies": {
5331− "punycode": {
5332− "version": "1.3.2",
5333− "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
5334− "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
5335− "dev": true
5336− }
5337− }
5338− },
5339− "url-parse": {
5340− "version": "1.4.4",
5341− "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz",
5342− "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==",
5343− "dev": true,
5344− "requires": {
5345− "querystringify": "^2.0.0",
5346− "requires-port": "^1.0.0"
5347− }
5348− },
5349− "use": {
5350− "version": "3.1.1",
5351− "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
5352− "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
5353− "dev": true
5354− },
5355− "util": {
5356− "version": "0.10.4",
5357− "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
5358− "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
5359− "dev": true,
5360− "requires": {
5361− "inherits": "2.0.3"
5362− }
5363− },
5364− "util-deprecate": {
5365− "version": "1.0.2",
5366− "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
5367− "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
5368− "dev": true
5369− },
5370− "util.promisify": {
5371− "version": "1.0.0",
5372− "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
5373− "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
5374− "dev": true,
5375− "requires": {
5376− "define-properties": "^1.1.2",
5377− "object.getownpropertydescriptors": "^2.0.3"
5378− }
5379− },
5380− "utila": {
5381− "version": "0.4.0",
5382− "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
5383− "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
5384− "dev": true
5385− },
5386− "utils-merge": {
5387− "version": "1.0.1",
5388− "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
5389− "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
5390− "dev": true
5391− },
5392− "uuid": {
5393− "version": "3.3.2",
5394− "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
5395− "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
5396− "dev": true
5397− },
5398− "v8-compile-cache": {
5399− "version": "2.0.2",
5400− "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz",
5401− "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==",
5402− "dev": true
5403− },
5404− "vary": {
5405− "version": "1.1.2",
5406− "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
5407− "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
5408− "dev": true
5409− },
5410− "vm-browserify": {
5411− "version": "0.0.4",
5412− "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
5413− "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
5414− "dev": true,
5415− "requires": {
5416− "indexof": "0.0.1"
5417− }
5418− },
5419− "watchpack": {
5420− "version": "1.6.0",
5421− "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
5422− "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==",
5423− "dev": true,
5424− "requires": {
5425− "chokidar": "^2.0.2",
5426− "graceful-fs": "^4.1.2",
5427− "neo-async": "^2.5.0"
5428− }
5429− },
5430− "wbuf": {
5431− "version": "1.7.3",
5432− "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
5433− "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
5434− "dev": true,
5435− "requires": {
5436− "minimalistic-assert": "^1.0.0"
5437− }
5438− },
5439− "webpack": {
5440− "version": "4.25.1",
5441− "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.25.1.tgz",
5442− "integrity": "sha512-T0GU/3NRtO4tMfNzsvpdhUr8HnzA4LTdP2zd+e5zd6CdOH5vNKHnAlO+DvzccfhPdzqRrALOFcjYxx7K5DWmvA==",
5443− "dev": true,
5444− "requires": {
5445− "@webassemblyjs/ast": "1.7.11",
5446− "@webassemblyjs/helper-module-context": "1.7.11",
5447− "@webassemblyjs/wasm-edit": "1.7.11",
5448− "@webassemblyjs/wasm-parser": "1.7.11",
5449− "acorn": "^5.6.2",
5450− "acorn-dynamic-import": "^3.0.0",
5451− "ajv": "^6.1.0",
5452− "ajv-keywords": "^3.1.0",
5453− "chrome-trace-event": "^1.0.0",
5454− "enhanced-resolve": "^4.1.0",
5455− "eslint-scope": "^4.0.0",
5456− "json-parse-better-errors": "^1.0.2",
5457− "loader-runner": "^2.3.0",
5458− "loader-utils": "^1.1.0",
5459− "memory-fs": "~0.4.1",
5460− "micromatch": "^3.1.8",
5461− "mkdirp": "~0.5.0",
5462− "neo-async": "^2.5.0",
5463− "node-libs-browser": "^2.0.0",
5464− "schema-utils": "^0.4.4",
5465− "tapable": "^1.1.0",
5466− "uglifyjs-webpack-plugin": "^1.2.4",
5467− "watchpack": "^1.5.0",
5468− "webpack-sources": "^1.3.0"
5469− },
5470− "dependencies": {
5471− "tapable": {
5472− "version": "1.1.0",
5473− "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz",
5474− "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==",
5475− "dev": true
5476− }
5477− }
5478− },
5479− "webpack-cli": {
5480− "version": "3.1.2",
5481− "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz",
5482− "integrity": "sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==",
5483− "dev": true,
5484− "requires": {
5485− "chalk": "^2.4.1",
5486− "cross-spawn": "^6.0.5",
5487− "enhanced-resolve": "^4.1.0",
5488− "global-modules-path": "^2.3.0",
5489− "import-local": "^2.0.0",
5490− "interpret": "^1.1.0",
5491− "loader-utils": "^1.1.0",
5492− "supports-color": "^5.5.0",
5493− "v8-compile-cache": "^2.0.2",
5494− "yargs": "^12.0.2"
5495− },
5496− "dependencies": {
5497− "supports-color": {
5498− "version": "5.5.0",
5499− "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
5500− "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
5501− "dev": true,
5502− "requires": {
5503− "has-flag": "^3.0.0"
5504− }
5505− }
5506− }
5507− },
5508− "webpack-dev-middleware": {
5509− "version": "3.4.0",
5510− "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz",
5511− "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==",
5512− "dev": true,
5513− "requires": {
5514− "memory-fs": "~0.4.1",
5515− "mime": "^2.3.1",
5516− "range-parser": "^1.0.3",
5517− "webpack-log": "^2.0.0"
5518− },
5519− "dependencies": {
5520− "mime": {
5521− "version": "2.4.0",
5522− "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz",
5523− "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==",
5524− "dev": true
5525− }
5526− }
5527− },
5528− "webpack-dev-server": {
5529− "version": "3.1.14",
5530− "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz",
5531− "integrity": "sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ==",
5532− "dev": true,
5533− "requires": {
5534− "ansi-html": "0.0.7",
5535− "bonjour": "^3.5.0",
5536− "chokidar": "^2.0.0",
5537− "compression": "^1.5.2",
5538− "connect-history-api-fallback": "^1.3.0",
5539− "debug": "^3.1.0",
5540− "del": "^3.0.0",
5541− "express": "^4.16.2",
5542− "html-entities": "^1.2.0",
5543− "http-proxy-middleware": "~0.18.0",
5544− "import-local": "^2.0.0",
5545− "internal-ip": "^3.0.1",
5546− "ip": "^1.1.5",
5547− "killable": "^1.0.0",
5548− "loglevel": "^1.4.1",
5549− "opn": "^5.1.0",
5550− "portfinder": "^1.0.9",
5551− "schema-utils": "^1.0.0",
5552− "selfsigned": "^1.9.1",
5553− "semver": "^5.6.0",
5554− "serve-index": "^1.7.2",
5555− "sockjs": "0.3.19",
5556− "sockjs-client": "1.3.0",
5557− "spdy": "^4.0.0",
5558− "strip-ansi": "^3.0.0",
5559− "supports-color": "^5.1.0",
5560− "url": "^0.11.0",
5561− "webpack-dev-middleware": "3.4.0",
5562− "webpack-log": "^2.0.0",
5563− "yargs": "12.0.2"
5564− },
5565− "dependencies": {
5566− "schema-utils": {
5567− "version": "1.0.0",
5568− "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
5569− "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
5570− "dev": true,
5571− "requires": {
5572− "ajv": "^6.1.0",
5573− "ajv-errors": "^1.0.0",
5574− "ajv-keywords": "^3.1.0"
5575− }
5576− },
5577− "semver": {
5578− "version": "5.6.0",
5579− "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
5580− "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
5581− "dev": true
5582− }
5583− }
5584− },
5585− "webpack-log": {
5586− "version": "2.0.0",
5587− "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
5588− "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
5589− "dev": true,
5590− "requires": {
5591− "ansi-colors": "^3.0.0",
5592− "uuid": "^3.3.2"
5593− }
5594− },
5595− "webpack-sources": {
5596− "version": "1.3.0",
5597− "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
5598− "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==",
5599− "dev": true,
5600− "requires": {
5601− "source-list-map": "^2.0.0",
5602− "source-map": "~0.6.1"
5603− },
5604− "dependencies": {
5605− "source-map": {
5606− "version": "0.6.1",
5607− "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
5608− "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
5609− "dev": true
5610− }
5611− }
5612− },
5613− "websocket-driver": {
5614− "version": "0.7.0",
5615− "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
5616− "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
5617− "dev": true,
5618− "requires": {
5619− "http-parser-js": ">=0.4.0",
5620− "websocket-extensions": ">=0.1.1"
5621− }
5622− },
5623− "websocket-extensions": {
5624− "version": "0.1.3",
5625− "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
5626− "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
5627− "dev": true
5628− },
5629− "which": {
5630− "version": "1.3.1",
5631− "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
5632− "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
5633− "dev": true,
5634− "requires": {
5635− "isexe": "^2.0.0"
5636− }
5637− },
5638− "which-module": {
5639− "version": "2.0.0",
5640− "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
5641− "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
5642− "dev": true
5643− },
5644− "worker-farm": {
5645− "version": "1.6.0",
5646− "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz",
5647− "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==",
5648− "dev": true,
5649− "requires": {
5650− "errno": "~0.1.7"
5651− }
5652− },
5653− "wrap-ansi": {
5654− "version": "2.1.0",
5655− "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
5656− "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
5657− "dev": true,
5658− "requires": {
5659− "string-width": "^1.0.1",
5660− "strip-ansi": "^3.0.1"
5661− },
5662− "dependencies": {
5663− "is-fullwidth-code-point": {
5664− "version": "1.0.0",
5665− "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
5666− "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
5667− "dev": true,
5668− "requires": {
5669− "number-is-nan": "^1.0.0"
5670− }
5671− },
5672− "string-width": {
5673− "version": "1.0.2",
5674− "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
5675− "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
5676− "dev": true,
5677− "requires": {
5678− "code-point-at": "^1.0.0",
5679− "is-fullwidth-code-point": "^1.0.0",
5680− "strip-ansi": "^3.0.0"
5681− }
5682− }
5683− }
5684− },
5685− "wrappy": {
5686− "version": "1.0.2",
5687− "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
5688− "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
5689− "dev": true
5690− },
5691− "xregexp": {
5692− "version": "4.0.0",
5693− "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
5694− "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==",
5695− "dev": true
5696− },
5697− "xtend": {
5698− "version": "4.0.1",
5699− "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
5700− "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
5701− "dev": true
5702− },
5703− "y18n": {
5704− "version": "4.0.0",
5705− "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
5706− "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
5707− "dev": true
5708− },
5709− "yallist": {
5710− "version": "2.1.2",
5711− "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
5712− "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
5713− "dev": true
5714− },
5715− "yargs": {
5716− "version": "12.0.2",
5717− "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz",
5718− "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==",
5719− "dev": true,
5720− "requires": {
5721− "cliui": "^4.0.0",
5722− "decamelize": "^2.0.0",
5723− "find-up": "^3.0.0",
5724− "get-caller-file": "^1.0.1",
5725− "os-locale": "^3.0.0",
5726− "require-directory": "^2.1.1",
5727− "require-main-filename": "^1.0.1",
5728− "set-blocking": "^2.0.0",
5729− "string-width": "^2.0.0",
5730− "which-module": "^2.0.0",
5731− "y18n": "^3.2.1 || ^4.0.0",
5732− "yargs-parser": "^10.1.0"
5733− },
5734− "dependencies": {
5735− "find-up": {
5736− "version": "3.0.0",
5737− "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
5738− "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
5739− "dev": true,
5740− "requires": {
5741− "locate-path": "^3.0.0"
5742− }
5743− },
5744− "locate-path": {
5745− "version": "3.0.0",
5746− "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
5747− "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
5748− "dev": true,
5749− "requires": {
5750− "p-locate": "^3.0.0",
5751− "path-exists": "^3.0.0"
5752− }
5753− },
5754− "p-limit": {
5755− "version": "2.0.0",
5756− "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
5757− "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
5758− "dev": true,
5759− "requires": {
5760− "p-try": "^2.0.0"
5761− }
5762− },
5763− "p-locate": {
5764− "version": "3.0.0",
5765− "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
5766− "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
5767− "dev": true,
5768− "requires": {
5769− "p-limit": "^2.0.0"
5770− }
5771− },
5772− "p-try": {
5773− "version": "2.0.0",
5774− "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
5775− "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
5776− "dev": true
5777− }
5778− }
5779− },
5780− "yargs-parser": {
5781− "version": "10.1.0",
5782− "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
5783− "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
5784− "dev": true,
5785− "requires": {
5786− "camelcase": "^4.1.0"
5787− }
5788− }
5789− }
5790−}
examples/counter/package.jsondeleted−18
@@ -1,18 +0,0 @@
1−{
2− "author": "Nick Fitzgerald <nfitzgerald@mozilla.com>",
3− "name": "create-rust-webpack",
4− "version": "0.1.5",
5− "repository": "https://github.com/rustwasm/rust-webpack-template",
6− "license": "Apache-2.0/MIT",
7− "scripts": {
8− "start": "webpack-dev-server -d",
9− "build": "webpack"
10− },
11− "devDependencies": {
12− "@wasm-tool/wasm-pack-plugin": "0.1.6",
13− "html-webpack-plugin": "^3.2.0",
14− "webpack": "^4.25.1",
15− "webpack-cli": "^3.1.2",
16− "webpack-dev-server": "^3.1.14"
17− }
18−}
examples/counter/src/lib.rsnew file+87
@@ -0,0 +1,87 @@
1+use dodrio::{bumpalo, Node, Render, RenderContext};
2+use log::*;
3+use wasm_bindgen::prelude::*;
4+
5+/// A counter that can be incremented and decremented!
6+struct Counter {
7+ count: isize,
8+}
9+
10+impl Counter {
11+ /// Construct a new, zeroed counter.
12+ fn new() -> Counter {
13+ Counter { count: 0 }
14+ }
15+
16+ /// Increment this counter's count.
17+ fn increment(&mut self) {
18+ self.count += 1;
19+ }
20+
21+ /// Decrement this counter's count.
22+ fn decrement(&mut self) {
23+ self.count -= 1;
24+ }
25+}
26+
27+// The `Render` implementation for `Counter`s displays the current count and has
28+// buttons to increment and decrement the count.
29+impl<'a> Render<'a> for Counter {
30+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
31+ use dodrio::builder::*;
32+
33+ // Stringify the count as a bump-allocated string.
34+ let count = bumpalo::format!(in cx.bump, "{}", self.count);
35+
36+ div(&cx)
37+ .children([
38+ button(&cx)
39+ .on("click", |root, vdom, _event| {
40+ // Cast the root render component to a `Counter`, since
41+ // we know that's what it is.
42+ let counter = root.unwrap_mut::<Counter>();
43+
44+ // Increment the counter.
45+ counter.increment();
46+
47+ // Since the count has updated, we should re-render the
48+ // counter on the next animation frame.
49+ vdom.schedule_render();
50+ })
51+ .children([text("+")])
52+ .finish(),
53+ text(count.into_bump_str()),
54+ button(&cx)
55+ .on("click", |root, vdom, _event| {
56+ // Same as above, but decrementing instead of incrementing.
57+ let counter = root.unwrap_mut::<Counter>();
58+ counter.decrement();
59+ vdom.schedule_render();
60+ })
61+ .children([text("-")])
62+ .finish(),
63+ ])
64+ .finish()
65+ }
66+}
67+
68+#[wasm_bindgen(start)]
69+pub fn run() {
70+ // Initialize debug logging for if/when things go wrong.
71+ console_error_panic_hook::set_once();
72+ console_log::init_with_level(Level::Trace).expect("should initialize logging OK");
73+
74+ // Get the document's `<body>`.
75+ let window = web_sys::window().unwrap();
76+ let document = window.document().unwrap();
77+ let body = document.body().unwrap();
78+
79+ // Construct a new counter component.
80+ let counter = Counter::new();
81+
82+ // Mount our counter component to the `<body>`.
83+ let vdom = dodrio::Vdom::new(&body, counter);
84+
85+ // Run the virtual DOM and its listeners forever.
86+ vdom.forget();
87+}
examples/counter/webpack.config.jsdeleted−25
@@ -1,25 +0,0 @@
1−const path = require("path");
2−const HtmlWebpackPlugin = require("html-webpack-plugin");
3−
4−const dist = path.resolve(__dirname, "dist");
5−const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin");
6−
7−module.exports = {
8− entry: "./js/index.js",
9− output: {
10− path: dist,
11− filename: "bundle.js"
12− },
13− devServer: {
14− contentBase: dist,
15− },
16− plugins: [
17− new HtmlWebpackPlugin({
18− template: 'index.html'
19− }),
20−
21− new WasmPackPlugin({
22− crateDirectory: path.resolve(__dirname, "crate")
23− }),
24− ]
25−};
examples/game-of-life/Cargo.tomlnew file+29
@@ -0,0 +1,29 @@
1+[package]
2+name = "dodrio-game-of-life"
3+version = "0.1.0"
4+authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
5+edition = "2018"
6+
7+[lib]
8+crate-type = ["cdylib"]
9+
10+[features]
11+
12+[dependencies]
13+dodrio = { path = "../.." }
14+wasm-bindgen = "0.2.55"
15+console_error_panic_hook = "0.1.6"
16+js-sys = "0.3.32"
17+wasm-bindgen-futures = "0.4.5"
18+
19+[dependencies.web-sys]
20+version = "0.3.32"
21+features = [
22+ "Document",
23+ "HtmlElement",
24+ "Node",
25+ "Window",
26+]
27+
28+[dev-dependencies]
29+wasm-bindgen-test = "0.3.5"
examples/game-of-life/README.mdnew file+23
@@ -0,0 +1,23 @@
1+# Conway's Game of Life
2+
3+A port of the [Rust and WebAssembly tutorial's Game of Life
4+implementation](https://rustwasm.github.io/book/game-of-life/introduction.html)
5+to rendering to HTML with Dodrio instead of to a canvas via JavaScript.
6+
7+## Source
8+
9+See `src/lib.rs`.
10+
11+## Build
12+
13+```
14+wasm-pack build --target web
15+```
16+
17+## Serve
18+
19+Use any HTTP server, for example:
20+
21+```
22+python -m SimpleHTTPServer
23+```
examples/game-of-life/index.htmlnew file+44
@@ -0,0 +1,44 @@
1+<!DOCTYPE html>
2+<html>
3+ <head>
4+ <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5+ <title>Conway's Game of Life</title>
6+ <style>
7+ .cell {
8+ display: inline-block;
9+ width: 1vh;
10+ height: 1vh;
11+ border: 1px #cccccc solid;
12+ margin: -1px;
13+ padding: 0;
14+ }
15+
16+ .row {
17+ height: 1vh;
18+ margin: 0;
19+ padding: 0;
20+ }
21+
22+ body {
23+ width: 100vw;
24+ height: 100vh;
25+ display: flex;
26+ align-items: center;
27+ justify-content: center;
28+ padding: 0;
29+ margin: 0;
30+ }
31+
32+ html {
33+ padding: 0;
34+ margin: 0;
35+ }
36+ </style>
37+ </head>
38+ <body>
39+ <script type="module">
40+ import init from "./pkg/dodrio_game_of_life.js";
41+ init("./pkg/dodrio_game_of_life_bg.wasm");
42+ </script>
43+ </body>
44+</html>
examples/game-of-life/src/lib.rsnew file+218
@@ -0,0 +1,218 @@
1+use dodrio::{bumpalo, Node, Render, RenderContext, Vdom};
2+use std::cell::RefCell;
3+use std::rc::Rc;
4+use wasm_bindgen::{prelude::*, JsCast};
5+
6+#[repr(u8)]
7+#[derive(Clone, Copy, Debug, PartialEq, Eq)]
8+pub enum Cell {
9+ Dead = 0,
10+ Alive = 1,
11+}
12+
13+/// The universe containing all of the cells for our Game of Life.
14+struct Universe {
15+ width: u32,
16+ height: u32,
17+ cells: Vec<Cell>,
18+}
19+
20+impl Universe {
21+ /// Construct a new universe.
22+ pub fn new() -> Universe {
23+ let width = 64;
24+ let height = 64;
25+
26+ let cells = (0..width * height)
27+ .map(|i| {
28+ if i % 2 == 0 || i % 7 == 0 {
29+ Cell::Alive
30+ } else {
31+ Cell::Dead
32+ }
33+ })
34+ .collect();
35+
36+ Universe {
37+ width,
38+ height,
39+ cells,
40+ }
41+ }
42+
43+ /// Compute one tick of the universe.
44+ pub fn tick(&mut self) {
45+ let mut next = self.cells.clone();
46+
47+ for row in 0..self.height {
48+ for col in 0..self.width {
49+ let idx = self.get_index(row, col);
50+ let cell = self.cells[idx];
51+ let live_neighbors = self.live_neighbor_count(row, col);
52+
53+ let next_cell = match (cell, live_neighbors) {
54+ // Rule 1: Any live cell with fewer than two live neighbours
55+ // dies, as if caused by underpopulation.
56+ (Cell::Alive, x) if x < 2 => Cell::Dead,
57+ // Rule 2: Any live cell with two or three live neighbours
58+ // lives on to the next generation.
59+ (Cell::Alive, 2) | (Cell::Alive, 3) => Cell::Alive,
60+ // Rule 3: Any live cell with more than three live
61+ // neighbours dies, as if by overpopulation.
62+ (Cell::Alive, x) if x > 3 => Cell::Dead,
63+ // Rule 4: Any dead cell with exactly three live neighbours
64+ // becomes a live cell, as if by reproduction.
65+ (Cell::Dead, 3) => Cell::Alive,
66+ // All other cells remain in the same state.
67+ (otherwise, _) => otherwise,
68+ };
69+
70+ next[idx] = next_cell;
71+ }
72+ }
73+
74+ self.cells = next;
75+ }
76+
77+ fn get_index(&self, row: u32, column: u32) -> usize {
78+ (row * self.width + column) as usize
79+ }
80+
81+ fn live_neighbor_count(&self, row: u32, column: u32) -> u8 {
82+ let mut count = 0;
83+
84+ let north = if row == 0 { self.height - 1 } else { row - 1 };
85+
86+ let south = if row == self.height - 1 { 0 } else { row + 1 };
87+
88+ let west = if column == 0 {
89+ self.width - 1
90+ } else {
91+ column - 1
92+ };
93+
94+ let east = if column == self.width - 1 {
95+ 0
96+ } else {
97+ column + 1
98+ };
99+
100+ let nw = self.get_index(north, west);
101+ count += self.cells[nw] as u8;
102+
103+ let n = self.get_index(north, column);
104+ count += self.cells[n] as u8;
105+
106+ let ne = self.get_index(north, east);
107+ count += self.cells[ne] as u8;
108+
109+ let w = self.get_index(row, west);
110+ count += self.cells[w] as u8;
111+
112+ let e = self.get_index(row, east);
113+ count += self.cells[e] as u8;
114+
115+ let sw = self.get_index(south, west);
116+ count += self.cells[sw] as u8;
117+
118+ let s = self.get_index(south, column);
119+ count += self.cells[s] as u8;
120+
121+ let se = self.get_index(south, east);
122+ count += self.cells[se] as u8;
123+
124+ count
125+ }
126+}
127+
128+/// The rendering implementation for our Game of Life.
129+impl<'a> Render<'a> for Universe {
130+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
131+ use dodrio::builder::*;
132+
133+ let mut rows = bumpalo::collections::Vec::with_capacity_in(self.height as usize, cx.bump);
134+
135+ for row in self.cells.chunks(self.width as usize) {
136+ let mut cells =
137+ bumpalo::collections::Vec::with_capacity_in(self.width as usize, cx.bump);
138+
139+ for cell in row {
140+ cells.push(
141+ span(&cx)
142+ .attr("class", "cell")
143+ .attr(
144+ "style",
145+ match cell {
146+ Cell::Alive => "background-color: black",
147+ Cell::Dead => "background-color: white",
148+ },
149+ )
150+ .finish(),
151+ );
152+ }
153+
154+ rows.push(div(&cx).attr("class", "row").children(cells).finish());
155+ }
156+
157+ div(&cx).attr("class", "universe").children(rows).finish()
158+ }
159+}
160+
161+#[wasm_bindgen(start)]
162+pub fn run() {
163+ // Set up the panic hook for debugging when things go wrong.
164+ console_error_panic_hook::set_once();
165+
166+ // Grab the document's `<body>`.
167+ let window = web_sys::window().unwrap_throw();
168+ let document = window.document().unwrap_throw();
169+ let body = document.body().unwrap_throw();
170+
171+ // Create a new Game of Life `Universe` render component.
172+ let universe = Universe::new();
173+
174+ // Create a virtual DOM and mount it and the `Universe` render component to the
175+ // `<body>`.
176+ let vdom = Vdom::new(body.as_ref(), universe);
177+
178+ // Kick off a loop that keeps computing a tick of the universe and then
179+ // re-rendering on every animation frame.
180+ let rc = <Rc<RefCell<Option<Closure<dyn FnMut()>>>>>::default();
181+ let rc2 = rc.clone();
182+ let window2 = window.clone();
183+ let weak = vdom.weak();
184+ let f = Closure::wrap(Box::new(move || {
185+ weak.schedule_render();
186+
187+ wasm_bindgen_futures::spawn_local({
188+ let weak = weak.clone();
189+ async move {
190+ let fut = weak.with_component(|root| {
191+ let universe = root.unwrap_mut::<Universe>();
192+ universe.tick();
193+ });
194+
195+ if fut.await.is_err() {
196+ wasm_bindgen::throw_str("impossible, we always keep the vdom alive");
197+ }
198+ }
199+ });
200+
201+ window
202+ .request_animation_frame(
203+ rc.borrow()
204+ .as_ref()
205+ .unwrap_throw()
206+ .as_ref()
207+ .unchecked_ref::<js_sys::Function>(),
208+ )
209+ .unwrap_throw();
210+ }) as Box<dyn FnMut()>);
211+ window2
212+ .request_animation_frame(f.as_ref().unchecked_ref::<js_sys::Function>())
213+ .unwrap_throw();
214+ *rc2.borrow_mut() = Some(f);
215+
216+ // Run the virtual DOM forever and don't unmount it.
217+ vdom.forget();
218+}
examples/hello-world/.gitignoredeleted−7
@@ -1,7 +0,0 @@
1−dist
2−node_modules
3−crate/bin
4−crate/pkg
5−crate/target
6−crate/wasm-pack.log
7−crate/Cargo.lock
examples/hello-world/.travis.ymldeleted−11
@@ -1,11 +0,0 @@
1−language: rust
2−
3−install:
4− - curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
5− - source ~/.nvm/nvm.sh
6− - nvm install v10.5
7− - curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh -s -- -f
8−
9−script:
10− - npm install
11− - npm run build
examples/hello-world/Cargo.toml+5−5
@@ -5,17 +5,17 @@ authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
55edition = "2018"
66
77[lib]
8−crate-type = ["cdylib", "rlib"]
8+crate-type = ["cdylib"]
99
1010[features]
1111
1212[dependencies]
1313dodrio = { path = "../.." }
14−wasm-bindgen = "0.2"
15−console_error_panic_hook = "0.1.1"
14+wasm-bindgen = "0.2.55"
15+console_error_panic_hook = "0.1.6"
1616
1717[dependencies.web-sys]
18−version = "0.3.8"
18+version = "0.3.32"
1919features = [
2020 "Document",
2121 "HtmlElement",
@@ -24,4 +24,4 @@ features = [
2424]
2525
2626[dev-dependencies]
27−wasm-bindgen-test = "0.2"
27+wasm-bindgen-test = "0.3.5"
examples/hello-world/LICENSE-APACHEdeleted−201
@@ -1,201 +0,0 @@
1− Apache License
2− Version 2.0, January 2004
3− http://www.apache.org/licenses/
4−
5−TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6−
7−1. Definitions.
8−
9− "License" shall mean the terms and conditions for use, reproduction,
10− and distribution as defined by Sections 1 through 9 of this document.
11−
12− "Licensor" shall mean the copyright owner or entity authorized by
13− the copyright owner that is granting the License.
14−
15− "Legal Entity" shall mean the union of the acting entity and all
16− other entities that control, are controlled by, or are under common
17− control with that entity. For the purposes of this definition,
18− "control" means (i) the power, direct or indirect, to cause the
19− direction or management of such entity, whether by contract or
20− otherwise, or (ii) ownership of fifty percent (50%) or more of the
21− outstanding shares, or (iii) beneficial ownership of such entity.
22−
23− "You" (or "Your") shall mean an individual or Legal Entity
24− exercising permissions granted by this License.
25−
26− "Source" form shall mean the preferred form for making modifications,
27− including but not limited to software source code, documentation
28− source, and configuration files.
29−
30− "Object" form shall mean any form resulting from mechanical
31− transformation or translation of a Source form, including but
32− not limited to compiled object code, generated documentation,
33− and conversions to other media types.
34−
35− "Work" shall mean the work of authorship, whether in Source or
36− Object form, made available under the License, as indicated by a
37− copyright notice that is included in or attached to the work
38− (an example is provided in the Appendix below).
39−
40− "Derivative Works" shall mean any work, whether in Source or Object
41− form, that is based on (or derived from) the Work and for which the
42− editorial revisions, annotations, elaborations, or other modifications
43− represent, as a whole, an original work of authorship. For the purposes
44− of this License, Derivative Works shall not include works that remain
45− separable from, or merely link (or bind by name) to the interfaces of,
46− the Work and Derivative Works thereof.
47−
48− "Contribution" shall mean any work of authorship, including
49− the original version of the Work and any modifications or additions
50− to that Work or Derivative Works thereof, that is intentionally
51− submitted to Licensor for inclusion in the Work by the copyright owner
52− or by an individual or Legal Entity authorized to submit on behalf of
53− the copyright owner. For the purposes of this definition, "submitted"
54− means any form of electronic, verbal, or written communication sent
55− to the Licensor or its representatives, including but not limited to
56− communication on electronic mailing lists, source code control systems,
57− and issue tracking systems that are managed by, or on behalf of, the
58− Licensor for the purpose of discussing and improving the Work, but
59− excluding communication that is conspicuously marked or otherwise
60− designated in writing by the copyright owner as "Not a Contribution."
61−
62− "Contributor" shall mean Licensor and any individual or Legal Entity
63− on behalf of whom a Contribution has been received by Licensor and
64− subsequently incorporated within the Work.
65−
66−2. Grant of Copyright License. Subject to the terms and conditions of
67− this License, each Contributor hereby grants to You a perpetual,
68− worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69− copyright license to reproduce, prepare Derivative Works of,
70− publicly display, publicly perform, sublicense, and distribute the
71− Work and such Derivative Works in Source or Object form.
72−
73−3. Grant of Patent License. Subject to the terms and conditions of
74− this License, each Contributor hereby grants to You a perpetual,
75− worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76− (except as stated in this section) patent license to make, have made,
77− use, offer to sell, sell, import, and otherwise transfer the Work,
78− where such license applies only to those patent claims licensable
79− by such Contributor that are necessarily infringed by their
80− Contribution(s) alone or by combination of their Contribution(s)
81− with the Work to which such Contribution(s) was submitted. If You
82− institute patent litigation against any entity (including a
83− cross-claim or counterclaim in a lawsuit) alleging that the Work
84− or a Contribution incorporated within the Work constitutes direct
85− or contributory patent infringement, then any patent licenses
86− granted to You under this License for that Work shall terminate
87− as of the date such litigation is filed.
88−
89−4. Redistribution. You may reproduce and distribute copies of the
90− Work or Derivative Works thereof in any medium, with or without
91− modifications, and in Source or Object form, provided that You
92− meet the following conditions:
93−
94− (a) You must give any other recipients of the Work or
95− Derivative Works a copy of this License; and
96−
97− (b) You must cause any modified files to carry prominent notices
98− stating that You changed the files; and
99−
100− (c) You must retain, in the Source form of any Derivative Works
101− that You distribute, all copyright, patent, trademark, and
102− attribution notices from the Source form of the Work,
103− excluding those notices that do not pertain to any part of
104− the Derivative Works; and
105−
106− (d) If the Work includes a "NOTICE" text file as part of its
107− distribution, then any Derivative Works that You distribute must
108− include a readable copy of the attribution notices contained
109− within such NOTICE file, excluding those notices that do not
110− pertain to any part of the Derivative Works, in at least one
111− of the following places: within a NOTICE text file distributed
112− as part of the Derivative Works; within the Source form or
113− documentation, if provided along with the Derivative Works; or,
114− within a display generated by the Derivative Works, if and
115− wherever such third-party notices normally appear. The contents
116− of the NOTICE file are for informational purposes only and
117− do not modify the License. You may add Your own attribution
118− notices within Derivative Works that You distribute, alongside
119− or as an addendum to the NOTICE text from the Work, provided
120− that such additional attribution notices cannot be construed
121− as modifying the License.
122−
123− You may add Your own copyright statement to Your modifications and
124− may provide additional or different license terms and conditions
125− for use, reproduction, or distribution of Your modifications, or
126− for any such Derivative Works as a whole, provided Your use,
127− reproduction, and distribution of the Work otherwise complies with
128− the conditions stated in this License.
129−
130−5. Submission of Contributions. Unless You explicitly state otherwise,
131− any Contribution intentionally submitted for inclusion in the Work
132− by You to the Licensor shall be under the terms and conditions of
133− this License, without any additional terms or conditions.
134− Notwithstanding the above, nothing herein shall supersede or modify
135− the terms of any separate license agreement you may have executed
136− with Licensor regarding such Contributions.
137−
138−6. Trademarks. This License does not grant permission to use the trade
139− names, trademarks, service marks, or product names of the Licensor,
140− except as required for reasonable and customary use in describing the
141− origin of the Work and reproducing the content of the NOTICE file.
142−
143−7. Disclaimer of Warranty. Unless required by applicable law or
144− agreed to in writing, Licensor provides the Work (and each
145− Contributor provides its Contributions) on an "AS IS" BASIS,
146− WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147− implied, including, without limitation, any warranties or conditions
148− of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149− PARTICULAR PURPOSE. You are solely responsible for determining the
150− appropriateness of using or redistributing the Work and assume any
151− risks associated with Your exercise of permissions under this License.
152−
153−8. Limitation of Liability. In no event and under no legal theory,
154− whether in tort (including negligence), contract, or otherwise,
155− unless required by applicable law (such as deliberate and grossly
156− negligent acts) or agreed to in writing, shall any Contributor be
157− liable to You for damages, including any direct, indirect, special,
158− incidental, or consequential damages of any character arising as a
159− result of this License or out of the use or inability to use the
160− Work (including but not limited to damages for loss of goodwill,
161− work stoppage, computer failure or malfunction, or any and all
162− other commercial damages or losses), even if such Contributor
163− has been advised of the possibility of such damages.
164−
165−9. Accepting Warranty or Additional Liability. While redistributing
166− the Work or Derivative Works thereof, You may choose to offer,
167− and charge a fee for, acceptance of support, warranty, indemnity,
168− or other liability obligations and/or rights consistent with this
169− License. However, in accepting such obligations, You may act only
170− on Your own behalf and on Your sole responsibility, not on behalf
171− of any other Contributor, and only if You agree to indemnify,
172− defend, and hold each Contributor harmless for any liability
173− incurred by, or claims asserted against, such Contributor by reason
174− of your accepting any such warranty or additional liability.
175−
176−END OF TERMS AND CONDITIONS
177−
178−APPENDIX: How to apply the Apache License to your work.
179−
180− To apply the Apache License to your work, attach the following
181− boilerplate notice, with the fields enclosed by brackets "[]"
182− replaced with your own identifying information. (Don't include
183− the brackets!) The text should be enclosed in the appropriate
184− comment syntax for the file format. We also recommend that a
185− file or class name and description of purpose be included on the
186− same "printed page" as the copyright notice for easier
187− identification within third-party archives.
188−
189−Copyright [yyyy] [name of copyright owner]
190−
191−Licensed under the Apache License, Version 2.0 (the "License");
192−you may not use this file except in compliance with the License.
193−You may obtain a copy of the License at
194−
195− http://www.apache.org/licenses/LICENSE-2.0
196−
197−Unless required by applicable law or agreed to in writing, software
198−distributed under the License is distributed on an "AS IS" BASIS,
199−WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200−See the License for the specific language governing permissions and
201−limitations under the License.
examples/hello-world/LICENSE-MITdeleted−25
@@ -1,25 +0,0 @@
1−Copyright (c) 2015 The Rust Project Developers
2−
3−Permission is hereby granted, free of charge, to any
4−person obtaining a copy of this software and associated
5−documentation files (the "Software"), to deal in the
6−Software without restriction, including without
7−limitation the rights to use, copy, modify, merge,
8−publish, distribute, sublicense, and/or sell copies of
9−the Software, and to permit persons to whom the Software
10−is furnished to do so, subject to the following
11−conditions:
12−
13−The above copyright notice and this permission notice
14−shall be included in all copies or substantial portions
15−of the Software.
16−
17−THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
18−ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
19−TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
20−PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
21−SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
22−CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23−OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
24−IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25−DEALINGS IN THE SOFTWARE.
examples/hello-world/README.md+12−20
@@ -1,29 +1,21 @@
1−# 🦀🕸 `rust-webpack-template`
1+# Hello World
22
3−> **Kickstart your Rust, WebAssembly, and Webpack project!**
3+The most basic example!
44
5−This template is designed for creating monorepo-style Web applications with
6−Rust-generated WebAssembly and Webpack without publishing your wasm to NPM.
5+## Source
76
8−* Want to create and publish NPM packages with Rust and WebAssembly? [Check out
9− `wasm-pack-template`.](https://github.com/rustwasm/wasm-pack-template)
7+See `src/lib.rs`.
108
11−## 🔋 Batteries Included
9+## Build
1210
13−This template comes pre-configured with all the boilerplate for compiling Rust
14−to WebAssembly and hooking into a Webpack build pipeline.
15−
16−* `npm run start` -- Serve the project locally for development at
17− `http://localhost:8080`.
18−
19−* `npm run build` -- Bundle the project (in production mode).
20−
21−## 🚴 Using This Template
11+```
12+wasm-pack build --target web
13+```
2214
23−First, [install `wasm-pack`!](https://rustwasm.github.io/wasm-pack/installer/)
15+## Serve
2416
25−Then, use `npm init` to clone this template:
17+Use any HTTP server, for example:
2618
27−```sh
28−npm init rust-webpack my-app
19+```
20+python -m SimpleHTTPServer
2921```
examples/hello-world/index.html+3−3
@@ -5,9 +5,9 @@
55 <title>Hello, World!</title>
66 </head>
77 <body>
8− <script src="pkg/dodrio_hello_world.js"></script>
9− <script>
10− wasm_bindgen("pkg/dodrio_hello_world_bg.wasm");
8+ <script type="module">
9+ import init from "./pkg/dodrio_hello_world.js";
10+ init("./pkg/dodrio_hello_world_bg.wasm");
1111 </script>
1212 </body>
1313</html>
examples/hello-world/src/lib.rs+18−23
@@ -1,42 +1,37 @@
1−use dodrio::bumpalo::Bump;
2−use dodrio::{Node, Render, Vdom};
1+use dodrio::{builder::*, bumpalo};
2+use dodrio::{Node, Render, RenderContext, Vdom};
33use wasm_bindgen::prelude::*;
44
5−struct Hello<'who> {
6− who: &'who str,
5+/// A rendering component that displays a greeting.
6+struct Hello {
7+ /// Who to greet.
8+ who: String,
79}
810
9−impl<'who> Hello<'who> {
10− fn new(who: &str) -> Hello {
11− Hello { who }
12− }
13−}
14−
15−impl<'who> Render for Hello<'who> {
16− fn render<'a, 'bump>(&'a self, bump: &'bump Bump) -> Node<'bump>
17− where
18− 'a: 'bump,
19− {
20− Node::element(
21− bump,
22− "p",
23− [],
24− [],
25− [Node::text("Hello, "), Node::text(self.who), Node::text("!")],
26− )
11+// The `Render` implementation describes how to render a `Hello` component into
12+// HTML.
13+impl<'a> Render<'a> for Hello {
14+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
15+ let msg = bumpalo::format!(in cx.bump, "Hello, {}!", self.who);
16+ let msg = msg.into_bump_str();
17+ p(&cx).children([text(msg)]).finish()
2718 }
2819}
2920
3021#[wasm_bindgen(start)]
3122pub fn run() {
23+ // Set up the panic hook for debugging when things go wrong.
3224 console_error_panic_hook::set_once();
3325
26+ // Grab the document's `<body>`.
3427 let window = web_sys::window().unwrap_throw();
3528 let document = window.document().unwrap_throw();
3629 let body = document.body().unwrap_throw();
3730
3831 // Create a new `Hello` render component.
39− let component = Hello::new("World");
32+ let component = Hello {
33+ who: String::from("World"),
34+ };
4035
4136 // Create a virtual DOM and mount it and the `Hello` render component to the
4237 // `<body>`.
examples/input-form/.gitignoredeleted−7
@@ -1,7 +0,0 @@
1−dist
2−node_modules
3−crate/bin
4−crate/pkg
5−crate/target
6−crate/wasm-pack.log
7−crate/Cargo.lock
examples/input-form/.travis.ymldeleted−11
@@ -1,11 +0,0 @@
1−language: rust
2−
3−install:
4− - curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
5− - source ~/.nvm/nvm.sh
6− - nvm install v10.5
7− - curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh -s -- -f
8−
9−script:
10− - npm install
11− - npm run build
examples/input-form/crate/Cargo.toml → examples/input-form/Cargo.tomlrenamed+6−6
@@ -5,17 +5,17 @@ authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
55edition = "2018"
66
77[lib]
8−crate-type = ["cdylib", "rlib"]
8+crate-type = ["cdylib"]
99
1010[features]
1111
1212[dependencies]
13−dodrio = { path = "../../.." }
14−wasm-bindgen = "0.2"
15−console_error_panic_hook = "0.1.1"
13+dodrio = { path = "../.." }
14+wasm-bindgen = "0.2.55"
15+console_error_panic_hook = "0.1.6"
1616
1717[dependencies.web-sys]
18−version = "0.3.8"
18+version = "0.3.32"
1919features = [
2020 "console",
2121 "Document",
@@ -29,4 +29,4 @@ features = [
2929]
3030
3131[dev-dependencies]
32−wasm-bindgen-test = "0.2"
32+wasm-bindgen-test = "0.3.5"
examples/input-form/LICENSE-APACHEdeleted−201
@@ -1,201 +0,0 @@
1− Apache License
2− Version 2.0, January 2004
3− http://www.apache.org/licenses/
4−
5−TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6−
7−1. Definitions.
8−
9− "License" shall mean the terms and conditions for use, reproduction,
10− and distribution as defined by Sections 1 through 9 of this document.
11−
12− "Licensor" shall mean the copyright owner or entity authorized by
13− the copyright owner that is granting the License.
14−
15− "Legal Entity" shall mean the union of the acting entity and all
16− other entities that control, are controlled by, or are under common
17− control with that entity. For the purposes of this definition,
18− "control" means (i) the power, direct or indirect, to cause the
19− direction or management of such entity, whether by contract or
20− otherwise, or (ii) ownership of fifty percent (50%) or more of the
21− outstanding shares, or (iii) beneficial ownership of such entity.
22−
23− "You" (or "Your") shall mean an individual or Legal Entity
24− exercising permissions granted by this License.
25−
26− "Source" form shall mean the preferred form for making modifications,
27− including but not limited to software source code, documentation
28− source, and configuration files.
29−
30− "Object" form shall mean any form resulting from mechanical
31− transformation or translation of a Source form, including but
32− not limited to compiled object code, generated documentation,
33− and conversions to other media types.
34−
35− "Work" shall mean the work of authorship, whether in Source or
36− Object form, made available under the License, as indicated by a
37− copyright notice that is included in or attached to the work
38− (an example is provided in the Appendix below).
39−
40− "Derivative Works" shall mean any work, whether in Source or Object
41− form, that is based on (or derived from) the Work and for which the
42− editorial revisions, annotations, elaborations, or other modifications
43− represent, as a whole, an original work of authorship. For the purposes
44− of this License, Derivative Works shall not include works that remain
45− separable from, or merely link (or bind by name) to the interfaces of,
46− the Work and Derivative Works thereof.
47−
48− "Contribution" shall mean any work of authorship, including
49− the original version of the Work and any modifications or additions
50− to that Work or Derivative Works thereof, that is intentionally
51− submitted to Licensor for inclusion in the Work by the copyright owner
52− or by an individual or Legal Entity authorized to submit on behalf of
53− the copyright owner. For the purposes of this definition, "submitted"
54− means any form of electronic, verbal, or written communication sent
55− to the Licensor or its representatives, including but not limited to
56− communication on electronic mailing lists, source code control systems,
57− and issue tracking systems that are managed by, or on behalf of, the
58− Licensor for the purpose of discussing and improving the Work, but
59− excluding communication that is conspicuously marked or otherwise
60− designated in writing by the copyright owner as "Not a Contribution."
61−
62− "Contributor" shall mean Licensor and any individual or Legal Entity
63− on behalf of whom a Contribution has been received by Licensor and
64− subsequently incorporated within the Work.
65−
66−2. Grant of Copyright License. Subject to the terms and conditions of
67− this License, each Contributor hereby grants to You a perpetual,
68− worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69− copyright license to reproduce, prepare Derivative Works of,
70− publicly display, publicly perform, sublicense, and distribute the
71− Work and such Derivative Works in Source or Object form.
72−
73−3. Grant of Patent License. Subject to the terms and conditions of
74− this License, each Contributor hereby grants to You a perpetual,
75− worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76− (except as stated in this section) patent license to make, have made,
77− use, offer to sell, sell, import, and otherwise transfer the Work,
78− where such license applies only to those patent claims licensable
79− by such Contributor that are necessarily infringed by their
80− Contribution(s) alone or by combination of their Contribution(s)
81− with the Work to which such Contribution(s) was submitted. If You
82− institute patent litigation against any entity (including a
83− cross-claim or counterclaim in a lawsuit) alleging that the Work
84− or a Contribution incorporated within the Work constitutes direct
85− or contributory patent infringement, then any patent licenses
86− granted to You under this License for that Work shall terminate
87− as of the date such litigation is filed.
88−
89−4. Redistribution. You may reproduce and distribute copies of the
90− Work or Derivative Works thereof in any medium, with or without
91− modifications, and in Source or Object form, provided that You
92− meet the following conditions:
93−
94− (a) You must give any other recipients of the Work or
95− Derivative Works a copy of this License; and
96−
97− (b) You must cause any modified files to carry prominent notices
98− stating that You changed the files; and
99−
100− (c) You must retain, in the Source form of any Derivative Works
101− that You distribute, all copyright, patent, trademark, and
102− attribution notices from the Source form of the Work,
103− excluding those notices that do not pertain to any part of
104− the Derivative Works; and
105−
106− (d) If the Work includes a "NOTICE" text file as part of its
107− distribution, then any Derivative Works that You distribute must
108− include a readable copy of the attribution notices contained
109− within such NOTICE file, excluding those notices that do not
110− pertain to any part of the Derivative Works, in at least one
111− of the following places: within a NOTICE text file distributed
112− as part of the Derivative Works; within the Source form or
113− documentation, if provided along with the Derivative Works; or,
114− within a display generated by the Derivative Works, if and
115− wherever such third-party notices normally appear. The contents
116− of the NOTICE file are for informational purposes only and
117− do not modify the License. You may add Your own attribution
118− notices within Derivative Works that You distribute, alongside
119− or as an addendum to the NOTICE text from the Work, provided
120− that such additional attribution notices cannot be construed
121− as modifying the License.
122−
123− You may add Your own copyright statement to Your modifications and
124− may provide additional or different license terms and conditions
125− for use, reproduction, or distribution of Your modifications, or
126− for any such Derivative Works as a whole, provided Your use,
127− reproduction, and distribution of the Work otherwise complies with
128− the conditions stated in this License.
129−
130−5. Submission of Contributions. Unless You explicitly state otherwise,
131− any Contribution intentionally submitted for inclusion in the Work
132− by You to the Licensor shall be under the terms and conditions of
133− this License, without any additional terms or conditions.
134− Notwithstanding the above, nothing herein shall supersede or modify
135− the terms of any separate license agreement you may have executed
136− with Licensor regarding such Contributions.
137−
138−6. Trademarks. This License does not grant permission to use the trade
139− names, trademarks, service marks, or product names of the Licensor,
140− except as required for reasonable and customary use in describing the
141− origin of the Work and reproducing the content of the NOTICE file.
142−
143−7. Disclaimer of Warranty. Unless required by applicable law or
144− agreed to in writing, Licensor provides the Work (and each
145− Contributor provides its Contributions) on an "AS IS" BASIS,
146− WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147− implied, including, without limitation, any warranties or conditions
148− of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149− PARTICULAR PURPOSE. You are solely responsible for determining the
150− appropriateness of using or redistributing the Work and assume any
151− risks associated with Your exercise of permissions under this License.
152−
153−8. Limitation of Liability. In no event and under no legal theory,
154− whether in tort (including negligence), contract, or otherwise,
155− unless required by applicable law (such as deliberate and grossly
156− negligent acts) or agreed to in writing, shall any Contributor be
157− liable to You for damages, including any direct, indirect, special,
158− incidental, or consequential damages of any character arising as a
159− result of this License or out of the use or inability to use the
160− Work (including but not limited to damages for loss of goodwill,
161− work stoppage, computer failure or malfunction, or any and all
162− other commercial damages or losses), even if such Contributor
163− has been advised of the possibility of such damages.
164−
165−9. Accepting Warranty or Additional Liability. While redistributing
166− the Work or Derivative Works thereof, You may choose to offer,
167− and charge a fee for, acceptance of support, warranty, indemnity,
168− or other liability obligations and/or rights consistent with this
169− License. However, in accepting such obligations, You may act only
170− on Your own behalf and on Your sole responsibility, not on behalf
171− of any other Contributor, and only if You agree to indemnify,
172− defend, and hold each Contributor harmless for any liability
173− incurred by, or claims asserted against, such Contributor by reason
174− of your accepting any such warranty or additional liability.
175−
176−END OF TERMS AND CONDITIONS
177−
178−APPENDIX: How to apply the Apache License to your work.
179−
180− To apply the Apache License to your work, attach the following
181− boilerplate notice, with the fields enclosed by brackets "[]"
182− replaced with your own identifying information. (Don't include
183− the brackets!) The text should be enclosed in the appropriate
184− comment syntax for the file format. We also recommend that a
185− file or class name and description of purpose be included on the
186− same "printed page" as the copyright notice for easier
187− identification within third-party archives.
188−
189−Copyright [yyyy] [name of copyright owner]
190−
191−Licensed under the Apache License, Version 2.0 (the "License");
192−you may not use this file except in compliance with the License.
193−You may obtain a copy of the License at
194−
195− http://www.apache.org/licenses/LICENSE-2.0
196−
197−Unless required by applicable law or agreed to in writing, software
198−distributed under the License is distributed on an "AS IS" BASIS,
199−WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200−See the License for the specific language governing permissions and
201−limitations under the License.
examples/input-form/LICENSE-MITdeleted−25
@@ -1,25 +0,0 @@
1−Copyright (c) 2015 The Rust Project Developers
2−
3−Permission is hereby granted, free of charge, to any
4−person obtaining a copy of this software and associated
5−documentation files (the "Software"), to deal in the
6−Software without restriction, including without
7−limitation the rights to use, copy, modify, merge,
8−publish, distribute, sublicense, and/or sell copies of
9−the Software, and to permit persons to whom the Software
10−is furnished to do so, subject to the following
11−conditions:
12−
13−The above copyright notice and this permission notice
14−shall be included in all copies or substantial portions
15−of the Software.
16−
17−THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
18−ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
19−TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
20−PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
21−SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
22−CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23−OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
24−IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25−DEALINGS IN THE SOFTWARE.
examples/input-form/README.md+13−20
@@ -1,29 +1,22 @@
1−# 🦀🕸 `rust-webpack-template`
1+# Input Forms
22
3−> **Kickstart your Rust, WebAssembly, and Webpack project!**
3+Renders a greeting to a user-supplied person via an `<input>` value. The
4+greeting is live-updated with new inputs.
45
5−This template is designed for creating monorepo-style Web applications with
6−Rust-generated WebAssembly and Webpack without publishing your wasm to NPM.
6+## Source
77
8−* Want to create and publish NPM packages with Rust and WebAssembly? [Check out
9− `wasm-pack-template`.](https://github.com/rustwasm/wasm-pack-template)
8+See `src/lib.rs`.
109
11−## 🔋 Batteries Included
10+## Build
1211
13−This template comes pre-configured with all the boilerplate for compiling Rust
14−to WebAssembly and hooking into a Webpack build pipeline.
15−
16−* `npm run start` -- Serve the project locally for development at
17− `http://localhost:8080`.
18−
19−* `npm run build` -- Bundle the project (in production mode).
20−
21−## 🚴 Using This Template
12+```
13+wasm-pack build --target web
14+```
2215
23−First, [install `wasm-pack`!](https://rustwasm.github.io/wasm-pack/installer/)
16+## Serve
2417
25−Then, use `npm init` to clone this template:
18+Use any HTTP server, for example:
2619
27−```sh
28−npm init rust-webpack my-app
20+```
21+python -m SimpleHTTPServer
2922```
examples/input-form/crate/src/lib.rsdeleted−76
@@ -1,76 +0,0 @@
1−use dodrio::bumpalo::{self, Bump};
2−use dodrio::{on, Attribute, Node, Render};
3−use wasm_bindgen::prelude::*;
4−use wasm_bindgen::JsCast;
5−
6−struct SayHelloTo {
7− who: String,
8−}
9−
10−impl SayHelloTo {
11− fn new<S: Into<String>>(who: S) -> SayHelloTo {
12− let who = who.into();
13− SayHelloTo { who }
14− }
15−
16− fn set_who(&mut self, who: String) {
17− self.who = who;
18− }
19−}
20−
21−impl Render for SayHelloTo {
22− fn render<'a, 'bump>(&'a self, bump: &'bump Bump) -> dodrio::Node<'bump>
23− where
24− 'a: 'bump,
25− {
26− let input = Node::element(
27− bump,
28− "input",
29− [on(bump, "input", |root, vdom, event| {
30− let input = match event
31− .target()
32− .and_then(|t| t.dyn_into::<web_sys::HtmlInputElement>().ok())
33− {
34− Some(input) => input,
35− None => return,
36− };
37−
38− root.unwrap_mut::<SayHelloTo>().set_who(input.value());
39− vdom.schedule_render();
40− })],
41− [
42− Attribute {
43− name: "type",
44− value: "text",
45− },
46− Attribute {
47− name: "value",
48− value: &self.who,
49− },
50− ],
51− [],
52− );
53−
54− let hello = bumpalo::format!(in bump, "Hello, {}!", self.who);
55− let hello = Node::text(hello.into_bump_str());
56−
57− Node::element(bump, "div", [], [], [input, hello])
58− }
59−}
60−
61−#[wasm_bindgen]
62−pub fn run() {
63− console_error_panic_hook::set_once();
64−
65− let window = web_sys::window().unwrap();
66− let document = window.document().unwrap();
67− let body = document.body().unwrap();
68−
69− let say_hello = SayHelloTo::new("World");
70−
71− // Mount the component to the `<body>`.
72− let vdom = dodrio::Vdom::new(&body, say_hello);
73−
74− // Run the component forever.
75− vdom.forget();
76−}
examples/input-form/index.html+4
@@ -5,5 +5,9 @@
55 <title>Input Form</title>
66 </head>
77 <body>
8+ <script type="module">
9+ import init from "./pkg/dodrio_input_form.js";
10+ init("./pkg/dodrio_input_form_bg.wasm");
11+ </script>
812 </body>
913</html>
examples/input-form/js/index.jsdeleted−3
@@ -1,3 +0,0 @@
1−import("../crate/pkg").then(module => {
2− module.run();
3−});
examples/input-form/package-lock.jsondeleted−5790
@@ -1,5790 +0,0 @@
1−{
2− "name": "create-rust-webpack",
3− "version": "0.1.5",
4− "lockfileVersion": 1,
5− "requires": true,
6− "dependencies": {
7− "@wasm-tool/wasm-pack-plugin": {
8− "version": "0.1.6",
9− "resolved": "https://registry.npmjs.org/@wasm-tool/wasm-pack-plugin/-/wasm-pack-plugin-0.1.6.tgz",
10− "integrity": "sha512-Nk6IqWSpvSnfjHOIElcol4aXLusl+/XKeuC2ViqbHOKHIClfN1r9KK9/KvGTslw7Qyjg4pVBYjGrTTRFqvvvvw==",
11− "dev": true,
12− "requires": {
13− "chalk": "^2.4.1",
14− "command-exists": "^1.2.7",
15− "glob": "^7.1.2",
16− "watchpack": "^1.6.0"
17− }
18− },
19− "@webassemblyjs/ast": {
20− "version": "1.7.11",
21− "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz",
22− "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==",
23− "dev": true,
24− "requires": {
25− "@webassemblyjs/helper-module-context": "1.7.11",
26− "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
27− "@webassemblyjs/wast-parser": "1.7.11"
28− }
29− },
30− "@webassemblyjs/floating-point-hex-parser": {
31− "version": "1.7.11",
32− "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz",
33− "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==",
34− "dev": true
35− },
36− "@webassemblyjs/helper-api-error": {
37− "version": "1.7.11",
38− "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz",
39− "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==",
40− "dev": true
41− },
42− "@webassemblyjs/helper-buffer": {
43− "version": "1.7.11",
44− "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz",
45− "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==",
46− "dev": true
47− },
48− "@webassemblyjs/helper-code-frame": {
49− "version": "1.7.11",
50− "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz",
51− "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==",
52− "dev": true,
53− "requires": {
54− "@webassemblyjs/wast-printer": "1.7.11"
55− }
56− },
57− "@webassemblyjs/helper-fsm": {
58− "version": "1.7.11",
59− "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz",
60− "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==",
61− "dev": true
62− },
63− "@webassemblyjs/helper-module-context": {
64− "version": "1.7.11",
65− "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz",
66− "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==",
67− "dev": true
68− },
69− "@webassemblyjs/helper-wasm-bytecode": {
70− "version": "1.7.11",
71− "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz",
72− "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==",
73− "dev": true
74− },
75− "@webassemblyjs/helper-wasm-section": {
76− "version": "1.7.11",
77− "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz",
78− "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==",
79− "dev": true,
80− "requires": {
81− "@webassemblyjs/ast": "1.7.11",
82− "@webassemblyjs/helper-buffer": "1.7.11",
83− "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
84− "@webassemblyjs/wasm-gen": "1.7.11"
85− }
86− },
87− "@webassemblyjs/ieee754": {
88− "version": "1.7.11",
89− "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz",
90− "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==",
91− "dev": true,
92− "requires": {
93− "@xtuc/ieee754": "^1.2.0"
94− }
95− },
96− "@webassemblyjs/leb128": {
97− "version": "1.7.11",
98− "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz",
99− "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==",
100− "dev": true,
101− "requires": {
102− "@xtuc/long": "4.2.1"
103− }
104− },
105− "@webassemblyjs/utf8": {
106− "version": "1.7.11",
107− "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz",
108− "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==",
109− "dev": true
110− },
111− "@webassemblyjs/wasm-edit": {
112− "version": "1.7.11",
113− "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz",
114− "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==",
115− "dev": true,
116− "requires": {
117− "@webassemblyjs/ast": "1.7.11",
118− "@webassemblyjs/helper-buffer": "1.7.11",
119− "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
120− "@webassemblyjs/helper-wasm-section": "1.7.11",
121− "@webassemblyjs/wasm-gen": "1.7.11",
122− "@webassemblyjs/wasm-opt": "1.7.11",
123− "@webassemblyjs/wasm-parser": "1.7.11",
124− "@webassemblyjs/wast-printer": "1.7.11"
125− }
126− },
127− "@webassemblyjs/wasm-gen": {
128− "version": "1.7.11",
129− "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz",
130− "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==",
131− "dev": true,
132− "requires": {
133− "@webassemblyjs/ast": "1.7.11",
134− "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
135− "@webassemblyjs/ieee754": "1.7.11",
136− "@webassemblyjs/leb128": "1.7.11",
137− "@webassemblyjs/utf8": "1.7.11"
138− }
139− },
140− "@webassemblyjs/wasm-opt": {
141− "version": "1.7.11",
142− "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz",
143− "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==",
144− "dev": true,
145− "requires": {
146− "@webassemblyjs/ast": "1.7.11",
147− "@webassemblyjs/helper-buffer": "1.7.11",
148− "@webassemblyjs/wasm-gen": "1.7.11",
149− "@webassemblyjs/wasm-parser": "1.7.11"
150− }
151− },
152− "@webassemblyjs/wasm-parser": {
153− "version": "1.7.11",
154− "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz",
155− "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==",
156− "dev": true,
157− "requires": {
158− "@webassemblyjs/ast": "1.7.11",
159− "@webassemblyjs/helper-api-error": "1.7.11",
160− "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
161− "@webassemblyjs/ieee754": "1.7.11",
162− "@webassemblyjs/leb128": "1.7.11",
163− "@webassemblyjs/utf8": "1.7.11"
164− }
165− },
166− "@webassemblyjs/wast-parser": {
167− "version": "1.7.11",
168− "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz",
169− "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==",
170− "dev": true,
171− "requires": {
172− "@webassemblyjs/ast": "1.7.11",
173− "@webassemblyjs/floating-point-hex-parser": "1.7.11",
174− "@webassemblyjs/helper-api-error": "1.7.11",
175− "@webassemblyjs/helper-code-frame": "1.7.11",
176− "@webassemblyjs/helper-fsm": "1.7.11",
177− "@xtuc/long": "4.2.1"
178− }
179− },
180− "@webassemblyjs/wast-printer": {
181− "version": "1.7.11",
182− "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz",
183− "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==",
184− "dev": true,
185− "requires": {
186− "@webassemblyjs/ast": "1.7.11",
187− "@webassemblyjs/wast-parser": "1.7.11",
188− "@xtuc/long": "4.2.1"
189− }
190− },
191− "@xtuc/ieee754": {
192− "version": "1.2.0",
193− "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
194− "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
195− "dev": true
196− },
197− "@xtuc/long": {
198− "version": "4.2.1",
199− "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz",
200− "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==",
201− "dev": true
202− },
203− "accepts": {
204− "version": "1.3.5",
205− "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
206− "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
207− "dev": true,
208− "requires": {
209− "mime-types": "~2.1.18",
210− "negotiator": "0.6.1"
211− }
212− },
213− "acorn": {
214− "version": "5.7.3",
215− "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
216− "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
217− "dev": true
218− },
219− "acorn-dynamic-import": {
220− "version": "3.0.0",
221− "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz",
222− "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==",
223− "dev": true,
224− "requires": {
225− "acorn": "^5.0.0"
226− }
227− },
228− "ajv": {
229− "version": "6.5.3",
230− "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz",
231− "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==",
232− "dev": true,
233− "requires": {
234− "fast-deep-equal": "^2.0.1",
235− "fast-json-stable-stringify": "^2.0.0",
236− "json-schema-traverse": "^0.4.1",
237− "uri-js": "^4.2.2"
238− }
239− },
240− "ajv-errors": {
241− "version": "1.0.1",
242− "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
243− "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
244− "dev": true
245− },
246− "ajv-keywords": {
247− "version": "3.2.0",
248− "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
249− "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=",
250− "dev": true
251− },
252− "ansi-colors": {
253− "version": "3.2.3",
254− "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
255− "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
256− "dev": true
257− },
258− "ansi-html": {
259− "version": "0.0.7",
260− "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
261− "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
262− "dev": true
263− },
264− "ansi-regex": {
265− "version": "2.1.1",
266− "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
267− "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
268− "dev": true
269− },
270− "ansi-styles": {
271− "version": "3.2.1",
272− "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
273− "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
274− "dev": true,
275− "requires": {
276− "color-convert": "^1.9.0"
277− }
278− },
279− "anymatch": {
280− "version": "2.0.0",
281− "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
282− "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
283− "dev": true,
284− "requires": {
285− "micromatch": "^3.1.4",
286− "normalize-path": "^2.1.1"
287− }
288− },
289− "aproba": {
290− "version": "1.2.0",
291− "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
292− "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
293− "dev": true
294− },
295− "arr-diff": {
296− "version": "4.0.0",
297− "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
298− "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
299− "dev": true
300− },
301− "arr-flatten": {
302− "version": "1.1.0",
303− "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
304− "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
305− "dev": true
306− },
307− "arr-union": {
308− "version": "3.1.0",
309− "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
310− "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
311− "dev": true
312− },
313− "array-flatten": {
314− "version": "2.1.2",
315− "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
316− "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
317− "dev": true
318− },
319− "array-union": {
320− "version": "1.0.2",
321− "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
322− "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
323− "dev": true,
324− "requires": {
325− "array-uniq": "^1.0.1"
326− }
327− },
328− "array-uniq": {
329− "version": "1.0.3",
330− "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
331− "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
332− "dev": true
333− },
334− "array-unique": {
335− "version": "0.3.2",
336− "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
337− "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
338− "dev": true
339− },
340− "asn1.js": {
341− "version": "4.10.1",
342− "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
343− "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
344− "dev": true,
345− "requires": {
346− "bn.js": "^4.0.0",
347− "inherits": "^2.0.1",
348− "minimalistic-assert": "^1.0.0"
349− }
350− },
351− "assert": {
352− "version": "1.4.1",
353− "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
354− "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
355− "dev": true,
356− "requires": {
357− "util": "0.10.3"
358− },
359− "dependencies": {
360− "inherits": {
361− "version": "2.0.1",
362− "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
363− "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
364− "dev": true
365− },
366− "util": {
367− "version": "0.10.3",
368− "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
369− "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
370− "dev": true,
371− "requires": {
372− "inherits": "2.0.1"
373− }
374− }
375− }
376− },
377− "assign-symbols": {
378− "version": "1.0.0",
379− "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
380− "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
381− "dev": true
382− },
383− "async": {
384− "version": "1.5.2",
385− "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz",
386− "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
387− "dev": true
388− },
389− "async-each": {
390− "version": "1.0.1",
391− "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
392− "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
393− "dev": true
394− },
395− "atob": {
396− "version": "2.1.1",
397− "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz",
398− "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=",
399− "dev": true
400− },
401− "balanced-match": {
402− "version": "1.0.0",
403− "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
404− "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
405− "dev": true
406− },
407− "base": {
408− "version": "0.11.2",
409− "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
410− "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
411− "dev": true,
412− "requires": {
413− "cache-base": "^1.0.1",
414− "class-utils": "^0.3.5",
415− "component-emitter": "^1.2.1",
416− "define-property": "^1.0.0",
417− "isobject": "^3.0.1",
418− "mixin-deep": "^1.2.0",
419− "pascalcase": "^0.1.1"
420− },
421− "dependencies": {
422− "define-property": {
423− "version": "1.0.0",
424− "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
425− "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
426− "dev": true,
427− "requires": {
428− "is-descriptor": "^1.0.0"
429− }
430− },
431− "is-accessor-descriptor": {
432− "version": "1.0.0",
433− "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
434− "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
435− "dev": true,
436− "requires": {
437− "kind-of": "^6.0.0"
438− }
439− },
440− "is-data-descriptor": {
441− "version": "1.0.0",
442− "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
443− "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
444− "dev": true,
445− "requires": {
446− "kind-of": "^6.0.0"
447− }
448− },
449− "is-descriptor": {
450− "version": "1.0.2",
451− "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
452− "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
453− "dev": true,
454− "requires": {
455− "is-accessor-descriptor": "^1.0.0",
456− "is-data-descriptor": "^1.0.0",
457− "kind-of": "^6.0.2"
458− }
459− }
460− }
461− },
462− "base64-js": {
463− "version": "1.3.0",
464− "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
465− "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
466− "dev": true
467− },
468− "batch": {
469− "version": "0.6.1",
470− "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
471− "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
472− "dev": true
473− },
474− "big.js": {
475− "version": "3.2.0",
476− "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
477− "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
478− "dev": true
479− },
480− "binary-extensions": {
481− "version": "1.11.0",
482− "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
483− "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
484− "dev": true
485− },
486− "bluebird": {
487− "version": "3.5.2",
488− "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz",
489− "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==",
490− "dev": true
491− },
492− "bn.js": {
493− "version": "4.11.8",
494− "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
495− "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
496− "dev": true
497− },
498− "body-parser": {
499− "version": "1.18.3",
500− "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
501− "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
502− "dev": true,
503− "requires": {
504− "bytes": "3.0.0",
505− "content-type": "~1.0.4",
506− "debug": "2.6.9",
507− "depd": "~1.1.2",
508− "http-errors": "~1.6.3",
509− "iconv-lite": "0.4.23",
510− "on-finished": "~2.3.0",
511− "qs": "6.5.2",
512− "raw-body": "2.3.3",
513− "type-is": "~1.6.16"
514− },
515− "dependencies": {
516− "debug": {
517− "version": "2.6.9",
518− "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
519− "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
520− "dev": true,
521− "requires": {
522− "ms": "2.0.0"
523− }
524− }
525− }
526− },
527− "bonjour": {
528− "version": "3.5.0",
529− "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
530− "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
531− "dev": true,
532− "requires": {
533− "array-flatten": "^2.1.0",
534− "deep-equal": "^1.0.1",
535− "dns-equal": "^1.0.0",
536− "dns-txt": "^2.0.2",
537− "multicast-dns": "^6.0.1",
538− "multicast-dns-service-types": "^1.1.0"
539− }
540− },
541− "boolbase": {
542− "version": "1.0.0",
543− "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
544− "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
545− "dev": true
546− },
547− "brace-expansion": {
548− "version": "1.1.11",
549− "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
550− "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
551− "dev": true,
552− "requires": {
553− "balanced-match": "^1.0.0",
554− "concat-map": "0.0.1"
555− }
556− },
557− "braces": {
558− "version": "2.3.2",
559− "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
560− "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
561− "dev": true,
562− "requires": {
563− "arr-flatten": "^1.1.0",
564− "array-unique": "^0.3.2",
565− "extend-shallow": "^2.0.1",
566− "fill-range": "^4.0.0",
567− "isobject": "^3.0.1",
568− "repeat-element": "^1.1.2",
569− "snapdragon": "^0.8.1",
570− "snapdragon-node": "^2.0.1",
571− "split-string": "^3.0.2",
572− "to-regex": "^3.0.1"
573− },
574− "dependencies": {
575− "extend-shallow": {
576− "version": "2.0.1",
577− "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
578− "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
579− "dev": true,
580− "requires": {
581− "is-extendable": "^0.1.0"
582− }
583− }
584− }
585− },
586− "brorand": {
587− "version": "1.1.0",
588− "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
589− "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
590− "dev": true
591− },
592− "browserify-aes": {
593− "version": "1.2.0",
594− "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
595− "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
596− "dev": true,
597− "requires": {
598− "buffer-xor": "^1.0.3",
599− "cipher-base": "^1.0.0",
600− "create-hash": "^1.1.0",
601− "evp_bytestokey": "^1.0.3",
602− "inherits": "^2.0.1",
603− "safe-buffer": "^5.0.1"
604− }
605− },
606− "browserify-cipher": {
607− "version": "1.0.1",
608− "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
609− "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
610− "dev": true,
611− "requires": {
612− "browserify-aes": "^1.0.4",
613− "browserify-des": "^1.0.0",
614− "evp_bytestokey": "^1.0.0"
615− }
616− },
617− "browserify-des": {
618− "version": "1.0.2",
619− "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
620− "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
621− "dev": true,
622− "requires": {
623− "cipher-base": "^1.0.1",
624− "des.js": "^1.0.0",
625− "inherits": "^2.0.1",
626− "safe-buffer": "^5.1.2"
627− }
628− },
629− "browserify-rsa": {
630− "version": "4.0.1",
631− "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
632− "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
633− "dev": true,
634− "requires": {
635− "bn.js": "^4.1.0",
636− "randombytes": "^2.0.1"
637− }
638− },
639− "browserify-sign": {
640− "version": "4.0.4",
641− "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
642− "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
643− "dev": true,
644− "requires": {
645− "bn.js": "^4.1.1",
646− "browserify-rsa": "^4.0.0",
647− "create-hash": "^1.1.0",
648− "create-hmac": "^1.1.2",
649− "elliptic": "^6.0.0",
650− "inherits": "^2.0.1",
651− "parse-asn1": "^5.0.0"
652− }
653− },
654− "browserify-zlib": {
655− "version": "0.2.0",
656− "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
657− "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
658− "dev": true,
659− "requires": {
660− "pako": "~1.0.5"
661− }
662− },
663− "buffer": {
664− "version": "4.9.1",
665− "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
666− "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
667− "dev": true,
668− "requires": {
669− "base64-js": "^1.0.2",
670− "ieee754": "^1.1.4",
671− "isarray": "^1.0.0"
672− }
673− },
674− "buffer-from": {
675− "version": "1.1.1",
676− "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
677− "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
678− "dev": true
679− },
680− "buffer-indexof": {
681− "version": "1.1.1",
682− "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
683− "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
684− "dev": true
685− },
686− "buffer-xor": {
687− "version": "1.0.3",
688− "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
689− "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
690− "dev": true
691− },
692− "builtin-status-codes": {
693− "version": "3.0.0",
694− "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
695− "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
696− "dev": true
697− },
698− "bytes": {
699− "version": "3.0.0",
700− "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
701− "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
702− "dev": true
703− },
704− "cacache": {
705− "version": "10.0.4",
706− "resolved": "http://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz",
707− "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==",
708− "dev": true,
709− "requires": {
710− "bluebird": "^3.5.1",
711− "chownr": "^1.0.1",
712− "glob": "^7.1.2",
713− "graceful-fs": "^4.1.11",
714− "lru-cache": "^4.1.1",
715− "mississippi": "^2.0.0",
716− "mkdirp": "^0.5.1",
717− "move-concurrently": "^1.0.1",
718− "promise-inflight": "^1.0.1",
719− "rimraf": "^2.6.2",
720− "ssri": "^5.2.4",
721− "unique-filename": "^1.1.0",
722− "y18n": "^4.0.0"
723− }
724− },
725− "cache-base": {
726− "version": "1.0.1",
727− "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
728− "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
729− "dev": true,
730− "requires": {
731− "collection-visit": "^1.0.0",
732− "component-emitter": "^1.2.1",
733− "get-value": "^2.0.6",
734− "has-value": "^1.0.0",
735− "isobject": "^3.0.1",
736− "set-value": "^2.0.0",
737− "to-object-path": "^0.3.0",
738− "union-value": "^1.0.0",
739− "unset-value": "^1.0.0"
740− }
741− },
742− "camel-case": {
743− "version": "3.0.0",
744− "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
745− "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
746− "dev": true,
747− "requires": {
748− "no-case": "^2.2.0",
749− "upper-case": "^1.1.1"
750− }
751− },
752− "camelcase": {
753− "version": "4.1.0",
754− "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
755− "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
756− "dev": true
757− },
758− "chalk": {
759− "version": "2.4.1",
760− "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
761− "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
762− "dev": true,
763− "requires": {
764− "ansi-styles": "^3.2.1",
765− "escape-string-regexp": "^1.0.5",
766− "supports-color": "^5.3.0"
767− }
768− },
769− "chokidar": {
770− "version": "2.0.4",
771− "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
772− "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
773− "dev": true,
774− "requires": {
775− "anymatch": "^2.0.0",
776− "async-each": "^1.0.0",
777− "braces": "^2.3.0",
778− "fsevents": "^1.2.2",
779− "glob-parent": "^3.1.0",
780− "inherits": "^2.0.1",
781− "is-binary-path": "^1.0.0",
782− "is-glob": "^4.0.0",
783− "lodash.debounce": "^4.0.8",
784− "normalize-path": "^2.1.1",
785− "path-is-absolute": "^1.0.0",
786− "readdirp": "^2.0.0",
787− "upath": "^1.0.5"
788− }
789− },
790− "chownr": {
791− "version": "1.1.1",
792− "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
793− "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
794− "dev": true
795− },
796− "chrome-trace-event": {
797− "version": "1.0.0",
798− "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz",
799− "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==",
800− "dev": true,
801− "requires": {
802− "tslib": "^1.9.0"
803− }
804− },
805− "cipher-base": {
806− "version": "1.0.4",
807− "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
808− "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
809− "dev": true,
810− "requires": {
811− "inherits": "^2.0.1",
812− "safe-buffer": "^5.0.1"
813− }
814− },
815− "class-utils": {
816− "version": "0.3.6",
817− "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
818− "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
819− "dev": true,
820− "requires": {
821− "arr-union": "^3.1.0",
822− "define-property": "^0.2.5",
823− "isobject": "^3.0.0",
824− "static-extend": "^0.1.1"
825− },
826− "dependencies": {
827− "define-property": {
828− "version": "0.2.5",
829− "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
830− "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
831− "dev": true,
832− "requires": {
833− "is-descriptor": "^0.1.0"
834− }
835− }
836− }
837− },
838− "clean-css": {
839− "version": "4.1.11",
840− "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz",
841− "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=",
842− "dev": true,
843− "requires": {
844− "source-map": "0.5.x"
845− }
846− },
847− "cliui": {
848− "version": "4.1.0",
849− "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
850− "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
851− "dev": true,
852− "requires": {
853− "string-width": "^2.1.1",
854− "strip-ansi": "^4.0.0",
855− "wrap-ansi": "^2.0.0"
856− },
857− "dependencies": {
858− "ansi-regex": {
859− "version": "3.0.0",
860− "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
861− "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
862− "dev": true
863− },
864− "strip-ansi": {
865− "version": "4.0.0",
866− "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
867− "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
868− "dev": true,
869− "requires": {
870− "ansi-regex": "^3.0.0"
871− }
872− }
873− }
874− },
875− "code-point-at": {
876− "version": "1.1.0",
877− "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
878− "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
879− "dev": true
880− },
881− "collection-visit": {
882− "version": "1.0.0",
883− "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
884− "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
885− "dev": true,
886− "requires": {
887− "map-visit": "^1.0.0",
888− "object-visit": "^1.0.0"
889− }
890− },
891− "color-convert": {
892− "version": "1.9.2",
893− "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz",
894− "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==",
895− "dev": true,
896− "requires": {
897− "color-name": "1.1.1"
898− }
899− },
900− "color-name": {
901− "version": "1.1.1",
902− "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz",
903− "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=",
904− "dev": true
905− },
906− "command-exists": {
907− "version": "1.2.8",
908− "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz",
909− "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==",
910− "dev": true
911− },
912− "commander": {
913− "version": "2.13.0",
914− "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
915− "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==",
916− "dev": true
917− },
918− "commondir": {
919− "version": "1.0.1",
920− "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
921− "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
922− "dev": true
923− },
924− "component-emitter": {
925− "version": "1.2.1",
926− "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
927− "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
928− "dev": true
929− },
930− "compressible": {
931− "version": "2.0.15",
932− "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz",
933− "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==",
934− "dev": true,
935− "requires": {
936− "mime-db": ">= 1.36.0 < 2"
937− }
938− },
939− "compression": {
940− "version": "1.7.3",
941− "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz",
942− "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==",
943− "dev": true,
944− "requires": {
945− "accepts": "~1.3.5",
946− "bytes": "3.0.0",
947− "compressible": "~2.0.14",
948− "debug": "2.6.9",
949− "on-headers": "~1.0.1",
950− "safe-buffer": "5.1.2",
951− "vary": "~1.1.2"
952− },
953− "dependencies": {
954− "debug": {
955− "version": "2.6.9",
956− "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
957− "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
958− "dev": true,
959− "requires": {
960− "ms": "2.0.0"
961− }
962− }
963− }
964− },
965− "concat-map": {
966− "version": "0.0.1",
967− "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
968− "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
969− "dev": true
970− },
971− "concat-stream": {
972− "version": "1.6.2",
973− "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
974− "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
975− "dev": true,
976− "requires": {
977− "buffer-from": "^1.0.0",
978− "inherits": "^2.0.3",
979− "readable-stream": "^2.2.2",
980− "typedarray": "^0.0.6"
981− }
982− },
983− "connect-history-api-fallback": {
984− "version": "1.6.0",
985− "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
986− "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
987− "dev": true
988− },
989− "console-browserify": {
990− "version": "1.1.0",
991− "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
992− "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
993− "dev": true,
994− "requires": {
995− "date-now": "^0.1.4"
996− }
997− },
998− "constants-browserify": {
999− "version": "1.0.0",
1000− "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
1001− "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
1002− "dev": true
1003− },
1004− "content-disposition": {
1005− "version": "0.5.2",
1006− "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
1007− "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
1008− "dev": true
1009− },
1010− "content-type": {
1011− "version": "1.0.4",
1012− "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
1013− "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
1014− "dev": true
1015− },
1016− "cookie": {
1017− "version": "0.3.1",
1018− "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
1019− "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
1020− "dev": true
1021− },
1022− "cookie-signature": {
1023− "version": "1.0.6",
1024− "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
1025− "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
1026− "dev": true
1027− },
1028− "copy-concurrently": {
1029− "version": "1.0.5",
1030− "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
1031− "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
1032− "dev": true,
1033− "requires": {
1034− "aproba": "^1.1.1",
1035− "fs-write-stream-atomic": "^1.0.8",
1036− "iferr": "^0.1.5",
1037− "mkdirp": "^0.5.1",
1038− "rimraf": "^2.5.4",
1039− "run-queue": "^1.0.0"
1040− }
1041− },
1042− "copy-descriptor": {
1043− "version": "0.1.1",
1044− "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
1045− "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
1046− "dev": true
1047− },
1048− "core-util-is": {
1049− "version": "1.0.2",
1050− "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
1051− "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
1052− "dev": true
1053− },
1054− "create-ecdh": {
1055− "version": "4.0.3",
1056− "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
1057− "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
1058− "dev": true,
1059− "requires": {
1060− "bn.js": "^4.1.0",
1061− "elliptic": "^6.0.0"
1062− }
1063− },
1064− "create-hash": {
1065− "version": "1.2.0",
1066− "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
1067− "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
1068− "dev": true,
1069− "requires": {
1070− "cipher-base": "^1.0.1",
1071− "inherits": "^2.0.1",
1072− "md5.js": "^1.3.4",
1073− "ripemd160": "^2.0.1",
1074− "sha.js": "^2.4.0"
1075− }
1076− },
1077− "create-hmac": {
1078− "version": "1.1.7",
1079− "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
1080− "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
1081− "dev": true,
1082− "requires": {
1083− "cipher-base": "^1.0.3",
1084− "create-hash": "^1.1.0",
1085− "inherits": "^2.0.1",
1086− "ripemd160": "^2.0.0",
1087− "safe-buffer": "^5.0.1",
1088− "sha.js": "^2.4.8"
1089− }
1090− },
1091− "cross-spawn": {
1092− "version": "6.0.5",
1093− "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
1094− "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
1095− "dev": true,
1096− "requires": {
1097− "nice-try": "^1.0.4",
1098− "path-key": "^2.0.1",
1099− "semver": "^5.5.0",
1100− "shebang-command": "^1.2.0",
1101− "which": "^1.2.9"
1102− }
1103− },
1104− "crypto-browserify": {
1105− "version": "3.12.0",
1106− "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
1107− "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
1108− "dev": true,
1109− "requires": {
1110− "browserify-cipher": "^1.0.0",
1111− "browserify-sign": "^4.0.0",
1112− "create-ecdh": "^4.0.0",
1113− "create-hash": "^1.1.0",
1114− "create-hmac": "^1.1.0",
1115− "diffie-hellman": "^5.0.0",
1116− "inherits": "^2.0.1",
1117− "pbkdf2": "^3.0.3",
1118− "public-encrypt": "^4.0.0",
1119− "randombytes": "^2.0.0",
1120− "randomfill": "^1.0.3"
1121− }
1122− },
1123− "css-select": {
1124− "version": "1.2.0",
1125− "resolved": "http://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
1126− "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
1127− "dev": true,
1128− "requires": {
1129− "boolbase": "~1.0.0",
1130− "css-what": "2.1",
1131− "domutils": "1.5.1",
1132− "nth-check": "~1.0.1"
1133− }
1134− },
1135− "css-what": {
1136− "version": "2.1.0",
1137− "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
1138− "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=",
1139− "dev": true
1140− },
1141− "cyclist": {
1142− "version": "0.2.2",
1143− "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
1144− "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=",
1145− "dev": true
1146− },
1147− "date-now": {
1148− "version": "0.1.4",
1149− "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
1150− "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
1151− "dev": true
1152− },
1153− "debug": {
1154− "version": "3.2.6",
1155− "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
1156− "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
1157− "dev": true,
1158− "requires": {
1159− "ms": "^2.1.1"
1160− },
1161− "dependencies": {
1162− "ms": {
1163− "version": "2.1.1",
1164− "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1165− "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
1166− "dev": true
1167− }
1168− }
1169− },
1170− "decamelize": {
1171− "version": "2.0.0",
1172− "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz",
1173− "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==",
1174− "dev": true,
1175− "requires": {
1176− "xregexp": "4.0.0"
1177− }
1178− },
1179− "decode-uri-component": {
1180− "version": "0.2.0",
1181− "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
1182− "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
1183− "dev": true
1184− },
1185− "deep-equal": {
1186− "version": "1.0.1",
1187− "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
1188− "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
1189− "dev": true
1190− },
1191− "default-gateway": {
1192− "version": "2.7.2",
1193− "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz",
1194− "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==",
1195− "dev": true,
1196− "requires": {
1197− "execa": "^0.10.0",
1198− "ip-regex": "^2.1.0"
1199− }
1200− },
1201− "define-properties": {
1202− "version": "1.1.2",
1203− "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
1204− "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
1205− "dev": true,
1206− "requires": {
1207− "foreach": "^2.0.5",
1208− "object-keys": "^1.0.8"
1209− }
1210− },
1211− "define-property": {
1212− "version": "2.0.2",
1213− "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
1214− "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
1215− "dev": true,
1216− "requires": {
1217− "is-descriptor": "^1.0.2",
1218− "isobject": "^3.0.1"
1219− },
1220− "dependencies": {
1221− "is-accessor-descriptor": {
1222− "version": "1.0.0",
1223− "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
1224− "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
1225− "dev": true,
1226− "requires": {
1227− "kind-of": "^6.0.0"
1228− }
1229− },
1230− "is-data-descriptor": {
1231− "version": "1.0.0",
1232− "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
1233− "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
1234− "dev": true,
1235− "requires": {
1236− "kind-of": "^6.0.0"
1237− }
1238− },
1239− "is-descriptor": {
1240− "version": "1.0.2",
1241− "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
1242− "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
1243− "dev": true,
1244− "requires": {
1245− "is-accessor-descriptor": "^1.0.0",
1246− "is-data-descriptor": "^1.0.0",
1247− "kind-of": "^6.0.2"
1248− }
1249− }
1250− }
1251− },
1252− "del": {
1253− "version": "3.0.0",
1254− "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
1255− "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
1256− "dev": true,
1257− "requires": {
1258− "globby": "^6.1.0",
1259− "is-path-cwd": "^1.0.0",
1260− "is-path-in-cwd": "^1.0.0",
1261− "p-map": "^1.1.1",
1262− "pify": "^3.0.0",
1263− "rimraf": "^2.2.8"
1264− }
1265− },
1266− "depd": {
1267− "version": "1.1.2",
1268− "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
1269− "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
1270− "dev": true
1271− },
1272− "des.js": {
1273− "version": "1.0.0",
1274− "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
1275− "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
1276− "dev": true,
1277− "requires": {
1278− "inherits": "^2.0.1",
1279− "minimalistic-assert": "^1.0.0"
1280− }
1281− },
1282− "destroy": {
1283− "version": "1.0.4",
1284− "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
1285− "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
1286− "dev": true
1287− },
1288− "detect-node": {
1289− "version": "2.0.4",
1290− "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
1291− "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
1292− "dev": true
1293− },
1294− "diffie-hellman": {
1295− "version": "5.0.3",
1296− "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
1297− "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
1298− "dev": true,
1299− "requires": {
1300− "bn.js": "^4.1.0",
1301− "miller-rabin": "^4.0.0",
1302− "randombytes": "^2.0.0"
1303− }
1304− },
1305− "dns-equal": {
1306− "version": "1.0.0",
1307− "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
1308− "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
1309− "dev": true
1310− },
1311− "dns-packet": {
1312− "version": "1.3.1",
1313− "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
1314− "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
1315− "dev": true,
1316− "requires": {
1317− "ip": "^1.1.0",
1318− "safe-buffer": "^5.0.1"
1319− }
1320− },
1321− "dns-txt": {
1322− "version": "2.0.2",
1323− "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
1324− "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
1325− "dev": true,
1326− "requires": {
1327− "buffer-indexof": "^1.0.0"
1328− }
1329− },
1330− "dom-converter": {
1331− "version": "0.1.4",
1332− "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz",
1333− "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=",
1334− "dev": true,
1335− "requires": {
1336− "utila": "~0.3"
1337− },
1338− "dependencies": {
1339− "utila": {
1340− "version": "0.3.3",
1341− "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz",
1342− "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=",
1343− "dev": true
1344− }
1345− }
1346− },
1347− "dom-serializer": {
1348− "version": "0.1.0",
1349− "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
1350− "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
1351− "dev": true,
1352− "requires": {
1353− "domelementtype": "~1.1.1",
1354− "entities": "~1.1.1"
1355− },
1356− "dependencies": {
1357− "domelementtype": {
1358− "version": "1.1.3",
1359− "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
1360− "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
1361− "dev": true
1362− }
1363− }
1364− },
1365− "domain-browser": {
1366− "version": "1.2.0",
1367− "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
1368− "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
1369− "dev": true
1370− },
1371− "domelementtype": {
1372− "version": "1.3.0",
1373− "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
1374− "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
1375− "dev": true
1376− },
1377− "domhandler": {
1378− "version": "2.1.0",
1379− "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz",
1380− "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=",
1381− "dev": true,
1382− "requires": {
1383− "domelementtype": "1"
1384− }
1385− },
1386− "domutils": {
1387− "version": "1.5.1",
1388− "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
1389− "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
1390− "dev": true,
1391− "requires": {
1392− "dom-serializer": "0",
1393− "domelementtype": "1"
1394− }
1395− },
1396− "duplexify": {
1397− "version": "3.6.1",
1398− "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz",
1399− "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==",
1400− "dev": true,
1401− "requires": {
1402− "end-of-stream": "^1.0.0",
1403− "inherits": "^2.0.1",
1404− "readable-stream": "^2.0.0",
1405− "stream-shift": "^1.0.0"
1406− }
1407− },
1408− "ee-first": {
1409− "version": "1.1.1",
1410− "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
1411− "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
1412− "dev": true
1413− },
1414− "elliptic": {
1415− "version": "6.4.1",
1416− "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz",
1417− "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==",
1418− "dev": true,
1419− "requires": {
1420− "bn.js": "^4.4.0",
1421− "brorand": "^1.0.1",
1422− "hash.js": "^1.0.0",
1423− "hmac-drbg": "^1.0.0",
1424− "inherits": "^2.0.1",
1425− "minimalistic-assert": "^1.0.0",
1426− "minimalistic-crypto-utils": "^1.0.0"
1427− }
1428− },
1429− "emojis-list": {
1430− "version": "2.1.0",
1431− "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
1432− "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
1433− "dev": true
1434− },
1435− "encodeurl": {
1436− "version": "1.0.2",
1437− "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
1438− "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
1439− "dev": true
1440− },
1441− "end-of-stream": {
1442− "version": "1.4.1",
1443− "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
1444− "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
1445− "dev": true,
1446− "requires": {
1447− "once": "^1.4.0"
1448− }
1449− },
1450− "enhanced-resolve": {
1451− "version": "4.1.0",
1452− "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
1453− "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
1454− "dev": true,
1455− "requires": {
1456− "graceful-fs": "^4.1.2",
1457− "memory-fs": "^0.4.0",
1458− "tapable": "^1.0.0"
1459− }
1460− },
1461− "entities": {
1462− "version": "1.1.1",
1463− "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
1464− "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
1465− "dev": true
1466− },
1467− "errno": {
1468− "version": "0.1.7",
1469− "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
1470− "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
1471− "dev": true,
1472− "requires": {
1473− "prr": "~1.0.1"
1474− }
1475− },
1476− "es-abstract": {
1477− "version": "1.12.0",
1478− "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
1479− "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
1480− "dev": true,
1481− "requires": {
1482− "es-to-primitive": "^1.1.1",
1483− "function-bind": "^1.1.1",
1484− "has": "^1.0.1",
1485− "is-callable": "^1.1.3",
1486− "is-regex": "^1.0.4"
1487− }
1488− },
1489− "es-to-primitive": {
1490− "version": "1.1.1",
1491− "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
1492− "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
1493− "dev": true,
1494− "requires": {
1495− "is-callable": "^1.1.1",
1496− "is-date-object": "^1.0.1",
1497− "is-symbol": "^1.0.1"
1498− }
1499− },
1500− "escape-html": {
1501− "version": "1.0.3",
1502− "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
1503− "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
1504− "dev": true
1505− },
1506− "escape-string-regexp": {
1507− "version": "1.0.5",
1508− "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
1509− "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
1510− "dev": true
1511− },
1512− "eslint-scope": {
1513− "version": "4.0.0",
1514− "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
1515− "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
1516− "dev": true,
1517− "requires": {
1518− "esrecurse": "^4.1.0",
1519− "estraverse": "^4.1.1"
1520− }
1521− },
1522− "esrecurse": {
1523− "version": "4.2.1",
1524− "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
1525− "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
1526− "dev": true,
1527− "requires": {
1528− "estraverse": "^4.1.0"
1529− }
1530− },
1531− "estraverse": {
1532− "version": "4.2.0",
1533− "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
1534− "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
1535− "dev": true
1536− },
1537− "etag": {
1538− "version": "1.8.1",
1539− "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
1540− "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
1541− "dev": true
1542− },
1543− "eventemitter3": {
1544− "version": "3.1.0",
1545− "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
1546− "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==",
1547− "dev": true
1548− },
1549− "events": {
1550− "version": "1.1.1",
1551− "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz",
1552− "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
1553− "dev": true
1554− },
1555− "eventsource": {
1556− "version": "1.0.7",
1557− "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
1558− "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
1559− "dev": true,
1560− "requires": {
1561− "original": "^1.0.0"
1562− }
1563− },
1564− "evp_bytestokey": {
1565− "version": "1.0.3",
1566− "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
1567− "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
1568− "dev": true,
1569− "requires": {
1570− "md5.js": "^1.3.4",
1571− "safe-buffer": "^5.1.1"
1572− }
1573− },
1574− "execa": {
1575− "version": "0.10.0",
1576− "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz",
1577− "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==",
1578− "dev": true,
1579− "requires": {
1580− "cross-spawn": "^6.0.0",
1581− "get-stream": "^3.0.0",
1582− "is-stream": "^1.1.0",
1583− "npm-run-path": "^2.0.0",
1584− "p-finally": "^1.0.0",
1585− "signal-exit": "^3.0.0",
1586− "strip-eof": "^1.0.0"
1587− }
1588− },
1589− "expand-brackets": {
1590− "version": "2.1.4",
1591− "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
1592− "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
1593− "dev": true,
1594− "requires": {
1595− "debug": "^2.3.3",
1596− "define-property": "^0.2.5",
1597− "extend-shallow": "^2.0.1",
1598− "posix-character-classes": "^0.1.0",
1599− "regex-not": "^1.0.0",
1600− "snapdragon": "^0.8.1",
1601− "to-regex": "^3.0.1"
1602− },
1603− "dependencies": {
1604− "debug": {
1605− "version": "2.6.9",
1606− "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1607− "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1608− "dev": true,
1609− "requires": {
1610− "ms": "2.0.0"
1611− }
1612− },
1613− "define-property": {
1614− "version": "0.2.5",
1615− "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
1616− "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
1617− "dev": true,
1618− "requires": {
1619− "is-descriptor": "^0.1.0"
1620− }
1621− },
1622− "extend-shallow": {
1623− "version": "2.0.1",
1624− "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1625− "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1626− "dev": true,
1627− "requires": {
1628− "is-extendable": "^0.1.0"
1629− }
1630− }
1631− }
1632− },
1633− "express": {
1634− "version": "4.16.4",
1635− "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
1636− "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==",
1637− "dev": true,
1638− "requires": {
1639− "accepts": "~1.3.5",
1640− "array-flatten": "1.1.1",
1641− "body-parser": "1.18.3",
1642− "content-disposition": "0.5.2",
1643− "content-type": "~1.0.4",
1644− "cookie": "0.3.1",
1645− "cookie-signature": "1.0.6",
1646− "debug": "2.6.9",
1647− "depd": "~1.1.2",
1648− "encodeurl": "~1.0.2",
1649− "escape-html": "~1.0.3",
1650− "etag": "~1.8.1",
1651− "finalhandler": "1.1.1",
1652− "fresh": "0.5.2",
1653− "merge-descriptors": "1.0.1",
1654− "methods": "~1.1.2",
1655− "on-finished": "~2.3.0",
1656− "parseurl": "~1.3.2",
1657− "path-to-regexp": "0.1.7",
1658− "proxy-addr": "~2.0.4",
1659− "qs": "6.5.2",
1660− "range-parser": "~1.2.0",
1661− "safe-buffer": "5.1.2",
1662− "send": "0.16.2",
1663− "serve-static": "1.13.2",
1664− "setprototypeof": "1.1.0",
1665− "statuses": "~1.4.0",
1666− "type-is": "~1.6.16",
1667− "utils-merge": "1.0.1",
1668− "vary": "~1.1.2"
1669− },
1670− "dependencies": {
1671− "array-flatten": {
1672− "version": "1.1.1",
1673− "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
1674− "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
1675− "dev": true
1676− },
1677− "debug": {
1678− "version": "2.6.9",
1679− "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1680− "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1681− "dev": true,
1682− "requires": {
1683− "ms": "2.0.0"
1684− }
1685− }
1686− }
1687− },
1688− "extend-shallow": {
1689− "version": "3.0.2",
1690− "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
1691− "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
1692− "dev": true,
1693− "requires": {
1694− "assign-symbols": "^1.0.0",
1695− "is-extendable": "^1.0.1"
1696− },
1697− "dependencies": {
1698− "is-extendable": {
1699− "version": "1.0.1",
1700− "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
1701− "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
1702− "dev": true,
1703− "requires": {
1704− "is-plain-object": "^2.0.4"
1705− }
1706− }
1707− }
1708− },
1709− "extglob": {
1710− "version": "2.0.4",
1711− "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
1712− "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
1713− "dev": true,
1714− "requires": {
1715− "array-unique": "^0.3.2",
1716− "define-property": "^1.0.0",
1717− "expand-brackets": "^2.1.4",
1718− "extend-shallow": "^2.0.1",
1719− "fragment-cache": "^0.2.1",
1720− "regex-not": "^1.0.0",
1721− "snapdragon": "^0.8.1",
1722− "to-regex": "^3.0.1"
1723− },
1724− "dependencies": {
1725− "define-property": {
1726− "version": "1.0.0",
1727− "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
1728− "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
1729− "dev": true,
1730− "requires": {
1731− "is-descriptor": "^1.0.0"
1732− }
1733− },
1734− "extend-shallow": {
1735− "version": "2.0.1",
1736− "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1737− "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1738− "dev": true,
1739− "requires": {
1740− "is-extendable": "^0.1.0"
1741− }
1742− },
1743− "is-accessor-descriptor": {
1744− "version": "1.0.0",
1745− "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
1746− "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
1747− "dev": true,
1748− "requires": {
1749− "kind-of": "^6.0.0"
1750− }
1751− },
1752− "is-data-descriptor": {
1753− "version": "1.0.0",
1754− "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
1755− "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
1756− "dev": true,
1757− "requires": {
1758− "kind-of": "^6.0.0"
1759− }
1760− },
1761− "is-descriptor": {
1762− "version": "1.0.2",
1763− "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
1764− "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
1765− "dev": true,
1766− "requires": {
1767− "is-accessor-descriptor": "^1.0.0",
1768− "is-data-descriptor": "^1.0.0",
1769− "kind-of": "^6.0.2"
1770− }
1771− }
1772− }
1773− },
1774− "fast-deep-equal": {
1775− "version": "2.0.1",
1776− "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
1777− "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
1778− "dev": true
1779− },
1780− "fast-json-stable-stringify": {
1781− "version": "2.0.0",
1782− "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
1783− "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
1784− "dev": true
1785− },
1786− "faye-websocket": {
1787− "version": "0.10.0",
1788− "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
1789− "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
1790− "dev": true,
1791− "requires": {
1792− "websocket-driver": ">=0.5.1"
1793− }
1794− },
1795− "fill-range": {
1796− "version": "4.0.0",
1797− "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
1798− "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
1799− "dev": true,
1800− "requires": {
1801− "extend-shallow": "^2.0.1",
1802− "is-number": "^3.0.0",
1803− "repeat-string": "^1.6.1",
1804− "to-regex-range": "^2.1.0"
1805− },
1806− "dependencies": {
1807− "extend-shallow": {
1808− "version": "2.0.1",
1809− "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1810− "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1811− "dev": true,
1812− "requires": {
1813− "is-extendable": "^0.1.0"
1814− }
1815− }
1816− }
1817− },
1818− "finalhandler": {
1819− "version": "1.1.1",
1820− "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
1821− "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
1822− "dev": true,
1823− "requires": {
1824− "debug": "2.6.9",
1825− "encodeurl": "~1.0.2",
1826− "escape-html": "~1.0.3",
1827− "on-finished": "~2.3.0",
1828− "parseurl": "~1.3.2",
1829− "statuses": "~1.4.0",
1830− "unpipe": "~1.0.0"
1831− },
1832− "dependencies": {
1833− "debug": {
1834− "version": "2.6.9",
1835− "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1836− "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1837− "dev": true,
1838− "requires": {
1839− "ms": "2.0.0"
1840− }
1841− }
1842− }
1843− },
1844− "find-cache-dir": {
1845− "version": "1.0.0",
1846− "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz",
1847− "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=",
1848− "dev": true,
1849− "requires": {
1850− "commondir": "^1.0.1",
1851− "make-dir": "^1.0.0",
1852− "pkg-dir": "^2.0.0"
1853− }
1854− },
1855− "find-up": {
1856− "version": "2.1.0",
1857− "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
1858− "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
1859− "dev": true,
1860− "requires": {
1861− "locate-path": "^2.0.0"
1862− }
1863− },
1864− "flush-write-stream": {
1865− "version": "1.0.3",
1866− "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz",
1867− "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==",
1868− "dev": true,
1869− "requires": {
1870− "inherits": "^2.0.1",
1871− "readable-stream": "^2.0.4"
1872− }
1873− },
1874− "follow-redirects": {
1875− "version": "1.6.1",
1876− "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.1.tgz",
1877− "integrity": "sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ==",
1878− "dev": true,
1879− "requires": {
1880− "debug": "=3.1.0"
1881− },
1882− "dependencies": {
1883− "debug": {
1884− "version": "3.1.0",
1885− "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
1886− "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
1887− "dev": true,
1888− "requires": {
1889− "ms": "2.0.0"
1890− }
1891− }
1892− }
1893− },
1894− "for-in": {
1895− "version": "1.0.2",
1896− "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
1897− "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
1898− "dev": true
1899− },
1900− "foreach": {
1901− "version": "2.0.5",
1902− "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
1903− "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
1904− "dev": true
1905− },
1906− "forwarded": {
1907− "version": "0.1.2",
1908− "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
1909− "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
1910− "dev": true
1911− },
1912− "fragment-cache": {
1913− "version": "0.2.1",
1914− "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
1915− "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
1916− "dev": true,
1917− "requires": {
1918− "map-cache": "^0.2.2"
1919− }
1920− },
1921− "fresh": {
1922− "version": "0.5.2",
1923− "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
1924− "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
1925− "dev": true
1926− },
1927− "from2": {
1928− "version": "2.3.0",
1929− "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
1930− "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
1931− "dev": true,
1932− "requires": {
1933− "inherits": "^2.0.1",
1934− "readable-stream": "^2.0.0"
1935− }
1936− },
1937− "fs-write-stream-atomic": {
1938− "version": "1.0.10",
1939− "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
1940− "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
1941− "dev": true,
1942− "requires": {
1943− "graceful-fs": "^4.1.2",
1944− "iferr": "^0.1.5",
1945− "imurmurhash": "^0.1.4",
1946− "readable-stream": "1 || 2"
1947− }
1948− },
1949− "fs.realpath": {
1950− "version": "1.0.0",
1951− "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1952− "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
1953− "dev": true
1954− },
1955− "fsevents": {
1956− "version": "1.2.4",
1957− "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
1958− "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
1959− "dev": true,
1960− "optional": true,
1961− "requires": {
1962− "nan": "^2.9.2",
1963− "node-pre-gyp": "^0.10.0"
1964− },
1965− "dependencies": {
1966− "abbrev": {
1967− "version": "1.1.1",
1968− "bundled": true,
1969− "dev": true,
1970− "optional": true
1971− },
1972− "ansi-regex": {
1973− "version": "2.1.1",
1974− "bundled": true,
1975− "dev": true
1976− },
1977− "aproba": {
1978− "version": "1.2.0",
1979− "bundled": true,
1980− "dev": true,
1981− "optional": true
1982− },
1983− "are-we-there-yet": {
1984− "version": "1.1.4",
1985− "bundled": true,
1986− "dev": true,
1987− "optional": true,
1988− "requires": {
1989− "delegates": "^1.0.0",
1990− "readable-stream": "^2.0.6"
1991− }
1992− },
1993− "balanced-match": {
1994− "version": "1.0.0",
1995− "bundled": true,
1996− "dev": true
1997− },
1998− "brace-expansion": {
1999− "version": "1.1.11",
2000− "bundled": true,
2001− "dev": true,
2002− "requires": {
2003− "balanced-match": "^1.0.0",
2004− "concat-map": "0.0.1"
2005− }
2006− },
2007− "chownr": {
2008− "version": "1.0.1",
2009− "bundled": true,
2010− "dev": true,
2011− "optional": true
2012− },
2013− "code-point-at": {
2014− "version": "1.1.0",
2015− "bundled": true,
2016− "dev": true
2017− },
2018− "concat-map": {
2019− "version": "0.0.1",
2020− "bundled": true,
2021− "dev": true
2022− },
2023− "console-control-strings": {
2024− "version": "1.1.0",
2025− "bundled": true,
2026− "dev": true
2027− },
2028− "core-util-is": {
2029− "version": "1.0.2",
2030− "bundled": true,
2031− "dev": true,
2032− "optional": true
2033− },
2034− "debug": {
2035− "version": "2.6.9",
2036− "bundled": true,
2037− "dev": true,
2038− "optional": true,
2039− "requires": {
2040− "ms": "2.0.0"
2041− }
2042− },
2043− "deep-extend": {
2044− "version": "0.5.1",
2045− "bundled": true,
2046− "dev": true,
2047− "optional": true
2048− },
2049− "delegates": {
2050− "version": "1.0.0",
2051− "bundled": true,
2052− "dev": true,
2053− "optional": true
2054− },
2055− "detect-libc": {
2056− "version": "1.0.3",
2057− "bundled": true,
2058− "dev": true,
2059− "optional": true
2060− },
2061− "fs-minipass": {
2062− "version": "1.2.5",
2063− "bundled": true,
2064− "dev": true,
2065− "optional": true,
2066− "requires": {
2067− "minipass": "^2.2.1"
2068− }
2069− },
2070− "fs.realpath": {
2071− "version": "1.0.0",
2072− "bundled": true,
2073− "dev": true,
2074− "optional": true
2075− },
2076− "gauge": {
2077− "version": "2.7.4",
2078− "bundled": true,
2079− "dev": true,
2080− "optional": true,
2081− "requires": {
2082− "aproba": "^1.0.3",
2083− "console-control-strings": "^1.0.0",
2084− "has-unicode": "^2.0.0",
2085− "object-assign": "^4.1.0",
2086− "signal-exit": "^3.0.0",
2087− "string-width": "^1.0.1",
2088− "strip-ansi": "^3.0.1",
2089− "wide-align": "^1.1.0"
2090− }
2091− },
2092− "glob": {
2093− "version": "7.1.2",
2094− "bundled": true,
2095− "dev": true,
2096− "optional": true,
2097− "requires": {
2098− "fs.realpath": "^1.0.0",
2099− "inflight": "^1.0.4",
2100− "inherits": "2",
2101− "minimatch": "^3.0.4",
2102− "once": "^1.3.0",
2103− "path-is-absolute": "^1.0.0"
2104− }
2105− },
2106− "has-unicode": {
2107− "version": "2.0.1",
2108− "bundled": true,
2109− "dev": true,
2110− "optional": true
2111− },
2112− "iconv-lite": {
2113− "version": "0.4.21",
2114− "bundled": true,
2115− "dev": true,
2116− "optional": true,
2117− "requires": {
2118− "safer-buffer": "^2.1.0"
2119− }
2120− },
2121− "ignore-walk": {
2122− "version": "3.0.1",
2123− "bundled": true,
2124− "dev": true,
2125− "optional": true,
2126− "requires": {
2127− "minimatch": "^3.0.4"
2128− }
2129− },
2130− "inflight": {
2131− "version": "1.0.6",
2132− "bundled": true,
2133− "dev": true,
2134− "optional": true,
2135− "requires": {
2136− "once": "^1.3.0",
2137− "wrappy": "1"
2138− }
2139− },
2140− "inherits": {
2141− "version": "2.0.3",
2142− "bundled": true,
2143− "dev": true
2144− },
2145− "ini": {
2146− "version": "1.3.5",
2147− "bundled": true,
2148− "dev": true,
2149− "optional": true
2150− },
2151− "is-fullwidth-code-point": {
2152− "version": "1.0.0",
2153− "bundled": true,
2154− "dev": true,
2155− "requires": {
2156− "number-is-nan": "^1.0.0"
2157− }
2158− },
2159− "isarray": {
2160− "version": "1.0.0",
2161− "bundled": true,
2162− "dev": true,
2163− "optional": true
2164− },
2165− "minimatch": {
2166− "version": "3.0.4",
2167− "bundled": true,
2168− "dev": true,
2169− "requires": {
2170− "brace-expansion": "^1.1.7"
2171− }
2172− },
2173− "minimist": {
2174− "version": "0.0.8",
2175− "bundled": true,
2176− "dev": true
2177− },
2178− "minipass": {
2179− "version": "2.2.4",
2180− "bundled": true,
2181− "dev": true,
2182− "requires": {
2183− "safe-buffer": "^5.1.1",
2184− "yallist": "^3.0.0"
2185− }
2186− },
2187− "minizlib": {
2188− "version": "1.1.0",
2189− "bundled": true,
2190− "dev": true,
2191− "optional": true,
2192− "requires": {
2193− "minipass": "^2.2.1"
2194− }
2195− },
2196− "mkdirp": {
2197− "version": "0.5.1",
2198− "bundled": true,
2199− "dev": true,
2200− "requires": {
2201− "minimist": "0.0.8"
2202− }
2203− },
2204− "ms": {
2205− "version": "2.0.0",
2206− "bundled": true,
2207− "dev": true,
2208− "optional": true
2209− },
2210− "needle": {
2211− "version": "2.2.0",
2212− "bundled": true,
2213− "dev": true,
2214− "optional": true,
2215− "requires": {
2216− "debug": "^2.1.2",
2217− "iconv-lite": "^0.4.4",
2218− "sax": "^1.2.4"
2219− }
2220− },
2221− "node-pre-gyp": {
2222− "version": "0.10.0",
2223− "bundled": true,
2224− "dev": true,
2225− "optional": true,
2226− "requires": {
2227− "detect-libc": "^1.0.2",
2228− "mkdirp": "^0.5.1",
2229− "needle": "^2.2.0",
2230− "nopt": "^4.0.1",
2231− "npm-packlist": "^1.1.6",
2232− "npmlog": "^4.0.2",
2233− "rc": "^1.1.7",
2234− "rimraf": "^2.6.1",
2235− "semver": "^5.3.0",
2236− "tar": "^4"
2237− }
2238− },
2239− "nopt": {
2240− "version": "4.0.1",
2241− "bundled": true,
2242− "dev": true,
2243− "optional": true,
2244− "requires": {
2245− "abbrev": "1",
2246− "osenv": "^0.1.4"
2247− }
2248− },
2249− "npm-bundled": {
2250− "version": "1.0.3",
2251− "bundled": true,
2252− "dev": true,
2253− "optional": true
2254− },
2255− "npm-packlist": {
2256− "version": "1.1.10",
2257− "bundled": true,
2258− "dev": true,
2259− "optional": true,
2260− "requires": {
2261− "ignore-walk": "^3.0.1",
2262− "npm-bundled": "^1.0.1"
2263− }
2264− },
2265− "npmlog": {
2266− "version": "4.1.2",
2267− "bundled": true,
2268− "dev": true,
2269− "optional": true,
2270− "requires": {
2271− "are-we-there-yet": "~1.1.2",
2272− "console-control-strings": "~1.1.0",
2273− "gauge": "~2.7.3",
2274− "set-blocking": "~2.0.0"
2275− }
2276− },
2277− "number-is-nan": {
2278− "version": "1.0.1",
2279− "bundled": true,
2280− "dev": true
2281− },
2282− "object-assign": {
2283− "version": "4.1.1",
2284− "bundled": true,
2285− "dev": true,
2286− "optional": true
2287− },
2288− "once": {
2289− "version": "1.4.0",
2290− "bundled": true,
2291− "dev": true,
2292− "requires": {
2293− "wrappy": "1"
2294− }
2295− },
2296− "os-homedir": {
2297− "version": "1.0.2",
2298− "bundled": true,
2299− "dev": true,
2300− "optional": true
2301− },
2302− "os-tmpdir": {
2303− "version": "1.0.2",
2304− "bundled": true,
2305− "dev": true,
2306− "optional": true
2307− },
2308− "osenv": {
2309− "version": "0.1.5",
2310− "bundled": true,
2311− "dev": true,
2312− "optional": true,
2313− "requires": {
2314− "os-homedir": "^1.0.0",
2315− "os-tmpdir": "^1.0.0"
2316− }
2317− },
2318− "path-is-absolute": {
2319− "version": "1.0.1",
2320− "bundled": true,
2321− "dev": true,
2322− "optional": true
2323− },
2324− "process-nextick-args": {
2325− "version": "2.0.0",
2326− "bundled": true,
2327− "dev": true,
2328− "optional": true
2329− },
2330− "rc": {
2331− "version": "1.2.7",
2332− "bundled": true,
2333− "dev": true,
2334− "optional": true,
2335− "requires": {
2336− "deep-extend": "^0.5.1",
2337− "ini": "~1.3.0",
2338− "minimist": "^1.2.0",
2339− "strip-json-comments": "~2.0.1"
2340− },
2341− "dependencies": {
2342− "minimist": {
2343− "version": "1.2.0",
2344− "bundled": true,
2345− "dev": true,
2346− "optional": true
2347− }
2348− }
2349− },
2350− "readable-stream": {
2351− "version": "2.3.6",
2352− "bundled": true,
2353− "dev": true,
2354− "optional": true,
2355− "requires": {
2356− "core-util-is": "~1.0.0",
2357− "inherits": "~2.0.3",
2358− "isarray": "~1.0.0",
2359− "process-nextick-args": "~2.0.0",
2360− "safe-buffer": "~5.1.1",
2361− "string_decoder": "~1.1.1",
2362− "util-deprecate": "~1.0.1"
2363− }
2364− },
2365− "rimraf": {
2366− "version": "2.6.2",
2367− "bundled": true,
2368− "dev": true,
2369− "optional": true,
2370− "requires": {
2371− "glob": "^7.0.5"
2372− }
2373− },
2374− "safe-buffer": {
2375− "version": "5.1.1",
2376− "bundled": true,
2377− "dev": true
2378− },
2379− "safer-buffer": {
2380− "version": "2.1.2",
2381− "bundled": true,
2382− "dev": true,
2383− "optional": true
2384− },
2385− "sax": {
2386− "version": "1.2.4",
2387− "bundled": true,
2388− "dev": true,
2389− "optional": true
2390− },
2391− "semver": {
2392− "version": "5.5.0",
2393− "bundled": true,
2394− "dev": true,
2395− "optional": true
2396− },
2397− "set-blocking": {
2398− "version": "2.0.0",
2399− "bundled": true,
2400− "dev": true,
2401− "optional": true
2402− },
2403− "signal-exit": {
2404− "version": "3.0.2",
2405− "bundled": true,
2406− "dev": true,
2407− "optional": true
2408− },
2409− "string-width": {
2410− "version": "1.0.2",
2411− "bundled": true,
2412− "dev": true,
2413− "requires": {
2414− "code-point-at": "^1.0.0",
2415− "is-fullwidth-code-point": "^1.0.0",
2416− "strip-ansi": "^3.0.0"
2417− }
2418− },
2419− "string_decoder": {
2420− "version": "1.1.1",
2421− "bundled": true,
2422− "dev": true,
2423− "optional": true,
2424− "requires": {
2425− "safe-buffer": "~5.1.0"
2426− }
2427− },
2428− "strip-ansi": {
2429− "version": "3.0.1",
2430− "bundled": true,
2431− "dev": true,
2432− "requires": {
2433− "ansi-regex": "^2.0.0"
2434− }
2435− },
2436− "strip-json-comments": {
2437− "version": "2.0.1",
2438− "bundled": true,
2439− "dev": true,
2440− "optional": true
2441− },
2442− "tar": {
2443− "version": "4.4.1",
2444− "bundled": true,
2445− "dev": true,
2446− "optional": true,
2447− "requires": {
2448− "chownr": "^1.0.1",
2449− "fs-minipass": "^1.2.5",
2450− "minipass": "^2.2.4",
2451− "minizlib": "^1.1.0",
2452− "mkdirp": "^0.5.0",
2453− "safe-buffer": "^5.1.1",
2454− "yallist": "^3.0.2"
2455− }
2456− },
2457− "util-deprecate": {
2458− "version": "1.0.2",
2459− "bundled": true,
2460− "dev": true,
2461− "optional": true
2462− },
2463− "wide-align": {
2464− "version": "1.1.2",
2465− "bundled": true,
2466− "dev": true,
2467− "optional": true,
2468− "requires": {
2469− "string-width": "^1.0.2"
2470− }
2471− },
2472− "wrappy": {
2473− "version": "1.0.2",
2474− "bundled": true,
2475− "dev": true
2476− },
2477− "yallist": {
2478− "version": "3.0.2",
2479− "bundled": true,
2480− "dev": true
2481− }
2482− }
2483− },
2484− "function-bind": {
2485− "version": "1.1.1",
2486− "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
2487− "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
2488− "dev": true
2489− },
2490− "get-caller-file": {
2491− "version": "1.0.3",
2492− "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
2493− "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
2494− "dev": true
2495− },
2496− "get-stream": {
2497− "version": "3.0.0",
2498− "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
2499− "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
2500− "dev": true
2501− },
2502− "get-value": {
2503− "version": "2.0.6",
2504− "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
2505− "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
2506− "dev": true
2507− },
2508− "glob": {
2509− "version": "7.1.2",
2510− "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
2511− "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
2512− "dev": true,
2513− "requires": {
2514− "fs.realpath": "^1.0.0",
2515− "inflight": "^1.0.4",
2516− "inherits": "2",
2517− "minimatch": "^3.0.4",
2518− "once": "^1.3.0",
2519− "path-is-absolute": "^1.0.0"
2520− }
2521− },
2522− "glob-parent": {
2523− "version": "3.1.0",
2524− "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
2525− "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
2526− "dev": true,
2527− "requires": {
2528− "is-glob": "^3.1.0",
2529− "path-dirname": "^1.0.0"
2530− },
2531− "dependencies": {
2532− "is-glob": {
2533− "version": "3.1.0",
2534− "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
2535− "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
2536− "dev": true,
2537− "requires": {
2538− "is-extglob": "^2.1.0"
2539− }
2540− }
2541− }
2542− },
2543− "global-modules-path": {
2544− "version": "2.3.0",
2545− "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz",
2546− "integrity": "sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==",
2547− "dev": true
2548− },
2549− "globby": {
2550− "version": "6.1.0",
2551− "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
2552− "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
2553− "dev": true,
2554− "requires": {
2555− "array-union": "^1.0.1",
2556− "glob": "^7.0.3",
2557− "object-assign": "^4.0.1",
2558− "pify": "^2.0.0",
2559− "pinkie-promise": "^2.0.0"
2560− },
2561− "dependencies": {
2562− "pify": {
2563− "version": "2.3.0",
2564− "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
2565− "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
2566− "dev": true
2567− }
2568− }
2569− },
2570− "graceful-fs": {
2571− "version": "4.1.11",
2572− "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
2573− "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
2574− "dev": true
2575− },
2576− "handle-thing": {
2577− "version": "2.0.0",
2578− "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz",
2579− "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==",
2580− "dev": true
2581− },
2582− "has": {
2583− "version": "1.0.3",
2584− "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
2585− "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
2586− "dev": true,
2587− "requires": {
2588− "function-bind": "^1.1.1"
2589− }
2590− },
2591− "has-flag": {
2592− "version": "3.0.0",
2593− "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
2594− "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
2595− "dev": true
2596− },
2597− "has-value": {
2598− "version": "1.0.0",
2599− "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
2600− "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
2601− "dev": true,
2602− "requires": {
2603− "get-value": "^2.0.6",
2604− "has-values": "^1.0.0",
2605− "isobject": "^3.0.0"
2606− }
2607− },
2608− "has-values": {
2609− "version": "1.0.0",
2610− "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
2611− "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
2612− "dev": true,
2613− "requires": {
2614− "is-number": "^3.0.0",
2615− "kind-of": "^4.0.0"
2616− },
2617− "dependencies": {
2618− "kind-of": {
2619− "version": "4.0.0",
2620− "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
2621− "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
2622− "dev": true,
2623− "requires": {
2624− "is-buffer": "^1.1.5"
2625− }
2626− }
2627− }
2628− },
2629− "hash-base": {
2630− "version": "3.0.4",
2631− "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
2632− "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
2633− "dev": true,
2634− "requires": {
2635− "inherits": "^2.0.1",
2636− "safe-buffer": "^5.0.1"
2637− }
2638− },
2639− "hash.js": {
2640− "version": "1.1.5",
2641− "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz",
2642− "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==",
2643− "dev": true,
2644− "requires": {
2645− "inherits": "^2.0.3",
2646− "minimalistic-assert": "^1.0.1"
2647− }
2648− },
2649− "he": {
2650− "version": "1.1.1",
2651− "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
2652− "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
2653− "dev": true
2654− },
2655− "hmac-drbg": {
2656− "version": "1.0.1",
2657− "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
2658− "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
2659− "dev": true,
2660− "requires": {
2661− "hash.js": "^1.0.3",
2662− "minimalistic-assert": "^1.0.0",
2663− "minimalistic-crypto-utils": "^1.0.1"
2664− }
2665− },
2666− "hpack.js": {
2667− "version": "2.1.6",
2668− "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
2669− "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
2670− "dev": true,
2671− "requires": {
2672− "inherits": "^2.0.1",
2673− "obuf": "^1.0.0",
2674− "readable-stream": "^2.0.1",
2675− "wbuf": "^1.1.0"
2676− }
2677− },
2678− "html-entities": {
2679− "version": "1.2.1",
2680− "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
2681− "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
2682− "dev": true
2683− },
2684− "html-minifier": {
2685− "version": "3.5.19",
2686− "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.19.tgz",
2687− "integrity": "sha512-Qr2JC9nsjK8oCrEmuB430ZIA8YWbF3D5LSjywD75FTuXmeqacwHgIM8wp3vHYzzPbklSjp53RdmDuzR4ub2HzA==",
2688− "dev": true,
2689− "requires": {
2690− "camel-case": "3.0.x",
2691− "clean-css": "4.1.x",
2692− "commander": "2.16.x",
2693− "he": "1.1.x",
2694− "param-case": "2.1.x",
2695− "relateurl": "0.2.x",
2696− "uglify-js": "3.4.x"
2697− },
2698− "dependencies": {
2699− "commander": {
2700− "version": "2.16.0",
2701− "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz",
2702− "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==",
2703− "dev": true
2704− },
2705− "source-map": {
2706− "version": "0.6.1",
2707− "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2708− "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2709− "dev": true
2710− },
2711− "uglify-js": {
2712− "version": "3.4.7",
2713− "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.7.tgz",
2714− "integrity": "sha512-J0M2i1mQA+ze3EdN9SBi751DNdAXmeFLfJrd/MDIkRc3G3Gbb9OPVSx7GIQvVwfWxQARcYV2DTxIkMyDAk3o9Q==",
2715− "dev": true,
2716− "requires": {
2717− "commander": "~2.16.0",
2718− "source-map": "~0.6.1"
2719− }
2720− }
2721− }
2722− },
2723− "html-webpack-plugin": {
2724− "version": "3.2.0",
2725− "resolved": "http://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz",
2726− "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=",
2727− "dev": true,
2728− "requires": {
2729− "html-minifier": "^3.2.3",
2730− "loader-utils": "^0.2.16",
2731− "lodash": "^4.17.3",
2732− "pretty-error": "^2.0.2",
2733− "tapable": "^1.0.0",
2734− "toposort": "^1.0.0",
2735− "util.promisify": "1.0.0"
2736− },
2737− "dependencies": {
2738− "loader-utils": {
2739− "version": "0.2.17",
2740− "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
2741− "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
2742− "dev": true,
2743− "requires": {
2744− "big.js": "^3.1.3",
2745− "emojis-list": "^2.0.0",
2746− "json5": "^0.5.0",
2747− "object-assign": "^4.0.1"
2748− }
2749− }
2750− }
2751− },
2752− "htmlparser2": {
2753− "version": "3.3.0",
2754− "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz",
2755− "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=",
2756− "dev": true,
2757− "requires": {
2758− "domelementtype": "1",
2759− "domhandler": "2.1",
2760− "domutils": "1.1",
2761− "readable-stream": "1.0"
2762− },
2763− "dependencies": {
2764− "domutils": {
2765− "version": "1.1.6",
2766− "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz",
2767− "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=",
2768− "dev": true,
2769− "requires": {
2770− "domelementtype": "1"
2771− }
2772− },
2773− "isarray": {
2774− "version": "0.0.1",
2775− "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
2776− "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
2777− "dev": true
2778− },
2779− "readable-stream": {
2780− "version": "1.0.34",
2781− "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
2782− "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
2783− "dev": true,
2784− "requires": {
2785− "core-util-is": "~1.0.0",
2786− "inherits": "~2.0.1",
2787− "isarray": "0.0.1",
2788− "string_decoder": "~0.10.x"
2789− }
2790− },
2791− "string_decoder": {
2792− "version": "0.10.31",
2793− "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
2794− "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
2795− "dev": true
2796− }
2797− }
2798− },
2799− "http-deceiver": {
2800− "version": "1.2.7",
2801− "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
2802− "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
2803− "dev": true
2804− },
2805− "http-errors": {
2806− "version": "1.6.3",
2807− "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
2808− "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
2809− "dev": true,
2810− "requires": {
2811− "depd": "~1.1.2",
2812− "inherits": "2.0.3",
2813− "setprototypeof": "1.1.0",
2814− "statuses": ">= 1.4.0 < 2"
2815− }
2816− },
2817− "http-parser-js": {
2818− "version": "0.5.0",
2819− "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz",
2820− "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==",
2821− "dev": true
2822− },
2823− "http-proxy": {
2824− "version": "1.17.0",
2825− "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
2826− "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
2827− "dev": true,
2828− "requires": {
2829− "eventemitter3": "^3.0.0",
2830− "follow-redirects": "^1.0.0",
2831− "requires-port": "^1.0.0"
2832− }
2833− },
2834− "http-proxy-middleware": {
2835− "version": "0.18.0",
2836− "resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz",
2837− "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==",
2838− "dev": true,
2839− "requires": {
2840− "http-proxy": "^1.16.2",
2841− "is-glob": "^4.0.0",
2842− "lodash": "^4.17.5",
2843− "micromatch": "^3.1.9"
2844− }
2845− },
2846− "https-browserify": {
2847− "version": "1.0.0",
2848− "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
2849− "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
2850− "dev": true
2851− },
2852− "iconv-lite": {
2853− "version": "0.4.23",
2854− "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
2855− "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
2856− "dev": true,
2857− "requires": {
2858− "safer-buffer": ">= 2.1.2 < 3"
2859− }
2860− },
2861− "ieee754": {
2862− "version": "1.1.12",
2863− "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
2864− "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==",
2865− "dev": true
2866− },
2867− "iferr": {
2868− "version": "0.1.5",
2869− "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
2870− "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
2871− "dev": true
2872− },
2873− "import-local": {
2874− "version": "2.0.0",
2875− "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
2876− "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
2877− "dev": true,
2878− "requires": {
2879− "pkg-dir": "^3.0.0",
2880− "resolve-cwd": "^2.0.0"
2881− },
2882− "dependencies": {
2883− "find-up": {
2884− "version": "3.0.0",
2885− "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
2886− "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
2887− "dev": true,
2888− "requires": {
2889− "locate-path": "^3.0.0"
2890− }
2891− },
2892− "locate-path": {
2893− "version": "3.0.0",
2894− "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
2895− "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
2896− "dev": true,
2897− "requires": {
2898− "p-locate": "^3.0.0",
2899− "path-exists": "^3.0.0"
2900− }
2901− },
2902− "p-limit": {
2903− "version": "2.0.0",
2904− "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
2905− "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
2906− "dev": true,
2907− "requires": {
2908− "p-try": "^2.0.0"
2909− }
2910− },
2911− "p-locate": {
2912− "version": "3.0.0",
2913− "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
2914− "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
2915− "dev": true,
2916− "requires": {
2917− "p-limit": "^2.0.0"
2918− }
2919− },
2920− "p-try": {
2921− "version": "2.0.0",
2922− "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
2923− "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
2924− "dev": true
2925− },
2926− "pkg-dir": {
2927− "version": "3.0.0",
2928− "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
2929− "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
2930− "dev": true,
2931− "requires": {
2932− "find-up": "^3.0.0"
2933− }
2934− }
2935− }
2936− },
2937− "imurmurhash": {
2938− "version": "0.1.4",
2939− "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
2940− "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
2941− "dev": true
2942− },
2943− "indexof": {
2944− "version": "0.0.1",
2945− "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
2946− "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
2947− "dev": true
2948− },
2949− "inflight": {
2950− "version": "1.0.6",
2951− "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
2952− "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
2953− "dev": true,
2954− "requires": {
2955− "once": "^1.3.0",
2956− "wrappy": "1"
2957− }
2958− },
2959− "inherits": {
2960− "version": "2.0.3",
2961− "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
2962− "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
2963− "dev": true
2964− },
2965− "internal-ip": {
2966− "version": "3.0.1",
2967− "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz",
2968− "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==",
2969− "dev": true,
2970− "requires": {
2971− "default-gateway": "^2.6.0",
2972− "ipaddr.js": "^1.5.2"
2973− }
2974− },
2975− "interpret": {
2976− "version": "1.1.0",
2977− "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
2978− "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
2979− "dev": true
2980− },
2981− "invert-kv": {
2982− "version": "2.0.0",
2983− "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
2984− "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
2985− "dev": true
2986− },
2987− "ip": {
2988− "version": "1.1.5",
2989− "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
2990− "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
2991− "dev": true
2992− },
2993− "ip-regex": {
2994− "version": "2.1.0",
2995− "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
2996− "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
2997− "dev": true
2998− },
2999− "ipaddr.js": {
3000− "version": "1.8.0",
3001− "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
3002− "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=",
3003− "dev": true
3004− },
3005− "is-accessor-descriptor": {
3006− "version": "0.1.6",
3007− "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
3008− "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
3009− "dev": true,
3010− "requires": {
3011− "kind-of": "^3.0.2"
3012− },
3013− "dependencies": {
3014− "kind-of": {
3015− "version": "3.2.2",
3016− "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3017− "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3018− "dev": true,
3019− "requires": {
3020− "is-buffer": "^1.1.5"
3021− }
3022− }
3023− }
3024− },
3025− "is-binary-path": {
3026− "version": "1.0.1",
3027− "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
3028− "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
3029− "dev": true,
3030− "requires": {
3031− "binary-extensions": "^1.0.0"
3032− }
3033− },
3034− "is-buffer": {
3035− "version": "1.1.6",
3036− "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
3037− "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
3038− "dev": true
3039− },
3040− "is-callable": {
3041− "version": "1.1.4",
3042− "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
3043− "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
3044− "dev": true
3045− },
3046− "is-data-descriptor": {
3047− "version": "0.1.4",
3048− "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
3049− "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
3050− "dev": true,
3051− "requires": {
3052− "kind-of": "^3.0.2"
3053− },
3054− "dependencies": {
3055− "kind-of": {
3056− "version": "3.2.2",
3057− "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3058− "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3059− "dev": true,
3060− "requires": {
3061− "is-buffer": "^1.1.5"
3062− }
3063− }
3064− }
3065− },
3066− "is-date-object": {
3067− "version": "1.0.1",
3068− "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
3069− "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
3070− "dev": true
3071− },
3072− "is-descriptor": {
3073− "version": "0.1.6",
3074− "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
3075− "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
3076− "dev": true,
3077− "requires": {
3078− "is-accessor-descriptor": "^0.1.6",
3079− "is-data-descriptor": "^0.1.4",
3080− "kind-of": "^5.0.0"
3081− },
3082− "dependencies": {
3083− "kind-of": {
3084− "version": "5.1.0",
3085− "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
3086− "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
3087− "dev": true
3088− }
3089− }
3090− },
3091− "is-extendable": {
3092− "version": "0.1.1",
3093− "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
3094− "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
3095− "dev": true
3096− },
3097− "is-extglob": {
3098− "version": "2.1.1",
3099− "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
3100− "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
3101− "dev": true
3102− },
3103− "is-fullwidth-code-point": {
3104− "version": "2.0.0",
3105− "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
3106− "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
3107− "dev": true
3108− },
3109− "is-glob": {
3110− "version": "4.0.0",
3111− "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
3112− "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
3113− "dev": true,
3114− "requires": {
3115− "is-extglob": "^2.1.1"
3116− }
3117− },
3118− "is-number": {
3119− "version": "3.0.0",
3120− "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
3121− "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
3122− "dev": true,
3123− "requires": {
3124− "kind-of": "^3.0.2"
3125− },
3126− "dependencies": {
3127− "kind-of": {
3128− "version": "3.2.2",
3129− "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3130− "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3131− "dev": true,
3132− "requires": {
3133− "is-buffer": "^1.1.5"
3134− }
3135− }
3136− }
3137− },
3138− "is-path-cwd": {
3139− "version": "1.0.0",
3140− "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
3141− "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
3142− "dev": true
3143− },
3144− "is-path-in-cwd": {
3145− "version": "1.0.1",
3146− "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
3147− "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
3148− "dev": true,
3149− "requires": {
3150− "is-path-inside": "^1.0.0"
3151− }
3152− },
3153− "is-path-inside": {
3154− "version": "1.0.1",
3155− "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
3156− "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
3157− "dev": true,
3158− "requires": {
3159− "path-is-inside": "^1.0.1"
3160− }
3161− },
3162− "is-plain-object": {
3163− "version": "2.0.4",
3164− "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
3165− "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
3166− "dev": true,
3167− "requires": {
3168− "isobject": "^3.0.1"
3169− }
3170− },
3171− "is-regex": {
3172− "version": "1.0.4",
3173− "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
3174− "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
3175− "dev": true,
3176− "requires": {
3177− "has": "^1.0.1"
3178− }
3179− },
3180− "is-stream": {
3181− "version": "1.1.0",
3182− "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
3183− "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
3184− "dev": true
3185− },
3186− "is-symbol": {
3187− "version": "1.0.1",
3188− "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz",
3189− "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=",
3190− "dev": true
3191− },
3192− "is-windows": {
3193− "version": "1.0.2",
3194− "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
3195− "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
3196− "dev": true
3197− },
3198− "is-wsl": {
3199− "version": "1.1.0",
3200− "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
3201− "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
3202− "dev": true
3203− },
3204− "isarray": {
3205− "version": "1.0.0",
3206− "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
3207− "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
3208− "dev": true
3209− },
3210− "isexe": {
3211− "version": "2.0.0",
3212− "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
3213− "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
3214− "dev": true
3215− },
3216− "isobject": {
3217− "version": "3.0.1",
3218− "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
3219− "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
3220− "dev": true
3221− },
3222− "json-parse-better-errors": {
3223− "version": "1.0.2",
3224− "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
3225− "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
3226− "dev": true
3227− },
3228− "json-schema-traverse": {
3229− "version": "0.4.1",
3230− "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
3231− "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
3232− "dev": true
3233− },
3234− "json3": {
3235− "version": "3.3.2",
3236− "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
3237− "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
3238− "dev": true
3239− },
3240− "json5": {
3241− "version": "0.5.1",
3242− "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
3243− "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
3244− "dev": true
3245− },
3246− "killable": {
3247− "version": "1.0.1",
3248− "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
3249− "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
3250− "dev": true
3251− },
3252− "kind-of": {
3253− "version": "6.0.2",
3254− "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
3255− "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
3256− "dev": true
3257− },
3258− "lcid": {
3259− "version": "2.0.0",
3260− "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
3261− "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
3262− "dev": true,
3263− "requires": {
3264− "invert-kv": "^2.0.0"
3265− }
3266− },
3267− "loader-runner": {
3268− "version": "2.3.1",
3269− "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz",
3270− "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==",
3271− "dev": true
3272− },
3273− "loader-utils": {
3274− "version": "1.1.0",
3275− "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
3276− "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
3277− "dev": true,
3278− "requires": {
3279− "big.js": "^3.1.3",
3280− "emojis-list": "^2.0.0",
3281− "json5": "^0.5.0"
3282− }
3283− },
3284− "locate-path": {
3285− "version": "2.0.0",
3286− "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
3287− "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
3288− "dev": true,
3289− "requires": {
3290− "p-locate": "^2.0.0",
3291− "path-exists": "^3.0.0"
3292− }
3293− },
3294− "lodash": {
3295− "version": "4.17.10",
3296− "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
3297− "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
3298− "dev": true
3299− },
3300− "lodash.debounce": {
3301− "version": "4.0.8",
3302− "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
3303− "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
3304− "dev": true
3305− },
3306− "loglevel": {
3307− "version": "1.6.1",
3308− "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz",
3309− "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=",
3310− "dev": true
3311− },
3312− "lower-case": {
3313− "version": "1.1.4",
3314− "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
3315− "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
3316− "dev": true
3317− },
3318− "lru-cache": {
3319− "version": "4.1.3",
3320− "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
3321− "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
3322− "dev": true,
3323− "requires": {
3324− "pseudomap": "^1.0.2",
3325− "yallist": "^2.1.2"
3326− }
3327− },
3328− "make-dir": {
3329− "version": "1.3.0",
3330− "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
3331− "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
3332− "dev": true,
3333− "requires": {
3334− "pify": "^3.0.0"
3335− }
3336− },
3337− "map-age-cleaner": {
3338− "version": "0.1.2",
3339− "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz",
3340− "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==",
3341− "dev": true,
3342− "requires": {
3343− "p-defer": "^1.0.0"
3344− }
3345− },
3346− "map-cache": {
3347− "version": "0.2.2",
3348− "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
3349− "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
3350− "dev": true
3351− },
3352− "map-visit": {
3353− "version": "1.0.0",
3354− "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
3355− "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
3356− "dev": true,
3357− "requires": {
3358− "object-visit": "^1.0.0"
3359− }
3360− },
3361− "md5.js": {
3362− "version": "1.3.5",
3363− "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
3364− "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
3365− "dev": true,
3366− "requires": {
3367− "hash-base": "^3.0.0",
3368− "inherits": "^2.0.1",
3369− "safe-buffer": "^5.1.2"
3370− }
3371− },
3372− "media-typer": {
3373− "version": "0.3.0",
3374− "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
3375− "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
3376− "dev": true
3377− },
3378− "mem": {
3379− "version": "4.0.0",
3380− "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz",
3381− "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==",
3382− "dev": true,
3383− "requires": {
3384− "map-age-cleaner": "^0.1.1",
3385− "mimic-fn": "^1.0.0",
3386− "p-is-promise": "^1.1.0"
3387− }
3388− },
3389− "memory-fs": {
3390− "version": "0.4.1",
3391− "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
3392− "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
3393− "dev": true,
3394− "requires": {
3395− "errno": "^0.1.3",
3396− "readable-stream": "^2.0.1"
3397− },
3398− "dependencies": {
3399− "isarray": {
3400− "version": "1.0.0",
3401− "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
3402− "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
3403− "dev": true
3404− },
3405− "readable-stream": {
3406− "version": "2.3.6",
3407− "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
3408− "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
3409− "dev": true,
3410− "requires": {
3411− "core-util-is": "~1.0.0",
3412− "inherits": "~2.0.3",
3413− "isarray": "~1.0.0",
3414− "process-nextick-args": "~2.0.0",
3415− "safe-buffer": "~5.1.1",
3416− "string_decoder": "~1.1.1",
3417− "util-deprecate": "~1.0.1"
3418− }
3419− },
3420− "string_decoder": {
3421− "version": "1.1.1",
3422− "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
3423− "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
3424− "dev": true,
3425− "requires": {
3426− "safe-buffer": "~5.1.0"
3427− }
3428− }
3429− }
3430− },
3431− "merge-descriptors": {
3432− "version": "1.0.1",
3433− "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
3434− "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
3435− "dev": true
3436− },
3437− "methods": {
3438− "version": "1.1.2",
3439− "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
3440− "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
3441− "dev": true
3442− },
3443− "micromatch": {
3444− "version": "3.1.10",
3445− "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
3446− "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
3447− "dev": true,
3448− "requires": {
3449− "arr-diff": "^4.0.0",
3450− "array-unique": "^0.3.2",
3451− "braces": "^2.3.1",
3452− "define-property": "^2.0.2",
3453− "extend-shallow": "^3.0.2",
3454− "extglob": "^2.0.4",
3455− "fragment-cache": "^0.2.1",
3456− "kind-of": "^6.0.2",
3457− "nanomatch": "^1.2.9",
3458− "object.pick": "^1.3.0",
3459− "regex-not": "^1.0.0",
3460− "snapdragon": "^0.8.1",
3461− "to-regex": "^3.0.2"
3462− }
3463− },
3464− "miller-rabin": {
3465− "version": "4.0.1",
3466− "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
3467− "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
3468− "dev": true,
3469− "requires": {
3470− "bn.js": "^4.0.0",
3471− "brorand": "^1.0.1"
3472− }
3473− },
3474− "mime": {
3475− "version": "1.4.1",
3476− "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
3477− "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
3478− "dev": true
3479− },
3480− "mime-db": {
3481− "version": "1.37.0",
3482− "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
3483− "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
3484− "dev": true
3485− },
3486− "mime-types": {
3487− "version": "2.1.21",
3488− "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
3489− "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
3490− "dev": true,
3491− "requires": {
3492− "mime-db": "~1.37.0"
3493− }
3494− },
3495− "mimic-fn": {
3496− "version": "1.2.0",
3497− "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
3498− "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
3499− "dev": true
3500− },
3501− "minimalistic-assert": {
3502− "version": "1.0.1",
3503− "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
3504− "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
3505− "dev": true
3506− },
3507− "minimalistic-crypto-utils": {
3508− "version": "1.0.1",
3509− "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
3510− "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
3511− "dev": true
3512− },
3513− "minimatch": {
3514− "version": "3.0.4",
3515− "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
3516− "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
3517− "dev": true,
3518− "requires": {
3519− "brace-expansion": "^1.1.7"
3520− }
3521− },
3522− "minimist": {
3523− "version": "0.0.8",
3524− "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
3525− "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
3526− "dev": true
3527− },
3528− "mississippi": {
3529− "version": "2.0.0",
3530− "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz",
3531− "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==",
3532− "dev": true,
3533− "requires": {
3534− "concat-stream": "^1.5.0",
3535− "duplexify": "^3.4.2",
3536− "end-of-stream": "^1.1.0",
3537− "flush-write-stream": "^1.0.0",
3538− "from2": "^2.1.0",
3539− "parallel-transform": "^1.1.0",
3540− "pump": "^2.0.1",
3541− "pumpify": "^1.3.3",
3542− "stream-each": "^1.1.0",
3543− "through2": "^2.0.0"
3544− }
3545− },
3546− "mixin-deep": {
3547− "version": "1.3.1",
3548− "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
3549− "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
3550− "dev": true,
3551− "requires": {
3552− "for-in": "^1.0.2",
3553− "is-extendable": "^1.0.1"
3554− },
3555− "dependencies": {
3556− "is-extendable": {
3557− "version": "1.0.1",
3558− "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
3559− "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
3560− "dev": true,
3561− "requires": {
3562− "is-plain-object": "^2.0.4"
3563− }
3564− }
3565− }
3566− },
3567− "mkdirp": {
3568− "version": "0.5.1",
3569− "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
3570− "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
3571− "dev": true,
3572− "requires": {
3573− "minimist": "0.0.8"
3574− }
3575− },
3576− "move-concurrently": {
3577− "version": "1.0.1",
3578− "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
3579− "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
3580− "dev": true,
3581− "requires": {
3582− "aproba": "^1.1.1",
3583− "copy-concurrently": "^1.0.0",
3584− "fs-write-stream-atomic": "^1.0.8",
3585− "mkdirp": "^0.5.1",
3586− "rimraf": "^2.5.4",
3587− "run-queue": "^1.0.3"
3588− }
3589− },
3590− "ms": {
3591− "version": "2.0.0",
3592− "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
3593− "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
3594− "dev": true
3595− },
3596− "multicast-dns": {
3597− "version": "6.2.3",
3598− "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
3599− "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
3600− "dev": true,
3601− "requires": {
3602− "dns-packet": "^1.3.1",
3603− "thunky": "^1.0.2"
3604− }
3605− },
3606− "multicast-dns-service-types": {
3607− "version": "1.1.0",
3608− "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
3609− "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
3610− "dev": true
3611− },
3612− "nan": {
3613− "version": "2.11.1",
3614− "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz",
3615− "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==",
3616− "dev": true,
3617− "optional": true
3618− },
3619− "nanomatch": {
3620− "version": "1.2.13",
3621− "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
3622− "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
3623− "dev": true,
3624− "requires": {
3625− "arr-diff": "^4.0.0",
3626− "array-unique": "^0.3.2",
3627− "define-property": "^2.0.2",
3628− "extend-shallow": "^3.0.2",
3629− "fragment-cache": "^0.2.1",
3630− "is-windows": "^1.0.2",
3631− "kind-of": "^6.0.2",
3632− "object.pick": "^1.3.0",
3633− "regex-not": "^1.0.0",
3634− "snapdragon": "^0.8.1",
3635− "to-regex": "^3.0.1"
3636− }
3637− },
3638− "negotiator": {
3639− "version": "0.6.1",
3640− "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
3641− "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
3642− "dev": true
3643− },
3644− "neo-async": {
3645− "version": "2.5.1",
3646− "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz",
3647− "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==",
3648− "dev": true
3649− },
3650− "nice-try": {
3651− "version": "1.0.4",
3652− "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz",
3653− "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==",
3654− "dev": true
3655− },
3656− "no-case": {
3657− "version": "2.3.2",
3658− "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
3659− "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
3660− "dev": true,
3661− "requires": {
3662− "lower-case": "^1.1.1"
3663− }
3664− },
3665− "node-forge": {
3666− "version": "0.7.5",
3667− "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz",
3668− "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==",
3669− "dev": true
3670− },
3671− "node-libs-browser": {
3672− "version": "2.1.0",
3673− "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz",
3674− "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==",
3675− "dev": true,
3676− "requires": {
3677− "assert": "^1.1.1",
3678− "browserify-zlib": "^0.2.0",
3679− "buffer": "^4.3.0",
3680− "console-browserify": "^1.1.0",
3681− "constants-browserify": "^1.0.0",
3682− "crypto-browserify": "^3.11.0",
3683− "domain-browser": "^1.1.1",
3684− "events": "^1.0.0",
3685− "https-browserify": "^1.0.0",
3686− "os-browserify": "^0.3.0",
3687− "path-browserify": "0.0.0",
3688− "process": "^0.11.10",
3689− "punycode": "^1.2.4",
3690− "querystring-es3": "^0.2.0",
3691− "readable-stream": "^2.3.3",
3692− "stream-browserify": "^2.0.1",
3693− "stream-http": "^2.7.2",
3694− "string_decoder": "^1.0.0",
3695− "timers-browserify": "^2.0.4",
3696− "tty-browserify": "0.0.0",
3697− "url": "^0.11.0",
3698− "util": "^0.10.3",
3699− "vm-browserify": "0.0.4"
3700− },
3701− "dependencies": {
3702− "punycode": {
3703− "version": "1.4.1",
3704− "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
3705− "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
3706− "dev": true
3707− }
3708− }
3709− },
3710− "normalize-path": {
3711− "version": "2.1.1",
3712− "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
3713− "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
3714− "dev": true,
3715− "requires": {
3716− "remove-trailing-separator": "^1.0.1"
3717− }
3718− },
3719− "npm-run-path": {
3720− "version": "2.0.2",
3721− "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
3722− "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
3723− "dev": true,
3724− "requires": {
3725− "path-key": "^2.0.0"
3726− }
3727− },
3728− "nth-check": {
3729− "version": "1.0.1",
3730− "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
3731− "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
3732− "dev": true,
3733− "requires": {
3734− "boolbase": "~1.0.0"
3735− }
3736− },
3737− "number-is-nan": {
3738− "version": "1.0.1",
3739− "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
3740− "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
3741− "dev": true
3742− },
3743− "object-assign": {
3744− "version": "4.1.1",
3745− "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
3746− "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
3747− "dev": true
3748− },
3749− "object-copy": {
3750− "version": "0.1.0",
3751− "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
3752− "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
3753− "dev": true,
3754− "requires": {
3755− "copy-descriptor": "^0.1.0",
3756− "define-property": "^0.2.5",
3757− "kind-of": "^3.0.3"
3758− },
3759− "dependencies": {
3760− "define-property": {
3761− "version": "0.2.5",
3762− "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
3763− "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
3764− "dev": true,
3765− "requires": {
3766− "is-descriptor": "^0.1.0"
3767− }
3768− },
3769− "kind-of": {
3770− "version": "3.2.2",
3771− "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3772− "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3773− "dev": true,
3774− "requires": {
3775− "is-buffer": "^1.1.5"
3776− }
3777− }
3778− }
3779− },
3780− "object-keys": {
3781− "version": "1.0.12",
3782− "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
3783− "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
3784− "dev": true
3785− },
3786− "object-visit": {
3787− "version": "1.0.1",
3788− "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
3789− "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
3790− "dev": true,
3791− "requires": {
3792− "isobject": "^3.0.0"
3793− }
3794− },
3795− "object.getownpropertydescriptors": {
3796− "version": "2.0.3",
3797− "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
3798− "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
3799− "dev": true,
3800− "requires": {
3801− "define-properties": "^1.1.2",
3802− "es-abstract": "^1.5.1"
3803− }
3804− },
3805− "object.pick": {
3806− "version": "1.3.0",
3807− "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
3808− "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
3809− "dev": true,
3810− "requires": {
3811− "isobject": "^3.0.1"
3812− }
3813− },
3814− "obuf": {
3815− "version": "1.1.2",
3816− "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
3817− "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
3818− "dev": true
3819− },
3820− "on-finished": {
3821− "version": "2.3.0",
3822− "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
3823− "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
3824− "dev": true,
3825− "requires": {
3826− "ee-first": "1.1.1"
3827− }
3828− },
3829− "on-headers": {
3830− "version": "1.0.1",
3831− "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
3832− "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
3833− "dev": true
3834− },
3835− "once": {
3836− "version": "1.4.0",
3837− "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
3838− "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
3839− "dev": true,
3840− "requires": {
3841− "wrappy": "1"
3842− }
3843− },
3844− "opn": {
3845− "version": "5.4.0",
3846− "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz",
3847− "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==",
3848− "dev": true,
3849− "requires": {
3850− "is-wsl": "^1.1.0"
3851− }
3852− },
3853− "original": {
3854− "version": "1.0.2",
3855− "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
3856− "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
3857− "dev": true,
3858− "requires": {
3859− "url-parse": "^1.4.3"
3860− }
3861− },
3862− "os-browserify": {
3863− "version": "0.3.0",
3864− "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
3865− "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
3866− "dev": true
3867− },
3868− "os-locale": {
3869− "version": "3.0.1",
3870− "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz",
3871− "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==",
3872− "dev": true,
3873− "requires": {
3874− "execa": "^0.10.0",
3875− "lcid": "^2.0.0",
3876− "mem": "^4.0.0"
3877− }
3878− },
3879− "p-defer": {
3880− "version": "1.0.0",
3881− "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
3882− "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
3883− "dev": true
3884− },
3885− "p-finally": {
3886− "version": "1.0.0",
3887− "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
3888− "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
3889− "dev": true
3890− },
3891− "p-is-promise": {
3892− "version": "1.1.0",
3893− "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
3894− "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
3895− "dev": true
3896− },
3897− "p-limit": {
3898− "version": "1.3.0",
3899− "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
3900− "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
3901− "dev": true,
3902− "requires": {
3903− "p-try": "^1.0.0"
3904− }
3905− },
3906− "p-locate": {
3907− "version": "2.0.0",
3908− "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
3909− "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
3910− "dev": true,
3911− "requires": {
3912− "p-limit": "^1.1.0"
3913− }
3914− },
3915− "p-map": {
3916− "version": "1.2.0",
3917− "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
3918− "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
3919− "dev": true
3920− },
3921− "p-try": {
3922− "version": "1.0.0",
3923− "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
3924− "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
3925− "dev": true
3926− },
3927− "pako": {
3928− "version": "1.0.6",
3929− "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
3930− "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==",
3931− "dev": true
3932− },
3933− "parallel-transform": {
3934− "version": "1.1.0",
3935− "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz",
3936− "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
3937− "dev": true,
3938− "requires": {
3939− "cyclist": "~0.2.2",
3940− "inherits": "^2.0.3",
3941− "readable-stream": "^2.1.5"
3942− }
3943− },
3944− "param-case": {
3945− "version": "2.1.1",
3946− "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
3947− "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
3948− "dev": true,
3949− "requires": {
3950− "no-case": "^2.2.0"
3951− }
3952− },
3953− "parse-asn1": {
3954− "version": "5.1.1",
3955− "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
3956− "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==",
3957− "dev": true,
3958− "requires": {
3959− "asn1.js": "^4.0.0",
3960− "browserify-aes": "^1.0.0",
3961− "create-hash": "^1.1.0",
3962− "evp_bytestokey": "^1.0.0",
3963− "pbkdf2": "^3.0.3"
3964− }
3965− },
3966− "parseurl": {
3967− "version": "1.3.2",
3968− "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
3969− "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
3970− "dev": true
3971− },
3972− "pascalcase": {
3973− "version": "0.1.1",
3974− "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
3975− "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
3976− "dev": true
3977− },
3978− "path-browserify": {
3979− "version": "0.0.0",
3980− "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
3981− "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
3982− "dev": true
3983− },
3984− "path-dirname": {
3985− "version": "1.0.2",
3986− "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
3987− "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
3988− "dev": true
3989− },
3990− "path-exists": {
3991− "version": "3.0.0",
3992− "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
3993− "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
3994− "dev": true
3995− },
3996− "path-is-absolute": {
3997− "version": "1.0.1",
3998− "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
3999− "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
4000− "dev": true
4001− },
4002− "path-is-inside": {
4003− "version": "1.0.2",
4004− "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
4005− "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
4006− "dev": true
4007− },
4008− "path-key": {
4009− "version": "2.0.1",
4010− "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
4011− "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
4012− "dev": true
4013− },
4014− "path-to-regexp": {
4015− "version": "0.1.7",
4016− "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
4017− "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
4018− "dev": true
4019− },
4020− "pbkdf2": {
4021− "version": "3.0.17",
4022− "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
4023− "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
4024− "dev": true,
4025− "requires": {
4026− "create-hash": "^1.1.2",
4027− "create-hmac": "^1.1.4",
4028− "ripemd160": "^2.0.1",
4029− "safe-buffer": "^5.0.1",
4030− "sha.js": "^2.4.8"
4031− }
4032− },
4033− "pify": {
4034− "version": "3.0.0",
4035− "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
4036− "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
4037− "dev": true
4038− },
4039− "pinkie": {
4040− "version": "2.0.4",
4041− "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
4042− "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
4043− "dev": true
4044− },
4045− "pinkie-promise": {
4046− "version": "2.0.1",
4047− "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
4048− "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
4049− "dev": true,
4050− "requires": {
4051− "pinkie": "^2.0.0"
4052− }
4053− },
4054− "pkg-dir": {
4055− "version": "2.0.0",
4056− "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
4057− "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
4058− "dev": true,
4059− "requires": {
4060− "find-up": "^2.1.0"
4061− }
4062− },
4063− "portfinder": {
4064− "version": "1.0.20",
4065− "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz",
4066− "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==",
4067− "dev": true,
4068− "requires": {
4069− "async": "^1.5.2",
4070− "debug": "^2.2.0",
4071− "mkdirp": "0.5.x"
4072− },
4073− "dependencies": {
4074− "debug": {
4075− "version": "2.6.9",
4076− "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4077− "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4078− "dev": true,
4079− "requires": {
4080− "ms": "2.0.0"
4081− }
4082− }
4083− }
4084− },
4085− "posix-character-classes": {
4086− "version": "0.1.1",
4087− "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
4088− "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
4089− "dev": true
4090− },
4091− "pretty-error": {
4092− "version": "2.1.1",
4093− "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
4094− "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
4095− "dev": true,
4096− "requires": {
4097− "renderkid": "^2.0.1",
4098− "utila": "~0.4"
4099− }
4100− },
4101− "process": {
4102− "version": "0.11.10",
4103− "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
4104− "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
4105− "dev": true
4106− },
4107− "process-nextick-args": {
4108− "version": "2.0.0",
4109− "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
4110− "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
4111− "dev": true
4112− },
4113− "promise-inflight": {
4114− "version": "1.0.1",
4115− "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
4116− "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
4117− "dev": true
4118− },
4119− "proxy-addr": {
4120− "version": "2.0.4",
4121− "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
4122− "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
4123− "dev": true,
4124− "requires": {
4125− "forwarded": "~0.1.2",
4126− "ipaddr.js": "1.8.0"
4127− }
4128− },
4129− "prr": {
4130− "version": "1.0.1",
4131− "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
4132− "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
4133− "dev": true
4134− },
4135− "pseudomap": {
4136− "version": "1.0.2",
4137− "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
4138− "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
4139− "dev": true
4140− },
4141− "public-encrypt": {
4142− "version": "4.0.3",
4143− "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
4144− "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
4145− "dev": true,
4146− "requires": {
4147− "bn.js": "^4.1.0",
4148− "browserify-rsa": "^4.0.0",
4149− "create-hash": "^1.1.0",
4150− "parse-asn1": "^5.0.0",
4151− "randombytes": "^2.0.1",
4152− "safe-buffer": "^5.1.2"
4153− }
4154− },
4155− "pump": {
4156− "version": "2.0.1",
4157− "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
4158− "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
4159− "dev": true,
4160− "requires": {
4161− "end-of-stream": "^1.1.0",
4162− "once": "^1.3.1"
4163− }
4164− },
4165− "pumpify": {
4166− "version": "1.5.1",
4167− "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
4168− "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
4169− "dev": true,
4170− "requires": {
4171− "duplexify": "^3.6.0",
4172− "inherits": "^2.0.3",
4173− "pump": "^2.0.0"
4174− }
4175− },
4176− "punycode": {
4177− "version": "2.1.1",
4178− "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
4179− "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
4180− "dev": true
4181− },
4182− "qs": {
4183− "version": "6.5.2",
4184− "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
4185− "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
4186− "dev": true
4187− },
4188− "querystring": {
4189− "version": "0.2.0",
4190− "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
4191− "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
4192− "dev": true
4193− },
4194− "querystring-es3": {
4195− "version": "0.2.1",
4196− "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
4197− "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
4198− "dev": true
4199− },
4200− "querystringify": {
4201− "version": "2.1.0",
4202− "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz",
4203− "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==",
4204− "dev": true
4205− },
4206− "randombytes": {
4207− "version": "2.0.6",
4208− "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
4209− "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
4210− "dev": true,
4211− "requires": {
4212− "safe-buffer": "^5.1.0"
4213− }
4214− },
4215− "randomfill": {
4216− "version": "1.0.4",
4217− "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
4218− "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
4219− "dev": true,
4220− "requires": {
4221− "randombytes": "^2.0.5",
4222− "safe-buffer": "^5.1.0"
4223− }
4224− },
4225− "range-parser": {
4226− "version": "1.2.0",
4227− "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
4228− "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
4229− "dev": true
4230− },
4231− "raw-body": {
4232− "version": "2.3.3",
4233− "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
4234− "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
4235− "dev": true,
4236− "requires": {
4237− "bytes": "3.0.0",
4238− "http-errors": "1.6.3",
4239− "iconv-lite": "0.4.23",
4240− "unpipe": "1.0.0"
4241− }
4242− },
4243− "readable-stream": {
4244− "version": "2.3.6",
4245− "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
4246− "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
4247− "dev": true,
4248− "requires": {
4249− "core-util-is": "~1.0.0",
4250− "inherits": "~2.0.3",
4251− "isarray": "~1.0.0",
4252− "process-nextick-args": "~2.0.0",
4253− "safe-buffer": "~5.1.1",
4254− "string_decoder": "~1.1.1",
4255− "util-deprecate": "~1.0.1"
4256− }
4257− },
4258− "readdirp": {
4259− "version": "2.1.0",
4260− "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
4261− "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
4262− "dev": true,
4263− "requires": {
4264− "graceful-fs": "^4.1.2",
4265− "minimatch": "^3.0.2",
4266− "readable-stream": "^2.0.2",
4267− "set-immediate-shim": "^1.0.1"
4268− },
4269− "dependencies": {
4270− "isarray": {
4271− "version": "1.0.0",
4272− "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
4273− "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
4274− "dev": true
4275− },
4276− "readable-stream": {
4277− "version": "2.3.6",
4278− "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
4279− "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
4280− "dev": true,
4281− "requires": {
4282− "core-util-is": "~1.0.0",
4283− "inherits": "~2.0.3",
4284− "isarray": "~1.0.0",
4285− "process-nextick-args": "~2.0.0",
4286− "safe-buffer": "~5.1.1",
4287− "string_decoder": "~1.1.1",
4288− "util-deprecate": "~1.0.1"
4289− }
4290− },
4291− "string_decoder": {
4292− "version": "1.1.1",
4293− "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
4294− "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
4295− "dev": true,
4296− "requires": {
4297− "safe-buffer": "~5.1.0"
4298− }
4299− }
4300− }
4301− },
4302− "regex-not": {
4303− "version": "1.0.2",
4304− "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
4305− "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
4306− "dev": true,
4307− "requires": {
4308− "extend-shallow": "^3.0.2",
4309− "safe-regex": "^1.1.0"
4310− }
4311− },
4312− "relateurl": {
4313− "version": "0.2.7",
4314− "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
4315− "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
4316− "dev": true
4317− },
4318− "remove-trailing-separator": {
4319− "version": "1.1.0",
4320− "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
4321− "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
4322− "dev": true
4323− },
4324− "renderkid": {
4325− "version": "2.0.1",
4326− "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz",
4327− "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=",
4328− "dev": true,
4329− "requires": {
4330− "css-select": "^1.1.0",
4331− "dom-converter": "~0.1",
4332− "htmlparser2": "~3.3.0",
4333− "strip-ansi": "^3.0.0",
4334− "utila": "~0.3"
4335− },
4336− "dependencies": {
4337− "utila": {
4338− "version": "0.3.3",
4339− "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz",
4340− "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=",
4341− "dev": true
4342− }
4343− }
4344− },
4345− "repeat-element": {
4346− "version": "1.1.2",
4347− "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
4348− "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
4349− "dev": true
4350− },
4351− "repeat-string": {
4352− "version": "1.6.1",
4353− "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
4354− "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
4355− "dev": true
4356− },
4357− "require-directory": {
4358− "version": "2.1.1",
4359− "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
4360− "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
4361− "dev": true
4362− },
4363− "require-main-filename": {
4364− "version": "1.0.1",
4365− "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
4366− "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
4367− "dev": true
4368− },
4369− "requires-port": {
4370− "version": "1.0.0",
4371− "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
4372− "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
4373− "dev": true
4374− },
4375− "resolve-cwd": {
4376− "version": "2.0.0",
4377− "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
4378− "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
4379− "dev": true,
4380− "requires": {
4381− "resolve-from": "^3.0.0"
4382− }
4383− },
4384− "resolve-from": {
4385− "version": "3.0.0",
4386− "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
4387− "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
4388− "dev": true
4389− },
4390− "resolve-url": {
4391− "version": "0.2.1",
4392− "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
4393− "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
4394− "dev": true
4395− },
4396− "ret": {
4397− "version": "0.1.15",
4398− "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
4399− "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
4400− "dev": true
4401− },
4402− "rimraf": {
4403− "version": "2.6.2",
4404− "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
4405− "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
4406− "dev": true,
4407− "requires": {
4408− "glob": "^7.0.5"
4409− }
4410− },
4411− "ripemd160": {
4412− "version": "2.0.2",
4413− "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
4414− "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
4415− "dev": true,
4416− "requires": {
4417− "hash-base": "^3.0.0",
4418− "inherits": "^2.0.1"
4419− }
4420− },
4421− "run-queue": {
4422− "version": "1.0.3",
4423− "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
4424− "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
4425− "dev": true,
4426− "requires": {
4427− "aproba": "^1.1.1"
4428− }
4429− },
4430− "safe-buffer": {
4431− "version": "5.1.2",
4432− "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
4433− "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
4434− "dev": true
4435− },
4436− "safe-regex": {
4437− "version": "1.1.0",
4438− "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
4439− "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
4440− "dev": true,
4441− "requires": {
4442− "ret": "~0.1.10"
4443− }
4444− },
4445− "safer-buffer": {
4446− "version": "2.1.2",
4447− "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
4448− "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
4449− "dev": true
4450− },
4451− "schema-utils": {
4452− "version": "0.4.7",
4453− "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
4454− "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
4455− "dev": true,
4456− "requires": {
4457− "ajv": "^6.1.0",
4458− "ajv-keywords": "^3.1.0"
4459− }
4460− },
4461− "select-hose": {
4462− "version": "2.0.0",
4463− "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
4464− "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
4465− "dev": true
4466− },
4467− "selfsigned": {
4468− "version": "1.10.4",
4469− "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz",
4470− "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==",
4471− "dev": true,
4472− "requires": {
4473− "node-forge": "0.7.5"
4474− }
4475− },
4476− "semver": {
4477− "version": "5.5.0",
4478− "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
4479− "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
4480− "dev": true
4481− },
4482− "send": {
4483− "version": "0.16.2",
4484− "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
4485− "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
4486− "dev": true,
4487− "requires": {
4488− "debug": "2.6.9",
4489− "depd": "~1.1.2",
4490− "destroy": "~1.0.4",
4491− "encodeurl": "~1.0.2",
4492− "escape-html": "~1.0.3",
4493− "etag": "~1.8.1",
4494− "fresh": "0.5.2",
4495− "http-errors": "~1.6.2",
4496− "mime": "1.4.1",
4497− "ms": "2.0.0",
4498− "on-finished": "~2.3.0",
4499− "range-parser": "~1.2.0",
4500− "statuses": "~1.4.0"
4501− },
4502− "dependencies": {
4503− "debug": {
4504− "version": "2.6.9",
4505− "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4506− "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4507− "dev": true,
4508− "requires": {
4509− "ms": "2.0.0"
4510− }
4511− }
4512− }
4513− },
4514− "serialize-javascript": {
4515− "version": "1.5.0",
4516− "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz",
4517− "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==",
4518− "dev": true
4519− },
4520− "serve-index": {
4521− "version": "1.9.1",
4522− "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
4523− "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
4524− "dev": true,
4525− "requires": {
4526− "accepts": "~1.3.4",
4527− "batch": "0.6.1",
4528− "debug": "2.6.9",
4529− "escape-html": "~1.0.3",
4530− "http-errors": "~1.6.2",
4531− "mime-types": "~2.1.17",
4532− "parseurl": "~1.3.2"
4533− },
4534− "dependencies": {
4535− "debug": {
4536− "version": "2.6.9",
4537− "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4538− "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4539− "dev": true,
4540− "requires": {
4541− "ms": "2.0.0"
4542− }
4543− }
4544− }
4545− },
4546− "serve-static": {
4547− "version": "1.13.2",
4548− "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
4549− "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
4550− "dev": true,
4551− "requires": {
4552− "encodeurl": "~1.0.2",
4553− "escape-html": "~1.0.3",
4554− "parseurl": "~1.3.2",
4555− "send": "0.16.2"
4556− }
4557− },
4558− "set-blocking": {
4559− "version": "2.0.0",
4560− "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
4561− "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
4562− "dev": true
4563− },
4564− "set-immediate-shim": {
4565− "version": "1.0.1",
4566− "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
4567− "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
4568− "dev": true
4569− },
4570− "set-value": {
4571− "version": "2.0.0",
4572− "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
4573− "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
4574− "dev": true,
4575− "requires": {
4576− "extend-shallow": "^2.0.1",
4577− "is-extendable": "^0.1.1",
4578− "is-plain-object": "^2.0.3",
4579− "split-string": "^3.0.1"
4580− },
4581− "dependencies": {
4582− "extend-shallow": {
4583− "version": "2.0.1",
4584− "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
4585− "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
4586− "dev": true,
4587− "requires": {
4588− "is-extendable": "^0.1.0"
4589− }
4590− }
4591− }
4592− },
4593− "setimmediate": {
4594− "version": "1.0.5",
4595− "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
4596− "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
4597− "dev": true
4598− },
4599− "setprototypeof": {
4600− "version": "1.1.0",
4601− "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
4602− "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
4603− "dev": true
4604− },
4605− "sha.js": {
4606− "version": "2.4.11",
4607− "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
4608− "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
4609− "dev": true,
4610− "requires": {
4611− "inherits": "^2.0.1",
4612− "safe-buffer": "^5.0.1"
4613− }
4614− },
4615− "shebang-command": {
4616− "version": "1.2.0",
4617− "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
4618− "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
4619− "dev": true,
4620− "requires": {
4621− "shebang-regex": "^1.0.0"
4622− }
4623− },
4624− "shebang-regex": {
4625− "version": "1.0.0",
4626− "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
4627− "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
4628− "dev": true
4629− },
4630− "signal-exit": {
4631− "version": "3.0.2",
4632− "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
4633− "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
4634− "dev": true
4635− },
4636− "snapdragon": {
4637− "version": "0.8.2",
4638− "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
4639− "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
4640− "dev": true,
4641− "requires": {
4642− "base": "^0.11.1",
4643− "debug": "^2.2.0",
4644− "define-property": "^0.2.5",
4645− "extend-shallow": "^2.0.1",
4646− "map-cache": "^0.2.2",
4647− "source-map": "^0.5.6",
4648− "source-map-resolve": "^0.5.0",
4649− "use": "^3.1.0"
4650− },
4651− "dependencies": {
4652− "debug": {
4653− "version": "2.6.9",
4654− "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4655− "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4656− "dev": true,
4657− "requires": {
4658− "ms": "2.0.0"
4659− }
4660− },
4661− "define-property": {
4662− "version": "0.2.5",
4663− "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
4664− "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
4665− "dev": true,
4666− "requires": {
4667− "is-descriptor": "^0.1.0"
4668− }
4669− },
4670− "extend-shallow": {
4671− "version": "2.0.1",
4672− "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
4673− "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
4674− "dev": true,
4675− "requires": {
4676− "is-extendable": "^0.1.0"
4677− }
4678− }
4679− }
4680− },
4681− "snapdragon-node": {
4682− "version": "2.1.1",
4683− "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
4684− "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
4685− "dev": true,
4686− "requires": {
4687− "define-property": "^1.0.0",
4688− "isobject": "^3.0.0",
4689− "snapdragon-util": "^3.0.1"
4690− },
4691− "dependencies": {
4692− "define-property": {
4693− "version": "1.0.0",
4694− "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
4695− "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
4696− "dev": true,
4697− "requires": {
4698− "is-descriptor": "^1.0.0"
4699− }
4700− },
4701− "is-accessor-descriptor": {
4702− "version": "1.0.0",
4703− "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
4704− "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
4705− "dev": true,
4706− "requires": {
4707− "kind-of": "^6.0.0"
4708− }
4709− },
4710− "is-data-descriptor": {
4711− "version": "1.0.0",
4712− "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
4713− "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
4714− "dev": true,
4715− "requires": {
4716− "kind-of": "^6.0.0"
4717− }
4718− },
4719− "is-descriptor": {
4720− "version": "1.0.2",
4721− "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
4722− "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
4723− "dev": true,
4724− "requires": {
4725− "is-accessor-descriptor": "^1.0.0",
4726− "is-data-descriptor": "^1.0.0",
4727− "kind-of": "^6.0.2"
4728− }
4729− }
4730− }
4731− },
4732− "snapdragon-util": {
4733− "version": "3.0.1",
4734− "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
4735− "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
4736− "dev": true,
4737− "requires": {
4738− "kind-of": "^3.2.0"
4739− },
4740− "dependencies": {
4741− "kind-of": {
4742− "version": "3.2.2",
4743− "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
4744− "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
4745− "dev": true,
4746− "requires": {
4747− "is-buffer": "^1.1.5"
4748− }
4749− }
4750− }
4751− },
4752− "sockjs": {
4753− "version": "0.3.19",
4754− "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
4755− "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
4756− "dev": true,
4757− "requires": {
4758− "faye-websocket": "^0.10.0",
4759− "uuid": "^3.0.1"
4760− }
4761− },
4762− "sockjs-client": {
4763− "version": "1.3.0",
4764− "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz",
4765− "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==",
4766− "dev": true,
4767− "requires": {
4768− "debug": "^3.2.5",
4769− "eventsource": "^1.0.7",
4770− "faye-websocket": "~0.11.1",
4771− "inherits": "^2.0.3",
4772− "json3": "^3.3.2",
4773− "url-parse": "^1.4.3"
4774− },
4775− "dependencies": {
4776− "faye-websocket": {
4777− "version": "0.11.1",
4778− "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz",
4779− "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=",
4780− "dev": true,
4781− "requires": {
4782− "websocket-driver": ">=0.5.1"
4783− }
4784− }
4785− }
4786− },
4787− "source-list-map": {
4788− "version": "2.0.1",
4789− "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
4790− "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
4791− "dev": true
4792− },
4793− "source-map": {
4794− "version": "0.5.7",
4795− "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
4796− "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
4797− "dev": true
4798− },
4799− "source-map-resolve": {
4800− "version": "0.5.2",
4801− "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
4802− "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
4803− "dev": true,
4804− "requires": {
4805− "atob": "^2.1.1",
4806− "decode-uri-component": "^0.2.0",
4807− "resolve-url": "^0.2.1",
4808− "source-map-url": "^0.4.0",
4809− "urix": "^0.1.0"
4810− }
4811− },
4812− "source-map-url": {
4813− "version": "0.4.0",
4814− "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
4815− "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
4816− "dev": true
4817− },
4818− "spdy": {
4819− "version": "4.0.0",
4820− "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz",
4821− "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==",
4822− "dev": true,
4823− "requires": {
4824− "debug": "^4.1.0",
4825− "handle-thing": "^2.0.0",
4826− "http-deceiver": "^1.2.7",
4827− "select-hose": "^2.0.0",
4828− "spdy-transport": "^3.0.0"
4829− },
4830− "dependencies": {
4831− "debug": {
4832− "version": "4.1.1",
4833− "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
4834− "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
4835− "dev": true,
4836− "requires": {
4837− "ms": "^2.1.1"
4838− }
4839− },
4840− "ms": {
4841− "version": "2.1.1",
4842− "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
4843− "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
4844− "dev": true
4845− }
4846− }
4847− },
4848− "spdy-transport": {
4849− "version": "3.0.0",
4850− "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
4851− "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
4852− "dev": true,
4853− "requires": {
4854− "debug": "^4.1.0",
4855− "detect-node": "^2.0.4",
4856− "hpack.js": "^2.1.6",
4857− "obuf": "^1.1.2",
4858− "readable-stream": "^3.0.6",
4859− "wbuf": "^1.7.3"
4860− },
4861− "dependencies": {
4862− "debug": {
4863− "version": "4.1.1",
4864− "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
4865− "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
4866− "dev": true,
4867− "requires": {
4868− "ms": "^2.1.1"
4869− }
4870− },
4871− "ms": {
4872− "version": "2.1.1",
4873− "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
4874− "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
4875− "dev": true
4876− },
4877− "readable-stream": {
4878− "version": "3.1.1",
4879− "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz",
4880− "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==",
4881− "dev": true,
4882− "requires": {
4883− "inherits": "^2.0.3",
4884− "string_decoder": "^1.1.1",
4885− "util-deprecate": "^1.0.1"
4886− }
4887− }
4888− }
4889− },
4890− "split-string": {
4891− "version": "3.1.0",
4892− "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
4893− "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
4894− "dev": true,
4895− "requires": {
4896− "extend-shallow": "^3.0.0"
4897− }
4898− },
4899− "ssri": {
4900− "version": "5.3.0",
4901− "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz",
4902− "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==",
4903− "dev": true,
4904− "requires": {
4905− "safe-buffer": "^5.1.1"
4906− }
4907− },
4908− "static-extend": {
4909− "version": "0.1.2",
4910− "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
4911− "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
4912− "dev": true,
4913− "requires": {
4914− "define-property": "^0.2.5",
4915− "object-copy": "^0.1.0"
4916− },
4917− "dependencies": {
4918− "define-property": {
4919− "version": "0.2.5",
4920− "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
4921− "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
4922− "dev": true,
4923− "requires": {
4924− "is-descriptor": "^0.1.0"
4925− }
4926− }
4927− }
4928− },
4929− "statuses": {
4930− "version": "1.4.0",
4931− "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
4932− "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
4933− "dev": true
4934− },
4935− "stream-browserify": {
4936− "version": "2.0.1",
4937− "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
4938− "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
4939− "dev": true,
4940− "requires": {
4941− "inherits": "~2.0.1",
4942− "readable-stream": "^2.0.2"
4943− }
4944− },
4945− "stream-each": {
4946− "version": "1.2.3",
4947− "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
4948− "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
4949− "dev": true,
4950− "requires": {
4951− "end-of-stream": "^1.1.0",
4952− "stream-shift": "^1.0.0"
4953− }
4954− },
4955− "stream-http": {
4956− "version": "2.8.3",
4957− "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
4958− "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
4959− "dev": true,
4960− "requires": {
4961− "builtin-status-codes": "^3.0.0",
4962− "inherits": "^2.0.1",
4963− "readable-stream": "^2.3.6",
4964− "to-arraybuffer": "^1.0.0",
4965− "xtend": "^4.0.0"
4966− }
4967− },
4968− "stream-shift": {
4969− "version": "1.0.0",
4970− "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
4971− "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
4972− "dev": true
4973− },
4974− "string-width": {
4975− "version": "2.1.1",
4976− "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
4977− "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
4978− "dev": true,
4979− "requires": {
4980− "is-fullwidth-code-point": "^2.0.0",
4981− "strip-ansi": "^4.0.0"
4982− },
4983− "dependencies": {
4984− "ansi-regex": {
4985− "version": "3.0.0",
4986− "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
4987− "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
4988− "dev": true
4989− },
4990− "strip-ansi": {
4991− "version": "4.0.0",
4992− "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
4993− "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
4994− "dev": true,
4995− "requires": {
4996− "ansi-regex": "^3.0.0"
4997− }
4998− }
4999− }
5000− },
5001− "string_decoder": {
5002− "version": "1.1.1",
5003− "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
5004− "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
5005− "dev": true,
5006− "requires": {
5007− "safe-buffer": "~5.1.0"
5008− }
5009− },
5010− "strip-ansi": {
5011− "version": "3.0.1",
5012− "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
5013− "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
5014− "dev": true,
5015− "requires": {
5016− "ansi-regex": "^2.0.0"
5017− }
5018− },
5019− "strip-eof": {
5020− "version": "1.0.0",
5021− "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
5022− "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
5023− "dev": true
5024− },
5025− "supports-color": {
5026− "version": "5.4.0",
5027− "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
5028− "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
5029− "dev": true,
5030− "requires": {
5031− "has-flag": "^3.0.0"
5032− }
5033− },
5034− "tapable": {
5035− "version": "1.0.0",
5036− "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz",
5037− "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==",
5038− "dev": true
5039− },
5040− "through2": {
5041− "version": "2.0.3",
5042− "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
5043− "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
5044− "dev": true,
5045− "requires": {
5046− "readable-stream": "^2.1.5",
5047− "xtend": "~4.0.1"
5048− }
5049− },
5050− "thunky": {
5051− "version": "1.0.3",
5052− "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz",
5053− "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==",
5054− "dev": true
5055− },
5056− "timers-browserify": {
5057− "version": "2.0.10",
5058− "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
5059− "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==",
5060− "dev": true,
5061− "requires": {
5062− "setimmediate": "^1.0.4"
5063− }
5064− },
5065− "to-arraybuffer": {
5066− "version": "1.0.1",
5067− "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
5068− "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
5069− "dev": true
5070− },
5071− "to-object-path": {
5072− "version": "0.3.0",
5073− "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
5074− "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
5075− "dev": true,
5076− "requires": {
5077− "kind-of": "^3.0.2"
5078− },
5079− "dependencies": {
5080− "kind-of": {
5081− "version": "3.2.2",
5082− "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
5083− "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
5084− "dev": true,
5085− "requires": {
5086− "is-buffer": "^1.1.5"
5087− }
5088− }
5089− }
5090− },
5091− "to-regex": {
5092− "version": "3.0.2",
5093− "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
5094− "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
5095− "dev": true,
5096− "requires": {
5097− "define-property": "^2.0.2",
5098− "extend-shallow": "^3.0.2",
5099− "regex-not": "^1.0.2",
5100− "safe-regex": "^1.1.0"
5101− }
5102− },
5103− "to-regex-range": {
5104− "version": "2.1.1",
5105− "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
5106− "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
5107− "dev": true,
5108− "requires": {
5109− "is-number": "^3.0.0",
5110− "repeat-string": "^1.6.1"
5111− }
5112− },
5113− "toposort": {
5114− "version": "1.0.7",
5115− "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz",
5116− "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=",
5117− "dev": true
5118− },
5119− "tslib": {
5120− "version": "1.9.3",
5121− "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
5122− "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
5123− "dev": true
5124− },
5125− "tty-browserify": {
5126− "version": "0.0.0",
5127− "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
5128− "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
5129− "dev": true
5130− },
5131− "type-is": {
5132− "version": "1.6.16",
5133− "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
5134− "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
5135− "dev": true,
5136− "requires": {
5137− "media-typer": "0.3.0",
5138− "mime-types": "~2.1.18"
5139− }
5140− },
5141− "typedarray": {
5142− "version": "0.0.6",
5143− "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
5144− "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
5145− "dev": true
5146− },
5147− "uglify-es": {
5148− "version": "3.3.9",
5149− "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
5150− "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==",
5151− "dev": true,
5152− "requires": {
5153− "commander": "~2.13.0",
5154− "source-map": "~0.6.1"
5155− },
5156− "dependencies": {
5157− "source-map": {
5158− "version": "0.6.1",
5159− "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
5160− "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
5161− "dev": true
5162− }
5163− }
5164− },
5165− "uglifyjs-webpack-plugin": {
5166− "version": "1.3.0",
5167− "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz",
5168− "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==",
5169− "dev": true,
5170− "requires": {
5171− "cacache": "^10.0.4",
5172− "find-cache-dir": "^1.0.0",
5173− "schema-utils": "^0.4.5",
5174− "serialize-javascript": "^1.4.0",
5175− "source-map": "^0.6.1",
5176− "uglify-es": "^3.3.4",
5177− "webpack-sources": "^1.1.0",
5178− "worker-farm": "^1.5.2"
5179− },
5180− "dependencies": {
5181− "source-map": {
5182− "version": "0.6.1",
5183− "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
5184− "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
5185− "dev": true
5186− }
5187− }
5188− },
5189− "union-value": {
5190− "version": "1.0.0",
5191− "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
5192− "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
5193− "dev": true,
5194− "requires": {
5195− "arr-union": "^3.1.0",
5196− "get-value": "^2.0.6",
5197− "is-extendable": "^0.1.1",
5198− "set-value": "^0.4.3"
5199− },
5200− "dependencies": {
5201− "extend-shallow": {
5202− "version": "2.0.1",
5203− "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
5204− "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
5205− "dev": true,
5206− "requires": {
5207− "is-extendable": "^0.1.0"
5208− }
5209− },
5210− "set-value": {
5211− "version": "0.4.3",
5212− "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
5213− "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
5214− "dev": true,
5215− "requires": {
5216− "extend-shallow": "^2.0.1",
5217− "is-extendable": "^0.1.1",
5218− "is-plain-object": "^2.0.1",
5219− "to-object-path": "^0.3.0"
5220− }
5221− }
5222− }
5223− },
5224− "unique-filename": {
5225− "version": "1.1.1",
5226− "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
5227− "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
5228− "dev": true,
5229− "requires": {
5230− "unique-slug": "^2.0.0"
5231− }
5232− },
5233− "unique-slug": {
5234− "version": "2.0.1",
5235− "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz",
5236− "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==",
5237− "dev": true,
5238− "requires": {
5239− "imurmurhash": "^0.1.4"
5240− }
5241− },
5242− "unpipe": {
5243− "version": "1.0.0",
5244− "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
5245− "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
5246− "dev": true
5247− },
5248− "unset-value": {
5249− "version": "1.0.0",
5250− "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
5251− "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
5252− "dev": true,
5253− "requires": {
5254− "has-value": "^0.3.1",
5255− "isobject": "^3.0.0"
5256− },
5257− "dependencies": {
5258− "has-value": {
5259− "version": "0.3.1",
5260− "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
5261− "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
5262− "dev": true,
5263− "requires": {
5264− "get-value": "^2.0.3",
5265− "has-values": "^0.1.4",
5266− "isobject": "^2.0.0"
5267− },
5268− "dependencies": {
5269− "isobject": {
5270− "version": "2.1.0",
5271− "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
5272− "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
5273− "dev": true,
5274− "requires": {
5275− "isarray": "1.0.0"
5276− }
5277− }
5278− }
5279− },
5280− "has-values": {
5281− "version": "0.1.4",
5282− "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
5283− "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
5284− "dev": true
5285− },
5286− "isarray": {
5287− "version": "1.0.0",
5288− "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
5289− "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
5290− "dev": true
5291− }
5292− }
5293− },
5294− "upath": {
5295− "version": "1.1.0",
5296− "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
5297− "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==",
5298− "dev": true
5299− },
5300− "upper-case": {
5301− "version": "1.1.3",
5302− "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
5303− "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
5304− "dev": true
5305− },
5306− "uri-js": {
5307− "version": "4.2.2",
5308− "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
5309− "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
5310− "dev": true,
5311− "requires": {
5312− "punycode": "^2.1.0"
5313− }
5314− },
5315− "urix": {
5316− "version": "0.1.0",
5317− "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
5318− "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
5319− "dev": true
5320− },
5321− "url": {
5322− "version": "0.11.0",
5323− "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
5324− "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
5325− "dev": true,
5326− "requires": {
5327− "punycode": "1.3.2",
5328− "querystring": "0.2.0"
5329− },
5330− "dependencies": {
5331− "punycode": {
5332− "version": "1.3.2",
5333− "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
5334− "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
5335− "dev": true
5336− }
5337− }
5338− },
5339− "url-parse": {
5340− "version": "1.4.4",
5341− "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz",
5342− "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==",
5343− "dev": true,
5344− "requires": {
5345− "querystringify": "^2.0.0",
5346− "requires-port": "^1.0.0"
5347− }
5348− },
5349− "use": {
5350− "version": "3.1.1",
5351− "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
5352− "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
5353− "dev": true
5354− },
5355− "util": {
5356− "version": "0.10.4",
5357− "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
5358− "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
5359− "dev": true,
5360− "requires": {
5361− "inherits": "2.0.3"
5362− }
5363− },
5364− "util-deprecate": {
5365− "version": "1.0.2",
5366− "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
5367− "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
5368− "dev": true
5369− },
5370− "util.promisify": {
5371− "version": "1.0.0",
5372− "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
5373− "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
5374− "dev": true,
5375− "requires": {
5376− "define-properties": "^1.1.2",
5377− "object.getownpropertydescriptors": "^2.0.3"
5378− }
5379− },
5380− "utila": {
5381− "version": "0.4.0",
5382− "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
5383− "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
5384− "dev": true
5385− },
5386− "utils-merge": {
5387− "version": "1.0.1",
5388− "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
5389− "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
5390− "dev": true
5391− },
5392− "uuid": {
5393− "version": "3.3.2",
5394− "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
5395− "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
5396− "dev": true
5397− },
5398− "v8-compile-cache": {
5399− "version": "2.0.2",
5400− "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz",
5401− "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==",
5402− "dev": true
5403− },
5404− "vary": {
5405− "version": "1.1.2",
5406− "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
5407− "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
5408− "dev": true
5409− },
5410− "vm-browserify": {
5411− "version": "0.0.4",
5412− "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
5413− "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
5414− "dev": true,
5415− "requires": {
5416− "indexof": "0.0.1"
5417− }
5418− },
5419− "watchpack": {
5420− "version": "1.6.0",
5421− "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
5422− "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==",
5423− "dev": true,
5424− "requires": {
5425− "chokidar": "^2.0.2",
5426− "graceful-fs": "^4.1.2",
5427− "neo-async": "^2.5.0"
5428− }
5429− },
5430− "wbuf": {
5431− "version": "1.7.3",
5432− "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
5433− "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
5434− "dev": true,
5435− "requires": {
5436− "minimalistic-assert": "^1.0.0"
5437− }
5438− },
5439− "webpack": {
5440− "version": "4.25.1",
5441− "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.25.1.tgz",
5442− "integrity": "sha512-T0GU/3NRtO4tMfNzsvpdhUr8HnzA4LTdP2zd+e5zd6CdOH5vNKHnAlO+DvzccfhPdzqRrALOFcjYxx7K5DWmvA==",
5443− "dev": true,
5444− "requires": {
5445− "@webassemblyjs/ast": "1.7.11",
5446− "@webassemblyjs/helper-module-context": "1.7.11",
5447− "@webassemblyjs/wasm-edit": "1.7.11",
5448− "@webassemblyjs/wasm-parser": "1.7.11",
5449− "acorn": "^5.6.2",
5450− "acorn-dynamic-import": "^3.0.0",
5451− "ajv": "^6.1.0",
5452− "ajv-keywords": "^3.1.0",
5453− "chrome-trace-event": "^1.0.0",
5454− "enhanced-resolve": "^4.1.0",
5455− "eslint-scope": "^4.0.0",
5456− "json-parse-better-errors": "^1.0.2",
5457− "loader-runner": "^2.3.0",
5458− "loader-utils": "^1.1.0",
5459− "memory-fs": "~0.4.1",
5460− "micromatch": "^3.1.8",
5461− "mkdirp": "~0.5.0",
5462− "neo-async": "^2.5.0",
5463− "node-libs-browser": "^2.0.0",
5464− "schema-utils": "^0.4.4",
5465− "tapable": "^1.1.0",
5466− "uglifyjs-webpack-plugin": "^1.2.4",
5467− "watchpack": "^1.5.0",
5468− "webpack-sources": "^1.3.0"
5469− },
5470− "dependencies": {
5471− "tapable": {
5472− "version": "1.1.0",
5473− "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz",
5474− "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==",
5475− "dev": true
5476− }
5477− }
5478− },
5479− "webpack-cli": {
5480− "version": "3.1.2",
5481− "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz",
5482− "integrity": "sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==",
5483− "dev": true,
5484− "requires": {
5485− "chalk": "^2.4.1",
5486− "cross-spawn": "^6.0.5",
5487− "enhanced-resolve": "^4.1.0",
5488− "global-modules-path": "^2.3.0",
5489− "import-local": "^2.0.0",
5490− "interpret": "^1.1.0",
5491− "loader-utils": "^1.1.0",
5492− "supports-color": "^5.5.0",
5493− "v8-compile-cache": "^2.0.2",
5494− "yargs": "^12.0.2"
5495− },
5496− "dependencies": {
5497− "supports-color": {
5498− "version": "5.5.0",
5499− "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
5500− "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
5501− "dev": true,
5502− "requires": {
5503− "has-flag": "^3.0.0"
5504− }
5505− }
5506− }
5507− },
5508− "webpack-dev-middleware": {
5509− "version": "3.4.0",
5510− "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz",
5511− "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==",
5512− "dev": true,
5513− "requires": {
5514− "memory-fs": "~0.4.1",
5515− "mime": "^2.3.1",
5516− "range-parser": "^1.0.3",
5517− "webpack-log": "^2.0.0"
5518− },
5519− "dependencies": {
5520− "mime": {
5521− "version": "2.4.0",
5522− "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz",
5523− "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==",
5524− "dev": true
5525− }
5526− }
5527− },
5528− "webpack-dev-server": {
5529− "version": "3.1.14",
5530− "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz",
5531− "integrity": "sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ==",
5532− "dev": true,
5533− "requires": {
5534− "ansi-html": "0.0.7",
5535− "bonjour": "^3.5.0",
5536− "chokidar": "^2.0.0",
5537− "compression": "^1.5.2",
5538− "connect-history-api-fallback": "^1.3.0",
5539− "debug": "^3.1.0",
5540− "del": "^3.0.0",
5541− "express": "^4.16.2",
5542− "html-entities": "^1.2.0",
5543− "http-proxy-middleware": "~0.18.0",
5544− "import-local": "^2.0.0",
5545− "internal-ip": "^3.0.1",
5546− "ip": "^1.1.5",
5547− "killable": "^1.0.0",
5548− "loglevel": "^1.4.1",
5549− "opn": "^5.1.0",
5550− "portfinder": "^1.0.9",
5551− "schema-utils": "^1.0.0",
5552− "selfsigned": "^1.9.1",
5553− "semver": "^5.6.0",
5554− "serve-index": "^1.7.2",
5555− "sockjs": "0.3.19",
5556− "sockjs-client": "1.3.0",
5557− "spdy": "^4.0.0",
5558− "strip-ansi": "^3.0.0",
5559− "supports-color": "^5.1.0",
5560− "url": "^0.11.0",
5561− "webpack-dev-middleware": "3.4.0",
5562− "webpack-log": "^2.0.0",
5563− "yargs": "12.0.2"
5564− },
5565− "dependencies": {
5566− "schema-utils": {
5567− "version": "1.0.0",
5568− "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
5569− "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
5570− "dev": true,
5571− "requires": {
5572− "ajv": "^6.1.0",
5573− "ajv-errors": "^1.0.0",
5574− "ajv-keywords": "^3.1.0"
5575− }
5576− },
5577− "semver": {
5578− "version": "5.6.0",
5579− "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
5580− "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
5581− "dev": true
5582− }
5583− }
5584− },
5585− "webpack-log": {
5586− "version": "2.0.0",
5587− "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
5588− "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
5589− "dev": true,
5590− "requires": {
5591− "ansi-colors": "^3.0.0",
5592− "uuid": "^3.3.2"
5593− }
5594− },
5595− "webpack-sources": {
5596− "version": "1.3.0",
5597− "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
5598− "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==",
5599− "dev": true,
5600− "requires": {
5601− "source-list-map": "^2.0.0",
5602− "source-map": "~0.6.1"
5603− },
5604− "dependencies": {
5605− "source-map": {
5606− "version": "0.6.1",
5607− "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
5608− "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
5609− "dev": true
5610− }
5611− }
5612− },
5613− "websocket-driver": {
5614− "version": "0.7.0",
5615− "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
5616− "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
5617− "dev": true,
5618− "requires": {
5619− "http-parser-js": ">=0.4.0",
5620− "websocket-extensions": ">=0.1.1"
5621− }
5622− },
5623− "websocket-extensions": {
5624− "version": "0.1.3",
5625− "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
5626− "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
5627− "dev": true
5628− },
5629− "which": {
5630− "version": "1.3.1",
5631− "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
5632− "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
5633− "dev": true,
5634− "requires": {
5635− "isexe": "^2.0.0"
5636− }
5637− },
5638− "which-module": {
5639− "version": "2.0.0",
5640− "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
5641− "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
5642− "dev": true
5643− },
5644− "worker-farm": {
5645− "version": "1.6.0",
5646− "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz",
5647− "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==",
5648− "dev": true,
5649− "requires": {
5650− "errno": "~0.1.7"
5651− }
5652− },
5653− "wrap-ansi": {
5654− "version": "2.1.0",
5655− "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
5656− "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
5657− "dev": true,
5658− "requires": {
5659− "string-width": "^1.0.1",
5660− "strip-ansi": "^3.0.1"
5661− },
5662− "dependencies": {
5663− "is-fullwidth-code-point": {
5664− "version": "1.0.0",
5665− "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
5666− "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
5667− "dev": true,
5668− "requires": {
5669− "number-is-nan": "^1.0.0"
5670− }
5671− },
5672− "string-width": {
5673− "version": "1.0.2",
5674− "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
5675− "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
5676− "dev": true,
5677− "requires": {
5678− "code-point-at": "^1.0.0",
5679− "is-fullwidth-code-point": "^1.0.0",
5680− "strip-ansi": "^3.0.0"
5681− }
5682− }
5683− }
5684− },
5685− "wrappy": {
5686− "version": "1.0.2",
5687− "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
5688− "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
5689− "dev": true
5690− },
5691− "xregexp": {
5692− "version": "4.0.0",
5693− "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
5694− "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==",
5695− "dev": true
5696− },
5697− "xtend": {
5698− "version": "4.0.1",
5699− "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
5700− "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
5701− "dev": true
5702− },
5703− "y18n": {
5704− "version": "4.0.0",
5705− "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
5706− "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
5707− "dev": true
5708− },
5709− "yallist": {
5710− "version": "2.1.2",
5711− "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
5712− "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
5713− "dev": true
5714− },
5715− "yargs": {
5716− "version": "12.0.2",
5717− "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz",
5718− "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==",
5719− "dev": true,
5720− "requires": {
5721− "cliui": "^4.0.0",
5722− "decamelize": "^2.0.0",
5723− "find-up": "^3.0.0",
5724− "get-caller-file": "^1.0.1",
5725− "os-locale": "^3.0.0",
5726− "require-directory": "^2.1.1",
5727− "require-main-filename": "^1.0.1",
5728− "set-blocking": "^2.0.0",
5729− "string-width": "^2.0.0",
5730− "which-module": "^2.0.0",
5731− "y18n": "^3.2.1 || ^4.0.0",
5732− "yargs-parser": "^10.1.0"
5733− },
5734− "dependencies": {
5735− "find-up": {
5736− "version": "3.0.0",
5737− "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
5738− "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
5739− "dev": true,
5740− "requires": {
5741− "locate-path": "^3.0.0"
5742− }
5743− },
5744− "locate-path": {
5745− "version": "3.0.0",
5746− "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
5747− "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
5748− "dev": true,
5749− "requires": {
5750− "p-locate": "^3.0.0",
5751− "path-exists": "^3.0.0"
5752− }
5753− },
5754− "p-limit": {
5755− "version": "2.0.0",
5756− "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
5757− "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
5758− "dev": true,
5759− "requires": {
5760− "p-try": "^2.0.0"
5761− }
5762− },
5763− "p-locate": {
5764− "version": "3.0.0",
5765− "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
5766− "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
5767− "dev": true,
5768− "requires": {
5769− "p-limit": "^2.0.0"
5770− }
5771− },
5772− "p-try": {
5773− "version": "2.0.0",
5774− "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
5775− "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
5776− "dev": true
5777− }
5778− }
5779− },
5780− "yargs-parser": {
5781− "version": "10.1.0",
5782− "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
5783− "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
5784− "dev": true,
5785− "requires": {
5786− "camelcase": "^4.1.0"
5787− }
5788− }
5789− }
5790−}
examples/input-form/package.jsondeleted−18
@@ -1,18 +0,0 @@
1−{
2− "author": "Nick Fitzgerald <nfitzgerald@mozilla.com>",
3− "name": "create-rust-webpack",
4− "version": "0.1.5",
5− "repository": "https://github.com/rustwasm/rust-webpack-template",
6− "license": "Apache-2.0/MIT",
7− "scripts": {
8− "start": "webpack-dev-server -d",
9− "build": "webpack"
10− },
11− "devDependencies": {
12− "@wasm-tool/wasm-pack-plugin": "0.1.6",
13− "html-webpack-plugin": "^3.2.0",
14− "webpack": "^4.25.1",
15− "webpack-cli": "^3.1.2",
16− "webpack-dev-server": "^3.1.14"
17− }
18−}
examples/input-form/src/lib.rsnew file+81
@@ -0,0 +1,81 @@
1+use dodrio::{bumpalo, Node, Render, RenderContext};
2+use wasm_bindgen::prelude::*;
3+use wasm_bindgen::JsCast;
4+
5+/// Say hello to someone.
6+struct SayHelloTo {
7+ /// Who to say hello to.
8+ who: String,
9+}
10+
11+impl SayHelloTo {
12+ /// Construct a new `SayHelloTo` component.
13+ fn new<S: Into<String>>(who: S) -> SayHelloTo {
14+ let who = who.into();
15+ SayHelloTo { who }
16+ }
17+
18+ /// Update who to say hello to.
19+ fn set_who(&mut self, who: String) {
20+ self.who = who;
21+ }
22+}
23+
24+// The `Render` implementation has a text `<input>` and a `<div>` that shows a
25+// greeting to the `<input>`'s value.
26+impl<'a> Render<'a> for SayHelloTo {
27+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
28+ use dodrio::builder::*;
29+
30+ div(&cx)
31+ .children([
32+ input(&cx)
33+ .attr("type", "text")
34+ .attr(
35+ "value",
36+ bumpalo::format!(in cx.bump, "{}", self.who).into_bump_str(),
37+ )
38+ .on("input", |root, vdom, event| {
39+ // If the event's target is our input...
40+ let input = match event
41+ .target()
42+ .and_then(|t| t.dyn_into::<web_sys::HtmlInputElement>().ok())
43+ {
44+ None => return,
45+ Some(input) => input,
46+ };
47+
48+ // ...then get its value and update who we are greeting.
49+ let value = input.value();
50+ let hello = root.unwrap_mut::<SayHelloTo>();
51+ hello.set_who(value);
52+
53+ // Finally, re-render the component on the next animation frame.
54+ vdom.schedule_render();
55+ })
56+ .finish(),
57+ text(bumpalo::format!(in cx.bump, "Hello, {}!", self.who).into_bump_str()),
58+ ])
59+ .finish()
60+ }
61+}
62+
63+#[wasm_bindgen(start)]
64+pub fn run() {
65+ // Initialize debugging for when/if something goes wrong.
66+ console_error_panic_hook::set_once();
67+
68+ // Get the document's `<body>`.
69+ let window = web_sys::window().unwrap();
70+ let document = window.document().unwrap();
71+ let body = document.body().unwrap();
72+
73+ // Construct a new `SayHelloTo` rendering component.
74+ let say_hello = SayHelloTo::new("World");
75+
76+ // Mount the component to the `<body>`.
77+ let vdom = dodrio::Vdom::new(&body, say_hello);
78+
79+ // Run the component forever.
80+ vdom.forget();
81+}
examples/input-form/webpack.config.jsdeleted−25
@@ -1,25 +0,0 @@
1−const path = require("path");
2−const HtmlWebpackPlugin = require("html-webpack-plugin");
3−
4−const dist = path.resolve(__dirname, "dist");
5−const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin");
6−
7−module.exports = {
8− entry: "./js/index.js",
9− output: {
10− path: dist,
11− filename: "bundle.js"
12− },
13− devServer: {
14− contentBase: dist,
15− },
16− plugins: [
17− new HtmlWebpackPlugin({
18− template: 'index.html'
19− }),
20−
21− new WasmPackPlugin({
22− crateDirectory: path.resolve(__dirname, "crate")
23− }),
24− ]
25−};
examples/js-component/Cargo.tomlnew file+26
@@ -0,0 +1,26 @@
1+[package]
2+name = "dodrio-js-component"
3+version = "0.1.0"
4+authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
5+edition = "2018"
6+
7+[lib]
8+crate-type = ["cdylib"]
9+
10+[features]
11+
12+[dependencies]
13+dodrio = { path = "../.." }
14+dodrio-js-api = { path = "../../crates/js-api" }
15+wasm-bindgen = "0.2.55"
16+console_error_panic_hook = "0.1.6"
17+js-sys = "0.3.32"
18+
19+[dependencies.web-sys]
20+version = "0.3.32"
21+features = [
22+ "Document",
23+ "HtmlElement",
24+ "Node",
25+ "Window",
26+]
examples/js-component/README.mdnew file+23
@@ -0,0 +1,23 @@
1+# Defining a Rendering Component in JavaScript
2+
3+Heterogeneous Rust and JavaScript rendering component trees!
4+
5+## Source
6+
7+See `greeting.js` for the JavaScript code.
8+
9+See `src/lib.rs` for the Rust code.
10+
11+## Build
12+
13+```
14+wasm-pack build --target web
15+```
16+
17+## Serve
18+
19+Use any HTTP server, for example:
20+
21+```
22+python -m SimpleHTTPServer
23+```
examples/js-component/greeting.jsnew file+41
@@ -0,0 +1,41 @@
1+// A rendering component defined in JavaScript!
2+class Greeting {
3+ constructor(who) {
4+ this.who = who;
5+ }
6+
7+ render() {
8+ return {
9+ tagName: "p",
10+ attributes: [
11+ {
12+ name: "class",
13+ value: "greeting",
14+ },
15+ ],
16+ listeners: [
17+ {
18+ on: "click",
19+ callback: this.onClick.bind(this),
20+ }
21+ ],
22+ children: [
23+ "Hello, ",
24+ {
25+ tagName: "strong",
26+ children: [this.who],
27+ }
28+ ],
29+ };
30+ }
31+
32+ async onClick(vdom, event) {
33+ // Be more excited!
34+ this.who += "!";
35+
36+ // Schedule a re-render.
37+ await vdom.render();
38+
39+ console.log("re-rendering finished!");
40+ }
41+}
examples/js-component/index.htmlnew file+14
@@ -0,0 +1,14 @@
1+<!DOCTYPE html>
2+<html>
3+ <head>
4+ <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5+ <title>A JavaScript component!</title>
6+ </head>
7+ <body>
8+ <script src="greeting.js"></script>
9+ <script type="module">
10+ import init from "./pkg/dodrio_js_component.js";
11+ init("./pkg/dodrio_js_component_bg.wasm");
12+ </script>
13+ </body>
14+</html>
examples/js-component/src/lib.rsnew file+63
@@ -0,0 +1,63 @@
1+use dodrio::{Node, Render, RenderContext, Vdom};
2+use dodrio_js_api::JsRender;
3+use js_sys::Object;
4+use wasm_bindgen::prelude::*;
5+
6+#[wasm_bindgen]
7+extern "C" {
8+ // Import the JS `Greeting` class.
9+ #[wasm_bindgen(extends = Object)]
10+ #[derive(Clone, Debug)]
11+ type Greeting;
12+
13+ // And the `Greeting` class's constructor.
14+ #[wasm_bindgen(constructor)]
15+ fn new(who: &str) -> Greeting;
16+}
17+
18+/// This is our Rust rendering component that wraps the JS rendering component.
19+pub struct GreetingViaJs {
20+ js: JsRender,
21+}
22+
23+impl GreetingViaJs {
24+ /// Create a new `GreetingViaJs`, which will internally create a new JS
25+ /// `Greeting`.
26+ pub fn new(who: &str) -> GreetingViaJs {
27+ let js = JsRender::new(Greeting::new(who));
28+ GreetingViaJs { js }
29+ }
30+}
31+
32+/// Here's the `Render` implementation! This adds a `<p>` element and some text
33+/// around whatever the inner JS `Greeting` component renders.
34+impl<'a> Render<'a> for GreetingViaJs {
35+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
36+ use dodrio::builder::*;
37+ p(&cx)
38+ .children([text("JavaScript says: "), self.js.render(cx)])
39+ .finish()
40+ }
41+}
42+
43+/// Finally our main initialization function that kicks everything off!
44+#[wasm_bindgen(start)]
45+pub fn run() {
46+ // Set up the panic hook for debugging when things go wrong.
47+ console_error_panic_hook::set_once();
48+
49+ // Grab the document's `<body>`.
50+ let window = web_sys::window().unwrap_throw();
51+ let document = window.document().unwrap_throw();
52+ let body = document.body().unwrap_throw();
53+
54+ // Create a new `GreetingViaJs` render component.
55+ let component = GreetingViaJs::new("World");
56+
57+ // Create a virtual DOM and mount it and the `GreetingViaJs` render component to the
58+ // `<body>`.
59+ let vdom = Vdom::new(body.as_ref(), component);
60+
61+ // Run the virtual DOM forever and don't unmount it.
62+ vdom.forget();
63+}
examples/moire/Cargo.tomlnew file+43
@@ -0,0 +1,43 @@
1+[package]
2+name = "dodrio-moire"
3+version = "0.1.0"
4+authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
5+edition = "2018"
6+
7+[lib]
8+crate-type = ["cdylib"]
9+
10+[dependencies]
11+cfg-if = "0.1.10"
12+dodrio = { path = "../.." }
13+log = "0.4.11"
14+wasm-bindgen = "0.2.55"
15+wasm-bindgen-futures = "0.4.5"
16+
17+# Optional dependencies for logging.
18+console_error_panic_hook = { optional = true, version = "0.1.6" }
19+console_log = { optional = true, version = "0.2.0" }
20+js-sys = "0.3.32"
21+
22+[dependencies.web-sys]
23+version = "0.3.32"
24+features = [
25+ "Document",
26+ "Element",
27+ "Event",
28+ "EventTarget",
29+ "HtmlElement",
30+ "HtmlInputElement",
31+ "Node",
32+ "Performance",
33+ "Window",
34+]
35+
36+[dev-dependencies]
37+wasm-bindgen-test = "0.3.5"
38+
39+[features]
40+logging = [
41+ "console_log",
42+ "console_error_panic_hook",
43+]
examples/moire/README.mdnew file+26
@@ -0,0 +1,26 @@
1+# Moiré Patterns!
2+
3+This was originally a demo meant to show off [WebRender][], and so the
4+performance bottleneck is painting, not DOM manipulation, but it looks cool
5+either way!
6+
7+[WebRender]: https://hacks.mozilla.org/2017/10/the-whole-web-at-maximum-fps-how-webrender-gets-rid-of-jank/
8+
9+## Source
10+
11+See `src/lib.rs` for the main bits, and `src/colors.rs` for HSV to RGB color
12+conversion and other color utilities.
13+
14+## Build
15+
16+```
17+wasm-pack build --target web
18+```
19+
20+## Serve
21+
22+Use any HTTP server, for example:
23+
24+```
25+python -m SimpleHTTPServer
26+```
examples/moire/index.htmlnew file+67
@@ -0,0 +1,67 @@
1+<!DOCTYPE html>
2+<html>
3+ <head>
4+ <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5+ <title>Moire patterns! Originally a WebRender demo</title>
6+ <style>
7+ main {
8+ position: absolute;
9+ top: 0;
10+ left: 0;
11+ right: 0;
12+ bottom: 0;
13+ overflow: hidden;
14+ }
15+ .circle {
16+ border-radius: 50%;
17+ position: absolute;
18+ top: 50%;
19+ left: 50%;
20+ border-style: solid;
21+ border-width: 3px;
22+ }
23+ .object {
24+ position: absolute;
25+ width: 100%;
26+ height: 100%;
27+ left: 0;
28+ top: 0;
29+ }
30+ code {
31+ position: relative;
32+ font-size: 150%;
33+ z-index: 10;
34+ }
35+ #circle-count {
36+ position: absolute;
37+ margin-top: 30px;
38+ z-index: 2;
39+ }
40+ </style>
41+ </head>
42+ <body>
43+ <code>FPS: <output id="fps"></code></code>
44+ <div id="scene"></div>
45+ <script type="module">
46+ import init from "./pkg/dodrio_moire.js";
47+ init("./pkg/dodrio_moire_bg.wasm");
48+ </script>
49+ <script>
50+ let lastTime = 0
51+ let frameCount = 0
52+ const fps = document.getElementById('fps')
53+ function updateFPS(time) {
54+ frameCount++
55+ if (lastTime + 1000.0 <= time) {
56+ fps.textContent = frameCount
57+ lastTime = time
58+ frameCount = 0
59+ }
60+ }
61+ requestAnimationFrame(function loop(now) {
62+ updateFPS(now);
63+ requestAnimationFrame(loop);
64+ })
65+ </script>
66+ </body>
67+</html>
examples/moire/src/colors.rsnew file+162
@@ -0,0 +1,162 @@
1+//! Color utility functions.
2+
3+use std::f64;
4+
5+/// An RGB color.
6+#[derive(Copy, Clone)]
7+pub struct Rgb {
8+ pub r: u8,
9+ pub g: u8,
10+ pub b: u8,
11+}
12+
13+/// An HSV color.
14+#[derive(Copy, Clone)]
15+pub struct Hsv {
16+ pub h: f64,
17+ pub s: f64,
18+ pub v: f64,
19+}
20+
21+/// Convert an RGB color into HSV.
22+impl From<Rgb> for Hsv {
23+ fn from(Rgb { r, g, b }: Rgb) -> Hsv {
24+ let r = r as f64 / 255.0;
25+ let g = g as f64 / 255.0;
26+ let b = b as f64 / 255.0;
27+ let max = f64::max(f64::max(r, g), b);
28+ let min = f64::min(f64::min(r, g), b);
29+ let v = max;
30+ let diff = v - min;
31+ let mut h = 0.0;
32+ let mut s = 0.0;
33+ if diff != 0.0 {
34+ s = diff / v;
35+ let diffc = |c| (v - c) / 6.0 / diff + 1.0 / 2.0;
36+ let rr = diffc(r);
37+ let gg = diffc(g);
38+ let bb = diffc(b);
39+ if r == v {
40+ h = bb - gg;
41+ } else if g == v {
42+ h = (1.0 / 3.0) + rr - bb;
43+ } else if b == v {
44+ h = (2.0 / 3.0) + gg - rr;
45+ }
46+ }
47+ Hsv { h, s, v }
48+ }
49+}
50+
51+/// Convert an HSV color into RGB.
52+impl From<Hsv> for Rgb {
53+ fn from(Hsv { h, s, v }: Hsv) -> Rgb {
54+ let i = (h * 6.0).floor();
55+ let f = h * 6.0 - i;
56+ let p = v * (1.0 - s);
57+ let q = v * (1.0 - f * s);
58+ let t = v * (1.0 - (1.0 - f) * s);
59+ let r;
60+ let g;
61+ let b;
62+ match i as u64 % 6 {
63+ 0 => {
64+ r = v;
65+ g = t;
66+ b = p;
67+ }
68+ 1 => {
69+ r = q;
70+ g = v;
71+ b = p;
72+ }
73+ 2 => {
74+ r = p;
75+ g = v;
76+ b = t;
77+ }
78+ 3 => {
79+ r = p;
80+ g = q;
81+ b = v;
82+ }
83+ 4 => {
84+ r = t;
85+ g = p;
86+ b = v;
87+ }
88+ 5 => {
89+ r = v;
90+ g = p;
91+ b = q;
92+ }
93+ _ => wasm_bindgen::throw_str("impossible"),
94+ }
95+ let r = (r * 255.0).round() as u8;
96+ let g = (g * 255.0).round() as u8;
97+ let b = (b * 255.0).round() as u8;
98+ Rgb { r, g, b }
99+ }
100+}
101+
102+/// Linearly interpolate between two values.
103+fn lerp(a: f64, b: f64, t: f64) -> f64 {
104+ a + (b - a) * t
105+}
106+
107+/// Clamp the `x` value to within the range `lo..hi`.
108+fn clamp(lo: f64, hi: f64, x: f64) -> f64 {
109+ if x < lo {
110+ lo
111+ } else if x > hi {
112+ hi
113+ } else {
114+ x
115+ }
116+}
117+
118+/// Linearly interpolate two HSV colors and convert the result into RGB.
119+fn lerp_hsv_to_rgb(a: Hsv, b: Hsv, t: f64) -> Rgb {
120+ let h = lerp(a.h, b.h, t);
121+ let s = lerp(a.s, b.s, t);
122+ let v = lerp(a.v, b.v, t);
123+ let hsv = Hsv { h, s, v };
124+ hsv.into()
125+}
126+
127+thread_local! {
128+ static PALETTES: [(Hsv, Hsv); 3] = [
129+ (
130+ (Rgb { r: 0xfe, g: 0xf6, b: 0xdf }).into(),
131+ (Rgb { r: 0x64, g: 0xc3, b: 0xc8 }).into(),
132+ ),
133+ (
134+ (Rgb { r: 0xfc, g: 0xcf, b: 0x74 }).into(),
135+ (Rgb { r: 0x41, g: 0x65, b: 0x7f }).into(),
136+ ),
137+ (
138+ (Rgb { r: 0xd9, g: 0xe0, b: 0xe8 }).into(),
139+ (Rgb { r: 0x94, g: 0x5d, b: 0x72 }).into(),
140+ ),
141+ ];
142+}
143+
144+/// Get a color from our color palette that is linearly interpolated based on
145+/// the `t` elapsed time value.
146+///
147+/// The `which` function allows callers to select whether they want the
148+/// foreground or background color.
149+pub fn get_interpolated_color<F>(mut which: F, t: f64) -> Rgb
150+where
151+ F: FnMut((Hsv, Hsv)) -> Hsv,
152+{
153+ PALETTES.with(|palettes| {
154+ let t = t * (palettes.len() as f64);
155+ let prev_index = t.floor() as usize % palettes.len();
156+ let next_index = (prev_index + 1) % palettes.len();
157+ let t = clamp(-0.5, 0.5, (t % 1.0 - 0.5) * 5.0) + 0.5;
158+ let a = which(palettes[prev_index]);
159+ let b = which(palettes[next_index]);
160+ lerp_hsv_to_rgb(a, b, t)
161+ })
162+}
examples/moire/src/lib.rsnew file+259
@@ -0,0 +1,259 @@
1+mod colors;
2+
3+use cfg_if::cfg_if;
4+use dodrio::{bumpalo, Node, Render, RenderContext, Vdom};
5+use std::cell::RefCell;
6+use std::rc::Rc;
7+use std::str;
8+use wasm_bindgen::{prelude::*, JsCast};
9+
10+/// This is the main function that is automatically invoked when the wasm module
11+/// is loaded.
12+#[wasm_bindgen(start)]
13+pub fn run() {
14+ // Set up the panic hook for debugging when things go wrong.
15+ init_logging();
16+
17+ // Grab the document's `<body>`.
18+ let window = web_sys::window().unwrap_throw();
19+ let document = window.document().unwrap_throw();
20+ let scene = document.get_element_by_id("scene").unwrap_throw();
21+
22+ // Create a new `Moire` render component.
23+ let component = Moire::new();
24+
25+ // Create a virtual DOM and mount it and the `Moire` render component to the
26+ // scene.
27+ let vdom = Vdom::new(&scene, component);
28+
29+ // Kick off a loop that keeps re-rendering on every animation frame.
30+ let rc = <Rc<RefCell<Option<Closure<dyn FnMut()>>>>>::default();
31+ let rc2 = rc.clone();
32+ let window2 = window.clone();
33+ let weak = vdom.weak();
34+ let f = Closure::wrap(Box::new(move || {
35+ weak.schedule_render();
36+ window
37+ .request_animation_frame(
38+ rc.borrow()
39+ .as_ref()
40+ .unwrap_throw()
41+ .as_ref()
42+ .unchecked_ref::<js_sys::Function>(),
43+ )
44+ .unwrap_throw();
45+ }) as Box<dyn FnMut()>);
46+ window2
47+ .request_animation_frame(f.as_ref().unchecked_ref::<js_sys::Function>())
48+ .unwrap_throw();
49+ *rc2.borrow_mut() = Some(f);
50+
51+ // Run the virtual DOM forever and don't unmount it.
52+ vdom.forget();
53+}
54+
55+cfg_if! {
56+ if #[cfg(feature = "logging")] {
57+ fn init_logging() {
58+ console_error_panic_hook::set_once();
59+ console_log::init_with_level(log::Level::Trace)
60+ .expect_throw("should initialize logging OK");
61+ }
62+ } else {
63+ fn init_logging() {
64+ // Do nothing.
65+ }
66+ }
67+}
68+
69+/// A rendering component that renders two overlapping sets of concentric
70+/// circles that move around and form Moiré patterns.
71+///
72+/// https://en.wikipedia.org/wiki/Moir%C3%A9_pattern
73+pub struct Moire {
74+ // How many circles to render in each of our sets. This is controlled by the
75+ // `<input>` slider.
76+ count: u32,
77+}
78+
79+impl Moire {
80+ /// Construct a new `Moire` rendering component.
81+ ///
82+ /// Defaults to 200 circles.
83+ pub fn new() -> Moire {
84+ Moire { count: 200 }
85+ }
86+
87+ /// Callback for "change" events emitted on the `<input>` slider that
88+ /// controls how many circles we render on each frame.
89+ fn on_change(&mut self, event: web_sys::Event) {
90+ // Get the `<input>` element.
91+ let input = event
92+ .target()
93+ .unwrap_throw()
94+ .unchecked_into::<web_sys::HtmlInputElement>();
95+
96+ // Parse its new value.
97+ let value = input.value();
98+ let value: u32 = value
99+ .parse()
100+ .expect_throw("<input type=\"range\"> value should always be an integer");
101+
102+ // And update our circle count!
103+ self.count = value;
104+ }
105+}
106+
107+impl<'a> Render<'a> for Moire {
108+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
109+ use dodrio::builder::*;
110+
111+ let elapsed = web_sys::window()
112+ .unwrap_throw()
113+ .performance()
114+ .unwrap_throw()
115+ .now();
116+ let elapsed = elapsed / 1600.0;
117+
118+ main(&cx)
119+ .attr("style", self.moire_style(cx, elapsed))
120+ .children([
121+ // The `<input>` that lets users control how many circles to
122+ // render.
123+ input(&cx)
124+ .attr("id", "circle-count")
125+ .attr("type", "range")
126+ .attr("min", "30")
127+ .attr("max", "500")
128+ .attr("value", {
129+ let count = bumpalo::format!(in cx.bump, "{}", self.count);
130+ count.into_bump_str()
131+ })
132+ .on("change", |root, _vdom, event| {
133+ root.unwrap_mut::<Moire>().on_change(event);
134+
135+ // Note: there is no need to manually schedule a
136+ // re-render here, since we already started a
137+ // `requestAnimationFrame` loop that automatically
138+ // re-renders on every frame in the `run` function.
139+ })
140+ .finish(),
141+ // And the actual concentric circles that form the Moire patterns.
142+ self.orbiting_objects(cx, elapsed),
143+ self.lemniscate_objects(cx, elapsed),
144+ ])
145+ .finish()
146+ }
147+}
148+
149+/// Rendering helper methods.
150+impl Moire {
151+ /// Generate the main Moire element's inline CSS styles.
152+ fn moire_style<'a>(&self, cx: &mut RenderContext<'a>, elapsed: f64) -> &'a str {
153+ let elapsed = elapsed / 3.0;
154+ let color = colors::get_interpolated_color(|(_, bg)| bg, elapsed % 1.0);
155+ let style = bumpalo::format!(
156+ in cx.bump,
157+ "background-color: rgb({}, {}, {})",
158+ color.r,
159+ color.g,
160+ color.b
161+ );
162+ style.into_bump_str()
163+ }
164+
165+ /// Generate the orbiting circle objects.
166+ fn orbiting_objects<'a>(&self, cx: &mut RenderContext<'a>, elapsed: f64) -> Node<'a> {
167+ const D: f64 = 200.0;
168+ let x = elapsed.sin() * D;
169+ let y = elapsed.cos() * D;
170+ self.moving_object(cx, elapsed, x, y)
171+ }
172+
173+ /// Generate the lemniscate circle objects that interact with the orbiting
174+ /// circle objects to form Moire patterns.
175+ fn lemniscate_objects<'a>(&self, cx: &mut RenderContext<'a>, elapsed: f64) -> Node<'a> {
176+ const A: f64 = 150.0;
177+ let x = elapsed.sin() * A;
178+ let y = elapsed.sin() * elapsed.cos() * A;
179+ self.moving_object(cx, elapsed, x, y)
180+ }
181+
182+ fn moving_object<'a>(
183+ &self,
184+ cx: &mut RenderContext<'a>,
185+ elapsed: f64,
186+ x: f64,
187+ y: f64,
188+ ) -> Node<'a> {
189+ use dodrio::builder::*;
190+ div(&cx)
191+ .attr("class", "object")
192+ .attr("style", self.moving_object_style(cx, x, y))
193+ .children([self.circle(cx, elapsed, self.count)])
194+ .finish()
195+ }
196+
197+ /// Generate inline CSS styles for a moving object.
198+ fn moving_object_style<'a>(&self, cx: &mut RenderContext<'a>, x: f64, y: f64) -> &'a str {
199+ bumpalo::format!(in cx.bump, "left: {}px; top: {}px;", x, y).into_bump_str()
200+ }
201+
202+ /// Recursively generate `self.count` concentric circles.
203+ fn circle<'a>(&self, cx: &mut RenderContext<'a>, elapsed: f64, n: u32) -> Node<'a> {
204+ use dodrio::builder::*;
205+
206+ let r = n * 16;
207+
208+ let mut circle = div(&cx)
209+ .attr("class", "circle")
210+ .attr("data-radius", {
211+ let r = bumpalo::format!(in cx.bump, "{}", r);
212+ r.into_bump_str()
213+ })
214+ .attr("style", self.circle_style(cx, elapsed, n, r));
215+
216+ if n > 0 {
217+ circle = circle.child(self.circle(cx, elapsed, n - 1));
218+ }
219+
220+ circle.finish()
221+ }
222+
223+ /// Generate inline CSS styles for a circle.
224+ fn circle_style<'a>(
225+ &self,
226+ cx: &mut RenderContext<'a>,
227+ elapsed: f64,
228+ n: u32,
229+ r: u32,
230+ ) -> &'a str {
231+ let (border, alpha) = self.circle_color(elapsed, n);
232+ let margin = r / 2 + 3;
233+ let style = bumpalo::format!(
234+ in cx.bump,
235+ "border-color: rgba({}, {}, {}, {});\
236+ margin-left: -{}px;\
237+ margin-top: -{}px;\
238+ width: {}px;\
239+ height: {}px;",
240+ border.r,
241+ border.g,
242+ border.b,
243+ alpha,
244+ margin,
245+ margin,
246+ r,
247+ r
248+ );
249+ style.into_bump_str()
250+ }
251+
252+ /// Compute the color for a circle.
253+ fn circle_color(&self, elapsed: f64, n: u32) -> (colors::Rgb, f64) {
254+ let elapsed = elapsed / 3.0;
255+ let base = colors::get_interpolated_color(|(fg, _)| fg, elapsed % 1.0);
256+ let lightness = 1.0 - (n as f64) / (self.count as f64);
257+ (base, lightness)
258+ }
259+}
examples/sierpinski-triangle/Cargo.tomlnew file+28
@@ -0,0 +1,28 @@
1+[package]
2+name = "dodrio-sierpinski"
3+version = "0.1.0"
4+authors = ["Steven Seguin <steven.seguin@gmail.com>"]
5+edition = "2018"
6+
7+[lib]
8+crate-type = ["cdylib"]
9+
10+[dependencies]
11+dodrio = { path = "../.." }
12+wasm-bindgen = "0.2.55"
13+console_error_panic_hook = "0.1.6"
14+js-sys = "0.3.32"
15+wasm-bindgen-futures = "0.4.5"
16+
17+[dependencies.web-sys]
18+version = "0.3.32"
19+features = [
20+ "Document",
21+ "HtmlElement",
22+ "Node",
23+ "Performance",
24+ "Window",
25+]
26+
27+[dev-dependencies]
28+wasm-bindgen-test = "0.3.5"
examples/sierpinski-triangle/README.mdnew file+24
@@ -0,0 +1,24 @@
1+# Sierpinski Triangle
2+
3+A Sierpinkski triangle that constantly shrinks and grows, and whose nodes have
4+a value that increments by one every second.
5+
6+Ported from the React Fiber example [here](https://github.com/claudiopro/react-fiber-vs-stack-demo).
7+
8+## Source
9+
10+See `src/lib.rs`.
11+
12+## Build
13+
14+```
15+wasm-pack build --target web
16+```
17+
18+## Serve
19+
20+Use any HTTP server, for example:
21+
22+```
23+python -m SimpleHTTPServer
24+```
examples/sierpinski-triangle/ferris.pngnew file

Binary file not shown.

examples/sierpinski-triangle/index.htmlnew file+69
@@ -0,0 +1,69 @@
1+<!DOCTYPE html>
2+<html>
3+
4+<head>
5+ <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
6+ <title>Sierpinski Triangle</title>
7+ <style>
8+ .container {
9+ position: absolute;
10+ transform-origin: 0 0;
11+ left: 50%;
12+ top: 50%;
13+ width: 10px;
14+ height: 10px;
15+ background: #eee;
16+ }
17+
18+ .dot {
19+ position: absolute;
20+ background: #61dafb;
21+ font: normal 15px sans-serif;
22+ text-align: center;
23+ cursor: pointer;
24+ }
25+
26+ .dot:hover {
27+ background: url("ferris.png") no-repeat center center;
28+ z-index: 999;
29+ }
30+
31+ code {
32+ position: relative;
33+ font-size: 150%;
34+ }
35+ </style>
36+</head>
37+
38+<body>
39+ <code>FPS: <output id="fps">...</output></code>
40+ <div id="scene"></div>
41+
42+ <script type="module">
43+ import init from "./pkg/dodrio_sierpinski.js";
44+ init("./pkg/dodrio_sierpinski_bg.wasm");
45+ </script>
46+
47+ <script>
48+ let lastTime = 0;
49+ let frameCount = 0;
50+ const fps = document.getElementById('fps');
51+
52+ function updateFPS(time) {
53+ frameCount++;
54+ if (lastTime + 1000.0 <= time) {
55+ fps.textContent = frameCount;
56+ lastTime = time;
57+ frameCount = 0;
58+ }
59+ }
60+
61+ requestAnimationFrame(function loop(now) {
62+ updateFPS(now);
63+ requestAnimationFrame(loop);
64+ })
65+
66+ </script>
67+</body>
68+
69+</html>
examples/sierpinski-triangle/src/lib.rsnew file+157
@@ -0,0 +1,157 @@
1+use dodrio::{bumpalo, Node, Render, RenderContext, Vdom};
2+use std::cell::RefCell;
3+use std::rc::Rc;
4+use wasm_bindgen::{prelude::*, JsCast};
5+use web_sys::Window;
6+
7+// Triangle container defining target size.
8+struct Container {
9+ size: f64,
10+}
11+
12+impl Container {
13+ // Construct a new container.
14+ pub fn new() -> Container {
15+ Container { size: 25.0 }
16+ }
17+
18+ // Generate the container style to fluctuate triangle width.
19+ fn container_transform<'a>(&self, cx: &mut RenderContext<'a>, elapsed: f64) -> &'a str {
20+ let t = elapsed % 10.0;
21+ let scale = 0.45 + (if t > 5.0 { 10.0 - t } else { t }) / 40.0;
22+ let transform = bumpalo::format!(
23+ in cx.bump,
24+ "transform: scaleX({}) scaleY(0.7) translateZ(0.1px)",
25+ scale
26+ );
27+ transform.into_bump_str()
28+ }
29+
30+ // Generate the dot's position on the grid.
31+ fn dot_style<'a>(&self, cx: &mut RenderContext<'a>, x: f64, y: f64) -> &'a str {
32+ let s = self.size * 1.3;
33+ let radius = s / 2.0;
34+ let styles = bumpalo::format!(
35+ in cx.bump,
36+ r#"
37+ width: {}px;
38+ height: {}px;
39+ left: {}px;
40+ top: {}px;
41+ border-radius: {}px;
42+ line-height: {}px;
43+ "#,
44+ s, s, x, y, radius, s
45+ );
46+ styles.into_bump_str()
47+ }
48+
49+ // Create a dot node.
50+ fn dot<'a>(&self, cx: &mut RenderContext<'a>, x: f64, y: f64, content: u32) -> Node<'a> {
51+ use dodrio::builder::{div, text};
52+
53+ div(&cx)
54+ .attr("class", "dot")
55+ .attr("style", self.dot_style(cx, x, y))
56+ .child(text(
57+ bumpalo::format!(in cx.bump, "{}", content).into_bump_str(),
58+ ))
59+ .finish()
60+ }
61+
62+ // Create a flattened vector of dot nodes (arranged in recursive triangles)
63+ fn triangle<'a>(
64+ &self,
65+ cx: &mut RenderContext<'a>,
66+ x: f64,
67+ y: f64,
68+ s: f64,
69+ content: u32,
70+ children: &mut bumpalo::collections::Vec<Node<'a>>,
71+ ) {
72+ if s <= self.size {
73+ children.push(self.dot(cx, x, y, content));
74+ return;
75+ }
76+
77+ let s = s / 2.0;
78+
79+ // Top of triangle
80+ self.triangle(cx, x, y - (s / 2.0), s, content, children);
81+ // Bottom-left of triangle
82+ self.triangle(cx, x - s, y + (s / 2.0), s, content, children);
83+ // Bottom-right of triangle
84+ self.triangle(cx, x + s, y + (s / 2.0), s, content, children);
85+ }
86+}
87+
88+impl<'a> Render<'a> for Container {
89+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
90+ use dodrio::builder::div;
91+
92+ let elapsed = web_sys::window()
93+ .unwrap_throw()
94+ .performance()
95+ .unwrap_throw()
96+ .now()
97+ / 1000.0;
98+
99+ let modulus = elapsed as u32 % 10;
100+
101+ let mut children = bumpalo::collections::Vec::new_in(cx.bump);
102+ self.triangle(cx, 0.0, 0.0, 1000.0, modulus, &mut children);
103+
104+ div(&cx)
105+ .attr("class", "container")
106+ .attr("style", self.container_transform(cx, elapsed))
107+ .children(children)
108+ .finish()
109+ }
110+}
111+
112+// Kick off a loop that keeps re-rendering on every animation frame.
113+fn animate(window: Window, vdom: Vdom) {
114+ let rc = <Rc<RefCell<Option<Closure<dyn FnMut()>>>>>::default();
115+ let rc2 = rc.clone();
116+ let window2 = window.clone();
117+ let weak = vdom.weak();
118+ let f = Closure::wrap(Box::new(move || {
119+ weak.schedule_render();
120+ window
121+ .request_animation_frame(
122+ rc.borrow()
123+ .as_ref()
124+ .unwrap_throw()
125+ .as_ref()
126+ .unchecked_ref::<js_sys::Function>(),
127+ )
128+ .unwrap_throw();
129+ }) as Box<dyn FnMut()>);
130+ window2
131+ .request_animation_frame(f.as_ref().unchecked_ref::<js_sys::Function>())
132+ .unwrap_throw();
133+ *rc2.borrow_mut() = Some(f);
134+
135+ // Run the virtual DOM and its listeners forever.
136+ vdom.forget();
137+}
138+
139+#[wasm_bindgen(start)]
140+pub fn run() {
141+ // Set up the panic hook
142+ console_error_panic_hook::set_once();
143+
144+ // Get the scene element to render within
145+ let window = web_sys::window().unwrap();
146+ let document = window.document().unwrap();
147+ let scene = document.get_element_by_id("scene").unwrap();
148+
149+ // Construct a new Container component.
150+ let container = Container::new();
151+
152+ // Mount our container component to the scene div.
153+ let vdom = Vdom::new(&scene, container);
154+
155+ // Kick off animation loop
156+ animate(window, vdom);
157+}
examples/todomvc/Cargo.tomlnew file+47
@@ -0,0 +1,47 @@
1+[package]
2+authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
3+edition = "2018"
4+name = "dodrio-todomvc"
5+version = "0.1.0"
6+
7+[dependencies]
8+cfg-if = "0.1.10"
9+dodrio = { path = "../..", features = ["serde"] }
10+js-sys = "0.3.32"
11+serde = { features = ["derive"], version = "1.0.114" }
12+serde_json = "1.0.57"
13+wasm-bindgen = "0.2.55"
14+wasm-bindgen-futures = "0.4.5"
15+
16+# Optional dependencies for logging.
17+console_error_panic_hook = { optional = true, version = "0.1.6" }
18+console_log = { optional = true, version = "0.2.0" }
19+log = { optional = true, version = "0.4.11" }
20+
21+[dependencies.web-sys]
22+version = "0.3.32"
23+features = [
24+ "Document",
25+ "Event",
26+ "EventTarget",
27+ "HtmlElement",
28+ "HtmlInputElement",
29+ "KeyboardEvent",
30+ "Location",
31+ "Storage",
32+ "Node",
33+ "Window",
34+]
35+
36+[dev-dependencies]
37+wasm-bindgen-test = "0.3.5"
38+
39+[features]
40+logging = [
41+ "console_log",
42+ "console_error_panic_hook",
43+ "log",
44+]
45+
46+[lib]
47+crate-type = ["cdylib"]
examples/todomvc/README.mdnew file+33
@@ -0,0 +1,33 @@
1+# TodoMVC
2+
3+`dodrio` implementation of the popular [TodoMVC](http://todomvc.com/) app. It
4+correctly and completely fulfills [the
5+specification](https://github.com/tastejs/todomvc/blob/master/app-spec.md) to
6+the best of my knowledge.
7+
8+## Source
9+
10+There are a number of modules in this `dodrio` implementation of TodoMVC. The
11+most important are:
12+
13+* `src/lib.rs`: The entry point to the application.
14+* `src/todos.rs`: Definition of `Todos` model and its rendering.
15+* `src/todo.rs`: Definition of `Todo` model and its rendering.
16+* `src/controller.rs`: The controller handles UI interactions and translates
17+ them into updates on the model. Finally, it triggers re-rendering after those
18+ updates.
19+* `src/router.rs`: A simple URL hash-based router.
20+
21+## Build
22+
23+```
24+wasm-pack build --target web
25+```
26+
27+## Serve
28+
29+Use any HTTP server, for example:
30+
31+```
32+python -m SimpleHTTPServer
33+```
examples/todomvc/index.htmlnew file+21
@@ -0,0 +1,21 @@
1+<!doctype html>
2+<html lang="en">
3+ <head>
4+ <meta charset="utf-8">
5+ <meta name="viewport" content="width=device-width, initial-scale=1">
6+ <title>dodrio • TodoMVC</title>
7+ <link rel="stylesheet" href="https://unpkg.com/todomvc-common@^1.0.0/base.css">
8+ <link rel="stylesheet" href="https://unpkg.com/todomvc-app-css@^2.0.0/index.css">
9+ </head>
10+ <body>
11+ <section class="todoapp">
12+ </section>
13+ <footer class="info">
14+ <p>Double-click to edit a todo</p>
15+ </footer>
16+ <script type="module">
17+ import init from "./pkg/dodrio_todomvc.js";
18+ init("./pkg/dodrio_todomvc_bg.wasm");
19+ </script>
20+ </body>
21+</html>
examples/todomvc/src/controller.rsnew file+140
@@ -0,0 +1,140 @@
1+//! The controller handles UI events, translates them into updates on the model,
2+//! and schedules re-renders.
3+
4+use crate::todo::{Todo, TodoActions};
5+use crate::todos::{Todos, TodosActions};
6+use crate::visibility::Visibility;
7+use dodrio::{RootRender, VdomWeak};
8+use serde::{Deserialize, Serialize};
9+use std::ops::{Deref, DerefMut};
10+
11+/// The controller for the TodoMVC app.
12+///
13+/// This `Controller` struct is never actually instantiated. It is only used for
14+/// its `*Actions` trait implementations, none of which take a `self` parameter.
15+///
16+/// One could imagine alternative controller implementations with `*Actions`
17+/// trait implementations for (e.g.) testing that will assert various expected
18+/// action methods are called after rendering todo items and sending DOM events.
19+#[derive(Default, Deserialize, Serialize)]
20+pub struct Controller;
21+
22+impl TodosActions for Controller {
23+ fn toggle_all(root: &mut dyn RootRender, vdom: VdomWeak) {
24+ let mut todos = AutoCommitTodos::new(root, vdom);
25+ let all_complete = todos.todos().iter().all(|t| t.is_complete());
26+ for t in todos.todos_mut() {
27+ t.set_complete(!all_complete);
28+ }
29+ }
30+
31+ fn update_draft(root: &mut dyn RootRender, vdom: VdomWeak, draft: String) {
32+ let mut todos = AutoCommitTodos::new(root, vdom);
33+ todos.set_draft(draft);
34+ }
35+
36+ fn finish_draft(root: &mut dyn RootRender, vdom: VdomWeak) {
37+ let mut todos = AutoCommitTodos::new(root, vdom);
38+ let title = todos.take_draft();
39+ let title = title.trim();
40+ if !title.is_empty() {
41+ let id = todos.todos().len();
42+ let new = Todo::new(id, title);
43+ todos.add_todo(new);
44+ }
45+ }
46+
47+ fn change_visibility(root: &mut dyn RootRender, vdom: VdomWeak, vis: Visibility) {
48+ let mut todos = AutoCommitTodos::new(root, vdom);
49+ todos.set_visibility(vis);
50+ }
51+
52+ fn delete_completed(root: &mut dyn RootRender, vdom: VdomWeak) {
53+ let mut todos = AutoCommitTodos::new(root, vdom);
54+ todos.delete_completed();
55+ }
56+}
57+
58+impl TodoActions for Controller {
59+ fn toggle_completed(root: &mut dyn RootRender, vdom: VdomWeak, id: usize) {
60+ let mut todos = AutoCommitTodos::new(root, vdom);
61+ let t = &mut todos.todos_mut()[id];
62+ let completed = t.is_complete();
63+ t.set_complete(!completed);
64+ }
65+
66+ fn delete(root: &mut dyn RootRender, vdom: VdomWeak, id: usize) {
67+ let mut todos = AutoCommitTodos::new(root, vdom);
68+ todos.delete_todo(id);
69+ }
70+
71+ fn begin_editing(root: &mut dyn RootRender, vdom: VdomWeak, id: usize) {
72+ let mut todos = AutoCommitTodos::new(root, vdom);
73+ let t = &mut todos.todos_mut()[id];
74+ let desc = t.title().to_string();
75+ t.set_edits(Some(desc));
76+ }
77+
78+ fn update_edits(root: &mut dyn RootRender, vdom: VdomWeak, id: usize, edits: String) {
79+ let mut todos = AutoCommitTodos::new(root, vdom);
80+ let t = &mut todos.todos_mut()[id];
81+ t.set_edits(Some(edits));
82+ }
83+
84+ fn finish_edits(root: &mut dyn RootRender, vdom: VdomWeak, id: usize) {
85+ let mut todos = AutoCommitTodos::new(root, vdom);
86+ let t = &mut todos.todos_mut()[id];
87+ if let Some(edits) = t.take_edits() {
88+ let edits = edits.trim();
89+ if edits.is_empty() {
90+ todos.delete_todo(id);
91+ } else {
92+ t.set_title(edits);
93+ }
94+ }
95+ }
96+
97+ fn cancel_edits(root: &mut dyn RootRender, vdom: VdomWeak, id: usize) {
98+ let mut todos = AutoCommitTodos::new(root, vdom);
99+ let t = &mut todos.todos_mut()[id];
100+ let _ = t.take_edits();
101+ }
102+}
103+
104+/// An RAII type that dereferences to a `Todos` and once it is dropped, saves
105+/// the (presumably just modified) todos to local storage, and schedules a new
106+/// `dodrio` render.
107+pub struct AutoCommitTodos<'a> {
108+ todos: &'a mut Todos,
109+ vdom: VdomWeak,
110+}
111+
112+impl AutoCommitTodos<'_> {
113+ /// Construct a new `AutoCommitTodos` from the root rendering component and
114+ /// `vdom` handle.
115+ pub fn new(root: &mut dyn RootRender, vdom: VdomWeak) -> AutoCommitTodos {
116+ let todos = root.unwrap_mut::<Todos>();
117+ AutoCommitTodos { todos, vdom }
118+ }
119+}
120+
121+impl Drop for AutoCommitTodos<'_> {
122+ fn drop(&mut self) {
123+ self.todos.save_to_local_storage();
124+ self.vdom.schedule_render();
125+ }
126+}
127+
128+impl Deref for AutoCommitTodos<'_> {
129+ type Target = Todos;
130+
131+ fn deref(&self) -> &Todos {
132+ &self.todos
133+ }
134+}
135+
136+impl DerefMut for AutoCommitTodos<'_> {
137+ fn deref_mut(&mut self) -> &mut Todos {
138+ &mut self.todos
139+ }
140+}
examples/todomvc/src/keys.rsnew file+7
@@ -0,0 +1,7 @@
1+//! Constants for `KeyboardEvent::key_code`.`
2+
3+/// The key code for the enter key.
4+pub const ENTER: u32 = 13;
5+
6+/// The key code for the escape key.
7+pub const ESCAPE: u32 = 27;
examples/todomvc/src/lib.rsnew file+60
@@ -0,0 +1,60 @@
1+//! TodoMVC implemented in `dodrio`!
2+
3+#![deny(missing_docs)]
4+
5+pub mod controller;
6+pub mod keys;
7+pub mod router;
8+pub mod todo;
9+pub mod todos;
10+pub mod utils;
11+pub mod visibility;
12+
13+use crate::controller::Controller;
14+use crate::todos::Todos;
15+use dodrio::Vdom;
16+use wasm_bindgen::prelude::*;
17+
18+/// Run the TodoMVC app!
19+///
20+/// Since this is marked `#[wasm_bindgen(start)]` it is automatically invoked
21+/// once the wasm module instantiated on the Web page.
22+#[wasm_bindgen(start)]
23+pub fn run() -> Result<(), JsValue> {
24+ // Set up the logging for debugging if/when things go wrong.
25+ init_logging();
26+
27+ // Grab the todo app container.
28+ let document = utils::document();
29+ let container = document
30+ .query_selector(".todoapp")?
31+ .ok_or_else(|| js_sys::Error::new("could not find `.todoapp` container"))?;
32+
33+ // Create a new `Todos` render component.
34+ let todos = Todos::<Controller>::new();
35+
36+ // Create a virtual DOM and mount it and the `Todos` render component.
37+ let vdom = Vdom::new(&container, todos);
38+
39+ // Start the URL router.
40+ router::start(vdom.weak());
41+
42+ // Run the virtual DOM forever and don't unmount it.
43+ vdom.forget();
44+
45+ Ok(())
46+}
47+
48+cfg_if::cfg_if! {
49+ if #[cfg(feature = "logging")] {
50+ fn init_logging() {
51+ console_error_panic_hook::set_once();
52+ console_log::init_with_level(log::Level::Trace)
53+ .expect_throw("should initialize logging OK");
54+ }
55+ } else {
56+ fn init_logging() {
57+ // Do nothing.
58+ }
59+ }
60+}
examples/todomvc/src/router.rsnew file+68
@@ -0,0 +1,68 @@
1+//! A simple `#`-fragment router.
2+
3+use crate::todos::Todos;
4+use crate::utils;
5+use crate::visibility::Visibility;
6+use dodrio::VdomWeak;
7+use std::str::FromStr;
8+use wasm_bindgen::{prelude::*, JsCast};
9+
10+/// Start the router.
11+pub fn start(vdom: VdomWeak) {
12+ // Callback fired whenever the URL's hash fragment changes. Keeps the root
13+ // todos collection's visibility in sync with the `#` fragment.
14+ let on_hash_change = move || {
15+ let new_vis = utils::hash()
16+ .and_then(|hash| {
17+ if hash.starts_with("#/") {
18+ Visibility::from_str(&hash[2..]).ok()
19+ } else {
20+ None
21+ }
22+ })
23+ .unwrap_or_else(|| {
24+ // If we couldn't parse a visibility, make sure we canonicalize
25+ // it back to our default hash.
26+ let v = Visibility::default();
27+ utils::set_hash(&format!("#/{}", v));
28+ v
29+ });
30+
31+ wasm_bindgen_futures::spawn_local({
32+ let vdom = vdom.clone();
33+ async move {
34+ let _ = vdom
35+ .with_component({
36+ let vdom = vdom.clone();
37+ move |root| {
38+ let todos = root.unwrap_mut::<Todos>();
39+ // If the todos' visibility already matches the event's
40+ // visibility, then there is nothing to do (ha). If they
41+ // don't match, then we need to update the todos' visibility
42+ // and re-render.
43+ if todos.visibility() != new_vis {
44+ todos.set_visibility(new_vis);
45+ vdom.schedule_render();
46+ }
47+ }
48+ })
49+ .await;
50+ }
51+ });
52+ };
53+
54+ // Call it once to handle the initial `#` fragment.
55+ on_hash_change();
56+
57+ // Now listen for hash changes forever.
58+ //
59+ // Note that if we ever intended to unmount our todos app, we would want to
60+ // provide a method for removing this router's event listener and cleaning
61+ // up after ourselves.
62+ let on_hash_change = Closure::wrap(Box::new(on_hash_change) as Box<dyn FnMut()>);
63+ let window = utils::window();
64+ window
65+ .add_event_listener_with_callback("hashchange", on_hash_change.as_ref().unchecked_ref())
66+ .unwrap_throw();
67+ on_hash_change.forget();
68+}
examples/todomvc/src/todo.rsnew file+229
@@ -0,0 +1,229 @@
1+//! Type definition and `dodrio::Render` implementation for a single todo item.
2+
3+use crate::keys;
4+use dodrio::{Cached, Node, Render, RenderContext, RootRender, VdomWeak};
5+use serde::{Deserialize, Serialize};
6+use std::marker::PhantomData;
7+use wasm_bindgen::{prelude::*, JsCast};
8+
9+/// A single todo item.
10+#[derive(Default)]
11+pub struct Todo<C> {
12+ inner: Cached<TodoInner<C>>,
13+}
14+
15+#[derive(Serialize, Deserialize)]
16+struct TodoInner<C> {
17+ id: usize,
18+ title: String,
19+ completed: bool,
20+
21+ #[serde(skip)]
22+ edits: Option<String>,
23+
24+ #[serde(skip)]
25+ _controller: PhantomData<C>,
26+}
27+
28+/// Actions on a single todo item that can be triggered from the UI.
29+pub trait TodoActions {
30+ /// Toggle the completion state of the todo item with the given id.
31+ fn toggle_completed(root: &mut dyn RootRender, vdom: VdomWeak, id: usize);
32+
33+ /// Delete the todo item with the given id.
34+ fn delete(root: &mut dyn RootRender, vdom: VdomWeak, id: usize);
35+
36+ /// Begin editing the todo item with the given id.
37+ fn begin_editing(root: &mut dyn RootRender, vdom: VdomWeak, id: usize);
38+
39+ /// Update the edits for the todo with the given id.
40+ fn update_edits(root: &mut dyn RootRender, vdom: VdomWeak, id: usize, edits: String);
41+
42+ /// Finish editing the todo with the given id.
43+ fn finish_edits(root: &mut dyn RootRender, vdom: VdomWeak, id: usize);
44+
45+ /// Cancel editing the todo with the given id.
46+ fn cancel_edits(root: &mut dyn RootRender, vdom: VdomWeak, id: usize);
47+}
48+
49+impl<C> Todo<C> {
50+ /// Construct a new `Todo` with the given identifier and title.
51+ pub fn new<S: Into<String>>(id: usize, title: S) -> Self {
52+ let title = title.into();
53+ let completed = false;
54+ let edits = None;
55+ Todo {
56+ inner: Cached::new(TodoInner {
57+ id,
58+ title,
59+ completed,
60+ edits,
61+ _controller: PhantomData,
62+ }),
63+ }
64+ }
65+
66+ /// Set this todo item's id.
67+ pub fn set_id(&mut self, id: usize) {
68+ if id != self.inner.id {
69+ Cached::invalidate(&self.inner);
70+ }
71+ self.inner.id = id;
72+ }
73+
74+ /// Is this `Todo` complete?
75+ pub fn is_complete(&self) -> bool {
76+ self.inner.completed
77+ }
78+
79+ /// Mark the `Todo` as complete or not.
80+ pub fn set_complete(&mut self, to: bool) {
81+ if to != self.inner.completed {
82+ Cached::invalidate(&self.inner);
83+ }
84+ self.inner.completed = to;
85+ }
86+
87+ /// Get this todo's title.
88+ pub fn title(&self) -> &str {
89+ &self.inner.title
90+ }
91+
92+ /// Set this todo item's title.
93+ pub fn set_title<S: Into<String>>(&mut self, title: S) {
94+ let title = title.into();
95+ if title != self.inner.title {
96+ Cached::invalidate(&self.inner);
97+ }
98+ self.inner.title = title;
99+ }
100+
101+ /// Set the edits for this todo.
102+ pub fn set_edits<S: Into<String>>(&mut self, edits: Option<S>) {
103+ let edits = edits.map(Into::into);
104+ if edits != self.inner.edits {
105+ Cached::invalidate(&self.inner);
106+ }
107+ self.inner.edits = edits;
108+ }
109+
110+ /// Take this todo's edits, leaving `None` in their place.
111+ pub fn take_edits(&mut self) -> Option<String> {
112+ if self.inner.edits.is_some() {
113+ Cached::invalidate(&self.inner);
114+ }
115+ self.inner.edits.take()
116+ }
117+}
118+
119+impl<'a, C: TodoActions> Render<'a> for Todo<C> {
120+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
121+ use dodrio::{
122+ builder::*,
123+ bumpalo::{self, collections::String},
124+ };
125+
126+ let id = self.inner.id;
127+ let title = self.inner.edits.as_ref().unwrap_or(&self.inner.title);
128+ let title = bumpalo::format!(in cx.bump, "{}", title).into_bump_str();
129+
130+ li(&cx)
131+ .attr("class", {
132+ let mut class = String::new_in(cx.bump);
133+ if self.inner.completed {
134+ class.push_str("completed ");
135+ }
136+ if self.inner.edits.is_some() {
137+ class.push_str("editing");
138+ }
139+ class.into_bump_str()
140+ })
141+ .children([
142+ div(&cx)
143+ .attr("class", "view")
144+ .children([
145+ input(&cx)
146+ .attr("class", "toggle")
147+ .attr("type", "checkbox")
148+ .bool_attr("checked", self.inner.completed)
149+ .on("click", move |root, vdom, _event| {
150+ C::toggle_completed(root, vdom, id);
151+ })
152+ .finish(),
153+ label(&cx)
154+ .on("dblclick", move |root, vdom, _event| {
155+ C::begin_editing(root, vdom, id);
156+ })
157+ .children([text(title)])
158+ .finish(),
159+ button(&cx)
160+ .attr("class", "destroy")
161+ .on("click", move |root, vdom, _event| {
162+ C::delete(root, vdom, id);
163+ })
164+ .finish(),
165+ ])
166+ .finish(),
167+ input(&cx)
168+ .attr("class", "edit")
169+ .attr("value", title)
170+ .attr("name", "title")
171+ .attr(
172+ "id",
173+ bumpalo::format!(in cx.bump, "todo-{}", id).into_bump_str(),
174+ )
175+ .on("input", move |root, vdom, event| {
176+ let input = event
177+ .target()
178+ .unwrap_throw()
179+ .unchecked_into::<web_sys::HtmlInputElement>();
180+ C::update_edits(root, vdom, id, input.value());
181+ })
182+ .on("blur", move |root, vdom, _event| {
183+ C::finish_edits(root, vdom, id);
184+ })
185+ .on("keydown", move |root, vdom, event| {
186+ let event = event.unchecked_into::<web_sys::KeyboardEvent>();
187+ match event.key_code() {
188+ keys::ENTER => C::finish_edits(root, vdom, id),
189+ keys::ESCAPE => C::cancel_edits(root, vdom, id),
190+ _ => {}
191+ }
192+ })
193+ .finish(),
194+ ])
195+ .finish()
196+ }
197+}
198+
199+impl<C> Default for TodoInner<C> {
200+ fn default() -> Self {
201+ TodoInner {
202+ id: Default::default(),
203+ title: Default::default(),
204+ completed: Default::default(),
205+ edits: Default::default(),
206+ _controller: PhantomData,
207+ }
208+ }
209+}
210+
211+impl<C> serde::Serialize for Todo<C> {
212+ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
213+ where
214+ S: serde::Serializer,
215+ {
216+ self.inner.serialize(serializer)
217+ }
218+}
219+
220+impl<'de, C> Deserialize<'de> for Todo<C> {
221+ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
222+ where
223+ D: serde::Deserializer<'de>,
224+ {
225+ Ok(Todo {
226+ inner: <Cached<TodoInner<C>>>::deserialize(deserializer)?,
227+ })
228+ }
229+}
examples/todomvc/src/todos.rsnew file+300
@@ -0,0 +1,300 @@
1+//! Type definitions and `dodrio::Render` implementation for a collection of
2+//! todo items.
3+
4+use crate::controller::Controller;
5+use crate::todo::{Todo, TodoActions};
6+use crate::visibility::Visibility;
7+use crate::{keys, utils};
8+use dodrio::{bumpalo, Node, Render, RenderContext, RootRender, VdomWeak};
9+use serde::{Deserialize, Serialize};
10+use std::marker::PhantomData;
11+use std::mem;
12+use wasm_bindgen::{prelude::*, JsCast};
13+
14+/// A collection of todos.
15+#[derive(Default, Serialize, Deserialize)]
16+#[serde(rename = "todos-dodrio", bound = "")]
17+pub struct Todos<C = Controller> {
18+ todos: Vec<Todo<C>>,
19+
20+ #[serde(skip)]
21+ draft: String,
22+
23+ #[serde(skip)]
24+ visibility: Visibility,
25+
26+ #[serde(skip)]
27+ _controller: PhantomData<C>,
28+}
29+
30+/// Actions for `Todos` that can be triggered by UI interactions.
31+pub trait TodosActions: 'static + TodoActions {
32+ /// Toggle the completion state of all todo items.
33+ fn toggle_all(root: &mut dyn RootRender, vdom: VdomWeak);
34+
35+ /// Update the draft todo item's text.
36+ fn update_draft(root: &mut dyn RootRender, vdom: VdomWeak, draft: String);
37+
38+ /// Finish the current draft todo item and add it to the collection of
39+ /// todos.
40+ fn finish_draft(root: &mut dyn RootRender, vdom: VdomWeak);
41+
42+ /// Change the todo item visibility filtering to the given `Visibility`.
43+ fn change_visibility(root: &mut dyn RootRender, vdom: VdomWeak, vis: Visibility);
44+
45+ /// Delete all completed todo items.
46+ fn delete_completed(root: &mut dyn RootRender, vdom: VdomWeak);
47+}
48+
49+impl<C> Todos<C> {
50+ /// Construct a new todos set.
51+ ///
52+ /// If an existing set is available in local storage, then use that,
53+ /// otherwise create a new set.
54+ pub fn new() -> Self
55+ where
56+ C: Default,
57+ {
58+ Self::from_local_storage().unwrap_or_default()
59+ }
60+
61+ /// Deserialize a set of todos from local storage.
62+ pub fn from_local_storage() -> Option<Self> {
63+ utils::local_storage()
64+ .get("todomvc-dodrio")
65+ .ok()
66+ .and_then(|opt| opt)
67+ .and_then(|json| serde_json::from_str(&json).ok())
68+ }
69+
70+ /// Serialize this set of todos to local storage.
71+ pub fn save_to_local_storage(&self) {
72+ let serialized = serde_json::to_string(self).unwrap_throw();
73+ utils::local_storage()
74+ .set("todomvc-dodrio", &serialized)
75+ .unwrap_throw();
76+ }
77+
78+ /// Add a new todo item to this collection.
79+ pub fn add_todo(&mut self, todo: Todo<C>) {
80+ self.todos.push(todo);
81+ }
82+
83+ /// Delete the todo with the given id.
84+ pub fn delete_todo(&mut self, id: usize) {
85+ self.todos.remove(id);
86+ self.fix_ids();
87+ }
88+
89+ /// Delete all completed todo items.
90+ pub fn delete_completed(&mut self) {
91+ self.todos.retain(|t| !t.is_complete());
92+ self.fix_ids();
93+ }
94+
95+ // Fix all todo identifiers so that they match their index once again.
96+ fn fix_ids(&mut self) {
97+ for (id, todo) in self.todos.iter_mut().enumerate() {
98+ todo.set_id(id);
99+ }
100+ }
101+
102+ /// Get a shared slice of the underlying set of todo items.
103+ pub fn todos(&self) -> &[Todo<C>] {
104+ &self.todos
105+ }
106+
107+ /// Get an exclusive slice of the underlying set of todo items.
108+ pub fn todos_mut(&mut self) -> &mut [Todo<C>] {
109+ &mut self.todos
110+ }
111+
112+ /// Set the draft todo item text.
113+ pub fn set_draft<S: Into<String>>(&mut self, draft: S) {
114+ self.draft = draft.into();
115+ }
116+
117+ /// Take the current draft text and replace it with an empty string.
118+ pub fn take_draft(&mut self) -> String {
119+ mem::replace(&mut self.draft, String::new())
120+ }
121+
122+ /// Get the current visibility for these todos.
123+ pub fn visibility(&self) -> Visibility {
124+ self.visibility
125+ }
126+
127+ /// Set the visibility for these todoS.
128+ pub fn set_visibility(&mut self, vis: Visibility) {
129+ self.visibility = vis;
130+ }
131+}
132+
133+/// Rendering helpers.
134+impl<C: TodosActions> Todos<C> {
135+ fn header<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
136+ use dodrio::builder::*;
137+
138+ header(&cx)
139+ .attr("class", "header")
140+ .children([
141+ h1(&cx).children([text("todos")]).finish(),
142+ input(&cx)
143+ .on("input", |root, vdom, event| {
144+ let input = event
145+ .target()
146+ .unwrap_throw()
147+ .unchecked_into::<web_sys::HtmlInputElement>();
148+ C::update_draft(root, vdom, input.value());
149+ })
150+ .on("keydown", |root, vdom, event| {
151+ let event = event.unchecked_into::<web_sys::KeyboardEvent>();
152+ if event.key_code() == keys::ENTER {
153+ C::finish_draft(root, vdom);
154+ }
155+ })
156+ .attr("class", "new-todo")
157+ .attr("placeholder", "What needs to be done?")
158+ .attr("autofocus", "")
159+ .attr(
160+ "value",
161+ bumpalo::format!(in cx.bump, "{}", self.draft).into_bump_str(),
162+ )
163+ .finish(),
164+ ])
165+ .finish()
166+ }
167+
168+ fn todos_list<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
169+ use dodrio::{builder::*, bumpalo::collections::Vec};
170+
171+ let mut todos = Vec::with_capacity_in(self.todos.len(), cx.bump);
172+ todos.extend(
173+ self.todos
174+ .iter()
175+ .filter(|t| match self.visibility {
176+ Visibility::All => true,
177+ Visibility::Active => !t.is_complete(),
178+ Visibility::Completed => t.is_complete(),
179+ })
180+ .map(|t| t.render(cx)),
181+ );
182+
183+ section(&cx)
184+ .attr("class", "main")
185+ .attr(
186+ "visibility",
187+ if self.todos.is_empty() {
188+ "hidden"
189+ } else {
190+ "visible"
191+ },
192+ )
193+ .children([
194+ input(&cx)
195+ .attr("class", "toggle-all")
196+ .attr("id", "toggle-all")
197+ .attr("type", "checkbox")
198+ .attr("name", "toggle")
199+ .bool_attr("checked", self.todos.iter().all(|t| t.is_complete()))
200+ .on("click", |root, vdom, _event| {
201+ C::toggle_all(root, vdom);
202+ })
203+ .finish(),
204+ label(&cx)
205+ .attr("for", "toggle-all")
206+ .children([text("Mark all as complete")])
207+ .finish(),
208+ ul(&cx).attr("class", "todo-list").children(todos).finish(),
209+ ])
210+ .finish()
211+ }
212+
213+ fn footer<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
214+ use dodrio::builder::*;
215+
216+ let completed_count = self.todos.iter().filter(|t| t.is_complete()).count();
217+ let incomplete_count = self.todos.len() - completed_count;
218+ let items_left = if incomplete_count == 1 {
219+ " item left"
220+ } else {
221+ " items left"
222+ };
223+ let incomplete_count = bumpalo::format!(in cx.bump, "{}", incomplete_count);
224+
225+ let clear_completed_text = bumpalo::format!(
226+ in cx.bump,
227+ "Clear completed ({})",
228+ self.todos.iter().filter(|t| t.is_complete()).count()
229+ );
230+
231+ footer(&cx)
232+ .attr("class", "footer")
233+ .bool_attr("hidden", self.todos.is_empty())
234+ .children([
235+ span(&cx)
236+ .attr("class", "todo-count")
237+ .children([
238+ strong(&cx)
239+ .children([text(incomplete_count.into_bump_str())])
240+ .finish(),
241+ text(items_left),
242+ ])
243+ .finish(),
244+ ul(&cx)
245+ .attr("class", "filters")
246+ .children([
247+ self.visibility_swap(cx, "#/", Visibility::All),
248+ self.visibility_swap(cx, "#/active", Visibility::Active),
249+ self.visibility_swap(cx, "#/completed", Visibility::Completed),
250+ ])
251+ .finish(),
252+ button(&cx)
253+ .on("click", |root, vdom, _event| {
254+ C::delete_completed(root, vdom);
255+ })
256+ .attr("class", "clear-completed")
257+ .bool_attr("hidden", completed_count == 0)
258+ .children([text(clear_completed_text.into_bump_str())])
259+ .finish(),
260+ ])
261+ .finish()
262+ }
263+
264+ fn visibility_swap<'a>(
265+ &self,
266+ cx: &mut RenderContext<'a>,
267+ url: &'static str,
268+ target_vis: Visibility,
269+ ) -> Node<'a> {
270+ use dodrio::builder::*;
271+
272+ li(&cx)
273+ .on("click", move |root, vdom, _event| {
274+ C::change_visibility(root, vdom, target_vis);
275+ })
276+ .children([a(&cx)
277+ .attr("href", url)
278+ .attr(
279+ "class",
280+ if self.visibility == target_vis {
281+ "selected"
282+ } else {
283+ ""
284+ },
285+ )
286+ .children([text(target_vis.label())])
287+ .finish()])
288+ .finish()
289+ }
290+}
291+
292+impl<'a, C: TodosActions> Render<'a> for Todos<C> {
293+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
294+ use dodrio::builder::*;
295+
296+ div(&cx)
297+ .children([self.header(cx), self.todos_list(cx), self.footer(cx)])
298+ .finish()
299+ }
300+}
examples/todomvc/src/utils.rsnew file+32
@@ -0,0 +1,32 @@
1+//! Small utility functions.
2+
3+use wasm_bindgen::UnwrapThrowExt;
4+
5+/// Get the top-level window.
6+pub fn window() -> web_sys::Window {
7+ web_sys::window().unwrap_throw()
8+}
9+
10+/// Get the current location hash, if any.
11+pub fn hash() -> Option<String> {
12+ window()
13+ .location()
14+ .hash()
15+ .ok()
16+ .and_then(|h| if h.is_empty() { None } else { Some(h) })
17+}
18+
19+/// Set the current location hash.
20+pub fn set_hash(hash: &str) {
21+ window().location().set_hash(hash).unwrap_throw();
22+}
23+
24+/// Get the top-level document.
25+pub fn document() -> web_sys::Document {
26+ window().document().unwrap_throw()
27+}
28+
29+/// Get the top-level window's local storage.
30+pub fn local_storage() -> web_sys::Storage {
31+ window().local_storage().unwrap_throw().unwrap_throw()
32+}
examples/todomvc/src/visibility.rsnew file+51
@@ -0,0 +1,51 @@
1+//! Visibility filtering.
2+
3+use std::fmt;
4+use std::str::FromStr;
5+
6+/// The visibility filtering for todo items.
7+#[derive(Clone, Copy, Eq, PartialEq)]
8+pub enum Visibility {
9+ /// Show all todos.
10+ All,
11+ /// Show only active, incomplete todos.
12+ Active,
13+ /// Show only inactive, completed todos.
14+ Completed,
15+}
16+
17+impl Default for Visibility {
18+ fn default() -> Visibility {
19+ Visibility::All
20+ }
21+}
22+
23+impl FromStr for Visibility {
24+ type Err = ();
25+
26+ fn from_str(s: &str) -> Result<Self, Self::Err> {
27+ match s {
28+ "all" => Ok(Visibility::All),
29+ "active" => Ok(Visibility::Active),
30+ "completed" => Ok(Visibility::Completed),
31+ _ => Err(()),
32+ }
33+ }
34+}
35+
36+impl fmt::Display for Visibility {
37+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
38+ write!(f, "{}", self.label().to_lowercase())
39+ }
40+}
41+
42+impl Visibility {
43+ /// Get a string label for this visibility.
44+ pub fn label(self) -> &'static str {
45+ match self {
46+ Visibility::All => "All",
47+ Visibility::Active => "Active",
48+ Visibility::Completed => "Completed",
49+ }
50+ }
51+}
js/change-list-interpreter.jsnew file+377
@@ -0,0 +1,377 @@
1+const decoder = new TextDecoder();
2+
3+function top(stack) {
4+ return stack[stack.length - 1];
5+}
6+
7+function string(mem, pointer, length) {
8+ const buf = mem.subarray(pointer, pointer + length);
9+ return decoder.decode(buf);
10+}
11+
12+const OP_TABLE = [
13+ // 0
14+ function setText(interpreter, mem8, mem32, i) {
15+ const pointer = mem32[i++];
16+ const length = mem32[i++];
17+ const str = string(mem8, pointer, length);
18+ top(interpreter.stack).textContent = str;
19+ return i;
20+ },
21+
22+ // 1
23+ function removeSelfAndNextSiblings(interpreter, mem8, mem32, i) {
24+ const node = interpreter.stack.pop();
25+ let sibling = node.nextSibling;
26+ while (sibling) {
27+ const temp = sibling.nextSibling;
28+ sibling.remove();
29+ sibling = temp;
30+ }
31+ node.remove();
32+ return i;
33+ },
34+
35+ // 2
36+ function replaceWith(interpreter, mem8, mem32, i) {
37+ const newNode = interpreter.stack.pop();
38+ const oldNode = interpreter.stack.pop();
39+ oldNode.replaceWith(newNode);
40+ interpreter.stack.push(newNode);
41+ return i;
42+ },
43+
44+ // 3
45+ function setAttribute(interpreter, mem8, mem32, i) {
46+ const nameId = mem32[i++];
47+ const valueId = mem32[i++];
48+ const name = interpreter.getCachedString(nameId);
49+ const value = interpreter.getCachedString(valueId);
50+ const node = top(interpreter.stack);
51+ node.setAttribute(name, value);
52+
53+ // Some attributes are "volatile" and don't work through `setAttribute`.
54+ if (name === "value") {
55+ node.value = value;
56+ }
57+ if (name === "checked") {
58+ node.checked = true;
59+ }
60+ if (name === "selected") {
61+ node.selected = true;
62+ }
63+
64+ return i;
65+ },
66+
67+ // 4
68+ function removeAttribute(interpreter, mem8, mem32, i) {
69+ const nameId = mem32[i++];
70+ const name = interpreter.getCachedString(nameId);
71+ const node = top(interpreter.stack);
72+ node.removeAttribute(name);
73+
74+ // Some attributes are "volatile" and don't work through `removeAttribute`.
75+ if (name === "value") {
76+ node.value = null;
77+ }
78+ if (name === "checked") {
79+ node.checked = false;
80+ }
81+ if (name === "selected") {
82+ node.selected = false;
83+ }
84+
85+ return i;
86+ },
87+
88+ // 5
89+ function pushReverseChild(interpreter, mem8, mem32, i) {
90+ const n = mem32[i++];
91+ const parent = top(interpreter.stack);
92+ const children = parent.childNodes;
93+ const child = children[children.length - n - 1];
94+ interpreter.stack.push(child);
95+ return i;
96+ },
97+
98+ // 6
99+ function popPushChild(interpreter, mem8, mem32, i) {
100+ const n = mem32[i++];
101+ interpreter.stack.pop();
102+ const parent = top(interpreter.stack);
103+ const children = parent.childNodes;
104+ const child = children[n];
105+ interpreter.stack.push(child);
106+ return i;
107+ },
108+
109+ // 7
110+ function pop(interpreter, mem8, mem32, i) {
111+ interpreter.stack.pop();
112+ return i;
113+ },
114+
115+ // 8
116+ function appendChild(interpreter, mem8, mem32, i) {
117+ const child = interpreter.stack.pop();
118+ top(interpreter.stack).appendChild(child);
119+ return i;
120+ },
121+
122+ // 9
123+ function createTextNode(interpreter, mem8, mem32, i) {
124+ const pointer = mem32[i++];
125+ const length = mem32[i++];
126+ const text = string(mem8, pointer, length);
127+ interpreter.stack.push(document.createTextNode(text));
128+ return i;
129+ },
130+
131+ // 10
132+ function createElement(interpreter, mem8, mem32, i) {
133+ const tagNameId = mem32[i++];
134+ const tagName = interpreter.getCachedString(tagNameId);
135+ interpreter.stack.push(document.createElement(tagName));
136+ return i;
137+ },
138+
139+ // 11
140+ function newEventListener(interpreter, mem8, mem32, i) {
141+ const eventId = mem32[i++];
142+ const eventType = interpreter.getCachedString(eventId);
143+ const a = mem32[i++];
144+ const b = mem32[i++];
145+ const el = top(interpreter.stack);
146+ el.addEventListener(eventType, interpreter.eventHandler);
147+ el[`dodrio-a-${eventType}`] = a;
148+ el[`dodrio-b-${eventType}`] = b;
149+ return i;
150+ },
151+
152+ // 12
153+ function updateEventListener(interpreter, mem8, mem32, i) {
154+ const eventId = mem32[i++];
155+ const eventType = interpreter.getCachedString(eventId);
156+ const el = top(interpreter.stack);
157+ el[`dodrio-a-${eventType}`] = mem32[i++];
158+ el[`dodrio-b-${eventType}`] = mem32[i++];
159+ return i;
160+ },
161+
162+ // 13
163+ function removeEventListener(interpreter, mem8, mem32, i) {
164+ const eventId = mem32[i++];
165+ const eventType = interpreter.getCachedString(eventId);
166+ const el = top(interpreter.stack);
167+ el.removeEventListener(eventType, interpreter.eventHandler);
168+ return i;
169+ },
170+
171+ // 14
172+ function addCachedString(interpreter, mem8, mem32, i) {
173+ const pointer = mem32[i++];
174+ const length = mem32[i++];
175+ const id = mem32[i++];
176+ const str = string(mem8, pointer, length);
177+ interpreter.addCachedString(str, id);
178+ return i;
179+ },
180+
181+ // 15
182+ function dropCachedString(interpreter, mem8, mem32, i) {
183+ const id = mem32[i++];
184+ interpreter.dropCachedString(id);
185+ return i;
186+ },
187+
188+ // 16
189+ function createElementNS(interpreter, mem8, mem32, i) {
190+ const tagNameId = mem32[i++];
191+ const tagName = interpreter.getCachedString(tagNameId);
192+ const nsId = mem32[i++];
193+ const ns = interpreter.getCachedString(nsId);
194+ interpreter.stack.push(document.createElementNS(ns, tagName));
195+ return i;
196+ },
197+
198+ // 17
199+ function saveChildrenToTemporaries(interpreter, mem8, mem32, i) {
200+ let temp = mem32[i++];
201+ const start = mem32[i++];
202+ const end = mem32[i++];
203+ const parent = top(interpreter.stack);
204+ const children = parent.childNodes;
205+ for (let i = start; i < end; i++) {
206+ interpreter.temporaries[temp++] = children[i];
207+ }
208+ return i;
209+ },
210+
211+ // 18
212+ function pushChild(interpreter, mem8, mem32, i) {
213+ const parent = top(interpreter.stack);
214+ const n = mem32[i++];
215+ const child = parent.childNodes[n];
216+ interpreter.stack.push(child);
217+ return i;
218+ },
219+
220+ // 19
221+ function pushTemporary(interpreter, mem8, mem32, i) {
222+ const temp = mem32[i++];
223+ interpreter.stack.push(interpreter.temporaries[temp]);
224+ return i;
225+ },
226+
227+ // 20
228+ function insertBefore(interpreter, mem8, mem32, i) {
229+ const before = interpreter.stack.pop();
230+ const after = interpreter.stack.pop();
231+ after.parentNode.insertBefore(before, after);
232+ interpreter.stack.push(before);
233+ return i;
234+ },
235+
236+ // 21
237+ function popPushReverseChild(interpreter, mem8, mem32, i) {
238+ const n = mem32[i++];
239+ interpreter.stack.pop();
240+ const parent = top(interpreter.stack);
241+ const children = parent.childNodes;
242+ const child = children[children.length - n - 1];
243+ interpreter.stack.push(child);
244+ return i;
245+ },
246+
247+ // 22
248+ function removeChild(interpreter, mem8, mem32, i) {
249+ const n = mem32[i++];
250+ const parent = top(interpreter.stack);
251+ const child = parent.childNodes[n];
252+ child.remove();
253+ return i;
254+ },
255+
256+ // 23
257+ function setClass(interpreter, mem8, mem32, i) {
258+ const classId = mem32[i++];
259+ const className = interpreter.getCachedString(classId);
260+ top(interpreter.stack).className = className;
261+ return i;
262+ },
263+
264+ // 24
265+ function saveTemplate(interpreter, mem8, mem32, i) {
266+ const id = mem32[i++];
267+ const template = top(interpreter.stack);
268+ interpreter.saveTemplate(id, template.cloneNode(true));
269+ return i;
270+ },
271+
272+ // 25
273+ function pushTemplate(interpreter, mem8, mem32, i) {
274+ const id = mem32[i++];
275+ const template = interpreter.getTemplate(id);
276+ interpreter.stack.push(template.cloneNode(true));
277+ return i;
278+ }
279+];
280+
281+export class ChangeListInterpreter {
282+ constructor(container) {
283+ this.trampoline = null;
284+ this.container = container;
285+ this.ranges = [];
286+ this.stack = [];
287+ this.strings = new Map();
288+ this.temporaries = [];
289+ this.templates = new Map();
290+ }
291+
292+ unmount() {
293+ this.trampoline.mounted = false;
294+
295+ // Null out all of our properties just to ensure that if we mistakenly ever
296+ // call a method on this instance again, it will throw.
297+ this.trampoline = null;
298+ this.container = null;
299+ this.ranges = null;
300+ this.stack = null;
301+ this.strings = null;
302+ this.temporaries = null;
303+ this.templates = null;
304+ }
305+
306+ addChangeListRange(start, len) {
307+ this.ranges.push(start);
308+ this.ranges.push(len);
309+ }
310+
311+ applyChanges(memory) {
312+ if (this.ranges.length == 0) {
313+ return;
314+ }
315+
316+ this.stack.push(this.container.firstChild);
317+ const mem8 = new Uint8Array(memory.buffer);
318+ const mem32 = new Uint32Array(memory.buffer);
319+
320+ for (let i = 0; i < this.ranges.length; i += 2) {
321+ const start = this.ranges[i];
322+ const len = this.ranges[i + 1];
323+ this.applyChangeRange(mem8, mem32, start, len);
324+ }
325+
326+ this.ranges.length = 0;
327+ this.stack.length = 0;
328+ this.temporaries.length = 0;
329+ }
330+
331+ applyChangeRange(mem8, mem32, start, len) {
332+ const end = (start + len) / 4;
333+ for (let i = start / 4; i < end; ) {
334+ const op = mem32[i++];
335+ i = OP_TABLE[op](this, mem8, mem32, i);
336+ }
337+ }
338+
339+ addCachedString(str, id) {
340+ this.strings.set(id, str);
341+ }
342+
343+ dropCachedString(id) {
344+ this.strings.delete(id);
345+ }
346+
347+ getCachedString(id) {
348+ return this.strings.get(id);
349+ }
350+
351+ saveTemplate(id, template) {
352+ this.templates.set(id, template);
353+ }
354+
355+ getTemplate(id) {
356+ return this.templates.get(id);
357+ }
358+
359+ initEventsTrampoline(trampoline) {
360+ this.trampoline = trampoline;
361+ trampoline.mounted = true;
362+ this.eventHandler = function(event) {
363+ if (!trampoline.mounted) {
364+ throw new Error("invocation of listener after VDOM has been unmounted");
365+ }
366+
367+ // `this` always refers to the element the handler was added to.
368+ // Since we're adding the handler to all elements our content wants
369+ // to listen for events on, this ensures that we always get the right
370+ // values for `a` and `b`.
371+ const type = event.type;
372+ const a = this[`dodrio-a-${type}`];
373+ const b = this[`dodrio-b-${type}`];
374+ trampoline(event, a, b);
375+ }
376+ }
377+}
js/change-list.jsdeleted−263
@@ -1,263 +0,0 @@
1−const decoder = new TextDecoder();
2−
3−function top(stack) {
4− return stack[stack.length - 1];
5−}
6−
7−function string(mem, pointer, length) {
8− const buf = mem.subarray(pointer, pointer + length);
9− return decoder.decode(buf);
10−}
11−
12−const OP_TABLE = [
13− // 0
14− function setText(stack, eventsTrampoline, listeners, mem8, mem32, i) {
15− // console.log("setText");
16− const pointer = mem32[i++];
17− const length = mem32[i++];
18− const str = string(mem8, pointer, length);
19− // console.log(" str =", str);
20− // console.log(" top(stack) =", top(stack));
21− top(stack).textContent = str;
22− return i;
23− },
24−
25− // 1
26− function removeSelfAndNextSiblings(stack, eventsTrampoline, listeners, mem8, mem32, i) {
27− // console.log("removeSelfAndNextSiblings");
28− const node = stack.pop();
29− // console.log(" top(stack) =", node);
30− let sibling = node.nextSibling;
31− while (sibling) {
32− const temp = sibling.nextSibling;
33− sibling.remove();
34− sibling = temp;
35− }
36− node.remove();
37− return i;
38− },
39−
40− // 2
41− function replaceWith(stack, eventsTrampoline, listeners, mem8, mem32, i) {
42− // console.log("replaceWith");
43− const newNode = stack.pop();
44− // console.log(" newNode =", newNode);
45− const oldNode = stack.pop();
46− // console.log(" oldNode =", oldNode);
47− oldNode.replaceWith(newNode);
48− stack.push(newNode);
49− return i;
50− },
51−
52− // 3
53− function setAttribute(stack, eventsTrampoline, listeners, mem8, mem32, i) {
54− // console.log("setAttribute");
55− const pointer1 = mem32[i++];
56− const length1 = mem32[i++];
57− const name = string(mem8, pointer1, length1);
58− // console.log(" name =", name);
59− const pointer2 = mem32[i++];
60− const length2 = mem32[i++];
61− const value = string(mem8, pointer2, length2);
62− // console.log(" value =", value);
63− // console.log(" top(stack) =", top(stack));
64− top(stack).setAttribute(name, value);
65− return i;
66− },
67−
68− // 4
69− function removeAttribute(stack, eventsTrampoline, listeners, mem8, mem32, i) {
70− // console.log("removeAttribute");
71− const pointer = mem32[i++];
72− const length = mem32[i++];
73− const name = string(mem8, pointer, length);
74− // console.log(" name =", name);
75− top(stack).removeAttribute(name);
76− return i;
77− },
78−
79− // 5
80− function pushFirstChild(stack, eventsTrampoline, listeners, mem8, mem32, i) {
81− // console.log("pushFirstChild");
82− // console.log(" top(stack) =", top(stack));
83− stack.push(top(stack).firstChild);
84− return i;
85− },
86−
87− // 6
88− function popPushNextSibling(stack, eventsTrampoline, listeners, mem8, mem32, i) {
89− // console.log("popPushNextSibling");
90− // console.log(" top(stack) =", top(stack));
91− const node = stack.pop();
92− stack.push(node.nextSibling);
93− return i;
94− },
95−
96− // 7
97− function pop(stack, eventsTrampoline, listeners, mem8, mem32, i) {
98− // console.log("pop");
99− // console.log(" top(stack) =", top(stack));
100− stack.pop();
101− return i;
102− },
103−
104− // 8
105− function appendChild(stack, eventsTrampoline, listeners, mem8, mem32, i) {
106− // console.log("appendChild");
107− // console.log(" top(stack) =", top(stack));
108− const child = stack.pop();
109− top(stack).appendChild(child);
110− return i;
111− },
112−
113− // 9
114− function createTextNode(stack, eventsTrampoline, listeners, mem8, mem32, i) {
115− // console.log("appendChild");
116− const pointer = mem32[i++];
117− const length = mem32[i++];
118− const text = string(mem8, pointer, length);
119− // console.log(" text =", text);
120− // console.log(" top(stack) =", top(stack));
121− stack.push(document.createTextNode(text));
122− return i;
123− },
124−
125− // 10
126− function createElement(stack, eventsTrampoline, listeners, mem8, mem32, i) {
127− // console.log("createElement");
128− const pointer = mem32[i++];
129− const length = mem32[i++];
130− const tagName = string(mem8, pointer, length);
131− // console.log(" tagName =", tagName);
132− // console.log(" top(stack) =", top(stack));
133− stack.push(document.createElement(tagName));
134− return i;
135− },
136−
137− // 11
138− function newEventListener(stack, eventsTrampoline, listeners, mem8, mem32, i) {
139− const pointer = mem32[i++];
140− const length = mem32[i++];
141− const eventType = string(mem8, pointer, length);
142− const a = mem32[i++];
143− const b = mem32[i++];
144− const el = top(stack);
145− const listener = new Listener(a, b, eventType, eventsTrampoline, el);
146− listeners.add(listener);
147− el.addEventListener(eventType, listener.callback);
148− el[`dodrio-${eventType}`] = listener;
149− return i;
150− },
151−
152− // 12
153− function updateEventListener(stack, eventsTrampoline, listeners, mem8, mem32, i) {
154− const pointer = mem32[i++];
155− const length = mem32[i++];
156− const eventType = string(mem8, pointer, length);
157− const el = top(stack);
158− const listener = el[`dodrio-${eventType}`];
159− listener.a = mem32[i++];
160− listener.b = mem32[i++];
161− return i;
162− },
163−
164− // 13
165− function removeEventListener(stack, eventsTrampoline, listeners, mem8, mem32, i) {
166− const pointer = mem32[i++];
167− const length = mem32[i++];
168− const eventType = string(mem8, pointer, length);
169− const el = top(stack);
170− const listener = el[`dodrio-${eventType}`];
171− el.removeEventListener(eventType, listener.callback);
172− listeners.delete(listener);
173− return i;
174− }
175−];
176−
177−class Listener {
178− constructor(a, b, eventType, trampoline, el) {
179− this.a = a;
180− this.b = b;
181− this.eventType = eventType;
182− this.trampoline = trampoline;
183− this.el = el;
184− this.callback = this.callback.bind(this);
185− }
186−
187− callback(event) {
188− this.trampoline(event, this.a, this.b);
189− }
190−}
191−
192−// export
193−class ChangeList {
194− constructor(container) {
195− this.listeners = new Set();
196− this.trampoline = null;
197− this.container = container;
198− this.ranges = [];
199− this.stack = [];
200− }
201−
202− unmount() {
203− for (const listener of this.listeners) {
204− listener.el.removeEventListener(listener.eventType, listener.callback);
205− listener.trampoline = () => {
206− throw new Error("invocation of listener after it has been removed");
207− };
208− listener.a = 0;
209− listener.b = 0;
210− }
211−
212− // Null out all of our properties just to ensure that if we mistakenly ever
213− // call a method on this instance again, it will throw.
214− this.listeners = null;
215− this.trampoline = null;
216− this.container = null;
217− this.ranges = null;
218− this.stack = null;
219− }
220−
221− addChangeListRange(start, len) {
222− this.ranges.push(start);
223− this.ranges.push(len);
224− }
225−
226− applyChanges(memory) {
227− // console.log("======== ChangeList.prototype.applyChanges ==============================");
228− if (this.ranges.length == 0) {
229− return;
230− }
231−
232− this.stack.push(this.container.firstChild);
233− const mem8 = new Uint8Array(memory.buffer);
234− const mem32 = new Uint32Array(memory.buffer);
235−
236− for (let i = 0; i < this.ranges.length; i += 2) {
237− const start = this.ranges[i];
238− const len = this.ranges[i + 1];
239− this.applyChangeRange(mem8, mem32, start, len);
240− }
241−
242− this.ranges.length = 0;
243− this.stack.length = 0;
244− }
245−
246− applyChangeRange(mem8, mem32, start, len) {
247− const end = (start + len) / 4;
248− for (let i = start / 4; i < end; ) {
249− const op = mem32[i++];
250− // console.log();
251− // console.log(OP_TABLE[op].name);
252− // console.log(this.stack);
253− i = OP_TABLE[op](this.stack, this.eventsTrampoline, this.listeners, mem8, mem32, i);
254− }
255− }
256−
257− initEventsTrampoline(trampoline) {
258− this.eventsTrampoline = (...args) => {
259− trampoline(...args);
260− };
261− }
262−}
263−window.ChangeList = ChangeList;
js/package-lock.jsondeleted−5
@@ -1,5 +0,0 @@
1−{
2− "name": "dodrio",
3− "version": "0.1.0",
4− "lockfileVersion": 1
5−}
js/package.jsondeleted−11
@@ -1,11 +0,0 @@
1−{
2− "name": "dodrio",
3− "version": "0.1.0",
4− "description": "Dodrio",
5− "main": "dodrio.js",
6− "scripts": {
7− "test": "echo \"Error: no test specified\" && exit 1"
8− },
9− "author": "Nick Fitzgerald <fitzgen@gmail.com>",
10− "license": "MPL-2.0"
11−}
js/strace.jsnew file+80
@@ -0,0 +1,80 @@
1+export function initStrace() {
2+ instrumentAll(Element.prototype);
3+ instrumentAll(Document.prototype);
4+ instrumentAll(Node.prototype);
5+ instrumentAll(EventTarget.prototype);
6+}
7+
8+const counts = new Map;
9+counts.total = 0;
10+
11+let timer = null;
12+
13+function log(ctorName, kind, key) {
14+ counts.total += 1;
15+
16+ const entry = `${kind} ${ctorName}#${key}`
17+ const count = counts.get(entry);
18+ if (count === undefined) {
19+ counts.set(entry, 1);
20+ } else {
21+ counts.set(entry, count + 1);
22+ }
23+
24+ if (timer !== null) {
25+ clearTimeout(timer);
26+ }
27+ timer = setTimeout(dumpAndReset, 100);
28+}
29+
30+function dumpAndReset() {
31+ const data = [...counts]
32+ .sort((a, b) => b[1] - a[1])
33+ .map(a => ({ "DOM Method": a[0], "Count": a[1] }));
34+
35+ data.push({ "DOM Method": "<total>", "Count": counts.total });
36+
37+ console.table(data, ["DOM Method", "Count"]);
38+
39+ counts.clear();
40+ counts.total = 0;
41+}
42+
43+function instrument(proto, key, desc) {
44+ const ctorName = proto.constructor.name;
45+
46+ if (typeof desc.value == "function") {
47+ const f = desc.value;
48+ desc.value = function (...args) {
49+ log(ctorName, "call", key);
50+ return f.apply(this, args);
51+ };
52+ }
53+
54+ if (typeof desc.get == "function") {
55+ const get = desc.get;
56+ desc.get = function (...args) {
57+ log(ctorName, "get", key);
58+ return get.apply(this, args);
59+ };
60+ }
61+
62+ if (typeof desc.set == "function") {
63+ const set = desc.set;
64+ desc.set = function (...args) {
65+ log(ctorName, "set", key);
66+ return set.apply(this, args);
67+ };
68+ }
69+
70+ Object.defineProperty(proto, key, desc);
71+}
72+
73+function instrumentAll(proto) {
74+ for (const key of Object.keys(proto)) {
75+ const desc = Object.getOwnPropertyDescriptor(proto, key);
76+ if (desc.configurable) {
77+ instrument(proto, key, desc);
78+ }
79+ }
80+}
publish.shnew file+11
@@ -0,0 +1,11 @@
1+#!/usr/bin/env bash
2+
3+set -ex
4+
5+cd "$(dirname "$0")"
6+
7+cd crates/js-api
8+cargo publish --no-verify $PUBLISH_FLAGS
9+cd ../..
10+
11+cargo publish $PUBLISH_FLAGS
src/builder.rsnew file+1075
@@ -0,0 +1,1075 @@
1+//! Helpers for building virtual DOM nodes.
2+
3+use crate::{node::NodeKey, Attribute, Listener, Node, RootRender, VdomWeak};
4+use bumpalo::Bump;
5+
6+/// A virtual DOM element builder.
7+///
8+/// Typically constructed with element-specific constructors, eg the `div`
9+/// function for building `<div>` elements or the `button` function for building
10+/// `<button>` elements.
11+#[derive(Clone, Debug)]
12+pub struct ElementBuilder<'a, Listeners, Attributes, Children>
13+where
14+ Listeners: 'a + AsRef<[Listener<'a>]>,
15+ Attributes: 'a + AsRef<[Attribute<'a>]>,
16+ Children: 'a + AsRef<[Node<'a>]>,
17+{
18+ bump: &'a Bump,
19+ key: NodeKey,
20+ tag_name: &'a str,
21+ listeners: Listeners,
22+ attributes: Attributes,
23+ children: Children,
24+ namespace: Option<&'a str>,
25+}
26+
27+impl<'a>
28+ ElementBuilder<
29+ 'a,
30+ bumpalo::collections::Vec<'a, Listener<'a>>,
31+ bumpalo::collections::Vec<'a, Attribute<'a>>,
32+ bumpalo::collections::Vec<'a, Node<'a>>,
33+ >
34+{
35+ /// Create a new `ElementBuilder` for an element with the given tag name.
36+ ///
37+ /// In general, only use this constructor if the tag is dynamic (i.e. you
38+ /// might build a `<div>` or you might build a `<span>` and you don't know
39+ /// until runtime). Prefer using the tag-specific constructors instead:
40+ /// `div(bump)` or `span(bump)`, etc.
41+ ///
42+ /// # Example
43+ ///
44+ /// ```
45+ /// use dodrio::{builder::*, bumpalo::Bump};
46+ ///
47+ /// let b = Bump::new();
48+ ///
49+ /// let tag_name = if flip_coin() {
50+ /// "div"
51+ /// } else {
52+ /// "span"
53+ /// };
54+ ///
55+ /// let my_element_builder = ElementBuilder::new(&b, tag_name);
56+ /// # fn flip_coin() -> bool { true }
57+ /// ```
58+ pub fn new<B>(bump: B, tag_name: &'a str) -> Self
59+ where
60+ B: Into<&'a Bump>,
61+ {
62+ let bump = bump.into();
63+ ElementBuilder {
64+ bump,
65+ key: NodeKey::NONE,
66+ tag_name,
67+ listeners: bumpalo::collections::Vec::new_in(bump),
68+ attributes: bumpalo::collections::Vec::new_in(bump),
69+ children: bumpalo::collections::Vec::new_in(bump),
70+ namespace: None,
71+ }
72+ }
73+}
74+
75+impl<'a, Listeners, Attributes, Children> ElementBuilder<'a, Listeners, Attributes, Children>
76+where
77+ Listeners: 'a + AsRef<[Listener<'a>]>,
78+ Attributes: 'a + AsRef<[Attribute<'a>]>,
79+ Children: 'a + AsRef<[Node<'a>]>,
80+{
81+ /// Set the listeners for this element.
82+ ///
83+ /// You can use this method to customize the backing storage for listeners,
84+ /// for example to use a fixed-size array instead of the default
85+ /// dynamically-sized `bumpalo::collections::Vec`.
86+ ///
87+ /// Any listeners already added to the builder will be overridden.
88+ ///
89+ /// # Example
90+ ///
91+ /// ```no_run
92+ /// use dodrio::{builder::*, bumpalo::Bump};
93+ ///
94+ /// let b = Bump::new();
95+ ///
96+ /// // Create a `<div>` with a fixed-size array of two listeners.
97+ /// let my_div = div(&b)
98+ /// .listeners([
99+ /// on(&b, "click", |root, vdom, event| {
100+ /// // ...
101+ /// }),
102+ /// on(&b, "dblclick", |root, vdom, event| {
103+ /// // ...
104+ /// }),
105+ /// ])
106+ /// .finish();
107+ /// ```
108+ #[inline]
109+ pub fn listeners<L>(self, listeners: L) -> ElementBuilder<'a, L, Attributes, Children>
110+ where
111+ L: 'a + AsRef<[Listener<'a>]>,
112+ {
113+ ElementBuilder {
114+ bump: self.bump,
115+ key: self.key,
116+ tag_name: self.tag_name,
117+ listeners,
118+ attributes: self.attributes,
119+ children: self.children,
120+ namespace: self.namespace,
121+ }
122+ }
123+
124+ /// Set the attributes for this element.
125+ ///
126+ /// You can use this method to customize the backing storage for attributes,
127+ /// for example to use a fixed-size array instead of the default
128+ /// dynamically-sized `bumpalo::collections::Vec`.
129+ ///
130+ /// Any attributes already added to the builder will be overridden.
131+ ///
132+ /// # Example
133+ ///
134+ /// ```no_run
135+ /// use dodrio::{builder::*, bumpalo::Bump, Attribute};
136+ ///
137+ /// let b = Bump::new();
138+ ///
139+ /// // Create a `<div>` with a fixed-size array of two attributes.
140+ /// let my_div = div(&b)
141+ /// .attributes([
142+ /// attr("id", "my-div"),
143+ /// attr("class", "notification"),
144+ /// ])
145+ /// .finish();
146+ /// ```
147+ #[inline]
148+ pub fn attributes<A>(self, attributes: A) -> ElementBuilder<'a, Listeners, A, Children>
149+ where
150+ A: 'a + AsRef<[Attribute<'a>]>,
151+ {
152+ ElementBuilder {
153+ bump: self.bump,
154+ key: self.key,
155+ tag_name: self.tag_name,
156+ listeners: self.listeners,
157+ attributes,
158+ children: self.children,
159+ namespace: self.namespace,
160+ }
161+ }
162+
163+ /// Set the children for this element.
164+ ///
165+ /// You can use this method to customize the backing storage for children,
166+ /// for example to use a fixed-size array instead of the default
167+ /// dynamically-sized `bumpalo::collections::Vec`.
168+ ///
169+ /// Any children already added to the builder will be overridden.
170+ ///
171+ /// # Example
172+ ///
173+ /// ```no_run
174+ /// use dodrio::{builder::*, bumpalo::Bump};
175+ ///
176+ /// let b = Bump::new();
177+ ///
178+ /// // Create a `<div>` with a fixed-size array of two `<span>` children.
179+ /// let my_div = div(&b)
180+ /// .children([
181+ /// span(&b).finish(),
182+ /// span(&b).finish(),
183+ /// ])
184+ /// .finish();
185+ /// ```
186+ #[inline]
187+ pub fn children<C>(self, children: C) -> ElementBuilder<'a, Listeners, Attributes, C>
188+ where
189+ C: 'a + AsRef<[Node<'a>]>,
190+ {
191+ ElementBuilder {
192+ bump: self.bump,
193+ key: self.key,
194+ tag_name: self.tag_name,
195+ listeners: self.listeners,
196+ attributes: self.attributes,
197+ children,
198+ namespace: self.namespace,
199+ }
200+ }
201+
202+ /// Set the namespace for this element.
203+ ///
204+ /// # Example
205+ ///
206+ /// ```no_run
207+ /// use dodrio::{builder::*, bumpalo::Bump};
208+ ///
209+ /// let b = Bump::new();
210+ ///
211+ /// // Create a `<td>` tag with an xhtml namespace
212+ /// let my_td = td(&b)
213+ /// .namespace(Some("http://www.w3.org/1999/xhtml"))
214+ /// .finish();
215+ /// ```
216+ #[inline]
217+ pub fn namespace(self, namespace: Option<&'a str>) -> Self {
218+ ElementBuilder {
219+ bump: self.bump,
220+ key: self.key,
221+ tag_name: self.tag_name,
222+ listeners: self.listeners,
223+ attributes: self.attributes,
224+ children: self.children,
225+ namespace,
226+ }
227+ }
228+
229+ /// Set this element's key.
230+ ///
231+ /// When diffing sets of siblings, if an old sibling and new sibling share a
232+ /// key, then they will always reuse the same physical DOM node. This is
233+ /// important when using CSS animations, web components, third party JS, or
234+ /// anything else that makes the diffing implementation observable.
235+ ///
236+ /// Do not use keys if such a scenario does not apply. Keyed diffing is
237+ /// generally more expensive than not, since it is putting greater
238+ /// constraints on the diffing algorithm.
239+ ///
240+ /// # Invariants You Must Uphold
241+ ///
242+ /// The key may not be `u32::MAX`, which is a reserved key value.
243+ ///
244+ /// Keys must be unique among siblings.
245+ ///
246+ /// All sibling nodes must be keyed, or they must all not be keyed. You may
247+ /// not mix keyed and unkeyed siblings.
248+ ///
249+ /// # Example
250+ ///
251+ /// ```no_run
252+ /// use dodrio::{builder::*, bumpalo::Bump};
253+ ///
254+ /// let b = Bump::new();
255+ ///
256+ /// let my_li = li(&b)
257+ /// .key(1337)
258+ /// .finish();
259+ /// ```
260+ #[inline]
261+ pub fn key(mut self, key: u32) -> Self {
262+ use std::u32;
263+ debug_assert!(key != u32::MAX);
264+ self.key = NodeKey(key);
265+ self
266+ }
267+
268+ /// Create the virtual DOM node described by this builder.
269+ ///
270+ /// # Example
271+ ///
272+ /// ```no_run
273+ /// use dodrio::{builder::*, bumpalo::Bump, Node};
274+ ///
275+ /// let b = Bump::new();
276+ ///
277+ /// // Start with a builder...
278+ /// let builder: ElementBuilder<_, _, _> = div(&b);
279+ ///
280+ /// // ...and finish it to create a virtual DOM node!
281+ /// let my_div: Node = builder.finish();
282+ /// ```
283+ #[inline]
284+ pub fn finish(self) -> Node<'a> {
285+ let children: &'a Children = self.bump.alloc(self.children);
286+ let children: &'a [Node<'a>] = children.as_ref();
287+
288+ let listeners: &'a Listeners = self.bump.alloc(self.listeners);
289+ let listeners: &'a [Listener<'a>] = listeners.as_ref();
290+
291+ let attributes: &'a Attributes = self.bump.alloc(self.attributes);
292+ let attributes: &'a [Attribute<'a>] = attributes.as_ref();
293+
294+ Node::element(
295+ self.bump,
296+ self.key,
297+ self.tag_name,
298+ listeners,
299+ attributes,
300+ children,
301+ self.namespace,
302+ )
303+ }
304+}
305+
306+impl<'a, Attributes, Children>
307+ ElementBuilder<'a, bumpalo::collections::Vec<'a, Listener<'a>>, Attributes, Children>
308+where
309+ Attributes: 'a + AsRef<[Attribute<'a>]>,
310+ Children: 'a + AsRef<[Node<'a>]>,
311+{
312+ /// Add a new event listener to this element.
313+ ///
314+ /// The `event` string specifies which event will be listened for. The
315+ /// `callback` function is the function that will be invoked if the
316+ /// specified event occurs.
317+ ///
318+ /// # Example
319+ ///
320+ /// ```no_run
321+ /// use dodrio::{builder::*, bumpalo::Bump};
322+ ///
323+ /// let b = Bump::new();
324+ ///
325+ /// // A button that does something when clicked!
326+ /// let my_button = button(&b)
327+ /// .on("click", |root, vdom, event| {
328+ /// // ...
329+ /// })
330+ /// .finish();
331+ /// ```
332+ #[inline]
333+ pub fn on<F>(mut self, event: &'a str, callback: F) -> Self
334+ where
335+ F: 'static + Fn(&mut dyn RootRender, VdomWeak, web_sys::Event),
336+ {
337+ self.listeners.push(Listener {
338+ event,
339+ callback: self.bump.alloc(callback),
340+ });
341+ self
342+ }
343+}
344+
345+impl<'a, Listeners, Children>
346+ ElementBuilder<'a, Listeners, bumpalo::collections::Vec<'a, Attribute<'a>>, Children>
347+where
348+ Listeners: 'a + AsRef<[Listener<'a>]>,
349+ Children: 'a + AsRef<[Node<'a>]>,
350+{
351+ /// Add a new attribute to this element.
352+ ///
353+ /// # Example
354+ ///
355+ /// ```no_run
356+ /// use dodrio::{builder::*, bumpalo::Bump};
357+ ///
358+ /// let b = Bump::new();
359+ ///
360+ /// // Create the `<div id="my-div"/>` element.
361+ /// let my_div = div(&b).attr("id", "my-div").finish();
362+ /// ```
363+ #[inline]
364+ pub fn attr(mut self, name: &'a str, value: &'a str) -> Self {
365+ self.attributes.push(Attribute { name, value });
366+ self
367+ }
368+
369+ /// Conditionally add a "boolean-style" attribute to this element.
370+ ///
371+ /// If the `should_add` parameter is true, then adds an attribute with the
372+ /// given `name` and an empty string value. If the `should_add` parameter is
373+ /// false, then the attribute is not added.
374+ ///
375+ /// This method is useful for attributes whose semantics are defined by
376+ /// whether or not the attribute is present or not, and whose value is
377+ /// ignored. Example attributes like this include:
378+ ///
379+ /// * `checked`
380+ /// * `hidden`
381+ /// * `selected`
382+ ///
383+ /// # Example
384+ ///
385+ /// ```no_run
386+ /// use dodrio::{builder::*, bumpalo::Bump};
387+ /// use js_sys::Math;
388+ ///
389+ /// let b = Bump::new();
390+ ///
391+ /// // Create the `<div>` that is randomly hidden 50% of the time.
392+ /// let my_div = div(&b)
393+ /// .bool_attr("hidden", Math::random() >= 0.5)
394+ /// .finish();
395+ /// ```
396+ pub fn bool_attr(mut self, name: &'a str, should_add: bool) -> Self {
397+ if should_add {
398+ self.attributes.push(Attribute { name, value: "" });
399+ }
400+ self
401+ }
402+}
403+
404+impl<'a, Listeners, Attributes>
405+ ElementBuilder<'a, Listeners, Attributes, bumpalo::collections::Vec<'a, Node<'a>>>
406+where
407+ Listeners: 'a + AsRef<[Listener<'a>]>,
408+ Attributes: 'a + AsRef<[Attribute<'a>]>,
409+{
410+ /// Add a new child to this element.
411+ ///
412+ /// # Example
413+ ///
414+ /// ```no_run
415+ /// use dodrio::{builder::*, bumpalo::Bump};
416+ /// use js_sys::Math;
417+ ///
418+ /// let b = Bump::new();
419+ ///
420+ /// // Create `<p><span></span></p>`.
421+ /// let my_div = p(&b)
422+ /// .child(span(&b).finish())
423+ /// .finish();
424+ /// ```
425+ #[inline]
426+ pub fn child(mut self, child: Node<'a>) -> Self {
427+ self.children.push(child);
428+ self
429+ }
430+}
431+
432+macro_rules! builder_constructors {
433+ ( $(
434+ $(#[$attr:meta])*
435+ $name:ident;
436+ )* ) => {
437+ $(
438+ $(#[$attr])*
439+ #[inline]
440+ pub fn $name<'a, B>(
441+ bump: B,
442+ ) -> ElementBuilder<
443+ 'a,
444+ bumpalo::collections::Vec<'a, Listener<'a>>,
445+ bumpalo::collections::Vec<'a, Attribute<'a>>,
446+ bumpalo::collections::Vec<'a, Node<'a>>,
447+ >
448+ where
449+ B: Into<&'a Bump>
450+ {
451+ ElementBuilder::new(bump, stringify!($name))
452+ }
453+ )*
454+ };
455+ ( $(
456+ $(#[$attr:meta])*
457+ $name:ident <> $namespace:tt;
458+ )* ) => {
459+ $(
460+ $(#[$attr])*
461+ #[inline]
462+ pub fn $name<'a>(
463+ bump: &'a Bump,
464+ ) -> ElementBuilder<
465+ 'a,
466+ bumpalo::collections::Vec<'a, Listener<'a>>,
467+ bumpalo::collections::Vec<'a, Attribute<'a>>,
468+ bumpalo::collections::Vec<'a, Node<'a>>,
469+ > {
470+ let builder = ElementBuilder::new(bump, stringify!($name));
471+ builder.namespace(Some($namespace))
472+ }
473+ )*
474+ }
475+}
476+
477+// Organized in the same order as
478+// https://developer.mozilla.org/en-US/docs/Web/HTML/Element
479+//
480+// Does not include obsolete elements.
481+builder_constructors! {
482+ // Document metadata
483+
484+ /// Build a
485+ /// [`<base>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base)
486+ /// element.
487+ base;
488+ /// Build a
489+ /// [`<head>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/head)
490+ /// element.
491+ head;
492+ /// Build a
493+ /// [`<link>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link)
494+ /// element.
495+ link;
496+ /// Build a
497+ /// [`<meta>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta)
498+ /// element.
499+ meta;
500+ /// Build a
501+ /// [`<style>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style)
502+ /// element.
503+ style;
504+ /// Build a
505+ /// [`<title>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title)
506+ /// element.
507+ title;
508+
509+ // Sectioning root
510+
511+ /// Build a
512+ /// [`<body>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/body)
513+ /// element.
514+ body;
515+
516+ // Content sectioning
517+
518+ /// Build a
519+ /// [`<address>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/address)
520+ /// element.
521+ address;
522+ /// Build a
523+ /// [`<article>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/article)
524+ /// element.
525+ article;
526+ /// Build a
527+ /// [`<aside>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/aside)
528+ /// element.
529+ aside;
530+ /// Build a
531+ /// [`<footer>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/footer)
532+ /// element.
533+ footer;
534+ /// Build a
535+ /// [`<header>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/header)
536+ /// element.
537+ header;
538+ /// Build a
539+ /// [`<h1>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h1)
540+ /// element.
541+ h1;
542+ /// Build a
543+ /// [`<h2>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h2)
544+ /// element.
545+ h2;
546+ /// Build a
547+ /// [`<h3>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h3)
548+ /// element.
549+ h3;
550+ /// Build a
551+ /// [`<h4>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h4)
552+ /// element.
553+ h4;
554+ /// Build a
555+ /// [`<h5>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h5)
556+ /// element.
557+ h5;
558+ /// Build a
559+ /// [`<h6>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h6)
560+ /// element.
561+ h6;
562+ /// Build a
563+ /// [`<hgroup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/hgroup)
564+ /// element.
565+ hgroup;
566+ /// Build a
567+ /// [`<main>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/main)
568+ /// element.
569+ main;
570+ /// Build a
571+ /// [`<nav>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/nav)
572+ /// element.
573+ nav;
574+ /// Build a
575+ /// [`<section>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/section)
576+ /// element.
577+ section;
578+
579+ // Text content
580+
581+ /// Build a
582+ /// [`<blockquote>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/blockquote)
583+ /// element.
584+ blockquote;
585+ /// Build a
586+ /// [`<dd>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dd)
587+ /// element.
588+ dd;
589+ /// Build a
590+ /// [`<div>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div)
591+ /// element.
592+ div;
593+ /// Build a
594+ /// [`<dl>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dl)
595+ /// element.
596+ dl;
597+ /// Build a
598+ /// [`<dt>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dt)
599+ /// element.
600+ dt;
601+ /// Build a
602+ /// [`<figcaption>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figcaption)
603+ /// element.
604+ figcaption;
605+ /// Build a
606+ /// [`<figure>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figure)
607+ /// element.
608+ figure;
609+ /// Build a
610+ /// [`<hr>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/hr)
611+ /// element.
612+ hr;
613+ /// Build a
614+ /// [`<li>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/li)
615+ /// element.
616+ li;
617+ /// Build a
618+ /// [`<ol>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ol)
619+ /// element.
620+ ol;
621+ /// Build a
622+ /// [`<p>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/p)
623+ /// element.
624+ p;
625+ /// Build a
626+ /// [`<pre>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/pre)
627+ /// element.
628+ pre;
629+ /// Build a
630+ /// [`<ul>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ul)
631+ /// element.
632+ ul;
633+
634+ // Inline text semantics
635+
636+ /// Build a
637+ /// [`<a>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a)
638+ /// element.
639+ a;
640+ /// Build a
641+ /// [`<abbr>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/abbr)
642+ /// element.
643+ abbr;
644+ /// Build a
645+ /// [`<b>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/b)
646+ /// element.
647+ b;
648+ /// Build a
649+ /// [`<bdi>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/bdi)
650+ /// element.
651+ bdi;
652+ /// Build a
653+ /// [`<bdo>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/bdo)
654+ /// element.
655+ bdo;
656+ /// Build a
657+ /// [`<br>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/br)
658+ /// element.
659+ br;
660+ /// Build a
661+ /// [`<cite>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/cite)
662+ /// element.
663+ cite;
664+ /// Build a
665+ /// [`<code>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/code)
666+ /// element.
667+ code;
668+ /// Build a
669+ /// [`<data>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/data)
670+ /// element.
671+ data;
672+ /// Build a
673+ /// [`<dfn>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dfn)
674+ /// element.
675+ dfn;
676+ /// Build a
677+ /// [`<em>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/em)
678+ /// element.
679+ em;
680+ /// Build a
681+ /// [`<i>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/i)
682+ /// element.
683+ i;
684+ /// Build a
685+ /// [`<kbd>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/kbd)
686+ /// element.
687+ kbd;
688+ /// Build a
689+ /// [`<mark>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/mark)
690+ /// element.
691+ mark;
692+ /// Build a
693+ /// [`<q>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/q)
694+ /// element.
695+ q;
696+ /// Build a
697+ /// [`<rb>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rb)
698+ /// element.
699+ rb;
700+ /// Build a
701+ /// [`<rp>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rp)
702+ /// element.
703+ rp;
704+ /// Build a
705+ /// [`<rt>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rt)
706+ /// element.
707+ rt;
708+ /// Build a
709+ /// [`<rtc>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rtc)
710+ /// element.
711+ rtc;
712+ /// Build a
713+ /// [`<ruby>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ruby)
714+ /// element.
715+ ruby;
716+ /// Build a
717+ /// [`<s>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/s)
718+ /// element.
719+ s;
720+ /// Build a
721+ /// [`<samp>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/samp)
722+ /// element.
723+ samp;
724+ /// Build a
725+ /// [`<small>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/small)
726+ /// element.
727+ small;
728+ /// Build a
729+ /// [`<span>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span)
730+ /// element.
731+ span;
732+ /// Build a
733+ /// [`<strong>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/strong)
734+ /// element.
735+ strong;
736+ /// Build a
737+ /// [`<sub>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sub)
738+ /// element.
739+ sub;
740+ /// Build a
741+ /// [`<sup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sup)
742+ /// element.
743+ sup;
744+ /// Build a
745+ /// [`<time>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/time)
746+ /// element.
747+ time;
748+ /// Build a
749+ /// [`<u>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/u)
750+ /// element.
751+ u;
752+ /// Build a
753+ /// [`<var>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/var)
754+ /// element.
755+ var;
756+ /// Build a
757+ /// [`<wbr>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/wbr)
758+ /// element.
759+ wbr;
760+
761+ // Image and multimedia
762+
763+ /// Build a
764+ /// [`<area>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/area)
765+ /// element.
766+ area;
767+ /// Build a
768+ /// [`<audio>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio)
769+ /// element.
770+ audio;
771+ /// Build a
772+ /// [`<img>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img)
773+ /// element.
774+ img;
775+ /// Build a
776+ /// [`<map>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/map)
777+ /// element.
778+ map;
779+ /// Build a
780+ /// [`<track>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/track)
781+ /// element.
782+ track;
783+ /// Build a
784+ /// [`<video>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video)
785+ /// element.
786+ video;
787+
788+ // Embedded content
789+
790+ /// Build a
791+ /// [`<embed>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/embed)
792+ /// element.
793+ embed;
794+ /// Build a
795+ /// [`<iframe>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe)
796+ /// element.
797+ iframe;
798+ /// Build a
799+ /// [`<object>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/object)
800+ /// element.
801+ object;
802+ /// Build a
803+ /// [`<param>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/param)
804+ /// element.
805+ param;
806+ /// Build a
807+ /// [`<picture>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture)
808+ /// element.
809+ picture;
810+ /// Build a
811+ /// [`<source>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source)
812+ /// element.
813+ source;
814+
815+ // Scripting
816+
817+ /// Build a
818+ /// [`<canvas>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas)
819+ /// element.
820+ canvas;
821+ /// Build a
822+ /// [`<noscript>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/noscript)
823+ /// element.
824+ noscript;
825+ /// Build a
826+ /// [`<script>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script)
827+ /// element.
828+ script;
829+
830+ // Demarcating edits
831+
832+ /// Build a
833+ /// [`<del>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/del)
834+ /// element.
835+ del;
836+ /// Build a
837+ /// [`<ins>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ins)
838+ /// element.
839+ ins;
840+
841+ // Table content
842+
843+ /// Build a
844+ /// [`<caption>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/caption)
845+ /// element.
846+ caption;
847+ /// Build a
848+ /// [`<col>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col)
849+ /// element.
850+ col;
851+ /// Build a
852+ /// [`<colgroup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup)
853+ /// element.
854+ colgroup;
855+ /// Build a
856+ /// [`<table>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/table)
857+ /// element.
858+ table;
859+ /// Build a
860+ /// [`<tbody>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tbody)
861+ /// element.
862+ tbody;
863+ /// Build a
864+ /// [`<td>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td)
865+ /// element.
866+ td;
867+ /// Build a
868+ /// [`<tfoot>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tfoot)
869+ /// element.
870+ tfoot;
871+ /// Build a
872+ /// [`<th>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th)
873+ /// element.
874+ th;
875+ /// Build a
876+ /// [`<thead>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/thead)
877+ /// element.
878+ thead;
879+ /// Build a
880+ /// [`<tr>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tr)
881+ /// element.
882+ tr;
883+
884+ // Forms
885+
886+ /// Build a
887+ /// [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button)
888+ /// element.
889+ button;
890+ /// Build a
891+ /// [`<datalist>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/datalist)
892+ /// element.
893+ datalist;
894+ /// Build a
895+ /// [`<fieldset>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset)
896+ /// element.
897+ fieldset;
898+ /// Build a
899+ /// [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form)
900+ /// element.
901+ form;
902+ /// Build a
903+ /// [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input)
904+ /// element.
905+ input;
906+ /// Build a
907+ /// [`<label>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label)
908+ /// element.
909+ label;
910+ /// Build a
911+ /// [`<legend>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/legend)
912+ /// element.
913+ legend;
914+ /// Build a
915+ /// [`<meter>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meter)
916+ /// element.
917+ meter;
918+ /// Build a
919+ /// [`<optgroup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/optgroup)
920+ /// element.
921+ optgroup;
922+ /// Build a
923+ /// [`<option>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option)
924+ /// element.
925+ option;
926+ /// Build a
927+ /// [`<output>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/output)
928+ /// element.
929+ output;
930+ /// Build a
931+ /// [`<progress>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/progress)
932+ /// element.
933+ progress;
934+ /// Build a
935+ /// [`<select>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select)
936+ /// element.
937+ select;
938+ /// Build a
939+ /// [`<textarea>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea)
940+ /// element.
941+ textarea;
942+
943+ // Interactive elements
944+
945+ /// Build a
946+ /// [`<details>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details)
947+ /// element.
948+ details;
949+ /// Build a
950+ /// [`<dialog>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog)
951+ /// element.
952+ dialog;
953+ /// Build a
954+ /// [`<menu>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/menu)
955+ /// element.
956+ menu;
957+ /// Build a
958+ /// [`<menuitem>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/menuitem)
959+ /// element.
960+ menuitem;
961+ /// Build a
962+ /// [`<summary>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/summary)
963+ /// element.
964+ summary;
965+
966+ // Web components
967+
968+ /// Build a
969+ /// [`<slot>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/slot)
970+ /// element.
971+ slot;
972+ /// Build a
973+ /// [`<template>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template)
974+ /// element.
975+ template;
976+}
977+
978+builder_constructors! {
979+ // SVG components
980+
981+ /// Build a
982+ /// [`<svg>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/svg)
983+ /// element.
984+ svg <> "http://www.w3.org/2000/svg" ;
985+ /// Build a
986+ /// [`<path>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/path)
987+ /// element.
988+ path <> "http://www.w3.org/2000/svg";
989+ /// Build a
990+ /// [`<circle>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/circle)
991+ /// element.
992+ circle <> "http://www.w3.org/2000/svg";
993+ /// Build a
994+ /// [`<ellipse>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/ellipse)
995+ /// element.
996+ ellipse <> "http://www.w3.org/2000/svg";
997+ /// Build a
998+ /// [`<line>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/line)
999+ /// element.
1000+ line <> "http://www.w3.org/2000/svg";
1001+ /// Build a
1002+ /// [`<polygon>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/polygon)
1003+ /// element.
1004+ polygon <> "http://www.w3.org/2000/svg";
1005+ /// Build a
1006+ /// [`<polyline>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/polyline)
1007+ /// element.
1008+ polyline <> "http://www.w3.org/2000/svg";
1009+ /// Build a
1010+ /// [`<rect>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/rect)
1011+ /// element.
1012+ rect <> "http://www.w3.org/2000/svg";
1013+ /// Build a
1014+ /// [`<image>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/image)
1015+ /// element.
1016+ image <> "http://www.w3.org/2000/svg";
1017+}
1018+
1019+/// Construct a text node.
1020+///
1021+/// This is `dodrio`'s virtual DOM equivalent of `document.createTextNode`.
1022+///
1023+/// # Example
1024+///
1025+/// ```no_run
1026+/// use dodrio::builder::*;
1027+///
1028+/// let my_text = text("hello, dodrio!");
1029+/// ```
1030+#[inline]
1031+pub fn text<'a>(contents: &'a str) -> Node<'a> {
1032+ Node::text(contents)
1033+}
1034+
1035+/// Construct an attribute for an element.
1036+///
1037+/// # Example
1038+///
1039+/// This example creates the `id="my-id"` for some element like `<div
1040+/// id="my-id"/>`.
1041+///
1042+/// ```no_run
1043+/// use dodrio::builder::*;
1044+///
1045+/// let my_id_attr = attr("id", "my-id");
1046+/// ```
1047+pub fn attr<'a>(name: &'a str, value: &'a str) -> Attribute<'a> {
1048+ Attribute { name, value }
1049+}
1050+
1051+/// Create an event listener.
1052+///
1053+/// `event` is the type of event to listen for, e.g. `"click"`. The `callback`
1054+/// is the function that will be invoked when the event occurs.
1055+///
1056+/// # Example
1057+///
1058+/// ```no_run
1059+/// use dodrio::{builder::*, bumpalo::Bump};
1060+///
1061+/// let b = Bump::new();
1062+///
1063+/// let listener = on(&b, "click", |root, vdom, event| {
1064+/// // do something when a click happens...
1065+/// });
1066+/// ```
1067+pub fn on<'a, F>(bump: &'a Bump, event: &'a str, callback: F) -> Listener<'a>
1068+where
1069+ F: Fn(&mut dyn RootRender, VdomWeak, web_sys::Event) + 'static,
1070+{
1071+ Listener {
1072+ event,
1073+ callback: bump.alloc(callback),
1074+ }
1075+}
src/cached.rs+141−75
@@ -1,45 +1,52 @@
1−use crate::{Node, Render};
2−use bumpalo::Bump;
3−use std::cell::RefCell;
4−use std::mem;
1+use crate::{
2+ cached_set::CachedSet,
3+ node::{CachedNode, NodeKey},
4+ Node, Render, RenderContext,
5+};
6+use std::any::TypeId;
7+use std::cell::Cell;
58use std::ops::{Deref, DerefMut};
69
7−// TODO: This implementation will only cache the rendering (generation of the
8−// virtual DOM) but not the diffing of the cached subtree. We could skip diffing
9−// for cached tree by adding `fn is_cached(&self) -> bool` to `Node` that we can
10−// check during diffing. This comes at the cost of bloating `Node`'s size (since
11−// we don't have any padding to sneak an extra `bool` field into). We should
12−// investigate whether it is worth adding this or not.
13−
1410/// A renderable that supports caching for when rendering is expensive but can
1511/// generate the same DOM tree.
16−pub struct Cached<R> {
12+///
13+/// # Example
14+///
15+/// The [TodoMVC
16+/// example](https://github.com/fitzgen/dodrio/blob/master/examples/todomvc/src/todo.rs)
17+/// caches individual todo items.
18+#[derive(Clone, Debug, Default)]
19+pub struct Cached<R>
20+where
21+ R: Default,
22+{
1723 inner: R,
18− bump: bumpalo::Bump,
19− // Actually a self-reference into `self.bump`. Safe because we ensure that
20− // whenever we hand out a cached node, we use a lifetime that cannot outlive
21− // its owning `Cached<R>`.
22− cached: RefCell<Option<Node<'static>>>,
24+ cached: Cell<Option<CachedNode>>,
25+}
26+
27+pub_unstable_internal! {
28+ #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
29+ pub(crate) struct TemplateId(TypeId);
2330}
2431
25−impl<R> Cached<R> {
32+impl<R> Cached<R>
33+where
34+ R: Default,
35+{
2636 /// Construct a new `Cached<R>` of an inner `R`.
2737 ///
2838 /// # Example
2939 ///
3040 /// ```
31− /// use bumpalo::Bump;
32− /// use dodrio::{Cached, Node, Render};
41+ /// use dodrio::{Cached, Node, Render, RenderContext};
3342 ///
43+ /// #[derive(Default)]
3444 /// pub struct Counter {
3545 /// count: u32,
3646 /// }
3747 ///
38− /// impl Render for Counter {
39− /// fn render<'a, 'bump>(&'a self, bump: &'bump Bump) -> Node<'bump>
40− /// where
41− /// 'a: 'bump
42− /// {
48+ /// impl<'a> Render<'a> for Counter {
49+ /// fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
4350 /// // ...
4451 /// # unimplemented!()
4552 /// }
@@ -53,13 +60,8 @@ impl<R> Cached<R> {
5360 /// ```
5461 #[inline]
5562 pub fn new(inner: R) -> Cached<R> {
56− let bump = Bump::new();
57− let cached = RefCell::new(None);
58− Cached {
59− inner,
60− bump,
61− cached,
62− }
63+ let cached = Cell::new(None);
64+ Cached { inner, cached }
6365 }
6466
6567 /// Invalidate the cached rendering.
@@ -71,28 +73,25 @@ impl<R> Cached<R> {
7173 /// # Example
7274 ///
7375 /// The `Cached<Hello>` component must have its cache invalidated whenever
74− /// the `who` string is changed, or else the cached rendering whill keep
76+ /// the `who` string is changed, or else the cached rendering will keep
7577 /// displaying greetings to old `who`s.
7678 ///
7779 /// ```
78− /// use bumpalo::Bump;
79− /// use dodrio::{Cached, Node, Render};
80+ /// use dodrio::{bumpalo, Cached, Node, Render, RenderContext};
8081 ///
8182 /// /// A component that renders to "<p>Hello, {who}!</p>"
83+ /// #[derive(Default)]
8284 /// pub struct Hello {
8385 /// who: String
8486 /// }
8587 ///
86− /// impl Render for Hello {
87− /// fn render<'a, 'bump>(&'a self, bump: &'bump Bump) -> Node<'bump>
88− /// where
89− /// 'a: 'bump,
90− /// {
91− /// Node::element(bump, "p", [], [
92− /// Node::text("Hello, "),
93− /// Node::text(&self.who),
94− /// Node::text("!"),
95− /// ])
88+ /// impl<'a> Render<'a> for Hello {
89+ /// fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
90+ /// use dodrio::builder::*;
91+ /// let greeting = bumpalo::format!(in cx.bump, "Hello, {}!", self.who);
92+ /// p(&cx)
93+ /// .children([text(greeting.into_bump_str())])
94+ /// .finish()
9695 /// }
9796 /// }
9897 ///
@@ -104,18 +103,30 @@ impl<R> Cached<R> {
104103 /// }
105104 /// ```
106105 #[inline]
107− pub fn invalidate(cached: &mut Self) {
108− *cached.cached.borrow_mut() = None;
106+ pub fn invalidate(cached: &Self) {
107+ cached.cached.set(None);
109108 }
110109
111110 /// Convert a `Cached<R>` back into a plain `R`.
112111 #[inline]
113− pub fn into_inner(cached: Cached<R>) -> R {
112+ pub fn into_inner(cached: Self) -> R {
114113 cached.inner
115114 }
116115}
117116
118−impl<R> Deref for Cached<R> {
117+impl<R> Cached<R>
118+where
119+ R: 'static + Default,
120+{
121+ pub(crate) fn template_id() -> TemplateId {
122+ TemplateId(TypeId::of::<R>())
123+ }
124+}
125+
126+impl<R> Deref for Cached<R>
127+where
128+ R: Default,
129+{
119130 type Target = R;
120131
121132 fn deref(&self) -> &R {
@@ -123,41 +134,96 @@ impl<R> Deref for Cached<R> {
123134 }
124135}
125136
126−impl<R> DerefMut for Cached<R> {
137+impl<R> DerefMut for Cached<R>
138+where
139+ R: Default,
140+{
127141 fn deref_mut(&mut self) -> &mut R {
128142 &mut self.inner
129143 }
130144}
131145
132−unsafe fn extend_node_lifetime<'a>(node: Node<'a>) -> Node<'static> {
133− mem::transmute(node)
146+impl<'a, R> Render<'a> for Cached<R>
147+where
148+ R: 'static + Default + for<'b> Render<'b>,
149+{
150+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
151+ let template = cx.template::<R>();
152+ let cached = match self.cached.get() {
153+ // This does-the-cache-contain-this-id check is necessary because
154+ // the same `Cached<R>` instance can be rendered into vdom A, which
155+ // will save the results into A's cached set and yield id X. Then,
156+ // it can be rendered *again* into a second vdom B, and B's cached
157+ // set does not have the saved results for id X. If we didn't have
158+ // this check, instead of a cache miss, we would have a panic.
159+ //
160+ // This scenario should basically never happen in the real world,
161+ // however. If we ever find that it is worth sharing a cached render
162+ // component between multiple vdoms, and want to avoid these
163+ // "unnecessary" cache misses, we can do this:
164+ //
165+ // * Make each `Cached<R>` have an instance id and generation
166+ // counter.
167+ //
168+ // * On invalidation, bump the generation counter.
169+ //
170+ // * Add a generation member to the `CacheEntry`.
171+ //
172+ // * Each vdom maintains a map from `Cached<R>` instance id to
173+ // `CacheEntry`s.
174+ //
175+ // * We only re-use the cached results if the `Cached<R>`'s
176+ // generation counter matches the entry in the vdom's cached set.
177+ //
178+ // This is all do-able but is a bit more book keeping than we really
179+ // want to do unless it is well motivated.
180+ Some(cached)
181+ if {
182+ let cached_set = cx.cached_set.borrow();
183+ cached_set.contains(cached.id)
184+ } =>
185+ {
186+ cached
187+ }
188+ _ => {
189+ let mut key = NodeKey::NONE;
190+ let id = CachedSet::insert(cx, false, template, |nested_cx| {
191+ let node = self.inner.render(nested_cx);
192+ key = node.key();
193+ node
194+ });
195+ let cached = CachedNode { id, key };
196+ self.cached.set(Some(cached));
197+ cached
198+ }
199+ };
200+
201+ cached.into()
202+ }
134203}
135204
136−impl<R: Render> Render for Cached<R> {
137− fn render<'a, 'bump>(&'a self, _: &'bump Bump) -> Node<'bump>
205+#[cfg(feature = "serde")]
206+impl<R> serde::Serialize for Cached<R>
207+where
208+ R: Default + serde::Serialize,
209+{
210+ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
138211 where
139− 'a: 'bump,
212+ S: serde::Serializer,
140213 {
141− let mut cached = self.cached.borrow_mut();
142−
143− if let Some(cached) = cached.as_ref() {
144− // The cached node is actually a self-reference, so it has the `'a`
145− // lifetime.
146− let cached: Node<'a> = cached.clone();
147−
148− // But the `'a` lifetime outlives `'bump`, so we can safely convert
149− // it to the narrower `'bump` lifetime.
150− let cached: Node<'bump> = cached;
151−
152− // Return the cached rendering!
153− return cached;
154− }
214+ self.inner.serialize(serializer)
215+ }
216+}
155217
156− // We don't have a cached node. Render into our own `Bump`, cache it for
157− // future renders, and return it. Same lifetimes as above.
158− let node: Node<'a> = self.inner.render(&self.bump);
159− *cached = Some(unsafe { extend_node_lifetime(node.clone()) });
160− let node: Node<'bump> = node;
161− node
218+#[cfg(feature = "serde")]
219+impl<'de, R> serde::Deserialize<'de> for Cached<R>
220+where
221+ R: Default + serde::Deserialize<'de>,
222+{
223+ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
224+ where
225+ D: serde::Deserializer<'de>,
226+ {
227+ R::deserialize(deserializer).map(Cached::new)
162228 }
163229}
src/cached_set.rsnew file+186
@@ -0,0 +1,186 @@
1+use crate::{
2+ events::EventsRegistry,
3+ node::{Node, NodeKind},
4+ render_context::RenderContext,
5+};
6+use bumpalo::Bump;
7+use fxhash::{FxHashMap, FxHashSet};
8+use std::sync::atomic::{AtomicUsize, Ordering};
9+use std::u32;
10+use wasm_bindgen::prelude::*;
11+
12+static ID_COUNTER: AtomicUsize = AtomicUsize::new(0);
13+
14+pub_unstable_internal! {
15+ #[derive(Debug, Default)]
16+ pub(crate) struct CachedSet {
17+ items: FxHashMap<CacheId, CacheEntry>,
18+ }
19+}
20+
21+pub_unstable_internal! {
22+ #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
23+ pub(crate) struct CacheId(u32);
24+}
25+
26+#[derive(Debug)]
27+pub(crate) struct CacheEntry {
28+ bump: Bump,
29+
30+ // Actually a reference into `bump`.
31+ node: *const Node<'static>,
32+
33+ // All the other cached entries that `node` references (including transitive
34+ // edges). By eagerly following transitive edges and recording them the
35+ // once, we don't have to repeat the tracing every time we want to garbage
36+ // collect cache entries.
37+ edges: FxHashSet<CacheId>,
38+
39+ // The template for this cached virtual subtree.
40+ //
41+ // When a cache entry has a template, that means that the `ChangeList` will
42+ // lazily build a physical DOM subtree based on the template, and when we
43+ // create new versions of this cached result, we clone the template's
44+ // physical DOM subtree and then modify it, rather than building the cached
45+ // result up from scratch. This is a nice win because we bounce between JS
46+ // and DOM methods less often, and get the C++ DOM implementation to do most
47+ // of the subtree construction for us.
48+ template: Option<CacheId>,
49+
50+ // Whether this entry should never be garbage collected. Typically only
51+ // templates are pinned.
52+ pinned: bool,
53+}
54+
55+impl From<CacheId> for u32 {
56+ #[inline]
57+ fn from(id: CacheId) -> u32 {
58+ id.0
59+ }
60+}
61+
62+impl CachedSet {
63+ pub(crate) fn new_roots_set(&self) -> FxHashSet<CacheId> {
64+ let mut roots = FxHashSet::default();
65+ roots.reserve(self.items.len());
66+ roots
67+ }
68+
69+ pub(crate) fn gc(&mut self, registry: &mut EventsRegistry, roots: FxHashSet<CacheId>) {
70+ let mut marked = FxHashSet::default();
71+ marked.reserve(self.items.len());
72+
73+ for root in roots {
74+ if marked.insert(root) {
75+ let entry = self
76+ .items
77+ .get(&root)
78+ .expect_throw("CachedSet::gc: should have root in cached set");
79+
80+ // NB: no need to recurse here because `edges` already contains
81+ // transitive edges!
82+ marked.extend(entry.edges.iter().cloned());
83+ }
84+ }
85+
86+ self.items.retain(|id, entry| {
87+ let keep = entry.pinned || marked.contains(id);
88+ if !keep {
89+ let node: &Node = unsafe { &*entry.node };
90+ registry.remove_subtree(node);
91+ }
92+ keep
93+ });
94+ }
95+
96+ // Trace all the transitive edges to other cached entries that the given
97+ // node has.
98+ fn trace(&self, node: &Node) -> FxHashSet<CacheId> {
99+ let mut edges = FxHashSet::default();
100+ self.trace_recursive(&mut edges, node);
101+ edges
102+ }
103+
104+ fn trace_recursive(&self, edges: &mut FxHashSet<CacheId>, node: &Node) {
105+ match &node.kind {
106+ NodeKind::Text(_) => return,
107+ NodeKind::Cached(c) => {
108+ debug_assert!(self.items.contains_key(&c.id));
109+ edges.insert(c.id);
110+ edges.extend(
111+ self.items
112+ .get(&c.id)
113+ .expect_throw("CachedSet::trace: should have c.id in cached set")
114+ .edges
115+ .iter()
116+ .cloned(),
117+ );
118+ }
119+ NodeKind::Element(el) => {
120+ for child in el.children {
121+ self.trace_recursive(edges, child);
122+ }
123+ }
124+ }
125+ }
126+
127+ fn next_id(&mut self) -> CacheId {
128+ let next = ID_COUNTER.fetch_add(1, Ordering::AcqRel) as u32;
129+ let next = if next == u32::MAX { None } else { Some(next) };
130+ CacheId(next.expect_throw("ID_COUNTER overflowed"))
131+ }
132+
133+ pub(crate) fn insert<F>(
134+ cx: &mut RenderContext,
135+ pinned: bool,
136+ template: Option<CacheId>,
137+ f: F,
138+ ) -> CacheId
139+ where
140+ F: for<'a> FnOnce(&mut RenderContext<'a>) -> Node<'a>,
141+ {
142+ let set = cx.cached_set;
143+ let bump = Bump::new();
144+ let (node, edges) = {
145+ let mut nested_cx = RenderContext::new(&bump, cx.cached_set, cx.templates);
146+ let node = f(&mut nested_cx);
147+ let node = bump.alloc(node);
148+ let edges = {
149+ let set = set.borrow();
150+ set.trace(node)
151+ };
152+ (
153+ node as *mut Node<'_> as usize as *const Node<'static>,
154+ edges,
155+ )
156+ };
157+
158+ let entry = CacheEntry {
159+ bump,
160+ node,
161+ edges,
162+ template,
163+ pinned,
164+ };
165+
166+ let mut set = set.borrow_mut();
167+ let id = set.next_id();
168+ set.items.insert(id, entry);
169+ id
170+ }
171+
172+ /// Does the cached set contain a cached node with the given id?
173+ pub fn contains(&self, id: CacheId) -> bool {
174+ self.items.contains_key(&id)
175+ }
176+
177+ /// Get the cached node and its template (if any) for the given cache id.
178+ pub fn get(&self, id: CacheId) -> (&Node, Option<CacheId>) {
179+ let entry = self
180+ .items
181+ .get(&id)
182+ .expect_throw("CachedSet::get: should have id in set");
183+ let node: &Node = unsafe { &*entry.node };
184+ (node, entry.template)
185+ }
186+}
src/change_list.rsdeleted−381

This diff is too big to show here.

src/change_list/emitter.rsnew file+292

This diff is too big to show here.

src/change_list/js.rsnew file+40

This diff is too big to show here.

src/change_list/mod.rsnew file+353

This diff is too big to show here.

src/change_list/strings.rsnew file+66

This diff is too big to show here.

src/change_list/traversal.rsnew file+344

This diff is too big to show here.

src/diff.rsnew file+1125

This diff is too big to show here.

src/events.rs+123−84

This diff is too big to show here.

src/lib.rs+86−128

This diff is too big to show here.

src/logging.rsnew file+65

This diff is too big to show here.

src/node.rs+183−102

This diff is too big to show here.

src/render.rsnew file+168

This diff is too big to show here.

src/render_context.rsnew file+104

This diff is too big to show here.

src/strace.rsnew file+22

This diff is too big to show here.

src/vdom.rs+186−340

This diff is too big to show here.

tests/web/cached.jsnew file+11

This diff is too big to show here.

tests/web/cached.rs+242−52

This diff is too big to show here.

tests/web/events.rs+70−191

This diff is too big to show here.

tests/web/js_api.rsnew file+153

This diff is too big to show here.

tests/web/keyed.jsnew file+25

This diff is too big to show here.

tests/web/keyed.rsnew file+269

This diff is too big to show here.

tests/web/main.rs+65−41

This diff is too big to show here.

tests/web/render.rs+233−142

This diff is too big to show here.