GET
H2
|
200
|
Primary Request
/
Show response
mikiki.tokyo.jp/
Redirect Chain
-
https://www.mikiki.tokyo.jp/
-
https://mikiki.tokyo.jp/
|
74 KB
15 KB
|
2853ms
2852ms
|
Document
text/html |
202.238.151.85
IIJ Internet Init...
|
|
|
GET
H2
|
200
|
css
fonts.googleapis.com/
|
2 KB
619 B
|
16ms
14ms
|
Stylesheet
text/css |
2a00:1450:4001:82a::200a
GOOGLE
|
|
General
- Full URL
- https://fonts.googleapis.com/css?family=Oswald
- Requested by
- Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:82a::200a
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
ESF /
- Resource Hash
- e12dfaae532b449b71117f29ad43f92b3b87c19509a9b16f91115fd4e07903b4
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000 |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
SAMEORIGIN |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
css
fonts.googleapis.com/
|
2 KB
614 B
|
17ms
15ms
|
Stylesheet
text/css |
2a00:1450:4001:82a::200a
GOOGLE
|
|
General
- Full URL
- https://fonts.googleapis.com/css?family=Roboto
- Requested by
- Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:82a::200a
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
ESF /
- Resource Hash
- 04f6abfdaebd7170b5c22848a8ab4f2a5e9fcd76276d5de379d5ab0f14645fb2
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000 |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
SAMEORIGIN |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
css2
fonts.googleapis.com/
|
334 KB
89 KB
|
21ms
19ms
|
Stylesheet
text/css |
2a00:1450:4001:82a::200a
GOOGLE
|
|
General
- Full URL
- https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Requested by
- Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:82a::200a
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
ESF /
- Resource Hash
- 293ffbe64feb5b27df5ce57a4fbe2bb16e2e1b9e4bd0083bdb4a1cd43a5d66a4
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000 |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
SAMEORIGIN |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
base.css
mikiki.ismcdn.jp/resources/mikiki/css/v1/
|
2 KB
1 KB
|
343ms
26ms
|
Stylesheet
text/css |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
common-layout.css
mikiki.ismcdn.jp/resources/mikiki/css/v1/
|
868 B
759 B
|
343ms
27ms
|
Stylesheet
text/css |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
common-parts.css
mikiki.ismcdn.jp/resources/mikiki/css/v1/
|
9 KB
3 KB
|
345ms
29ms
|
Stylesheet
text/css |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
common-header.css
mikiki.ismcdn.jp/resources/mikiki/css/v1/
|
8 KB
2 KB
|
345ms
29ms
|
Stylesheet
text/css |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
common-aside.css
mikiki.ismcdn.jp/resources/mikiki/css/v1/
|
10 KB
3 KB
|
347ms
31ms
|
Stylesheet
text/css |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
indexes-main-contents.css
mikiki.ismcdn.jp/resources/mikiki/css/v1/
|
25 KB
5 KB
|
355ms
39ms
|
Stylesheet
text/css |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
slick.css
mikiki.ismcdn.jp/common/js/v1/lib/slick/
|
2 KB
763 B
|
355ms
39ms
|
Stylesheet
text/css |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
slick-theme.css
mikiki.ismcdn.jp/common/js/v1/lib/slick/
|
3 KB
1 KB
|
356ms
40ms
|
Stylesheet
text/css |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
jquery.min.js
Show response
ajax.googleapis.com/ajax/libs/jquery/3.5.1/
|
87 KB
30 KB
|
8ms
7ms
|
Script
text/javascript |
2a00:1450:4001:80f::200a
GOOGLE
|
|
|
GET
H2
|
200
|
script
Show response
checkout-api.worldshopping.jp/v1/
|
337 KB
120 KB
|
1196ms
1094ms
|
Script
application/javascript |
143.204.209.77
AMAZON-02
|
|
|
GET
H2
|
200
|
img_529745170ef2a3a593e27ea02b6f7cf7295705.jpg
mikiki.ismcdn.jp/mwimgs/5/2/476/
|
256 KB
257 KB
|
28ms
28ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_aa2fe163414aebaeb1c6c06054f2a7fc240818.jpg
mikiki.ismcdn.jp/mwimgs/a/a/476/
|
209 KB
210 KB
|
85ms
76ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_88034c0f1431d1e128c2745d13fc09f5206334.jpg
mikiki.ismcdn.jp/mwimgs/8/8/476/
|
179 KB
179 KB
|
75ms
67ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_1382b10d4545097d993a8e4b8b022f3c195745.jpg
mikiki.ismcdn.jp/mwimgs/1/3/476h/
|
186 KB
187 KB
|
92ms
83ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_40316cba29ca81fdadd85339328fa7e9189240.jpg
mikiki.ismcdn.jp/mwimgs/4/0/476/
|
162 KB
162 KB
|
98ms
89ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_f34c4f5ff227999480591efccac73f68439505.jpg
mikiki.ismcdn.jp/mwimgs/f/3/476h/
|
232 KB
233 KB
|
98ms
89ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_57eab5951a20a9f09436453b2c6850c2236806.jpg
mikiki.ismcdn.jp/mwimgs/5/7/476h/
|
213 KB
214 KB
|
99ms
91ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_4ab46f473f1e772bfdbdc16a3e850f98444405.jpg
mikiki.ismcdn.jp/mwimgs/4/a/476/
|
384 KB
385 KB
|
99ms
91ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_312f6b5af787139e554f2f81c9dea9b3281820.jpg
mikiki.ismcdn.jp/mwimgs/3/1/476/
|
247 KB
247 KB
|
99ms
90ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_628572d8ca2f10a28143f5b5d865cbf3236601.jpg
mikiki.ismcdn.jp/mwimgs/6/2/476/
|
206 KB
206 KB
|
101ms
91ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_529745170ef2a3a593e27ea02b6f7cf7295705.jpg
mikiki.ismcdn.jp/mwimgs/5/2/142/
|
35 KB
36 KB
|
101ms
92ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_aa2fe163414aebaeb1c6c06054f2a7fc240818.jpg
mikiki.ismcdn.jp/mwimgs/a/a/142/
|
19 KB
19 KB
|
102ms
93ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_88034c0f1431d1e128c2745d13fc09f5206334.jpg
mikiki.ismcdn.jp/mwimgs/8/8/142/
|
25 KB
25 KB
|
102ms
93ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_1382b10d4545097d993a8e4b8b022f3c195745.jpg
mikiki.ismcdn.jp/mwimgs/1/3/142h/
|
24 KB
24 KB
|
118ms
109ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_40316cba29ca81fdadd85339328fa7e9189240.jpg
mikiki.ismcdn.jp/mwimgs/4/0/142/
|
19 KB
19 KB
|
118ms
109ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_f34c4f5ff227999480591efccac73f68439505.jpg
mikiki.ismcdn.jp/mwimgs/f/3/142h/
|
28 KB
29 KB
|
118ms
110ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_57eab5951a20a9f09436453b2c6850c2236806.jpg
mikiki.ismcdn.jp/mwimgs/5/7/142h/
|
25 KB
25 KB
|
118ms
110ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_4ab46f473f1e772bfdbdc16a3e850f98444405.jpg
mikiki.ismcdn.jp/mwimgs/4/a/142/
|
43 KB
43 KB
|
118ms
110ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_312f6b5af787139e554f2f81c9dea9b3281820.jpg
mikiki.ismcdn.jp/mwimgs/3/1/142/
|
29 KB
30 KB
|
124ms
116ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_628572d8ca2f10a28143f5b5d865cbf3236601.jpg
mikiki.ismcdn.jp/mwimgs/6/2/142/
|
27 KB
28 KB
|
128ms
119ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_0f67a4d7dbf0923ec0a37530aa34ef3d350161.jpg
mikiki.ismcdn.jp/mwimgs/0/f/656/
|
75 KB
75 KB
|
128ms
120ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_928d8cc5967a6ba8a6c0f503022d9429600127.jpg
mikiki.ismcdn.jp/mwimgs/9/2/306/
|
43 KB
43 KB
|
128ms
120ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_ff28c4932c4595c777230005f85f90c2754156.jpg
mikiki.ismcdn.jp/mwimgs/f/f/85/
|
6 KB
6 KB
|
128ms
120ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_ffef38e07ce3bce764eaaaec2ab0275c758240.jpg
mikiki.ismcdn.jp/mwimgs/f/f/85/
|
4 KB
5 KB
|
131ms
123ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_f4588853abe8bc5b61f9ea5f3fa30888309598.jpg
mikiki.ismcdn.jp/mwimgs/f/4/120h/
|
5 KB
6 KB
|
134ms
126ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_898a15cb363a41e72ad0a1f3ef9b85ea1352172.jpg
mikiki.ismcdn.jp/mwimgs/8/9/85/
|
6 KB
6 KB
|
135ms
127ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_34811fe29099a510764904239ac1d582193093.jpg
mikiki.ismcdn.jp/mwimgs/3/4/85/
|
9 KB
9 KB
|
137ms
129ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_1b10d4131513247a404a9ea9d64168fc271117.jpg
mikiki.ismcdn.jp/mwimgs/1/b/85/
|
3 KB
3 KB
|
138ms
131ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_33c9300f34e54c4fbac139affbc2ef70476781.jpg
mikiki.ismcdn.jp/mwimgs/3/3/85/
|
7 KB
7 KB
|
138ms
131ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_4e5cd1d3eaae222e6612692c7f3588671471823.jpg
mikiki.ismcdn.jp/mwimgs/4/e/300/
|
116 KB
116 KB
|
140ms
133ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_e407779bac19d54f96d4dca7a2d4a999510780.jpg
mikiki.ismcdn.jp/mwimgs/e/4/200h/
|
20 KB
20 KB
|
141ms
134ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_e52e9982ed27d81317c7a7c406d11662213422.jpg
mikiki.ismcdn.jp/mwimgs/e/5/300/
|
19 KB
19 KB
|
141ms
134ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_50e819db601ee27e9125c8a8e9c945c0648736.jpg
mikiki.ismcdn.jp/mwimgs/5/0/300/
|
41 KB
41 KB
|
141ms
135ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_cdca2e283fcfb4bad846962c0af4f16e174401.jpg
mikiki.ismcdn.jp/mwimgs/c/d/656/
|
35 KB
36 KB
|
142ms
135ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_0f67a4d7dbf0923ec0a37530aa34ef3d350161.jpg
mikiki.ismcdn.jp/mwimgs/0/f/306/
|
19 KB
20 KB
|
142ms
136ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_6d08563448d20bad9371a7528338bd7d1109338.jpg
mikiki.ismcdn.jp/mwimgs/6/d/306/
|
87 KB
88 KB
|
143ms
136ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_be6ddc12a611b0a3192fbeeb988205122287962.jpg
mikiki.ismcdn.jp/mwimgs/b/e/204h/
|
65 KB
65 KB
|
144ms
137ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_7b18e9c6f970d7e266171b643112cad41315554.jpg
mikiki.ismcdn.jp/mwimgs/7/b/204h/
|
28 KB
29 KB
|
144ms
138ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_4e5cd1d3eaae222e6612692c7f3588671471823.jpg
mikiki.ismcdn.jp/mwimgs/4/e/306/
|
119 KB
120 KB
|
144ms
138ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_2125ae47d8382a15892a6f6f38778c7e981925.jpg
mikiki.ismcdn.jp/mwimgs/2/1/204h/
|
21 KB
22 KB
|
145ms
139ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_296c40f62859ff88cafbdad99e64ba7b1525483.jpg
mikiki.ismcdn.jp/mwimgs/2/9/204h/
|
37 KB
37 KB
|
145ms
139ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_06ac6fc8f87a4bf63e6c3bf620e873621926742.jpg
mikiki.ismcdn.jp/mwimgs/0/6/306/
|
84 KB
85 KB
|
146ms
140ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_21f85bb2c3583f5d394099c9ae0d7f961120941.jpg
mikiki.ismcdn.jp/mwimgs/2/1/204h/
|
33 KB
33 KB
|
146ms
141ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_e407779bac19d54f96d4dca7a2d4a999510780.jpg
mikiki.ismcdn.jp/mwimgs/e/4/204h/
|
21 KB
22 KB
|
146ms
141ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_d9af183b9c90b6cacd629b954c4281ee753304.jpg
mikiki.ismcdn.jp/mwimgs/d/9/306/
|
53 KB
54 KB
|
147ms
141ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_1c55528e022adf8230758845df77c168593345.jpg
mikiki.ismcdn.jp/mwimgs/1/c/204h/
|
19 KB
20 KB
|
147ms
142ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
|
140 KB
50 KB
|
69ms
23ms
|
Script
text/javascript |
2a00:1450:4001:827::2002
GOOGLE
|
|
|
GET
H2
|
200
|
img_9fcca91980620231fcce37173aa0dd9137404.jpg
mikiki.tokyo.jp/mwimgs/9/f/-/
|
36 KB
36 KB
|
255ms
250ms
|
Image
image/jpeg |
202.238.151.85
IIJ Internet Init...
|
|
|
GET
H2
|
200
|
img_0f67a4d7dbf0923ec0a37530aa34ef3d350161.jpg
mikiki.ismcdn.jp/mwimgs/0/f/300w/
|
19 KB
19 KB
|
147ms
142ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_cdca2e283fcfb4bad846962c0af4f16e174401.jpg
mikiki.ismcdn.jp/mwimgs/c/d/300w/
|
9 KB
10 KB
|
147ms
143ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_e52e9982ed27d81317c7a7c406d11662213422.jpg
mikiki.ismcdn.jp/mwimgs/e/5/300w/
|
19 KB
19 KB
|
148ms
144ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_97c2133c5d8b5d072fb75913c93546b8361024.jpg
mikiki.ismcdn.jp/mwimgs/9/7/200h/
|
11 KB
12 KB
|
149ms
144ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_9851d4908d6952af1d8bb1696f604947894000.jpg
mikiki.ismcdn.jp/mwimgs/9/8/300w/
|
38 KB
39 KB
|
149ms
144ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_074e23f3d0274ef5dff8608354b7de661498300.jpg
mikiki.ismcdn.jp/mwimgs/0/7/300w/
|
22 KB
23 KB
|
165ms
161ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_e2e8b94ced8bedc3d8a896aaedb853ec518316.jpg
mikiki.ismcdn.jp/mwimgs/e/2/300w/
|
34 KB
34 KB
|
165ms
161ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_cf830c3fa0fd53d6150848ca4002f77c1114386.jpg
mikiki.ismcdn.jp/mwimgs/c/f/300w/
|
58 KB
59 KB
|
165ms
161ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_bec4c3aa9664da4a69da7b5467512178150821.jpg
mikiki.ismcdn.jp/mwimgs/b/e/90/
|
2 KB
2 KB
|
166ms
162ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_c298d84d003779fa43558636d132dba452965.jpg
mikiki.ismcdn.jp/mwimgs/c/2/90/
|
2 KB
2 KB
|
166ms
162ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_6ae23b92c5c6bb01646db6c0e56c9d65376925.jpg
mikiki.ismcdn.jp/mwimgs/6/a/90/
|
7 KB
7 KB
|
167ms
163ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_902e6148ce6a54e1053ffe51cd16d4d1467856.jpg
mikiki.ismcdn.jp/mwimgs/9/0/90/
|
4 KB
4 KB
|
167ms
163ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
logo.png
mikiki.ismcdn.jp/common/images/v1/common/
|
11 KB
11 KB
|
143ms
141ms
|
Image
image/png |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
twitter-64.png
mikiki.ismcdn.jp/common/images/v2/smartphone/
|
2 KB
2 KB
|
143ms
141ms
|
Image
image/png |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
facebook.png
mikiki.ismcdn.jp/common/images/v2/smartphone/
|
507 B
681 B
|
143ms
141ms
|
Image
image/png |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
instagram.png
mikiki.ismcdn.jp/common/images/v2/smartphone/
|
2 KB
2 KB
|
156ms
154ms
|
Image
image/png |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
youtube.png
mikiki.ismcdn.jp/common/images/v2/smartphone/
|
678 B
852 B
|
156ms
154ms
|
Image
image/png |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
icon_search.png
mikiki.ismcdn.jp/common/images/v1/common/
|
845 B
1019 B
|
156ms
155ms
|
Image
image/png |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
bg_top_review.png
mikiki.ismcdn.jp/common/images/v1/main_column/
|
248 B
422 B
|
156ms
155ms
|
Image
image/png |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.118.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
13 KB
13 KB
|
10ms
9ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.118.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 602a5dcd9d2f9dcfbc4d874ca1cb678980d0bd438f059baf655ec1738407dd44
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.119.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
51 KB
51 KB
|
9ms
8ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.119.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 07897cb289ad971fc16117c1aa87d8e34b12bebb64c86e12e23da3c3844820d0
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
KFOmCnqEu92Fr1Mu4mxK.woff2
fonts.gstatic.com/s/roboto/v20/
|
15 KB
15 KB
|
8ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
|
GET
H2
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.119.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
50 KB
50 KB
|
11ms
10ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.119.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 839c37491e75f874f27d008facea2ca67a0ee1ac4b4cf08cea849cd867f8a481
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.116.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
12 KB
12 KB
|
38ms
21ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.116.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- b8d0ac62da50fbb0597add996c2b8d95945197f8eba1d0ae58b4c775f36a0682
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.114.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
11 KB
12 KB
|
37ms
21ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.114.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- f79f9e37e32f2b785374b23de144789aa3a51890f6f988f0775b8d314a1031f1
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.118.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
13 KB
13 KB
|
7ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.118.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 17c4f63a5838d55a80ee56b453f14000af4ff8cc00b477d7c0f3f345100630d1
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.111.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
8ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.111.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 27eb0cd78766a34130a0576edab8a592ac7185cb1392d0f16fb04e858b2e9ec5
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.117.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
9 KB
10 KB
|
9ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.117.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- fa455fe41339aea4896b1bd254c9aaf0526e157ef2987c931fd3fc304e2773ab
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.113.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
12 KB
12 KB
|
10ms
8ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.113.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- bb915b7278248012753d418ea0bf6b8f24ada7be9e8ff65c8f1f93ca5edc30ad
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.112.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
12 KB
12 KB
|
10ms
8ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.112.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- a1db447d5fded04e406067127a27914776541c23f49e9bb9a2e11229a8e9267b
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.110.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
13 KB
13 KB
|
13ms
11ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.110.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 4dcda0daa519f52435cb137ffbdb0afb5e5ca8129924ea8819525f06c64e2862
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.98.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
15 KB
15 KB
|
15ms
13ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.98.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- eca5e4b773a1f5bbcad549433d6f8b1374e1847e3d3ff6de6fdd7a3aa4625cb5
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.93.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
12ms
10ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.93.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 38a465fa1ef5d0746ddaebad5638abc8ba0946f455fb07b60a3c86c209254622
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.28.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
53 KB
53 KB
|
11ms
9ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.28.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- a6c2ef0e5c0908627f62819d7c68325ea2bac8300aadb8d888e513c0d1de5c91
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.107.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
13 KB
13 KB
|
17ms
15ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.107.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 40f2416a462edde810a860187b5a9d6cbab3ba506239b57e8336f3ffec695ba3
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.90.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
16 KB
16 KB
|
15ms
13ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.90.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- a7f4f3c218bfc61533c17194e7f72767d8407cfaa712d301de5ca05e8b725446
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.115.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
14ms
13ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.115.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 8b697c38acad2b459608fd707c78357fc6d91dbac39edfcc031f2df5d4798b14
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.117.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
9 KB
9 KB
|
13ms
11ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.117.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- ad0f62c75cc9e9553001b7dea1bec37dd09f8eb23e7f11c5256ac3aea219f6d3
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.109.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
12 KB
12 KB
|
13ms
8ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.109.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- ef796289bb6aba587bc8a2b913252782dc74f671ffa1adbf4cff2ea98302e68e
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.84.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
15 KB
15 KB
|
17ms
11ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.84.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 8f0ec2741f6dc9472d183a72eea92897e37c492d39e8e04052e2662162f98575
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.101.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
13 KB
13 KB
|
16ms
10ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.101.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- fa376a12bf886dcd556dd537d3dd546e55af1217ea2c05bdc7e5eb628d93fbc8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.67.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
15ms
10ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.67.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 02b081c8a5b07b09d49dc204fb78065b2e965fb5a7e01d7cf91f2517efb5f55d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.94.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
16 KB
16 KB
|
17ms
12ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.94.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 2ed4fad10bde60024d26e14073a9c97f29d65b9d92325bb827270a15814bf32b
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.100.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
17 KB
17 KB
|
16ms
9ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.100.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- cc85d7665430c72ef49021221536a7b8dcd16e8bc0bc11ceb9bac4aa9f5f75d7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.102.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
15 KB
15 KB
|
9ms
8ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.102.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- e7d83be9624e15a40f0e9957b7989ee1332316cd4964f0b721650d4704108aee
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.92.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
16 KB
16 KB
|
9ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.92.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- ffedbcaa8faa8d35694373e2f95bf9948622de67d7819173ff7e411ed869b452
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.99.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
16 KB
16 KB
|
7ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.99.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 9fc9f3ab6d39be9fc3843a4b4100b0b8a088f531c4f8c0e47765f202d555bda2
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.108.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
15 KB
16 KB
|
7ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.108.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 79e06a61e43a37a2237635ecbf0e6e6f572a57adf6ce5308528f92473f1c9b29
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.105.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
8ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.105.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- fe00c4967597e1957d5f28ccbe42785bf265355f54aa2c461047aa853285ba56
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.104.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
7ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.104.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- dbb59f6b2042d5f803c0c6752a38625c0dc072eb82837974253ff58d39e0a75f
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.85.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
8ms
8ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.85.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 704230d3ab92cee78199d3d5067699583b67e5f7dfd17c2fb9ab750b1f3a9b3e
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.103.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
7ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.103.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 963bc082db73b19b5718958d3a3407e076b033261ad320533a838eff1d39313d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.106.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
18 KB
18 KB
|
6ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.106.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- a6cf1be12cedd8831630f680f30bde048e4beb31332e5f0d190b0aeb35c0b1bf
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.86.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
7ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.86.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- dd25286bc9bb33ddf9d164a84c9e655fc3a65a957aeca51805ff7b6d7e0da080
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.87.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
16 KB
16 KB
|
7ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.87.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 647dcb241a42cc03a0eadeb25707de5c25891d90a2ad791808a6801de69f43a9
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.65.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
17 KB
17 KB
|
7ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.65.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 780274f8d794f07e4a07104888e0d03562be15e6672490a6e50f11bfdc754cc2
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.116.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
12 KB
12 KB
|
6ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.116.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 1002546098510527be307620ac05e89e6378cd4a320eecea2d350362a0c32cfa
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.114.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
11 KB
11 KB
|
7ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.114.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 0d8755fdd3ad6a0ad8bff8e51a8272640eaa91023bd8439dcafab5c2788718f7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.76.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
15 KB
15 KB
|
7ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.76.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- ca9b887ba8e20019ba43791cec3453809582a349c65a6b7017c9415b258c8969
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.80.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
15 KB
15 KB
|
6ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.80.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 3fa3450b07b49b60756b5d852d67fa58d7769943b290d4294e1f4ea50192c60d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.97.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
15 KB
15 KB
|
10ms
8ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.97.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- ef4cea46477fae80dea705ec8e2d61f0de2702fccdda594ce3c78f6aa844c8e8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.91.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
16 KB
16 KB
|
9ms
8ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.91.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 536f8d5b5018ae63d2a2a9f10d32547f1bf071e56657d5a95d167c7624ea97de
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.78.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
17 KB
17 KB
|
12ms
10ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.78.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- ab83b66e358e5ec4f3e7b58365578e10c833ce55b5d1c0f0f12b36400e6460f3
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.77.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
15 KB
|
8ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.77.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- ffaf3f74081130197ac049dd0660e61af0e07ee8cbd11d50ff4ca19305f9e5e2
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.41.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
58 KB
58 KB
|
11ms
10ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.41.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 64a730449f44153383afa7df6f6892a1bafc9c59e6941f601e071489cf8a568d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.40.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
45 KB
45 KB
|
10ms
9ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.40.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 3782da43615c58e52f2a390f7b5bebe45564bda62993858cddec99c057e84034
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.68.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
17 KB
18 KB
|
9ms
9ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.68.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 0319ff9a1d32a340bc3e6380f467f9799c3a1e3e94d1dcede1af2c21e90495f0
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.73.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
17 KB
17 KB
|
12ms
11ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.73.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 76078be6370f737ef226cd3c7a68d28e522605266a790dda8e9a0a7cf5f33e2e
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.95.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
15 KB
15 KB
|
10ms
10ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.95.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- cd31ca1ac038f9d935e771718d78fd8cd60d151484de4bb6d967853606949f24
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.79.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
16 KB
16 KB
|
10ms
9ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.79.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- d04526c1417802365f624fe4da7b0c16d0209d262918a0488b9a2afcd6a5faf0
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.17.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
65 KB
65 KB
|
10ms
10ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.17.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 5b477fb9a62da28bbdeeb604b989a411eac04b2681dc6080710cb011eeb170d1
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.96.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
16 KB
16 KB
|
9ms
9ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.96.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- f7a01079de31377add99cab5139c7a57065a730623677475acaeb4473c716891
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.81.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
15 KB
|
11ms
10ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.81.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- d53831993057b52e14c5d2d158eb0b4466e1b67b73e0f68c3c868209c71fe881
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.109.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
12 KB
12 KB
|
8ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.109.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- b77c8336090d439fead311869670fad2f967de3919f9f99995e7278e755350c7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
arrow_r_wh.png
mikiki.ismcdn.jp/common/images/v1/main_column/
|
1 KB
1 KB
|
25ms
24ms
|
Image
image/png |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.33.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
47 KB
47 KB
|
7ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.33.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- acdfd379ae0662a62840293b1299de5e454132f948233a00818183abad122162
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.89.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
15 KB
15 KB
|
7ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.89.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- ac69e594b591b52adf10ca552340ca61262b8c9099452e514402ec3ad46ad02d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.101.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
13 KB
13 KB
|
6ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.101.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 399031cf526bda363fcb843695a6687e7d52562a525eb3fc3083d4ca8bff3284
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.110.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
13 KB
13 KB
|
6ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.110.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 2a01e79481a158efeaebaa1ebb3ad7824106c1d22d991d83cedfe72a30699aa0
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
img_5df16effdce95bd5fbd2052998cdedc4143796.jpg
mikiki.ismcdn.jp/mwimgs/5/d/90/
|
2 KB
2 KB
|
27ms
25ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_585d479cd1c6848f69af10e4e92d24d025441.jpg
mikiki.ismcdn.jp/mwimgs/5/8/300/
|
11 KB
11 KB
|
28ms
24ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_56759d0307034cc3c6cce9e0d9c574c310187.gif
mikiki.ismcdn.jp/mwimgs/5/6/300/
|
10 KB
10 KB
|
28ms
24ms
|
Image
image/gif |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_7b5c6b810100e63edf746849754cc2778446.jpg
mikiki.ismcdn.jp/mwimgs/7/b/300/
|
7 KB
8 KB
|
30ms
26ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_74defc4e2e700b1564f1d1f1ff01aaba12530.jpg
mikiki.ismcdn.jp/mwimgs/7/4/300/
|
11 KB
12 KB
|
31ms
27ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_4e075572a17b4e2013bbc9511dcf048f19363.jpg
mikiki.ismcdn.jp/mwimgs/4/e/300/
|
18 KB
18 KB
|
31ms
27ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_3aab23d8298ae2095174ddd01e1b88b418525.jpg
mikiki.ismcdn.jp/mwimgs/3/a/300/
|
17 KB
18 KB
|
32ms
28ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_c89cc54feaf3037beb7aa78bc284a9e115466.jpg
mikiki.ismcdn.jp/mwimgs/c/8/300/
|
15 KB
15 KB
|
33ms
30ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_5ac730b3e138f5595b6f959bbb6d26cd16002.jpg
mikiki.ismcdn.jp/mwimgs/5/a/300/
|
15 KB
15 KB
|
36ms
31ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_dac41b561645bdd33bf0e4e2e99ab13d12593.jpg
mikiki.ismcdn.jp/mwimgs/d/a/300/
|
11 KB
11 KB
|
36ms
32ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
change-for-smartphone.png
mikiki.tokyo.jp/common/images/v1/common/
|
11 KB
11 KB
|
252ms
248ms
|
Image
image/png |
202.238.151.85
IIJ Internet Init...
|
|
|
GET
H3-Q050
|
200
|
jquery-ui.min.js
Show response
ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/
|
223 KB
60 KB
|
38ms
21ms
|
Script
text/javascript |
2a00:1450:4001:82a::200a
GOOGLE
|
|
|
GET
H2
|
200
|
jquery.cycle2.min.js
Show response
mikiki.ismcdn.jp/common/js/v1/lib/
|
22 KB
7 KB
|
30ms
27ms
|
Script
application/javascript |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
easyselectbox.min.js
Show response
mikiki.ismcdn.jp/common/js/v1/lib/
|
5 KB
2 KB
|
30ms
28ms
|
Script
application/javascript |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
jquery.tile.js
Show response
mikiki.ismcdn.jp/common/js/v1/lib/tile/
|
894 B
696 B
|
32ms
29ms
|
Script
application/javascript |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
jquery.zoomcycle.js
Show response
mikiki.ismcdn.jp/resources/mikiki/js/v1/lib/
|
6 KB
2 KB
|
33ms
30ms
|
Script
application/x-javascript |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
common.js
Show response
mikiki.ismcdn.jp/resources/mikiki/js/v1/
|
10 KB
3 KB
|
73ms
70ms
|
Script
application/x-javascript |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
indexes.js
Show response
mikiki.ismcdn.jp/resources/mikiki/js/v1/
|
2 KB
1 KB
|
33ms
31ms
|
Script
application/x-javascript |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
l.js
Show response
mikiki.tokyo.jp/oo/mk/
|
1 KB
835 B
|
250ms
247ms
|
Script
text/javascript |
202.238.151.85
IIJ Internet Init...
|
|
|
GET
H2
|
200
|
share.js
Show response
platform.tumblr.com/v1/
|
96 B
370 B
|
372ms
121ms
|
Script
application/javascript |
74.114.154.15
AUTOMATTIC
|
|
|
GET
H2
|
200
|
bookmark_button.js
Show response
b.st-hatena.com/js/
|
35 KB
11 KB
|
145ms
49ms
|
Script
application/x-javascript |
65.9.96.38
AMAZON-02
|
|
|
GET
H3-Q050
|
200
|
show_ads_impl_with_ama_fy2019.js
Show response
pagead2.googlesyndication.com/pagead/js/r20210303/r20190131/
|
227 KB
86 KB
|
74ms
60ms
|
Script
text/javascript |
2a00:1450:4001:827::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20210303/r20190131/show_ads_impl_with_ama_fy2019.js?client=ca-pub-6762391202596396&plah=mikiki.tokyo.jp&amaexp=1
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:827::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- c1f6f1027092d281d624e67f9f83460ed291ae367b558c16cd6afad7af5eba1e
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
logo-s.png
mikiki.ismcdn.jp/common/images/v1/common/
|
2 KB
3 KB
|
25ms
25ms
|
Image
image/png |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.82.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
16 KB
16 KB
|
7ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.82.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- be77f2a682264d0193dbec5caf6719e392f56ea86130cafb4adc4b4dba813fc2
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.113.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
12 KB
12 KB
|
7ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.113.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 9a2267d25cd1e6879633a573e90a5cd8f406ded9d15f86af3c090f0f43972466
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.108.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
15 KB
15 KB
|
7ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.108.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 809b23fa3719aa2e2f7948dd598edbd963828447a7e6a975b7c90ca8fdcdaaf4
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.112.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
12 KB
12 KB
|
6ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.112.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- daf150195be02d40aef144108115e329b6d2befe8b2532f64bad9963facb4b93
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
zrt_lookup.html
Show response
googleads.g.doubleclick.net/pagead/html/r20210303/r20190131/
Frame 6DC7
|
11 KB
5 KB
|
7ms
6ms
|
Document
text/html |
2a00:1450:4001:802::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20210303/r20190131/zrt_lookup.html
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:802::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e78c14aeb9435fd03f67ad2ee4c45e18bfcfc100a4c62c8bd886324ce6296f77
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
|
46 KB
19 KB
|
6ms
5ms
|
Script
text/javascript |
2a00:1450:4001:809::200e
GOOGLE
|
|
|
POST
H3-Q050
|
200
|
collect
Show response
www.google-analytics.com/j/
|
4 B
70 B
|
13ms
13ms
|
XHR
text/plain |
2a00:1450:4001:809::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/j/collect?v=1&_v=j88&a=2024170864&t=pageview&_s=1&dl=https%3A%2F%2Fmikiki.tokyo.jp%2F&ul=en-us&de=UTF-8&dt=Mikiki%20-%20music%20review%20site&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&_u=IEBAAEABAAAAAC~&jid=30069544&gjid=892501656&cid=649973928.1615234972&tid=UA-48867176-1&_gid=1720696143.1615234972&_r=1&_slc=1&z=1845013153
- Requested by
- Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- aec60bc104db041b1512185839f18f52986df7e569e5445f740dd60f763fbca8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
POST
H2
|
200
|
collect
Show response
stats.g.doubleclick.net/j/
|
1 B
85 B
|
15ms
14ms
|
XHR
text/plain |
2a00:1450:400c:c1b::9d
GOOGLE
|
|
General
- Full URL
- https://stats.g.doubleclick.net/j/collect?t=dc&aip=1&_r=3&v=1&_v=j88&tid=UA-48867176-1&cid=649973928.1615234972&jid=30069544&gjid=892501656&_gid=1720696143.1615234972&_u=IEBAAEAAAAAAAC~&z=336044354
- Requested by
- Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:400c:c1b::9d
Brussels, Belgium,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
m.gif
mikiki.tokyo.jp/oo/mk/
|
43 B
142 B
|
248ms
248ms
|
Image
image/gif |
202.238.151.85
IIJ Internet Init...
|
|
|
GET
H2
|
200
|
sdk.js
Show response
connect.facebook.net/ja_JP/
|
3 KB
2 KB
|
14ms
14ms
|
Script
application/x-javascript |
2a03:2880:f045:10:face:b00c:0:3
FACEBOOK
|
|
|
GET
H2
|
200
|
sdk.js
Show response
connect.facebook.net/ja_JP/
|
197 KB
60 KB
|
38ms
13ms
|
Script
application/x-javascript |
2a03:2880:f045:10:face:b00c:0:3
FACEBOOK
|
|
General
- Full URL
- https://connect.facebook.net/ja_JP/sdk.js?hash=88a562dfc2480c8ef772655c688a4d87&ua=modern_es6
- Requested by
- Host: connect.facebook.net
URL: https://connect.facebook.net/ja_JP/sdk.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a03:2880:f045:10:face:b00c:0:3
, United States,
ASN32934
(FACEBOOK, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- 0e235c65027fd5f1ba0b9f86250a77592a9d3b4fa03b45df3e02251dad244974
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; preload; includeSubDomains |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
DENY |
|
GET
H/1.1
|
200
OK
|
widgets.js
Show response
platform.twitter.com/
|
96 KB
29 KB
|
59ms
14ms
|
Script
application/javascript |
2606:2800:234:59:254c:406:2366:268c
EDGECAST
|
|
|
GET
H2
|
200
|
btn.js
Show response
widgets.getpocket.com/v1/j/
|
2 KB
1 KB
|
137ms
44ms
|
Script
application/javascript |
65.9.96.29
AMAZON-02
|
|
|
GET
H2
|
200
|
tag.js
Show response
s.yjtag.jp/
|
37 KB
13 KB
|
29ms
7ms
|
Script
application/javascript |
2600:9000:214f:1000:8:dcbf:c740:93a1
AMAZON-02
|
|
|
GET
H2
|
200
|
cookie.js
Show response
partner.googleadservices.com/gampad/
|
205 B
645 B
|
115ms
58ms
|
Script
text/javascript |
142.250.185.226
GOOGLE
|
|
General
- Full URL
- https://partner.googleadservices.com/gampad/cookie.js?domain=mikiki.tokyo.jp&callback=_gfp_s_&client=ca-pub-6762391202596396
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20210303/r20190131/show_ads_impl_with_ama_fy2019.js?client=ca-pub-6762391202596396&plah=mikiki.tokyo.jp&amaexp=1
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
142.250.185.226
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s53-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 8142410a7e8adddb1eabb914635504ec09717377d2e14feed9840afbcf00b90d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
107 B
799 B
|
35ms
16ms
|
Script
application/javascript |
2a00:1450:4001:812::2002
GOOGLE
|
|
General
- Full URL
- https://adservice.google.de/adsid/integrator.js?domain=mikiki.tokyo.jp
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20210303/r20190131/show_ads_impl_with_ama_fy2019.js?client=ca-pub-6762391202596396&plah=mikiki.tokyo.jp&amaexp=1
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:812::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- a4a1824defec1084ca81d496ee77891684c26196924bdc4fc21dd3482ce15e14
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
|
107 B
243 B
|
16ms
15ms
|
Script
application/javascript |
2a00:1450:4001:803::2002
GOOGLE
|
|
General
- Full URL
- https://adservice.google.com/adsid/integrator.js?domain=mikiki.tokyo.jp
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20210303/r20190131/show_ads_impl_with_ama_fy2019.js?client=ca-pub-6762391202596396&plah=mikiki.tokyo.jp&amaexp=1
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:803::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- a4a1824defec1084ca81d496ee77891684c26196924bdc4fc21dd3482ce15e14
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
|
0
111 B
|
39ms
38ms
|
Image
image/gif |
2a00:1450:4001:827::2002
GOOGLE
|
|
|
GET
H3-Q050
|
200
|
ads
Show response
googleads.g.doubleclick.net/pagead/
Frame F8EB
|
54 B
596 B
|
134ms
120ms
|
Document
text/html |
2a00:1450:4001:800::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6762391202596396&output=html&adk=1812271804&adf=3025194257&lmt=1615234972&plat=1%3A16809992%2C2%3A32776%2C8%3A134217728%2C9%3A134250504%2C16%3A8388608%2C17%3A32%2C24%3A32%2C25%3A32%2C30%3A1081344%2C32%3A32&format=0x0&url=https%3A%2F%2Fmikiki.tokyo.jp%2F&ea=0&flash=0&pra=7&wgl=1&dt=1615234972114&bpp=1&bdt=1257&idt=1&shv=r20210303&cbv=r20190131&ptt=9&saldr=aa&abxe=1&nras=1&correlator=7858236862458&frm=20&pv=2&ga_vid=649973928.1615234972&ga_sid=1615234972&ga_hid=2024170864&ga_fc=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1600&bih=1200&scr_x=0&scr_y=0&eid=42530672%2C21066922%2C21068083&oid=3&pvsid=1284100185698243&rx=0&eae=2&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=8192&bc=31&ifi=3&uci=a!3&fsb=1&dtd=18
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20210303/r20190131/show_ads_impl_with_ama_fy2019.js?client=ca-pub-6762391202596396&plah=mikiki.tokyo.jp&amaexp=1
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 166a4ec3cb90d525f7f744c7616c01b36bebd6dcecd486c8f5be14ccc0a7b3da
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd.js
Show response
www.googletagservices.com/activeview/js/current/
|
74 KB
28 KB
|
33ms
14ms
|
Script
text/javascript |
2a00:1450:4001:80e::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20210303/r20190131/show_ads_impl_with_ama_fy2019.js?client=ca-pub-6762391202596396&plah=mikiki.tokyo.jp&amaexp=1
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80e::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- e2b04100564fd9141d7acbd40482d40a3c5b4af2cf25b2cf8726b5608841d61a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
like_box.php
Show response
www.facebook.com/v2.0/plugins/
Frame 8B64
|
53 KB
17 KB
|
85ms
85ms
|
Document
text/html |
2a03:2880:f145:82:face:b00c:0:25de
FACEBOOK
|
|
General
- Full URL
- https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
- Requested by
- Host: connect.facebook.net
URL: https://connect.facebook.net/ja_JP/sdk.js?hash=88a562dfc2480c8ef772655c688a4d87&ua=modern_es6
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a03:2880:f145:82:face:b00c:0:25de
, United States,
ASN32934
(FACEBOOK, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- 877154470ef1831f5378508d6848ab9e0cf3e5dfd6f8537b13ecd4b43ea6baf9
- Security Headers
-
Name |
Value |
Content-Security-Policy |
default-src * data: blob: 'self';script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' *;connect-src *.facebook.com facebook.com *.fbcdn.net *.facebook.net *.spotilocal.com:* wss://*.facebook.com:* https://fb.scanandcleanlocal.com:* attachment.fbsbx.com ws://localhost:* blob: *.cdninstagram.com 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;block-all-mixed-content;upgrade-insecure-requests; |
Strict-Transport-Security |
max-age=15552000; preload |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
genre_selector.png
mikiki.ismcdn.jp/common/images/v1/sub_column/
|
447 B
621 B
|
25ms
25ms
|
Image
image/png |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
ranking
Show response
mikiki.tokyo.jp/list/slideshow/tabs_reviews/
|
8 KB
1 KB
|
249ms
249ms
|
XHR
text/html |
202.238.151.85
IIJ Internet Init...
|
|
General
- Full URL
- https://mikiki.tokyo.jp/list/slideshow/tabs_reviews/ranking?t=0&g=0
- Requested by
- Host: ajax.googleapis.com
URL: https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
202.238.151.85
Mito, Japan,
ASN2497
(IIJ Internet Initiative Japan Inc., JP),
- Reverse DNS
- 85.151.238.202.rev.ismedia.jp
- Software
-
/
- Resource Hash
- fcd42fbc171063aec1e2deceb21e3884c46b7dea68543a511a5c5dad335b57a1
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000 |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
SAMEORIGIN |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
ranking
Show response
mikiki.tokyo.jp/list/slideshow/tabs_articles/
|
9 KB
2 KB
|
248ms
248ms
|
XHR
text/html |
202.238.151.85
IIJ Internet Init...
|
|
General
- Full URL
- https://mikiki.tokyo.jp/list/slideshow/tabs_articles/ranking?t=0&g=0
- Requested by
- Host: ajax.googleapis.com
URL: https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
202.238.151.85
Mito, Japan,
ASN2497
(IIJ Internet Initiative Japan Inc., JP),
- Reverse DNS
- 85.151.238.202.rev.ismedia.jp
- Software
-
/
- Resource Hash
- 3bf4ba4cad00a79d25826421b08cf177ab20e4f352ef514c08b3b850524bb8e5
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000 |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
SAMEORIGIN |
X-Xss-Protection |
1; mode=block |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.66.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
16 KB
16 KB
|
7ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.66.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- f9b9f1e144d97450d5ccc485f9aeba31144a8e15bc70c9f17249b34e157c12fc
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.39.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
56 KB
56 KB
|
6ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.39.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 690d6f60191f1663dc4c741f9ec6e90d106214dd2b6f69e5ace9b414ea71d1de
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.83.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
16 KB
16 KB
|
7ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.83.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- fae0fa574bed38ddf8e96e24b982062e0fe6b04b2c1e004df584fcb0dce75050
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
|
tag
Show response
yjtag.yahoo.co.jp/
|
4 KB
2 KB
|
1356ms
290ms
|
Script
text/javascript |
183.79.113.119
YAHOO-JP-AS-AP Ya...
|
|
General
- Full URL
- https://yjtag.yahoo.co.jp/tag?site=XeiM79u&referrer=https%3A%2F%2Fmikiki.tokyo.jp%2F&H=3rivtft
- Requested by
- Host: s.yjtag.jp
URL: https://s.yjtag.jp/tag.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
183.79.113.119
, Japan,
ASN24572
(YAHOO-JP-AS-AP Yahoo Japan, JP),
- Reverse DNS
- Software
-
/
- Resource Hash
- 269b982262e017483ed1a150558e693b9bbcf32573d207c2cade2baa7d3db4db
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
widget_iframe.0edc1ef9f8b82d9b79c6115bda79f63f.html
Show response
platform.twitter.com/widgets/
Frame CE63
|
320 KB
104 KB
|
14ms
14ms
|
Document
text/html |
2606:2800:234:59:254c:406:2366:268c
EDGECAST
|
|
|
GET
H2
|
200
|
aCaPNPfP7ow.css
www.facebook.com/rsrc.php/v3/yN/l/0,ja_JP/
Frame 8B64
|
35 KB
9 KB
|
37ms
35ms
|
Stylesheet
text/css |
2a03:2880:f145:82:face:b00c:0:25de
FACEBOOK
|
|
General
- Full URL
- https://www.facebook.com/rsrc.php/v3/yN/l/0,ja_JP/aCaPNPfP7ow.css?_nc_x=Ij3Wp8lg5Kz
- Requested by
- Host: www.facebook.com
URL: https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a03:2880:f145:82:face:b00c:0:25de
, United States,
ASN32934
(FACEBOOK, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- 40291ead67dbd6701800119f53000b60b0697c31bb17d4a356dcb85e0a5d1c50
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
1_s3efm4LYv.js
Show response
www.facebook.com/rsrc.php/v3/yp/r/
Frame 8B64
|
267 KB
71 KB
|
14ms
13ms
|
Script
application/x-javascript |
2a03:2880:f145:82:face:b00c:0:25de
FACEBOOK
|
|
General
- Full URL
- https://www.facebook.com/rsrc.php/v3/yp/r/1_s3efm4LYv.js?_nc_x=Ij3Wp8lg5Kz
- Requested by
- Host: www.facebook.com
URL: https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a03:2880:f145:82:face:b00c:0:25de
, United States,
ASN32934
(FACEBOOK, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- 624a90008a2ffe56c5745854d5df0f61402093ab7978559f4b4fd36e41e57dad
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
ujzWhJE7ek0.js
Show response
www.facebook.com/rsrc.php/v3/yJ/r/
Frame 8B64
|
65 KB
20 KB
|
14ms
12ms
|
Script
application/x-javascript |
2a03:2880:f145:82:face:b00c:0:25de
FACEBOOK
|
|
General
- Full URL
- https://www.facebook.com/rsrc.php/v3/yJ/r/ujzWhJE7ek0.js?_nc_x=Ij3Wp8lg5Kz
- Requested by
- Host: www.facebook.com
URL: https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a03:2880:f145:82:face:b00c:0:25de
, United States,
ASN32934
(FACEBOOK, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- bdb4ecc3fb70125429c5a3808b423ef6a53bb1e83d77bef8f02ead87bc80ec76
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
-y6ICflXqw-.js
Show response
www.facebook.com/rsrc.php/v3irB34/y-/l/ja_JP/
Frame 8B64
|
123 KB
34 KB
|
36ms
35ms
|
Script
application/x-javascript |
2a03:2880:f145:82:face:b00c:0:25de
FACEBOOK
|
|
General
- Full URL
- https://www.facebook.com/rsrc.php/v3irB34/y-/l/ja_JP/-y6ICflXqw-.js?_nc_x=Ij3Wp8lg5Kz
- Requested by
- Host: www.facebook.com
URL: https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a03:2880:f145:82:face:b00c:0:25de
, United States,
ASN32934
(FACEBOOK, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e00e69e8e10f072e4a816dd6980c5273917201e813ee432c64e86443a0404ba6
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
nLyZ6bYhSNu.js
Show response
www.facebook.com/rsrc.php/v3/yW/r/
Frame 8B64
|
7 KB
2 KB
|
36ms
35ms
|
Script
application/x-javascript |
2a03:2880:f145:82:face:b00c:0:25de
FACEBOOK
|
|
General
- Full URL
- https://www.facebook.com/rsrc.php/v3/yW/r/nLyZ6bYhSNu.js?_nc_x=Ij3Wp8lg5Kz
- Requested by
- Host: www.facebook.com
URL: https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a03:2880:f145:82:face:b00c:0:25de
, United States,
ASN32934
(FACEBOOK, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- 67d8e7a3e7815e72595c83389b163f51ecd562ed6c394cdaf5cbc93c7330623e
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
158810230_375991646883705_115399203741811626_n.jpg
scontent-frt3-1.xx.fbcdn.net/v/t1.0-0/p130x130/
Frame 8B64
|
7 KB
7 KB
|
20ms
6ms
|
Image
image/jpeg |
2a03:2880:f01c:216:face:b00c:0:3
FACEBOOK
|
|
General
- Full URL
- https://scontent-frt3-1.xx.fbcdn.net/v/t1.0-0/p130x130/158810230_375991646883705_115399203741811626_n.jpg?_nc_cat=109&ccb=1-3&_nc_sid=dd9801&_nc_ohc=Yp87ixHyZjEAX9P1xK5&_nc_ht=scontent-frt3-1.xx&tp=6&oh=dd61f32df5b628f58d88e9c5a0ae90c6&oe=606C9E03
- Requested by
- Host: www.facebook.com
URL: https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a03:2880:f01c:216:face:b00c:0:3
, United States,
ASN32934
(FACEBOOK, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- f26d999c117cf597b4309a9b0b06736a6186c2ea179312ce2e84e92cb44014e8
|
GET
H2
|
200
|
158695835_375991650217038_429185904419813178_n.jpg
scontent-frt3-2.xx.fbcdn.net/v/t1.0-1/cp0/p50x50/
Frame 8B64
|
1 KB
2 KB
|
20ms
6ms
|
Image
image/jpeg |
2a03:2880:f01c:8012:face:b00c:0:3
FACEBOOK
|
|
General
- Full URL
- https://scontent-frt3-2.xx.fbcdn.net/v/t1.0-1/cp0/p50x50/158695835_375991650217038_429185904419813178_n.jpg?_nc_cat=101&ccb=1-3&_nc_sid=dbb9e7&_nc_ohc=YsCE3wuo9SwAX-BFm2k&_nc_ht=scontent-frt3-2.xx&tp=27&oh=ee07ddb1a40ebc0902b5d7c86ac5a580&oe=606BAD0C
- Requested by
- Host: www.facebook.com
URL: https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a03:2880:f01c:8012:face:b00c:0:3
, United States,
ASN32934
(FACEBOOK, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- 338de06ae9e44b27f5ae8230f171c8c74c23cbbef0e1e8c2d57c703039cb37b3
|
GET
H2
|
200
|
settings
Show response
syndication.twitter.com/
Frame CE63
|
183 B
410 B
|
201ms
136ms
|
Fetch
application/json |
104.244.42.136
TWITTER
|
|
General
- Full URL
- https://syndication.twitter.com/settings?session_id=263bd738c0cc98004f2a442b43db8ee1792b3aea
- Requested by
- Host: platform.twitter.com
URL: https://platform.twitter.com/widgets/widget_iframe.0edc1ef9f8b82d9b79c6115bda79f63f.html?origin=https%3A%2F%2Fmikiki.tokyo.jp
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.42.136
, United States,
ASN13414
(TWITTER, US),
- Reverse DNS
- Software
-
tsa_o /
- Resource Hash
- ced34f591157438ef47695f979ac95f8758408e8d9b88e63aee8b382ec975785
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=631138519 |
|
GET
H2
|
200
|
ApcBOUT5FoS.png
www.facebook.com/rsrc.php/v3/y_/r/
Frame 8B64
|
573 B
789 B
|
12ms
12ms
|
Image
image/png |
2a03:2880:f145:82:face:b00c:0:25de
FACEBOOK
|
|
|
GET
H2
|
200
|
3gKIw20zpPx.js
Show response
www.facebook.com/rsrc.php/v3/yc/r/
Frame 8B64
|
18 KB
6 KB
|
12ms
12ms
|
Script
application/x-javascript |
2a03:2880:f145:82:face:b00c:0:25de
FACEBOOK
|
|
|
GET
H2
|
200
|
JopZtdti8dq.js
Show response
www.facebook.com/rsrc.php/v3/y_/r/
Frame 8B64
|
7 KB
2 KB
|
13ms
12ms
|
Script
application/x-javascript |
2a03:2880:f145:82:face:b00c:0:25de
FACEBOOK
|
|
|
GET
H2
|
200
|
mbwLUT9Jpr0.js
Show response
www.facebook.com/rsrc.php/v3/y4/r/
Frame 8B64
|
48 KB
14 KB
|
13ms
13ms
|
Script
application/x-javascript |
2a03:2880:f145:82:face:b00c:0:25de
FACEBOOK
|
|
|
GET
H2
|
200
|
img_f34c4f5ff227999480591efccac73f68439505.jpg
mikiki.ismcdn.jp/mwimgs/f/3/220h/
|
58 KB
58 KB
|
28ms
26ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_32bc20028f22c6340f2b2e50b3d02c6f371768.jpg
mikiki.ismcdn.jp/mwimgs/3/2/220/
|
91 KB
91 KB
|
29ms
28ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_40316cba29ca81fdadd85339328fa7e9189240.jpg
mikiki.ismcdn.jp/mwimgs/4/0/220/
|
41 KB
42 KB
|
31ms
30ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_529745170ef2a3a593e27ea02b6f7cf7295705.jpg
mikiki.ismcdn.jp/mwimgs/5/2/220/
|
74 KB
74 KB
|
32ms
31ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_1382b10d4545097d993a8e4b8b022f3c195745.jpg
mikiki.ismcdn.jp/mwimgs/1/3/220h/
|
50 KB
50 KB
|
56ms
54ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_bba73a3e4db90af6fd99d08e5b88390e412524.jpg
mikiki.ismcdn.jp/mwimgs/b/b/220/
|
19 KB
20 KB
|
57ms
55ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_df01a46988a6a9e595ae2b32cbb4d8d8213492.jpg
mikiki.ismcdn.jp/mwimgs/d/f/220/
|
51 KB
51 KB
|
57ms
56ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_aa2fe163414aebaeb1c6c06054f2a7fc240818.jpg
mikiki.ismcdn.jp/mwimgs/a/a/220/
|
46 KB
46 KB
|
58ms
57ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_4ab46f473f1e772bfdbdc16a3e850f98444405.jpg
mikiki.ismcdn.jp/mwimgs/4/a/220/
|
98 KB
98 KB
|
59ms
58ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_88034c0f1431d1e128c2745d13fc09f5206334.jpg
mikiki.ismcdn.jp/mwimgs/8/8/220/
|
51 KB
51 KB
|
78ms
78ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
cycle_pager.png
mikiki.ismcdn.jp/common/images/v1/sub_column/
|
310 B
483 B
|
78ms
78ms
|
Image
image/png |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
tag_corner_wh.png
mikiki.ismcdn.jp/common/images/v1/common/
|
406 B
580 B
|
78ms
77ms
|
Image
image/png |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.117.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
10 KB
10 KB
|
6ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.117.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 9b5bb281335fd0c63339483981216a6807ab62adcb452b79b810f67a9b2951a7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.118.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
13 KB
14 KB
|
7ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.118.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 25d60620fbd3478d449ed18e74336849b237d1e45e035dc74024f2e6235d56e8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.112.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
13 KB
13 KB
|
9ms
8ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.112.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 35ebf4926dd4130b9cbb7950342c27d98a0d0e3853be0110f9b860863fa382a7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.111.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
8ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.111.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 6a352e1c80750991386dc776482535a958e11899502c2efa9bcb25375e251d00
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.110.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
13 KB
13 KB
|
10ms
9ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.110.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 9ad5b0abecf13076072b73e09b3028adccd1f18778e9b4702f4592be29146e44
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.107.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
9ms
9ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.107.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 016f83769d5bd72278c6942f0f2119e91c5d29d3afe86a8b11aeb4ffcca2e3d4
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.100.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
17 KB
17 KB
|
9ms
8ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.100.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- d272dcef0f0b73b67c85a3c724552319aaab80b951ca8bd765b515837c097bf5
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.99.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
16 KB
16 KB
|
7ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.99.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 8ead8c65d14cf4b878e6d67b423166df1eca666ea389576bf163538508c0a735
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.119.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
52 KB
52 KB
|
7ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.119.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- d3433bbae8708076d6e9520170f8bedce10e23541ab1937e25fd9a7fb68c63fd
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.107.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
13 KB
13 KB
|
8ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.107.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- e3b2fad6e3232fa74667f0d123ec81ea032faafa050e2d9343a2801ffc1f8fda
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.115.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
13 KB
13 KB
|
7ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.115.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 48fc83f0f96ce8185898f554404d560beb6312334902a207bf103baf5cf7aeb1
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.115.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
7ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.115.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 3b27a0f37afa496acb2b319b9313d75387868e359e51a06b004d37f63eb92423
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.105.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
7ms
6ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.105.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- e2c9a0ca9f379618b4cd9bac6bc1f3aaedfae3098a0fc40838c8727a8237a9f1
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
img_d503db31681f69c860745388f7ce2dd3295430.jpg
mikiki.ismcdn.jp/mwimgs/d/5/220h/
|
12 KB
12 KB
|
31ms
27ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_0f67a4d7dbf0923ec0a37530aa34ef3d350161.jpg
mikiki.ismcdn.jp/mwimgs/0/f/220/
|
11 KB
11 KB
|
80ms
76ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_7b18e9c6f970d7e266171b643112cad41315554.jpg
mikiki.ismcdn.jp/mwimgs/7/b/220h/
|
32 KB
32 KB
|
59ms
55ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_f65b13aa32eeacd10e0e9b5a6f0127cf379591.jpg
mikiki.ismcdn.jp/mwimgs/f/6/220/
|
26 KB
26 KB
|
32ms
28ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_97c2133c5d8b5d072fb75913c93546b8361024.jpg
mikiki.ismcdn.jp/mwimgs/9/7/220h/
|
13 KB
13 KB
|
32ms
29ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_62c33438ef0759a80dab9f14f41d9e61238571.jpg
mikiki.ismcdn.jp/mwimgs/6/2/220/
|
10 KB
11 KB
|
34ms
30ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_647209f0f6258262193ed28cf595330a1233484.jpg
mikiki.ismcdn.jp/mwimgs/6/4/220/
|
50 KB
51 KB
|
34ms
31ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_4fcb45c2cf8307bd0f9876b44fac92cd880224.jpg
mikiki.ismcdn.jp/mwimgs/4/f/220/
|
553 KB
555 KB
|
101ms
99ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_4e5cd1d3eaae222e6612692c7f3588671471823.jpg
mikiki.ismcdn.jp/mwimgs/4/e/220/
|
68 KB
68 KB
|
70ms
68ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
img_ca64037cc5eb048e82a8365dd89989b8345344.jpg
mikiki.ismcdn.jp/mwimgs/c/a/220/
|
13 KB
13 KB
|
34ms
32ms
|
Image
image/jpeg |
2.16.107.89
AKAMAI-ASN1
|
|
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.111.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
7ms
7ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.111.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 846f7d8e67c639570b124028d5a21ad5ec84492239c3bef7e9cd3517cdbc5cbc
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.83.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
16 KB
16 KB
|
10ms
9ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.83.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 19a69f647c93a07b8b2605e1d56c79d0b374807cdcb419fcdced2c55b9343aa1
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.92.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
15 KB
16 KB
|
9ms
9ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.92.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 8639ff502223c403a24492e198023ec853f86bdc3dbe0e3166e5b3c8a8701987
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.84.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
15 KB
15 KB
|
8ms
8ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.84.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 93fe41db9f07e54a5534338808be67ac02efa6f7bb84ba8d1dcfd5f671d1a939
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.67.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
14ms
14ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.67.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- d3be57f602efeede358880a0a90d42209cef6db6fe27519a00df90bd90602ecd
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.94.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
16 KB
16 KB
|
11ms
11ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.94.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 439d47c8b190ac1a23cdce79411e328372a148e70de6be3259200d33134dd557
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.100.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
17 KB
17 KB
|
11ms
11ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.100.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 5e192e51fcc97d233b14975854b646e695e0953bf04bd70756ff351ca2c5dc23
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.102.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
15 KB
15 KB
|
10ms
10ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.102.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- c6546c7051e9f1a615bd2d11b997ac6e7516ce160dba3f9ff2a526bedff75823
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.68.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
17 KB
17 KB
|
10ms
9ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.68.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 39a0d8ab6450afa84d4b1996dd3f703b73d02000684a2bbe70d2e37dde661cde
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.105.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
16ms
16ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.105.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 2f1a66f9a01bdcd1009095bef115bde5f1df8a7389b28b29735f89e0867c9ab2
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.78.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
17 KB
17 KB
|
15ms
15ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.78.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 15cdd64531bdd5d775ca0bd6545a4d2c9fd0b1fa7e0f12caa1196fa2d1218b52
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.73.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
17 KB
17 KB
|
14ms
14ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.73.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 2041bd7fe56ee702d796770dc9d7dd4890fa2140bb1038ec7140e8f9ef84e7e9
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.104.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
15ms
14ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.104.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- f29d11feed082dab235d2bb1d7630b142de08616b978a9709cc6899d9d56a708
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.95.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
15 KB
15 KB
|
20ms
20ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.95.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 62a7fa666d6f46c8911b5e637e752c2472eae6bcbb32fa59dc05b9374f9e4839
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.106.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
18 KB
18 KB
|
17ms
17ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.106.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 965a3375a1c13fc67b57e0b4eaec43998ab57cd02c20e7a7e4774e0e5614926c
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.98.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
15 KB
15 KB
|
20ms
19ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.98.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 75cb87c3dcf435025338b8a5afa68f31bb7d3b88de17659ea1b6c294a116d3ca
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.33.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
46 KB
46 KB
|
17ms
17ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.33.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 63e5a151b0522b0aa537ccfb24ee8538129589386ab99bdee61c09bcc44d2bee
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.85.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
17ms
17ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.85.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- bf5365396cf8864cacf254de07a9311f664635927a0d7cae79ceb26a9bdc015b
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.70.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
16 KB
16 KB
|
16ms
15ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.70.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 6831f3f64549e3c7d50cfac29d9977f85ea2cf55efbfb95db768ad2dc096216b
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.77.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
16ms
16ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.77.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 22f740c9cd6e4d77dc5a633fa4fd1e22e23644f3e04d2fe9bb10872e66347e53
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.103.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
14 KB
14 KB
|
14ms
14ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.103.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 2251e565d2d24030b91f7eca2f09d488822c353e41fd28ad07aa7fdca3d68006
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.79.woff2
fonts.gstatic.com/s/notosansjp/v28/
|
16 KB
16 KB
|
17ms
15ms
|
Font
font/woff2 |
2a00:1450:4001:800::2003
GOOGLE
|
|
General
- Full URL
- https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.79.woff2
- Requested by
- Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:800::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 514dc56a08fa1eef64ebd657afd5a7186ade9da1ff353252355bbb6197c2b483
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
DATA
|
200
OK
|
truncated
Show response
/
|
249 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H2
|
200
|
geolocation
Show response
checkout-api.worldshopping.jp/v1/
|
46 B
490 B
|
1067ms
1004ms
|
XHR
application/json |
143.204.209.77
AMAZON-02
|
|
|
GET
H2
|
200
|
ytag.js
Show response
s.yimg.jp/images/listing/tool/cv/
|
23 KB
7 KB
|
1131ms
286ms
|
Script
application/javascript |
182.22.24.252
YAHOO Yahoo Japan...
|
|
|
GET
H2
|
200
|
checkout-3_2_28.js
Show response
checkout-js.worldshopping.jp/
|
1 MB
465 KB
|
1235ms
1123ms
|
Script
application/javascript |
65.9.96.8
AMAZON-02
|
|
|
GET
H2
|
200
|
sodar
Show response
pagead2.googlesyndication.com/getconfig/
|
8 KB
7 KB
|
38ms
19ms
|
XHR
application/json |
2a00:1450:4001:827::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gda&tv=r20210303&st=env
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20210303/r20190131/show_ads_impl_with_ama_fy2019.js?client=ca-pub-6762391202596396&plah=mikiki.tokyo.jp&amaexp=1
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:827::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- b0bba882ca184170cc4f6a79cff496f9bbcfc075153b811d9f90bc6f13a38ac0
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
conversion_async.js
Show response
www.googleadservices.com/pagead/
|
32 KB
13 KB
|
94ms
39ms
|
Script
text/javascript |
172.217.23.98
GOOGLE
|
|
|
GET
H2
|
200
|
/
Show response
b92.yahoo.co.jp/search/
|
0
658 B
|
304ms
296ms
|
Script
text/javascript |
182.22.24.252
YAHOO Yahoo Japan...
|
|
General
- Full URL
- https://b92.yahoo.co.jp/search/?p=6ELZ7URVW7&label=&ref=https%3A%2F%2Fmikiki.tokyo.jp%2F&rref=&pt=&item=&cat=&price=&quantity=&r=1615234975.8877237&pvid=rksz6yb6d5km1177v7&tsyjad=0&_impl=ytag
- Requested by
- Host: s.yimg.jp
URL: https://s.yimg.jp/images/listing/tool/cv/ytag.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
182.22.24.252
, Japan,
ASN23816
(YAHOO Yahoo Japan Corporation, JP),
- Reverse DNS
- Software
-
ATS /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
SAMEORIGIN |
X-Xss-Protection |
1;mode=block |
|
GET
H/1.1
|
200
OK
|
td.min.js
Show response
cdn.treasuredata.com/sdk/1.8.4/
|
35 KB
13 KB
|
118ms
38ms
|
Script
application/javascript |
99.84.90.65
AMAZON-02
|
|
|
GET
H2
|
200
|
tracking.min.js
Show response
img.ak.impact-ad.jp/ut/a1/
|
50 KB
14 KB
|
89ms
24ms
|
Script
text/javascript |
151.101.13.19
FASTLY
|
|
|
GET
H2
|
200
|
default
Show response
api.locize.io/60ff8224-bbcc-4802-8d59-c8983deae8d0/production/en-US/
|
3 B
594 B
|
372ms
310ms
|
XHR
application/json |
13.32.21.90
AMAZON-02
|
|
General
- Full URL
- https://api.locize.io/60ff8224-bbcc-4802-8d59-c8983deae8d0/production/en-US/default
- Requested by
- Host: text
URL: data:text/javascript;base64,ZnVuY3Rpb24gb25Mb2FkWmlnWmFnKCl7IWZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4ocil7aWYoZVtyXSlyZXR1cm4gZVtyXS5leHBvcnRzO3ZhciBvPWVbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9bi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxyKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiYib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImZSYmInN0cmluZyIhPXR5cGVvZiB0KWZvcih2YXIgbyBpbiB0KW4uZChyLG8sZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxvKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsImEiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPSIvIixuKG4ucz0zMDIpfShbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDQpLG89big0NCkuZixpPW4oODcpLGE9bigxKSxzPW4oMzEpLHU9bigxNyksYz1uKDE0KSxsPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUsbixyKXtpZih0aGlzIGluc3RhbmNlb2YgdCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGUsbil9cmV0dXJuIG5ldyB0KGUsbixyKX1yZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3JldHVybiBlLnByb3RvdHlwZT10LnByb3RvdHlwZSxlfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbixmLHAsaCxkLGcsdix5LG09dC50YXJnZXQsYj10Lmdsb2JhbCx4PXQuc3RhdCx3PXQucHJvdG8saz1iP3I6eD9yW21dOihyW21dfHx7fSkucHJvdG90eXBlLFM9Yj9hOmFbbV18fChhW21dPXt9KSxFPVMucHJvdG90eXBlO2ZvcihwIGluIGUpbj0haShiP3A6bSsoeD8iLiI6IiMiKStwLHQuZm9yY2VkKSYmayYmYyhrLHApLGQ9U1twXSxuJiYoZz10Lm5vVGFyZ2V0R2V0Pyh5PW8oayxwKSkmJnkudmFsdWU6a1twXSksaD1uJiZnP2c6ZVtwXSxuJiZ0eXBlb2YgZD09dHlwZW9mIGh8fCh2PXQuYmluZCYmbj9zKGgscik6dC53cmFwJiZuP2woaCk6dyYmImZ1bmN0aW9uIj09dHlwZW9mIGg/cyhGdW5jdGlvbi5jYWxsLGgpOmgsKHQuc2hhbXx8aCYmaC5zaGFtfHxkJiZkLnNoYW0pJiZ1KHYsInNoYW0iLCEwKSxTW3BdPXYsdyYmKGMoYSxmPW0rIlByb3RvdHlwZSIpfHx1KGEsZix7fSksYVtmXVtwXT1oLHQucmVhbCYmRSYmIUVbcF0mJnUoRSxwLGgpKSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCksbz1uKDU4KSxpPW4oNzApLGE9big5NCkscz1yLlN5bWJvbCx1PW8oIndrcyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdVt0XXx8KHVbdF09YSYmc1t0XXx8KGE/czppKSgiU3ltYm9sLiIrdCkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSksbz1uKDE0KSxpPW4oNzUpLGE9bigyMykuZjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9ci5TeW1ib2x8fChyLlN5bWJvbD17fSk7byhlLHQpfHxhKGUsdCx7dmFsdWU6aS5mKHQpfSl9fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKGUpe3ZhciBuPSJvYmplY3QiLHI9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuTWF0aD09TWF0aCYmdH07dC5leHBvcnRzPXIodHlwZW9mIGdsb2JhbFRoaXM9PW4mJmdsb2JhbFRoaXMpfHxyKHR5cGVvZiB3aW5kb3c9PW4mJndpbmRvdyl8fHIodHlwZW9mIHNlbGY9PW4mJnNlbGYpfHxyKHR5cGVvZiBlPT1uJiZlKXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKX0pLmNhbGwodGhpcyxuKDg1KSl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4hIXQoKX1jYXRjaCh0KXtyZXR1cm4hMH19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ/bnVsbCE9PXQ6ImZ1bmN0aW9uIj09dHlwZW9mIHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDEzNil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNDMpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjA5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFyKHQpKXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYW4gb2JqZWN0Iik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNTApO2Z1bmN0aW9uIG8odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLHIodCxvLmtleSxvKX19dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZSYmbyh0LnByb3RvdHlwZSxlKSxuJiZvKHQsbiksdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSl7dmFyIG49e30uaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uY2FsbCh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTYzKSxvPW4oOTYpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQuZXhwb3J0cz1pPW8/cjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fHIodCl9LGkoZSl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMyksbz1uKDIzKSxpPW4oMzApO3QuZXhwb3J0cz1yP2Z1bmN0aW9uKHQsZSxuKXtyZXR1cm4gby5mKHQsZSxpKDEsbikpfTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRbZV09bix0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByW3QrIlByb3RvdHlwZSJdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTcxKSxvPW4oMTc1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1yKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmbyh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE0Nil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY1KSxvPW4oNDUpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcihvKHQpKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYSBmdW5jdGlvbiIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTMpLG89big4NiksaT1uKDExKSxhPW4oNTQpLHM9T2JqZWN0LmRlZmluZVByb3BlcnR5O2UuZj1yP3M6ZnVuY3Rpb24odCxlLG4pe2lmKGkodCksZT1hKGUsITApLGkobiksbyl0cnl7cmV0dXJuIHModCxlLG4pfWNhdGNoKHQpe31pZigiZ2V0ImluIG58fCJzZXQiaW4gbil0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuInZhbHVlImluIG4mJih0W2VdPW4udmFsdWUpLHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0NSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qocih0KSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNjEpLG89bi5uKHIpO2Z1bmN0aW9uIGkodCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzLmRlYnVnTG9nZ2VyKCkobygpKHQpKX1lLmE9e2RlYnVnOmksZXJyb3I6ZnVuY3Rpb24odCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzJiZlLnV0aWxzLmVycm9yTG9nZ2VyJiZlLnV0aWxzLmVycm9yTG9nZ2VyKCkodCksaSh0KX19fSxmdW5jdGlvbih0LGUpe3ZhciBuPXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbi5jYWxsKHQpLnNsaWNlKDgsLTEpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ITB9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzKS5mLG89bigxNyksaT1uKDE0KSxhPW4oMTgzKSxzPW4oMikoInRvU3RyaW5nVGFnIiksdT1hIT09e30udG9TdHJpbmc7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLGMpe2lmKHQpe3ZhciBsPW4/dDp0LnByb3RvdHlwZTtpKGwscyl8fHIobCxzLHtjb25maWd1cmFibGU6ITAsdmFsdWU6ZX0pLGMmJnUmJm8obCwidG9TdHJpbmciLGEpfX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPXt9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybntlbnVtZXJhYmxlOiEoMSZ0KSxjb25maWd1cmFibGU6ISgyJnQpLHdyaXRhYmxlOiEoNCZ0KSx2YWx1ZTplfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe2lmKHIodCksdm9pZCAwPT09ZSlyZXR1cm4gdDtzd2l0Y2gobil7Y2FzZSAwOnJldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmNhbGwoZSl9O2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQuY2FsbChlLG4pfTtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKG4scil7cmV0dXJuIHQuY2FsbChlLG4scil9O2Nhc2UgMzpyZXR1cm4gZnVuY3Rpb24obixyLG8pe3JldHVybiB0LmNhbGwoZSxuLHIsbyl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KGUsYXJndW1lbnRzKX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSxvPW4oNCksaT1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OnZvaWQgMH07dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9pKHJbdF0pfHxpKG9bdF0pOnJbdF0mJnJbdF1bZV18fG9bdF0mJm9bdF1bZV19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2OCksbz1NYXRoLm1pbjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MD9vKHIodCksOTAwNzE5OTI1NDc0MDk5MSk6MH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxODApLmNoYXJBdCxvPW4oNDkpLGk9big5OCksYT1vLnNldCxzPW8uZ2V0dGVyRm9yKCJTdHJpbmcgSXRlcmF0b3IiKTtpKFN0cmluZywiU3RyaW5nIixmdW5jdGlvbih0KXthKHRoaXMse3R5cGU6IlN0cmluZyBJdGVyYXRvciIsc3RyaW5nOlN0cmluZyh0KSxpbmRleDowfSl9LGZ1bmN0aW9uKCl7dmFyIHQsZT1zKHRoaXMpLG49ZS5zdHJpbmcsbz1lLmluZGV4O3JldHVybiBvPj1uLmxlbmd0aD97dmFsdWU6dm9pZCAwLGRvbmU6ITB9Oih0PXIobixvKSxlLmluZGV4Kz10Lmxlbmd0aCx7dmFsdWU6dCxkb25lOiExfSl9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTcpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixvKXtvJiZvLmVudW1lcmFibGU/dFtlXT1uOnIodCxlLG4pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTc2KSxvPW4oMjA4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4hZXx8Im9iamVjdCIhPT1yKGUpJiYiZnVuY3Rpb24iIT10eXBlb2YgZT9vKHQpOmV9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjIyKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIyMyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjUpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjI2KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIyNyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMzApfSxmdW5jdGlvbih0KXt0LmV4cG9ydHM9SlNPTi5wYXJzZSgneyJsb2NpemUiOnsicHJvZHVjdElkIjoiNjBmZjgyMjQtYmJjYy00ODAyLThkNTktYzg5ODNkZWFlOGQwIiwiYXBpS2V5IjoiNzM5NmU3NzgtMDkwMy00ZTdlLTgyODItZTY3MTU4NThiYjhjIiwidmVyc2lvbiI6InByb2R1Y3Rpb24ifSwiaW50ZWdyYXRpb25zIjp7ImNvbG9ybWVBcHAiOnsiYXBpIjp7InByb2R1Y3QiOiJodHRwczovL2NvbG9ybWUud29ybGRzaG9wcGluZy5qcC92MS9wcm9kdWN0In19LCJzaG9waWZ5QXBwIjp7ImFwaSI6eyJwcm9kdWN0IjoiaHR0cHM6Ly9hcHAtcy53b3JsZHNob3BwaW5nLmpwL3YxL3Byb2R1Y3QifX19LCJsYW1iZGEiOnsiY3JlYXRlIjoic2hvcC1kYXRhLXByb2QtY3JlYXRlIiwiY2xlYXIiOiJzaG9wLWRhdGEtcHJvZC1jbGVhciJ9LCJzZmRjIjp7ImNvbm5lY3Rpb25TZXR0aW5nc1BhdGgiOiIvc2ZkYy9wcm9kL2FwaSJ9LCJkZWJ1Z0hvc3RzIjpbInNob3AtZGFzaGJvYXJkLndvcmxkc2hvcHBpbmcuYml6Iiwic2hvcC1kYXNoYm9hcmQtZGV2Lndvcmxkc2hvcHBpbmcuYml6Iiwic2hvcC1kYXNoYm9hcmQtbG9jYWwud29ybGRzaG9wcGluZy5iaXoiXX0nKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTMpLG89big2NCksaT1uKDMwKSxhPW4oMjEpLHM9big1NCksdT1uKDE0KSxjPW4oODYpLGw9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtlLmY9cj9sOmZ1bmN0aW9uKHQsZSl7aWYodD1hKHQpLGU9cyhlLCEwKSxjKXRyeXtyZXR1cm4gbCh0LGUpfWNhdGNoKHQpe31pZih1KHQsZSkpcmV0dXJuIGkoIW8uZi5jYWxsKHQsZSksdFtlXSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihudWxsPT10KXRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIit0KTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxvPW4oMTM5KSxpPW4oNjkpLGE9big1Nikscz1uKDkwKSx1PW4oNjYpLGM9big1NykoIklFX1BST1RPIiksbD1mdW5jdGlvbigpe30sZj1mdW5jdGlvbigpe3ZhciB0LGU9dSgiaWZyYW1lIiksbj1pLmxlbmd0aDtmb3IoZS5zdHlsZS5kaXNwbGF5PSJub25lIixzLmFwcGVuZENoaWxkKGUpLGUuc3JjPVN0cmluZygiamF2YXNjcmlwdDoiKSwodD1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpLm9wZW4oKSx0LndyaXRlKCI8c2NyaXB0PmRvY3VtZW50LkY9T2JqZWN0PFwvc2NyaXB0PiIpLHQuY2xvc2UoKSxmPXQuRjtuLS07KWRlbGV0ZSBmLnByb3RvdHlwZVtpW25dXTtyZXR1cm4gZigpfTt0LmV4cG9ydHM9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gbnVsbCE9PXQ/KGwucHJvdG90eXBlPXIodCksbj1uZXcgbCxsLnByb3RvdHlwZT1udWxsLG5bY109dCk6bj1mKCksdm9pZCAwPT09ZT9uOm8obixlKX0sYVtjXT0hMH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjYpO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iQXJyYXkiPT1yKHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQpLG89bigyNCksaT1uKDU3KSxhPW4oOTUpLHM9aSgiSUVfUFJPVE8iKSx1PU9iamVjdC5wcm90b3R5cGU7dC5leHBvcnRzPWE/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0PW8odCkscih0LHMpP3Rbc106ImZ1bmN0aW9uIj09dHlwZW9mIHQuY29uc3RydWN0b3ImJnQgaW5zdGFuY2VvZiB0LmNvbnN0cnVjdG9yP3QuY29uc3RydWN0b3IucHJvdG90eXBlOnQgaW5zdGFuY2VvZiBPYmplY3Q/dTpudWxsfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhPW4oMTgxKSxzPW4oNCksdT1uKDYpLGM9bigxNyksbD1uKDE0KSxmPW4oNTcpLHA9big1NiksaD1zLldlYWtNYXA7aWYoYSl7dmFyIGQ9bmV3IGgsZz1kLmdldCx2PWQuaGFzLHk9ZC5zZXQ7cj1mdW5jdGlvbih0LGUpe3JldHVybiB5LmNhbGwoZCx0LGUpLGV9LG89ZnVuY3Rpb24odCl7cmV0dXJuIGcuY2FsbChkLHQpfHx7fX0saT1mdW5jdGlvbih0KXtyZXR1cm4gdi5jYWxsKGQsdCl9fWVsc2V7dmFyIG09Zigic3RhdGUiKTtwW21dPSEwLHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYyh0LG0sZSksZX0sbz1mdW5jdGlvbih0KXtyZXR1cm4gbCh0LG0pP3RbbV06e319LGk9ZnVuY3Rpb24odCl7cmV0dXJuIGwodCxtKX19dC5leHBvcnRzPXtzZXQ6cixnZXQ6byxoYXM6aSxlbmZvcmNlOmZ1bmN0aW9uKHQpe3JldHVybiBpKHQpP28odCk6cih0LHt9KX0sZ2V0dGVyRm9yOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbjtpZighdShlKXx8KG49byhlKSkudHlwZSE9PXQpdGhyb3cgVHlwZUVycm9yKCJJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICIrdCsiIHJlcXVpcmVkIik7cmV0dXJuIG59fX19LGZ1bmN0aW9uKHQsZSxuKXtuKDEwMSk7dmFyIHI9bigxODQpLG89big0KSxpPW4oMTcpLGE9bigyOSkscz1uKDIpKCJ0b1N0cmluZ1RhZyIpO2Zvcih2YXIgdSBpbiByKXt2YXIgYz1vW3VdLGw9YyYmYy5wcm90b3R5cGU7bCYmIWxbc10mJmkobCxzLHUpLGFbdV09YS5BcnJheX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDc2KSxvPW4oMjkpLGk9bigyKSgiaXRlcmF0b3IiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYobnVsbCE9dClyZXR1cm4gdFtpXXx8dFsiQEBpdGVyYXRvciJdfHxvW3IodCldfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIyKSxvPWZ1bmN0aW9uKHQpe3ZhciBlLG47dGhpcy5wcm9taXNlPW5ldyB0KGZ1bmN0aW9uKHQscil7aWYodm9pZCAwIT09ZXx8dm9pZCAwIT09bil0aHJvdyBUeXBlRXJyb3IoIkJhZCBQcm9taXNlIGNvbnN0cnVjdG9yIik7ZT10LG49cn0pLHRoaXMucmVzb2x2ZT1yKGUpLHRoaXMucmVqZWN0PXIobil9O3QuZXhwb3J0cy5mPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbyh0KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighcih0KSlyZXR1cm4gdDt2YXIgbixvO2lmKGUmJiJmdW5jdGlvbiI9PXR5cGVvZihuPXQudG9TdHJpbmcpJiYhcihvPW4uY2FsbCh0KSkpcmV0dXJuIG87aWYoImZ1bmN0aW9uIj09dHlwZW9mKG49dC52YWx1ZU9mKSYmIXIobz1uLmNhbGwodCkpKXJldHVybiBvO2lmKCFlJiYiZnVuY3Rpb24iPT10eXBlb2Yobj10LnRvU3RyaW5nKSYmIXIobz1uLmNhbGwodCkpKXJldHVybiBvO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big4OCksbz1uKDY5KTt0LmV4cG9ydHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3JldHVybiByKHQsbyl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTgpLG89big3MCksaT1yKCJrZXlzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpW3RdfHwoaVt0XT1vKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpLG89bigxNDApLGk9bigyNyksYT1yWyJfX2NvcmUtanNfc2hhcmVkX18iXXx8bygiX19jb3JlLWpzX3NoYXJlZF9fIix7fSk7KHQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBhW3RdfHwoYVt0XT12b2lkIDAhPT1lP2U6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjoiMy4yLjAiLG1vZGU6aT8icHVyZSI6Imdsb2JhbCIsY29weXJpZ2h0OiLCqSAyMDE5IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpIn0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDExMiksaT1uKDMzKSxhPW4oMzEpLHM9big1MSksdT1uKDExMSksYz1mdW5jdGlvbih0LGUpe3RoaXMuc3RvcHBlZD10LHRoaXMucmVzdWx0PWV9Oyh0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbCxmKXt2YXIgcCxoLGQsZyx2LHksbT1hKGUsbixsPzI6MSk7aWYoZilwPXQ7ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2YoaD1zKHQpKSl0aHJvdyBUeXBlRXJyb3IoIlRhcmdldCBpcyBub3QgaXRlcmFibGUiKTtpZihvKGgpKXtmb3IoZD0wLGc9aSh0Lmxlbmd0aCk7Zz5kO2QrKylpZigodj1sP20ocih5PXRbZF0pWzBdLHlbMV0pOm0odFtkXSkpJiZ2IGluc3RhbmNlb2YgYylyZXR1cm4gdjtyZXR1cm4gbmV3IGMoITEpfXA9aC5jYWxsKHQpfWZvcig7ISh5PXAubmV4dCgpKS5kb25lOylpZigodj11KHAsbSx5LnZhbHVlLGwpKSYmdiBpbnN0YW5jZW9mIGMpcmV0dXJuIHY7cmV0dXJuIG5ldyBjKCExKX0pLnN0b3A9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBjKCEwLHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybntlcnJvcjohMSx2YWx1ZTp0KCl9fWNhdGNoKHQpe3JldHVybntlcnJvcjohMCx2YWx1ZTp0fX19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQxKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzMyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyODUpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixpPW8mJiFyLmNhbGwoezE6Mn0sMSk7ZS5mPWk/ZnVuY3Rpb24odCl7dmFyIGU9byh0aGlzLHQpO3JldHVybiEhZSYmZS5lbnVtZXJhYmxlfTpyfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KSxvPW4oMjYpLGk9IiIuc3BsaXQ7dC5leHBvcnRzPXIoZnVuY3Rpb24oKXtyZXR1cm4hT2JqZWN0KCJ6IikucHJvcGVydHlJc0VudW1lcmFibGUoMCl9KT9mdW5jdGlvbih0KXtyZXR1cm4iU3RyaW5nIj09byh0KT9pLmNhbGwodCwiIik6T2JqZWN0KHQpfTpPYmplY3R9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpLG89big2KSxpPXIuZG9jdW1lbnQsYT1vKGkpJiZvKGkuY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhP2kuY3JlYXRlRWxlbWVudCh0KTp7fX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxKSxvPW4oMzMpLGk9big4OSksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLGEpe3ZhciBzLHU9cihlKSxjPW8odS5sZW5ndGgpLGw9aShhLGMpO2lmKHQmJm4hPW4pe2Zvcig7Yz5sOylpZigocz11W2wrK10pIT1zKXJldHVybiEwfWVsc2UgZm9yKDtjPmw7bCsrKWlmKCh0fHxsIGluIHUpJiZ1W2xdPT09bilyZXR1cm4gdHx8bHx8MDtyZXR1cm4hdCYmLTF9fTt0LmV4cG9ydHM9e2luY2x1ZGVzOmEoITApLGluZGV4T2Y6YSghMSl9fSxmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguY2VpbCxyPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA/cjpuKSh0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl19LGZ1bmN0aW9uKHQsZSl7dmFyIG49MCxyPU1hdGgucmFuZG9tKCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJTeW1ib2woIitTdHJpbmcodm9pZCAwPT09dD8iIjp0KSsiKV8iKygrK24rcikudG9TdHJpbmcoMzYpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDU0KSxvPW4oMjMpLGk9bigzMCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgYT1yKGUpO2EgaW4gdD9vLmYodCxhLGkoMCxuKSk6dFthXT1ufX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDIpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiFyKGZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuKGUuY29uc3RydWN0b3I9e30pW29dPWZ1bmN0aW9uKCl7cmV0dXJue2ZvbzoxfX0sMSE9PWVbdF0oQm9vbGVhbikuZm9vfSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMSksbz1uKDY1KSxpPW4oMjQpLGE9bigzMykscz1uKDkzKSx1PVtdLnB1c2gsYz1mdW5jdGlvbih0KXt2YXIgZT0xPT10LG49Mj09dCxjPTM9PXQsbD00PT10LGY9Nj09dCxwPTU9PXR8fGY7cmV0dXJuIGZ1bmN0aW9uKGgsZCxnLHYpe2Zvcih2YXIgeSxtLGI9aShoKSx4PW8oYiksdz1yKGQsZywzKSxrPWEoeC5sZW5ndGgpLFM9MCxFPXZ8fHMsVD1lP0UoaCxrKTpuP0UoaCwwKTp2b2lkIDA7az5TO1MrKylpZigocHx8UyBpbiB4KSYmKG09dyh5PXhbU10sUyxiKSx0KSlpZihlKVRbU109bTtlbHNlIGlmKG0pc3dpdGNoKHQpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIHk7Y2FzZSA2OnJldHVybiBTO2Nhc2UgMjp1LmNhbGwoVCx5KX1lbHNlIGlmKGwpcmV0dXJuITE7cmV0dXJuIGY/LTE6Y3x8bD9sOlR9fTt0LmV4cG9ydHM9e2ZvckVhY2g6YygwKSxtYXA6YygxKSxmaWx0ZXI6YygyKSxzb21lOmMoMyksZXZlcnk6Yyg0KSxmaW5kOmMoNSksZmluZEluZGV4OmMoNil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDE3MCk7dC5leHBvcnRzPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8KCJfX3Byb3RvX18iaW57fT9mdW5jdGlvbigpe3ZhciB0LGU9ITEsbj17fTt0cnl7KHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCJfX3Byb3RvX18iKS5zZXQpLmNhbGwobixbXSksZT1uIGluc3RhbmNlb2YgQXJyYXl9Y2F0Y2godCl7fXJldHVybiBmdW5jdGlvbihuLGkpe3JldHVybiByKG4pLG8oaSksZT90LmNhbGwobixpKTpuLl9fcHJvdG9fXz1pLG59fSgpOnZvaWQgMCl9LGZ1bmN0aW9uKHQsZSxuKXtlLmY9bigyKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjYpLG89bigyKSgidG9TdHJpbmdUYWciKSxpPSJBcmd1bWVudHMiPT1yKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlLG4sYTtyZXR1cm4gdm9pZCAwPT09dD8iVW5kZWZpbmVkIjpudWxsPT09dD8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihuPWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiB0W2VdfWNhdGNoKHQpe319KGU9T2JqZWN0KHQpLG8pKT9uOmk/cihlKToiT2JqZWN0Ij09KGE9cihlKSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNhbGxlZT8iQXJndW1lbnRzIjphfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz0iXHRcblx2XGZcciDCoOGagOKAgOKAgeKAguKAg+KAhOKAheKAhuKAh+KAiOKAieKAiuKAr+KBn+OAgFx1MjAyOFx1MjAyOVx1ZmVmZiJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMyKTt0LmV4cG9ydHM9cigibmF2aWdhdG9yIiwidXNlckFnZW50Iil8fCIifSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjE4KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0Nyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNjMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNzMpLG89bigyNzYpLGk9bigyODEpLGE9bigyODQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KXx8byh0KXx8aSh0KXx8YSgpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24odCl7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KSxuLmQoZSwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gUH0pO3ZhciByPW4oMzcpLG89bi5uKHIpLGk9bigzOCksYT1uLm4oaSkscz1uKDM5KSx1PW4ubihzKSxjPW4oNDApLGw9bi5uKGMpLGY9big0MSkscD1uLm4oZiksaD1uKDQyKSxkPW4ubihoKSxnPW4oMTM0KSx2PW4ubihnKSx5PW4oNjMpLG09bi5uKHkpLGI9bigxNikseD1uLm4oYiksdz1uKDcpLGs9bi5uKHcpLFM9bigxMiksRT1uLm4oUyksVD1uKDEzNSksaj1uLm4oVCksQT1uKDI1KSxPPW4oNDMpO2Z1bmN0aW9uIEModCxlKXt2YXIgbjtpZih2b2lkIDA9PT1sLmF8fG51bGw9PXUoKSh0KSl7aWYoYSgpKHQpfHwobj1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKCF0KXJldHVybjtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIEwodCxlKTt2YXIgcj1kKCkobj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTsiT2JqZWN0Ij09PXImJnQuY29uc3RydWN0b3ImJihyPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1yfHwiU2V0Ij09PXIpcmV0dXJuIHAoKSh0KTtpZigiQXJndW1lbnRzIj09PXJ8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKXJldHVybiBMKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxpPWZ1bmN0aW9uKCl7fTtyZXR1cm57czppLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjppfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIHMsYz0hMCxmPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1vKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYz10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtmPSEwLHM9dH0sZjpmdW5jdGlvbigpe3RyeXtjfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKGYpdGhyb3cgc319fX1mdW5jdGlvbiBMKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9dmFyIFI9e2NvZGU6Ik5PTkUifSxQPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt2YXIgbj10aGlzLHI9dC5zY3JhcGVyUmVzdWx0LG89dC5sb2NhdGlvbixpPXQuZGF0YTtrKCkodGhpcyxlKSx0aGlzLmV4Y2x1ZGVCeVNjcmFwZXJFcnJvcj1mdW5jdGlvbigpe3ZhciB0PW4uc2NyYXBlclJlc3VsdDtyZXR1cm4gdC5lcnJvcj97Y29kZToiRVJST1IiLG1lc3NhZ2U6ImV4Y2x1ZGVCeVNjcmFwZXJFcnJvcjogIi5jb25jYXQodC5lcnJvcil9OnQuaXRlbT8odC5za3VSb3dzfHwodC5za3VSb3dzPVtdKSxSKTp7Y29kZToiRVJST1IiLG1lc3NhZ2U6ImV4Y2x1ZGVCeVNjcmFwZXJFcnJvcjogbm8gaXRlbSJ9fSx0aGlzLmV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIG4uc2NyYXBlclJlc3VsdC5wdXJjaGFzYWJsZT9SOntjb2RlOiJOT1RfUFVSQ0hBU0FCTEUiLG1lc3NhZ2U6ImV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlIn19LHRoaXMuZXhjbHVkZUJ5U2t1WmVybz1mdW5jdGlvbigpe3JldHVybiBuLnNjcmFwZXJSZXN1bHQuc2t1Um93cyYmMD09PW4uc2NyYXBlclJlc3VsdC5za3VSb3dzLmxlbmd0aD97Y29kZToiTk9UX1BVUkNIQVNBQkxFIixtZXNzYWdlOiJleGNsdWRlQnlTa3VaZXJvIn06Un0sdGhpcy5leGNsdWRlQnlVcmw9ZnVuY3Rpb24oKXtpZigwPT09bi5ieVVybC5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9ZS53aW5kb3dMb2NhdGlvbkhyZWY7cmV0dXJuIG4uZXhjbHVkZShuLmJ5VXJsLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIl4iLmNvbmNhdChqKCkoeCgpKG49ZS51cmwpLmNhbGwobikpKSkudGVzdCh0KX0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1OYW1lPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtTmFtZS5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLm5hbWV8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1OYW1lLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIl4iLmNvbmNhdCh4KCkobj1lLml0ZW1OYW1lKS5jYWxsKG4pKSkudGVzdCh0KX0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1Db2RlPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtQ29kZS5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLmNvZGV8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1Db2RlLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIHgoKShuPWUuaXRlbUNvZGUpLmNhbGwobik9PT10fSl9LHRoaXMuZXhjbHVkZUJ5Q2F0ZWdvcnk9ZnVuY3Rpb24oKXtpZigwPT09bi5ieUNhdGVnb3J5Lmxlbmd0aClyZXR1cm4gUjt2YXIgdD1uLnNjcmFwZXJSZXN1bHQuaXRlbSYmbi5zY3JhcGVyUmVzdWx0Lml0ZW0uY2F0ZWdvcnl8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUNhdGVnb3J5LHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIHgoKShuPWUuY2F0ZWdvcnkpLmNhbGwobik9PT10fSl9LHRoaXMuZXhjbHVkZUJ5SXRlbURlc2NyaXB0aW9uPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtRGVzY3JpcHRpb24ubGVuZ3RoKXJldHVybiBSO3ZhciB0PW4uc2NyYXBlclJlc3VsdC5pdGVtJiZuLnNjcmFwZXJSZXN1bHQuaXRlbS5kZXNjcmlwdGlvbnx8IiI7cmV0dXJuIG4uZXhjbHVkZShuLmJ5SXRlbURlc2NyaXB0aW9uLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIiIuY29uY2F0KHgoKShuPWUudGV4dCkuY2FsbChuKSkpLnRlc3QodCl9KX0sdGhpcy5leGVjdXRlPWZ1bmN0aW9uKCl7dmFyIHQ9ITEsZT1bXSxyPW4uZXhjbHVkZUJ5U2NyYXBlckVycm9yKCk7aWYoIk5PTkUiIT09ci5jb2RlKXJldHVybntpc0V4Y2x1ZGVkOiEwLHJlYXNvbnM6W3JdfTsiTk9ORSIhPT0ocj1uLmV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlKCkpLmNvZGUmJih0PSEwLGUucHVzaChyKSk7dmFyIG8saT1DKG4uY29uZmlndXJlRXhjbHVzaW9uTWV0aG9kcyhbbi5leGNsdWRlQnlVcmwsbi5leGNsdWRlQnlJdGVtTmFtZSxuLmV4Y2x1ZGVCeUl0ZW1Db2RlLG4uZXhjbHVkZUJ5Q2F0ZWdvcnksbi5leGNsdWRlQnlJdGVtRGVzY3JpcHRpb25dKSk7dHJ5e2ZvcihpLnMoKTshKG89aS5uKCkpLmRvbmU7KXt2YXIgYT0oMCxvLnZhbHVlKSgpO2lmKCJOT05FIiE9PWEuY29kZSYmKHQ9ITAsZS5wdXNoKGEpKSwiRVJST1IiPT09YS5jb2RlKWJyZWFrfX1jYXRjaCh0KXtpLmUodCl9ZmluYWxseXtpLmYoKX1yZXR1cm57aXNFeGNsdWRlZDp0LHJlYXNvbnM6ZX19LHRoaXMuc2NyYXBlclJlc3VsdD1yLHRoaXMubG9jYXRpb249byx0aGlzLmRhdGE9aSx0aGlzLmJ5VXJsPWkuYnlVcmwsdGhpcy5ieUl0ZW1OYW1lPWkuYnlJdGVtTmFtZSx0aGlzLmJ5SXRlbUNvZGU9aS5ieUl0ZW1Db2RlLHRoaXMuYnlDYXRlZ29yeT1pLmJ5Q2F0ZWdvcnksdGhpcy5ieUl0ZW1EZXNjcmlwdGlvbj1pLmJ5SXRlbURlc2NyaXB0aW9ufXJldHVybiBFKCkoZSxbe2tleToiY29uZmlndXJlRXhjbHVzaW9uTWV0aG9kcyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSx7a2V5OiJleGNsdWRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFJ9fV0sW3trZXk6IndpbmRvd0xvY2F0aW9uSHJlZiIsZ2V0OmZ1bmN0aW9uKCl7dmFyIGUsbj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUscj13aW5kb3cubG9jYXRpb24uaHJlZjtpZihtKCkoZT1PLmRlYnVnSG9zdHMpLmNhbGwoZSxuKSl7dmFyIG89bmV3IHYuYSh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoInp6dXJsIik7aWYobyl0cnl7cj10LmZyb20obywiYmFzZTY0IikudG9TdHJpbmcoInV0Zi04Iil9Y2F0Y2godCl7QS5hLmVycm9yKHQpfX1yZXR1cm4gcn19XSksZX0oKX0pLmNhbGwodGhpcyxuKDI5NCkuQnVmZmVyKX0sZnVuY3Rpb24odCxlKXt2YXIgbjtuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e249bnx8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2godCl7Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJihuPXdpbmRvdyl9dC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKSxvPW4oNSksaT1uKDY2KTt0LmV4cG9ydHM9IXImJiFvKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eShpKCJkaXYiKSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz0vI3xcLnByb3RvdHlwZVwuLyxpPWZ1bmN0aW9uKHQsZSl7dmFyIG49c1thKHQpXTtyZXR1cm4gbj09Y3x8biE9dSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBlP3IoZSk6ISFlKX0sYT1pLm5vcm1hbGl6ZT1mdW5jdGlvbih0KXtyZXR1cm4gU3RyaW5nKHQpLnJlcGxhY2UobywiLiIpLnRvTG93ZXJDYXNlKCl9LHM9aS5kYXRhPXt9LHU9aS5OQVRJVkU9Ik4iLGM9aS5QT0xZRklMTD0iUCI7dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0KSxvPW4oMjEpLGk9big2NykuaW5kZXhPZixhPW4oNTYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLHM9byh0KSx1PTAsYz1bXTtmb3IobiBpbiBzKSFyKGEsbikmJnIocyxuKSYmYy5wdXNoKG4pO2Zvcig7ZS5sZW5ndGg+dTspcihzLG49ZVt1KytdKSYmKH5pKGMsbil8fGMucHVzaChuKSk7cmV0dXJuIGN9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2OCksbz1NYXRoLm1heCxpPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXIodCk7cmV0dXJuIG48MD9vKG4rZSwwKTppKG4sZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMik7dC5leHBvcnRzPXIoImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50Iil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1uKDYpLGk9W10uc2xpY2UsYT17fSxzPWZ1bmN0aW9uKHQsZSxuKXtpZighKGUgaW4gYSkpe2Zvcih2YXIgcj1bXSxvPTA7bzxlO28rKylyW29dPSJhWyIrbysiXSI7YVtlXT1GdW5jdGlvbigiQyxhIiwicmV0dXJuIG5ldyBDKCIrci5qb2luKCIsIikrIikiKX1yZXR1cm4gYVtlXSh0LG4pfTt0LmV4cG9ydHM9RnVuY3Rpb24uYmluZHx8ZnVuY3Rpb24odCl7dmFyIGU9cih0aGlzKSxuPWkuY2FsbChhcmd1bWVudHMsMSksYT1mdW5jdGlvbigpe3ZhciByPW4uY29uY2F0KGkuY2FsbChhcmd1bWVudHMpKTtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGE/cyhlLHIubGVuZ3RoLHIpOmUuYXBwbHkodCxyKX07cmV0dXJuIG8oZS5wcm90b3R5cGUpJiYoYS5wcm90b3R5cGU9ZS5wcm90b3R5cGUpLGF9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDUpLGk9big0NyksYT1uKDYpLHM9bigyNCksdT1uKDMzKSxjPW4oNzEpLGw9big5MyksZj1uKDcyKSxwPW4oMikoImlzQ29uY2F0U3ByZWFkYWJsZSIpLGg9IW8oZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdFtwXT0hMSx0LmNvbmNhdCgpWzBdIT09dH0pLGQ9ZigiY29uY2F0IiksZz1mdW5jdGlvbih0KXtpZighYSh0KSlyZXR1cm4hMTt2YXIgZT10W3BdO3JldHVybiB2b2lkIDAhPT1lPyEhZTppKHQpfTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWh8fCFkfSx7Y29uY2F0OmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYT1zKHRoaXMpLGY9bChhLDApLHA9MDtmb3IoZT0tMSxyPWFyZ3VtZW50cy5sZW5ndGg7ZTxyO2UrKylpZihpPS0xPT09ZT9hOmFyZ3VtZW50c1tlXSxnKGkpKXtpZihwKyhvPXUoaS5sZW5ndGgpKT45MDA3MTk5MjU0NzQwOTkxKXRocm93IFR5cGVFcnJvcigiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7Zm9yKG49MDtuPG87bisrLHArKyluIGluIGkmJmMoZixwLGlbbl0pfWVsc2V7aWYocD49OTAwNzE5OTI1NDc0MDk5MSl0aHJvdyBUeXBlRXJyb3IoIk1heGltdW0gYWxsb3dlZCBpbmRleCBleGNlZWRlZCIpO2MoZixwKyssaSl9cmV0dXJuIGYubGVuZ3RoPXAsZn19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNiksbz1uKDQ3KSxpPW4oMikoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gbyh0KSYmKCJmdW5jdGlvbiIhPXR5cGVvZihuPXQuY29uc3RydWN0b3IpfHxuIT09QXJyYXkmJiFvKG4ucHJvdG90eXBlKT9yKG4pJiZudWxsPT09KG49bltpXSkmJihuPXZvaWQgMCk6bj12b2lkIDApLG5ldyh2b2lkIDA9PT1uP0FycmF5Om4pKDA9PT1lPzA6ZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTt0LmV4cG9ydHM9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhcihmdW5jdGlvbigpe3JldHVybiFTdHJpbmcoU3ltYm9sKCkpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPW51bGwsT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyB0KSE9PXQucHJvdG90eXBlfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjcpfSxmdW5jdGlvbih0LGUsbil7bigzKSgiaXRlcmF0b3IiKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big5OSksaT1uKDQ4KSxhPW4oNzQpLHM9bigyOCksdT1uKDE3KSxjPW4oMzUpLGw9bigyKSxmPW4oMjcpLHA9bigyOSksaD1uKDEwMCksZD1oLkl0ZXJhdG9yUHJvdG90eXBlLGc9aC5CVUdHWV9TQUZBUklfSVRFUkFUT1JTLHY9bCgiaXRlcmF0b3IiKSx5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixsLGgsbSxiKXtvKG4sZSxsKTt2YXIgeCx3LGssUz1mdW5jdGlvbih0KXtpZih0PT09aCYmTylyZXR1cm4gTztpZighZyYmdCBpbiBqKXJldHVybiBqW3RdO3N3aXRjaCh0KXtjYXNlImtleXMiOmNhc2UidmFsdWVzIjpjYXNlImVudHJpZXMiOnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyl9fSxFPWUrIiBJdGVyYXRvciIsVD0hMSxqPXQucHJvdG90eXBlLEE9alt2XXx8alsiQEBpdGVyYXRvciJdfHxoJiZqW2hdLE89IWcmJkF8fFMoaCksQz0iQXJyYXkiPT1lJiZqLmVudHJpZXN8fEE7aWYoQyYmKHg9aShDLmNhbGwobmV3IHQpKSxkIT09T2JqZWN0LnByb3RvdHlwZSYmeC5uZXh0JiYoZnx8aSh4KT09PWR8fChhP2EoeCxkKToiZnVuY3Rpb24iIT10eXBlb2YgeFt2XSYmdSh4LHYseSkpLHMoeCxFLCEwLCEwKSxmJiYocFtFXT15KSkpLCJ2YWx1ZXMiPT1oJiZBJiYidmFsdWVzIiE9PUEubmFtZSYmKFQ9ITAsTz1mdW5jdGlvbigpe3JldHVybiBBLmNhbGwodGhpcyl9KSxmJiYhYnx8alt2XT09PU98fHUoaix2LE8pLHBbZV09TyxoKWlmKHc9e3ZhbHVlczpTKCJ2YWx1ZXMiKSxrZXlzOm0/TzpTKCJrZXlzIiksZW50cmllczpTKCJlbnRyaWVzIil9LGIpZm9yKGsgaW4gdykhZyYmIVQmJmsgaW4ganx8YyhqLGssd1trXSk7ZWxzZSByKHt0YXJnZXQ6ZSxwcm90bzohMCxmb3JjZWQ6Z3x8VH0sdyk7cmV0dXJuIHd9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTAwKS5JdGVyYXRvclByb3RvdHlwZSxvPW4oNDYpLGk9bigzMCksYT1uKDI4KSxzPW4oMjkpLHU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgYz1lKyIgSXRlcmF0b3IiO3JldHVybiB0LnByb3RvdHlwZT1vKHIse25leHQ6aSgxLG4pfSksYSh0LGMsITEsITApLHNbY109dSx0fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvLGksYT1uKDQ4KSxzPW4oMTcpLHU9bigxNCksYz1uKDIpLGw9bigyNyksZj1jKCJpdGVyYXRvciIpLHA9ITE7W10ua2V5cyYmKCJuZXh0ImluKGk9W10ua2V5cygpKT8obz1hKGEoaSkpKSE9PU9iamVjdC5wcm90b3R5cGUmJihyPW8pOnA9ITApLG51bGw9PXImJihyPXt9KSxsfHx1KHIsZil8fHMocixmLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSx0LmV4cG9ydHM9e0l0ZXJhdG9yUHJvdG90eXBlOnIsQlVHR1lfU0FGQVJJX0lURVJBVE9SUzpwfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIxKSxvPW4oNzcpLGk9bigyOSksYT1uKDQ5KSxzPW4oOTgpLHU9YS5zZXQsYz1hLmdldHRlckZvcigiQXJyYXkgSXRlcmF0b3IiKTt0LmV4cG9ydHM9cyhBcnJheSwiQXJyYXkiLGZ1bmN0aW9uKHQsZSl7dSh0aGlzLHt0eXBlOiJBcnJheSBJdGVyYXRvciIsdGFyZ2V0OnIodCksaW5kZXg6MCxraW5kOmV9KX0sZnVuY3Rpb24oKXt2YXIgdD1jKHRoaXMpLGU9dC50YXJnZXQsbj10LmtpbmQscj10LmluZGV4Kys7cmV0dXJuIWV8fHI+PWUubGVuZ3RoPyh0LnRhcmdldD12b2lkIDAse3ZhbHVlOnZvaWQgMCxkb25lOiEwfSk6ImtleXMiPT1uP3t2YWx1ZTpyLGRvbmU6ITF9OiJ2YWx1ZXMiPT1uP3t2YWx1ZTplW3JdLGRvbmU6ITF9Ont2YWx1ZTpbcixlW3JdXSxkb25lOiExfX0sInZhbHVlcyIpLGkuQXJndW1lbnRzPWkuQXJyYXksbygia2V5cyIpLG8oInZhbHVlcyIpLG8oImVudHJpZXMiKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE4NSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDkyKSxuKDEwNCksbigxODYpLG4oMTg4KSxuKDE4OSksbigxOTApLG4oMTkxKSxuKDk3KSxuKDE5MiksbigxOTMpLG4oMTk0KSxuKDE5NSksbigxOTYpLG4oMTk3KSxuKDE5OCksbigxOTkpLG4oMjAwKSxuKDIwMSksbigyMDIpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuU3ltYm9sfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oODgpLG89big2OSkuY29uY2F0KCJsZW5ndGgiLCJwcm90b3R5cGUiKTtlLmY9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXN8fGZ1bmN0aW9uKHQpe3JldHVybiByKHQsbyl9fSxmdW5jdGlvbih0LGUpe2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0NSksbz0iWyIrbig3OCkrIl0iLGk9UmVnRXhwKCJeIitvK28rIioiKSxhPVJlZ0V4cChvK28rIiokIikscz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49U3RyaW5nKHIoZSkpO3JldHVybiAxJnQmJihuPW4ucmVwbGFjZShpLCIiKSksMiZ0JiYobj1uLnJlcGxhY2UoYSwiIikpLG59fTt0LmV4cG9ydHM9e3N0YXJ0OnMoMSksZW5kOnMoMiksdHJpbTpzKDMpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTEpLG89big1MSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW8odCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgVHlwZUVycm9yKFN0cmluZyh0KSsiIGlzIG5vdCBpdGVyYWJsZSIpO3JldHVybiByKGUuY2FsbCh0KSl9fSxmdW5jdGlvbih0LGUsbil7bigyMjQpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuQXJyYXkuaXNBcnJheX0sZnVuY3Rpb24odCxlLG4pe24oMzQpLG4oMjI4KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLkFycmF5LmZyb219LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbyl7dHJ5e3JldHVybiBvP2UocihuKVswXSxuWzFdKTplKG4pfWNhdGNoKGUpe3ZhciBpPXQucmV0dXJuO3Rocm93IHZvaWQgMCE9PWkmJnIoaS5jYWxsKHQpKSxlfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIpLG89bigyOSksaT1yKCJpdGVyYXRvciIpLGE9QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dCYmKG8uQXJyYXk9PT10fHxhW2ldPT09dCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyKSgiaXRlcmF0b3IiKSxvPSExO3RyeXt2YXIgaT0wLGE9e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTohIWkrK319LHJldHVybjpmdW5jdGlvbigpe289ITB9fTthW3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LEFycmF5LmZyb20oYSxmdW5jdGlvbigpe3Rocm93IDJ9KX1jYXRjaCh0KXt9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoIWUmJiFvKXJldHVybiExO3ZhciBuPSExO3RyeXt2YXIgaT17fTtpW3JdPWZ1bmN0aW9uKCl7cmV0dXJue25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTpuPSEwfX19fSx0KGkpfWNhdGNoKHQpe31yZXR1cm4gbn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzMSksbz1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2xpY2U7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLnNsaWNlP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big0KSxpPW4oNzkpLGE9W10uc2xpY2Uscz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjIsbz1yP2EuY2FsbChhcmd1bWVudHMsMik6dm9pZCAwO3JldHVybiB0KHI/ZnVuY3Rpb24oKXsoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpGdW5jdGlvbihlKSkuYXBwbHkodGhpcyxvKX06ZSxuKX19O3Ioe2dsb2JhbDohMCxiaW5kOiEwLGZvcmNlZDovTVNJRSAuXC4vLnRlc3QoaSl9LHtzZXRUaW1lb3V0OnMoby5zZXRUaW1lb3V0KSxzZXRJbnRlcnZhbDpzKG8uc2V0SW50ZXJ2YWwpfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDEwNCksbigzNCksbig1MCksbigyNTQpLG4oMTIzKSxuKDI1OCk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5Qcm9taXNlfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KTt0LmV4cG9ydHM9ci5Qcm9taXNlfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzNSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIG8gaW4gZSluJiZuLnVuc2FmZSYmdFtvXT90W29dPWVbb106cih0LG8sZVtvXSxuKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBUeXBlRXJyb3IoIkluY29ycmVjdCAiKyhuP24rIiAiOiIiKSsiaW52b2NhdGlvbiIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTEpLG89bigyMiksaT1uKDIpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG4sYT1yKHQpLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT1hfHxudWxsPT0obj1yKGEpW2ldKT9lOm8obil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGE9big0KSxzPW4oNSksdT1uKDI2KSxjPW4oMzEpLGw9big5MCksZj1uKDY2KSxwPWEubG9jYXRpb24saD1hLnNldEltbWVkaWF0ZSxkPWEuY2xlYXJJbW1lZGlhdGUsZz1hLnByb2Nlc3Msdj1hLk1lc3NhZ2VDaGFubmVsLHk9YS5EaXNwYXRjaCxtPTAsYj17fSx4PWZ1bmN0aW9uKHQpe2lmKGIuaGFzT3duUHJvcGVydHkodCkpe3ZhciBlPWJbdF07ZGVsZXRlIGJbdF0sZSgpfX0sdz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt4KHQpfX0saz1mdW5jdGlvbih0KXt4KHQuZGF0YSl9LFM9ZnVuY3Rpb24odCl7YS5wb3N0TWVzc2FnZSh0KyIiLHAucHJvdG9jb2wrIi8vIitwLmhvc3QpfTtoJiZkfHwoaD1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0xO2FyZ3VtZW50cy5sZW5ndGg+bjspZS5wdXNoKGFyZ3VtZW50c1tuKytdKTtyZXR1cm4gYlsrK21dPWZ1bmN0aW9uKCl7KCJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RnVuY3Rpb24odCkpLmFwcGx5KHZvaWQgMCxlKX0scihtKSxtfSxkPWZ1bmN0aW9uKHQpe2RlbGV0ZSBiW3RdfSwicHJvY2VzcyI9PXUoZyk/cj1mdW5jdGlvbih0KXtnLm5leHRUaWNrKHcodCkpfTp5JiZ5Lm5vdz9yPWZ1bmN0aW9uKHQpe3kubm93KHcodCkpfTp2PyhpPShvPW5ldyB2KS5wb3J0MixvLnBvcnQxLm9ubWVzc2FnZT1rLHI9YyhpLnBvc3RNZXNzYWdlLGksMSkpOiFhLmFkZEV2ZW50TGlzdGVuZXJ8fCJmdW5jdGlvbiIhPXR5cGVvZiBwb3N0TWVzc2FnZXx8YS5pbXBvcnRTY3JpcHRzfHxzKFMpP3I9Im9ucmVhZHlzdGF0ZWNoYW5nZSJpbiBmKCJzY3JpcHQiKT9mdW5jdGlvbih0KXtsLmFwcGVuZENoaWxkKGYoInNjcmlwdCIpKS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtsLnJlbW92ZUNoaWxkKHRoaXMpLHgodCl9fTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHcodCksMCl9OihyPVMsYS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixrLCExKSkpLHQuZXhwb3J0cz17c2V0OmgsY2xlYXI6ZH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxvPW4oNiksaT1uKDUyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihyKHQpLG8oZSkmJmUuY29uc3RydWN0b3I9PT10KXJldHVybiBlO3ZhciBuPWkuZih0KTtyZXR1cm4oMCxuLnJlc29sdmUpKGUpLG4ucHJvbWlzZX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMjIpLGk9big1MiksYT1uKDYwKSxzPW4oNTkpO3Ioe3RhcmdldDoiUHJvbWlzZSIsc3RhdDohMH0se2FsbFNldHRsZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWkuZihlKSxyPW4ucmVzb2x2ZSx1PW4ucmVqZWN0LGM9YShmdW5jdGlvbigpe3ZhciBuPW8oZS5yZXNvbHZlKSxpPVtdLGE9MCx1PTE7cyh0LGZ1bmN0aW9uKHQpe3ZhciBvPWErKyxzPSExO2kucHVzaCh2b2lkIDApLHUrKyxuLmNhbGwoZSx0KS50aGVuKGZ1bmN0aW9uKHQpe3N8fChzPSEwLGlbb109e3N0YXR1czoiZnVsZmlsbGVkIix2YWx1ZTp0fSwtLXV8fHIoaSkpfSxmdW5jdGlvbih0KXtzfHwocz0hMCxpW29dPXtzdGF0dXM6InJlamVjdGVkIixyZWFzb246dH0sLS11fHxyKGkpKX0pfSksLS11fHxyKGkpfSk7cmV0dXJuIGMuZXJyb3ImJnUoYy52YWx1ZSksbi5wcm9taXNlfX0pfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI3Nyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1NCksbz1uKDE1OCksaT1uKDE2Mik7ZnVuY3Rpb24gYShlLG4scyl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBSZWZsZWN0JiZvP3QuZXhwb3J0cz1hPW86dC5leHBvcnRzPWE9ZnVuY3Rpb24odCxlLG4pe3ZhciBvPWkodCxlKTtpZihvKXt2YXIgYT1yKG8sZSk7cmV0dXJuIGEuZ2V0P2EuZ2V0LmNhbGwobik6YS52YWx1ZX19LGEoZSxuLHN8fGUpfXQuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjM2KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByOwovKiEKICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My40LjEKICogaHR0cHM6Ly9qcXVlcnkuY29tLwogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vCiAqCiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIERhdGU6IDIwMTktMDUtMDFUMjE6MDRaCiAqLwovKiEKICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My40LjEKICogaHR0cHM6Ly9qcXVlcnkuY29tLwogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vCiAqCiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIERhdGU6IDIwMTktMDUtMDFUMjE6MDRaCiAqLwohZnVuY3Rpb24oZSxuKXsidXNlIHN0cmljdCI7Im9iamVjdCI9PXR5cGVvZiB0LmV4cG9ydHM/dC5leHBvcnRzPWUuZG9jdW1lbnQ/bihlLCEwKTpmdW5jdGlvbih0KXtpZighdC5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gbih0KX06bihlKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24obixvKXsidXNlIHN0cmljdCI7dmFyIGk9W10sYT1uLmRvY3VtZW50LHM9T2JqZWN0LmdldFByb3RvdHlwZU9mLHU9aS5zbGljZSxjPWkuY29uY2F0LGw9aS5wdXNoLGY9aS5pbmRleE9mLHA9e30saD1wLnRvU3RyaW5nLGQ9cC5oYXNPd25Qcm9wZXJ0eSxnPWQudG9TdHJpbmcsdj1nLmNhbGwoT2JqZWN0KSx5PXt9LG09ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJiJudW1iZXIiIT10eXBlb2YgdC5ub2RlVHlwZX0sYj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmdD09PXQud2luZG93fSx4PXt0eXBlOiEwLHNyYzohMCxub25jZTohMCxub01vZHVsZTohMH07ZnVuY3Rpb24gdyh0LGUsbil7dmFyIHIsbyxpPShuPW58fGEpLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2lmKGkudGV4dD10LGUpZm9yKHIgaW4geCkobz1lW3JdfHxlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUocikpJiZpLnNldEF0dHJpYnV0ZShyLG8pO24uaGVhZC5hcHBlbmRDaGlsZChpKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGkpfWZ1bmN0aW9uIGsodCl7cmV0dXJuIG51bGw9PXQ/dCsiIjoib2JqZWN0Ij09dHlwZW9mIHR8fCJmdW5jdGlvbiI9PXR5cGVvZiB0P3BbaC5jYWxsKHQpXXx8Im9iamVjdCI6dHlwZW9mIHR9dmFyIFM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IFMuZm4uaW5pdCh0LGUpfSxFPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZztmdW5jdGlvbiBUKHQpe3ZhciBlPSEhdCYmImxlbmd0aCJpbiB0JiZ0Lmxlbmd0aCxuPWsodCk7cmV0dXJuIW0odCkmJiFiKHQpJiYoImFycmF5Ij09PW58fDA9PT1lfHwibnVtYmVyIj09dHlwZW9mIGUmJmU+MCYmZS0xIGluIHQpfVMuZm49Uy5wcm90b3R5cGU9e2pxdWVyeToiMy40LjEiLGNvbnN0cnVjdG9yOlMsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiB1LmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD91LmNhbGwodGhpcyk6dDwwP3RoaXNbdCt0aGlzLmxlbmd0aF06dGhpc1t0XX0scHVzaFN0YWNrOmZ1bmN0aW9uKHQpe3ZhciBlPVMubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLHQpO3JldHVybiBlLnByZXZPYmplY3Q9dGhpcyxlfSxlYWNoOmZ1bmN0aW9uKHQpe3JldHVybiBTLmVhY2godGhpcyx0KX0sbWFwOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhTLm1hcCh0aGlzLGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuY2FsbChlLG4sZSl9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sZW5ndGgsbj0rdCsodDwwP2U6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4+PTAmJm48ZT9bdGhpc1tuXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6bCxzb3J0Omkuc29ydCxzcGxpY2U6aS5zcGxpY2V9LFMuZXh0ZW5kPVMuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHIsbyxpLGE9YXJndW1lbnRzWzBdfHx7fSxzPTEsdT1hcmd1bWVudHMubGVuZ3RoLGM9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGEmJihjPWEsYT1hcmd1bWVudHNbc118fHt9LHMrKyksIm9iamVjdCI9PXR5cGVvZiBhfHxtKGEpfHwoYT17fSkscz09PXUmJihhPXRoaXMscy0tKTtzPHU7cysrKWlmKG51bGwhPSh0PWFyZ3VtZW50c1tzXSkpZm9yKGUgaW4gdClyPXRbZV0sIl9fcHJvdG9fXyIhPT1lJiZhIT09ciYmKGMmJnImJihTLmlzUGxhaW5PYmplY3Qocil8fChvPUFycmF5LmlzQXJyYXkocikpKT8obj1hW2VdLGk9byYmIUFycmF5LmlzQXJyYXkobik/W106b3x8Uy5pc1BsYWluT2JqZWN0KG4pP246e30sbz0hMSxhW2VdPVMuZXh0ZW5kKGMsaSxyKSk6dm9pZCAwIT09ciYmKGFbZV09cikpO3JldHVybiBhfSxTLmV4dGVuZCh7ZXhwYW5kbzoialF1ZXJ5IisoIjMuNC4xIitNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcih0KX0sbm9vcDpmdW5jdGlvbigpe30saXNQbGFpbk9iamVjdDpmdW5jdGlvbih0KXt2YXIgZSxuO3JldHVybiEoIXR8fCJbb2JqZWN0IE9iamVjdF0iIT09aC5jYWxsKHQpKSYmKCEoZT1zKHQpKXx8ImZ1bmN0aW9uIj09dHlwZW9mKG49ZC5jYWxsKGUsImNvbnN0cnVjdG9yIikmJmUuY29uc3RydWN0b3IpJiZnLmNhbGwobik9PT12KX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbih0KXt2YXIgZTtmb3IoZSBpbiB0KXJldHVybiExO3JldHVybiEwfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKHQsZSl7dyh0LHtub25jZTplJiZlLm5vbmNlfSl9LGVhY2g6ZnVuY3Rpb24odCxlKXt2YXIgbixyPTA7aWYoVCh0KSlmb3Iobj10Lmxlbmd0aDtyPG4mJiExIT09ZS5jYWxsKHRbcl0scix0W3JdKTtyKyspO2Vsc2UgZm9yKHIgaW4gdClpZighMT09PWUuY2FsbCh0W3JdLHIsdFtyXSkpYnJlYWs7cmV0dXJuIHR9LHRyaW06ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/IiI6KHQrIiIpLnJlcGxhY2UoRSwiIil9LG1ha2VBcnJheTpmdW5jdGlvbih0LGUpe3ZhciBuPWV8fFtdO3JldHVybiBudWxsIT10JiYoVChPYmplY3QodCkpP1MubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIHQ/W3RdOnQpOmwuY2FsbChuLHQpKSxufSxpbkFycmF5OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbD09ZT8tMTpmLmNhbGwoZSx0LG4pfSxtZXJnZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0rZS5sZW5ndGgscj0wLG89dC5sZW5ndGg7cjxuO3IrKyl0W28rK109ZVtyXTtyZXR1cm4gdC5sZW5ndGg9byx0fSxncmVwOmZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9W10sbz0wLGk9dC5sZW5ndGgsYT0hbjtvPGk7bysrKSFlKHRbb10sbykhPT1hJiZyLnB1c2godFtvXSk7cmV0dXJuIHJ9LG1hcDpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpPTAsYT1bXTtpZihUKHQpKWZvcihyPXQubGVuZ3RoO2k8cjtpKyspbnVsbCE9KG89ZSh0W2ldLGksbikpJiZhLnB1c2gobyk7ZWxzZSBmb3IoaSBpbiB0KW51bGwhPShvPWUodFtpXSxpLG4pKSYmYS5wdXNoKG8pO3JldHVybiBjLmFwcGx5KFtdLGEpfSxndWlkOjEsc3VwcG9ydDp5fSksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKFMuZm5bU3ltYm9sLml0ZXJhdG9yXT1pW1N5bWJvbC5pdGVyYXRvcl0pLFMuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24odCxlKXtwWyJbb2JqZWN0ICIrZSsiXSJdPWUudG9Mb3dlckNhc2UoKX0pO3ZhciBqPQovKiEKICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMy40CiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pzLmZvdW5kYXRpb24vCiAqCiAqIERhdGU6IDIwMTktMDQtMDgKICovCmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYSxzLHUsYyxsLGYscCxoLGQsZyx2LHksbSxiLHg9InNpenpsZSIrMSpuZXcgRGF0ZSx3PXQuZG9jdW1lbnQsaz0wLFM9MCxFPXV0KCksVD11dCgpLGo9dXQoKSxBPXV0KCksTz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZSYmKGY9ITApLDB9LEM9e30uaGFzT3duUHJvcGVydHksTD1bXSxSPUwucG9wLFA9TC5wdXNoLE49TC5wdXNoLEk9TC5zbGljZSxEPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKWlmKHRbbl09PT1lKXJldHVybiBuO3JldHVybi0xfSxfPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTT0iW1xceDIwXFx0XFxyXFxuXFxmXSIsVT0iKD86XFxcXC58W1xcdy1dfFteXDAtXFx4YTBdKSsiLEI9IlxcWyIrTSsiKigiK1UrIikoPzoiK00rIiooWypeJHwhfl0/PSkiK00rIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitVKyIpKXwpIitNKyIqXFxdIixxPSI6KCIrVSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrQisiKSopfC4qKVxcKXwpIixGPW5ldyBSZWdFeHAoTSsiKyIsImciKSxIPW5ldyBSZWdFeHAoIl4iK00rIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTSsiKyQiLCJnIiksej1uZXcgUmVnRXhwKCJeIitNKyIqLCIrTSsiKiIpLFc9bmV3IFJlZ0V4cCgiXiIrTSsiKihbPit+XXwiK00rIikiK00rIioiKSwkPW5ldyBSZWdFeHAoTSsifD4iKSxZPW5ldyBSZWdFeHAocSksVj1uZXcgUmVnRXhwKCJeIitVKyIkIiksRz17SUQ6bmV3IFJlZ0V4cCgiXiMoIitVKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK1UrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK1UrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitCKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrcSksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitNKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitNKyIqKD86KFsrLV18KSIrTSsiKihcXGQrKXwpKSIrTSsiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrXysiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK00rIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrTSsiKigoPzotXFxkKT9cXGQqKSIrTSsiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sSz0vSFRNTCQvaSxYPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksSj0vXmhcZCQvaSxRPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxaPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sdHQ9L1srfl0vLGV0PW5ldyBSZWdFeHAoIlxcXFwoW1xcZGEtZl17MSw2fSIrTSsiP3woIitNKyIpfC4pIiwiaWciKSxudD1mdW5jdGlvbih0LGUsbil7dmFyIHI9IjB4IitlLTY1NTM2O3JldHVybiByIT1yfHxuP2U6cjwwP1N0cmluZy5mcm9tQ2hhckNvZGUocis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShyPj4xMHw1NTI5NiwxMDIzJnJ8NTYzMjApfSxydD0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxvdD1mdW5jdGlvbih0LGUpe3JldHVybiBlPyJcMCI9PT10PyLvv70iOnQuc2xpY2UoMCwtMSkrIlxcIit0LmNoYXJDb2RlQXQodC5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK3R9LGl0PWZ1bmN0aW9uKCl7cCgpfSxhdD14dChmdW5jdGlvbih0KXtyZXR1cm4hMD09PXQuZGlzYWJsZWQmJiJmaWVsZHNldCI9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTt0cnl7Ti5hcHBseShMPUkuY2FsbCh3LmNoaWxkTm9kZXMpLHcuY2hpbGROb2RlcyksTFt3LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaCh0KXtOPXthcHBseTpMLmxlbmd0aD9mdW5jdGlvbih0LGUpe1AuYXBwbHkodCxJLmNhbGwoZSkpfTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aCxyPTA7dFtuKytdPWVbcisrXTspO3QubGVuZ3RoPW4tMX19fWZ1bmN0aW9uIHN0KHQsZSxyLG8pe3ZhciBpLHMsYyxsLGYsZCx5LG09ZSYmZS5vd25lckRvY3VtZW50LGs9ZT9lLm5vZGVUeXBlOjk7aWYocj1yfHxbXSwic3RyaW5nIiE9dHlwZW9mIHR8fCF0fHwxIT09ayYmOSE9PWsmJjExIT09aylyZXR1cm4gcjtpZighbyYmKChlP2Uub3duZXJEb2N1bWVudHx8ZTp3KSE9PWgmJnAoZSksZT1lfHxoLGcpKXtpZigxMSE9PWsmJihmPVouZXhlYyh0KSkpaWYoaT1mWzFdKXtpZig5PT09ayl7aWYoIShjPWUuZ2V0RWxlbWVudEJ5SWQoaSkpKXJldHVybiByO2lmKGMuaWQ9PT1pKXJldHVybiByLnB1c2goYykscn1lbHNlIGlmKG0mJihjPW0uZ2V0RWxlbWVudEJ5SWQoaSkpJiZiKGUsYykmJmMuaWQ9PT1pKXJldHVybiByLnB1c2goYykscn1lbHNle2lmKGZbMl0pcmV0dXJuIE4uYXBwbHkocixlLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpKSxyO2lmKChpPWZbM10pJiZuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gTi5hcHBseShyLGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShpKSkscn1pZihuLnFzYSYmIUFbdCsiICJdJiYoIXZ8fCF2LnRlc3QodCkpJiYoMSE9PWt8fCJvYmplY3QiIT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSl7aWYoeT10LG09ZSwxPT09ayYmJC50ZXN0KHQpKXtmb3IoKGw9ZS5nZXRBdHRyaWJ1dGUoImlkIikpP2w9bC5yZXBsYWNlKHJ0LG90KTplLnNldEF0dHJpYnV0ZSgiaWQiLGw9eCkscz0oZD1hKHQpKS5sZW5ndGg7cy0tOylkW3NdPSIjIitsKyIgIitidChkW3NdKTt5PWQuam9pbigiLCIpLG09dHQudGVzdCh0KSYmeXQoZS5wYXJlbnROb2RlKXx8ZX10cnl7cmV0dXJuIE4uYXBwbHkocixtLnF1ZXJ5U2VsZWN0b3JBbGwoeSkpLHJ9Y2F0Y2goZSl7QSh0LCEwKX1maW5hbGx5e2w9PT14JiZlLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiB1KHQucmVwbGFjZShILCIkMSIpLGUscixvKX1mdW5jdGlvbiB1dCgpe3ZhciB0PVtdO3JldHVybiBmdW5jdGlvbiBlKG4sbyl7cmV0dXJuIHQucHVzaChuKyIgIik+ci5jYWNoZUxlbmd0aCYmZGVsZXRlIGVbdC5zaGlmdCgpXSxlW24rIiAiXT1vfX1mdW5jdGlvbiBjdCh0KXtyZXR1cm4gdFt4XT0hMCx0fWZ1bmN0aW9uIGx0KHQpe3ZhciBlPWguY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTt0cnl7cmV0dXJuISF0KGUpfWNhdGNoKHQpe3JldHVybiExfWZpbmFsbHl7ZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSksZT1udWxsfX1mdW5jdGlvbiBmdCh0LGUpe2Zvcih2YXIgbj10LnNwbGl0KCJ8Iiksbz1uLmxlbmd0aDtvLS07KXIuYXR0ckhhbmRsZVtuW29dXT1lfWZ1bmN0aW9uIHB0KHQsZSl7dmFyIG49ZSYmdCxyPW4mJjE9PT10Lm5vZGVUeXBlJiYxPT09ZS5ub2RlVHlwZSYmdC5zb3VyY2VJbmRleC1lLnNvdXJjZUluZGV4O2lmKHIpcmV0dXJuIHI7aWYobilmb3IoO249bi5uZXh0U2libGluZzspaWYobj09PWUpcmV0dXJuLTE7cmV0dXJuIHQ/MTotMX1mdW5jdGlvbiBodCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmZS50eXBlPT09dH19ZnVuY3Rpb24gZHQodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PW58fCJidXR0b24iPT09bikmJmUudHlwZT09PXR9fWZ1bmN0aW9uIGd0KHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iZm9ybSJpbiBlP2UucGFyZW50Tm9kZSYmITE9PT1lLmRpc2FibGVkPyJsYWJlbCJpbiBlPyJsYWJlbCJpbiBlLnBhcmVudE5vZGU/ZS5wYXJlbnROb2RlLmRpc2FibGVkPT09dDplLmRpc2FibGVkPT09dDplLmlzRGlzYWJsZWQ9PT10fHxlLmlzRGlzYWJsZWQhPT0hdCYmYXQoZSk9PT10OmUuZGlzYWJsZWQ9PT10OiJsYWJlbCJpbiBlJiZlLmRpc2FibGVkPT09dH19ZnVuY3Rpb24gdnQodCl7cmV0dXJuIGN0KGZ1bmN0aW9uKGUpe3JldHVybiBlPStlLGN0KGZ1bmN0aW9uKG4scil7Zm9yKHZhciBvLGk9dChbXSxuLmxlbmd0aCxlKSxhPWkubGVuZ3RoO2EtLTspbltvPWlbYV1dJiYobltvXT0hKHJbb109bltvXSkpfSl9KX1mdW5jdGlvbiB5dCh0KXtyZXR1cm4gdCYmdm9pZCAwIT09dC5nZXRFbGVtZW50c0J5VGFnTmFtZSYmdH1mb3IoZSBpbiBuPXN0LnN1cHBvcnQ9e30saT1zdC5pc1hNTD1mdW5jdGlvbih0KXt2YXIgZT10Lm5hbWVzcGFjZVVSSSxuPSh0Lm93bmVyRG9jdW1lbnR8fHQpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4hSy50ZXN0KGV8fG4mJm4ubm9kZU5hbWV8fCJIVE1MIil9LHA9c3Quc2V0RG9jdW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGUsbyxhPXQ/dC5vd25lckRvY3VtZW50fHx0Onc7cmV0dXJuIGEhPT1oJiY5PT09YS5ub2RlVHlwZSYmYS5kb2N1bWVudEVsZW1lbnQ/KGQ9KGg9YSkuZG9jdW1lbnRFbGVtZW50LGc9IWkoaCksdyE9PWgmJihvPWguZGVmYXVsdFZpZXcpJiZvLnRvcCE9PW8mJihvLmFkZEV2ZW50TGlzdGVuZXI/by5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGl0LCExKTpvLmF0dGFjaEV2ZW50JiZvLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsaXQpKSxuLmF0dHJpYnV0ZXM9bHQoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NOYW1lPSJpIiwhdC5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksbi5nZXRFbGVtZW50c0J5VGFnTmFtZT1sdChmdW5jdGlvbih0KXtyZXR1cm4gdC5hcHBlbmRDaGlsZChoLmNyZWF0ZUNvbW1lbnQoIiIpKSwhdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1RLnRlc3QoaC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxuLmdldEJ5SWQ9bHQoZnVuY3Rpb24odCl7cmV0dXJuIGQuYXBwZW5kQ2hpbGQodCkuaWQ9eCwhaC5nZXRFbGVtZW50c0J5TmFtZXx8IWguZ2V0RWxlbWVudHNCeU5hbWUoeCkubGVuZ3RofSksbi5nZXRCeUlkPyhyLmZpbHRlci5JRD1mdW5jdGlvbih0KXt2YXIgZT10LnJlcGxhY2UoZXQsbnQpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoImlkIik9PT1lfX0sci5maW5kLklEPWZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09ZS5nZXRFbGVtZW50QnlJZCYmZyl7dmFyIG49ZS5nZXRFbGVtZW50QnlJZCh0KTtyZXR1cm4gbj9bbl06W119fSk6KHIuZmlsdGVyLklEPWZ1bmN0aW9uKHQpe3ZhciBlPXQucmVwbGFjZShldCxudCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXZvaWQgMCE9PXQuZ2V0QXR0cmlidXRlTm9kZSYmdC5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBuJiZuLnZhbHVlPT09ZX19LHIuZmluZC5JRD1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PWUuZ2V0RWxlbWVudEJ5SWQmJmcpe3ZhciBuLHIsbyxpPWUuZ2V0RWxlbWVudEJ5SWQodCk7aWYoaSl7aWYoKG49aS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PXQpcmV0dXJuW2ldO2ZvcihvPWUuZ2V0RWxlbWVudHNCeU5hbWUodCkscj0wO2k9b1tyKytdOylpZigobj1pLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09dClyZXR1cm5baV19cmV0dXJuW119fSksci5maW5kLlRBRz1uLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWUuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KTpuLnFzYT9lLnF1ZXJ5U2VsZWN0b3JBbGwodCk6dm9pZCAwfTpmdW5jdGlvbih0LGUpe3ZhciBuLHI9W10sbz0wLGk9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KTtpZigiKiI9PT10KXtmb3IoO249aVtvKytdOykxPT09bi5ub2RlVHlwZSYmci5wdXNoKG4pO3JldHVybiByfXJldHVybiBpfSxyLmZpbmQuQ0xBU1M9bi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PWUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZylyZXR1cm4gZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHQpfSx5PVtdLHY9W10sKG4ucXNhPVEudGVzdChoLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKGx0KGZ1bmN0aW9uKHQpe2QuYXBwZW5kQ2hpbGQodCkuaW5uZXJIVE1MPSI8YSBpZD0nIit4KyInPjwvYT48c2VsZWN0IGlkPSciK3grIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsdC5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmdi5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLHQucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8di5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK18rIikiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49Iit4KyItXSIpLmxlbmd0aHx8di5wdXNoKCJ+PSIpLHQucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHYucHVzaCgiOmNoZWNrZWQiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoImEjIit4KyIrKiIpLmxlbmd0aHx8di5wdXNoKCIuIy4rWyt+XSIpfSksbHQoZnVuY3Rpb24odCl7dC5pbm5lckhUTUw9IjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7dmFyIGU9aC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Uuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksdC5hcHBlbmRDaGlsZChlKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmdi5wdXNoKCJuYW1lIitNKyIqWypeJHwhfl0/PSIpLDIhPT10LnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksZC5hcHBlbmRDaGlsZCh0KS5kaXNhYmxlZD0hMCwyIT09dC5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGgmJnYucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSx2LnB1c2goIiwuKjoiKX0pKSwobi5tYXRjaGVzU2VsZWN0b3I9US50ZXN0KG09ZC5tYXRjaGVzfHxkLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8ZC5tb3pNYXRjaGVzU2VsZWN0b3J8fGQub01hdGNoZXNTZWxlY3Rvcnx8ZC5tc01hdGNoZXNTZWxlY3RvcikpJiZsdChmdW5jdGlvbih0KXtuLmRpc2Nvbm5lY3RlZE1hdGNoPW0uY2FsbCh0LCIqIiksbS5jYWxsKHQsIltzIT0nJ106eCIpLHkucHVzaCgiIT0iLHEpfSksdj12Lmxlbmd0aCYmbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSkseT15Lmxlbmd0aCYmbmV3IFJlZ0V4cCh5LmpvaW4oInwiKSksZT1RLnRlc3QoZC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiksYj1lfHxRLnRlc3QoZC5jb250YWlucyk/ZnVuY3Rpb24odCxlKXt2YXIgbj05PT09dC5ub2RlVHlwZT90LmRvY3VtZW50RWxlbWVudDp0LHI9ZSYmZS5wYXJlbnROb2RlO3JldHVybiB0PT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24odCxlKXtpZihlKWZvcig7ZT1lLnBhcmVudE5vZGU7KWlmKGU9PT10KXJldHVybiEwO3JldHVybiExfSxPPWU/ZnVuY3Rpb24odCxlKXtpZih0PT09ZSlyZXR1cm4gZj0hMCwwO3ZhciByPSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiByfHwoMSYocj0odC5vd25lckRvY3VtZW50fHx0KT09PShlLm93bmVyRG9jdW1lbnR8fGUpP3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZSk6MSl8fCFuLnNvcnREZXRhY2hlZCYmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KT09PXI/dD09PWh8fHQub3duZXJEb2N1bWVudD09PXcmJmIodyx0KT8tMTplPT09aHx8ZS5vd25lckRvY3VtZW50PT09dyYmYih3LGUpPzE6bD9EKGwsdCktRChsLGUpOjA6NCZyPy0xOjEpfTpmdW5jdGlvbih0LGUpe2lmKHQ9PT1lKXJldHVybiBmPSEwLDA7dmFyIG4scj0wLG89dC5wYXJlbnROb2RlLGk9ZS5wYXJlbnROb2RlLGE9W3RdLHM9W2VdO2lmKCFvfHwhaSlyZXR1cm4gdD09PWg/LTE6ZT09PWg/MTpvPy0xOmk/MTpsP0QobCx0KS1EKGwsZSk6MDtpZihvPT09aSlyZXR1cm4gcHQodCxlKTtmb3Iobj10O249bi5wYXJlbnROb2RlOylhLnVuc2hpZnQobik7Zm9yKG49ZTtuPW4ucGFyZW50Tm9kZTspcy51bnNoaWZ0KG4pO2Zvcig7YVtyXT09PXNbcl07KXIrKztyZXR1cm4gcj9wdChhW3JdLHNbcl0pOmFbcl09PT13Py0xOnNbcl09PT13PzE6MH0saCk6aH0sc3QubWF0Y2hlcz1mdW5jdGlvbih0LGUpe3JldHVybiBzdCh0LG51bGwsbnVsbCxlKX0sc3QubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKHQsZSl7aWYoKHQub3duZXJEb2N1bWVudHx8dCkhPT1oJiZwKHQpLG4ubWF0Y2hlc1NlbGVjdG9yJiZnJiYhQVtlKyIgIl0mJigheXx8IXkudGVzdChlKSkmJighdnx8IXYudGVzdChlKSkpdHJ5e3ZhciByPW0uY2FsbCh0LGUpO2lmKHJ8fG4uZGlzY29ubmVjdGVkTWF0Y2h8fHQuZG9jdW1lbnQmJjExIT09dC5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gcn1jYXRjaCh0KXtBKGUsITApfXJldHVybiBzdChlLGgsbnVsbCxbdF0pLmxlbmd0aD4wfSxzdC5jb250YWlucz1mdW5jdGlvbih0LGUpe3JldHVybih0Lm93bmVyRG9jdW1lbnR8fHQpIT09aCYmcCh0KSxiKHQsZSl9LHN0LmF0dHI9ZnVuY3Rpb24odCxlKXsodC5vd25lckRvY3VtZW50fHx0KSE9PWgmJnAodCk7dmFyIG89ci5hdHRySGFuZGxlW2UudG9Mb3dlckNhc2UoKV0saT1vJiZDLmNhbGwoci5hdHRySGFuZGxlLGUudG9Mb3dlckNhc2UoKSk/byh0LGUsIWcpOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09aT9pOm4uYXR0cmlidXRlc3x8IWc/dC5nZXRBdHRyaWJ1dGUoZSk6KGk9dC5nZXRBdHRyaWJ1dGVOb2RlKGUpKSYmaS5zcGVjaWZpZWQ/aS52YWx1ZTpudWxsfSxzdC5lc2NhcGU9ZnVuY3Rpb24odCl7cmV0dXJuKHQrIiIpLnJlcGxhY2UocnQsb3QpfSxzdC5lcnJvcj1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrdCl9LHN0LnVuaXF1ZVNvcnQ9ZnVuY3Rpb24odCl7dmFyIGUscj1bXSxvPTAsaT0wO2lmKGY9IW4uZGV0ZWN0RHVwbGljYXRlcyxsPSFuLnNvcnRTdGFibGUmJnQuc2xpY2UoMCksdC5zb3J0KE8pLGYpe2Zvcig7ZT10W2krK107KWU9PT10W2ldJiYobz1yLnB1c2goaSkpO2Zvcig7by0tOyl0LnNwbGljZShyW29dLDEpfXJldHVybiBsPW51bGwsdH0sbz1zdC5nZXRUZXh0PWZ1bmN0aW9uKHQpe3ZhciBlLG49IiIscj0wLGk9dC5ub2RlVHlwZTtpZihpKXtpZigxPT09aXx8OT09PWl8fDExPT09aSl7aWYoInN0cmluZyI9PXR5cGVvZiB0LnRleHRDb250ZW50KXJldHVybiB0LnRleHRDb250ZW50O2Zvcih0PXQuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZyluKz1vKHQpfWVsc2UgaWYoMz09PWl8fDQ9PT1pKXJldHVybiB0Lm5vZGVWYWx1ZX1lbHNlIGZvcig7ZT10W3IrK107KW4rPW8oZSk7cmV0dXJuIG59LChyPXN0LnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmN0LG1hdGNoOkcsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKHQpe3JldHVybiB0WzFdPXRbMV0ucmVwbGFjZShldCxudCksdFszXT0odFszXXx8dFs0XXx8dFs1XXx8IiIpLnJlcGxhY2UoZXQsbnQpLCJ+PSI9PT10WzJdJiYodFszXT0iICIrdFszXSsiICIpLHQuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRbMV09dFsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09dFsxXS5zbGljZSgwLDMpPyh0WzNdfHxzdC5lcnJvcih0WzBdKSx0WzRdPSsodFs0XT90WzVdKyh0WzZdfHwxKToyKigiZXZlbiI9PT10WzNdfHwib2RkIj09PXRbM10pKSx0WzVdPSsodFs3XSt0WzhdfHwib2RkIj09PXRbM10pKTp0WzNdJiZzdC5lcnJvcih0WzBdKSx0fSxQU0VVRE86ZnVuY3Rpb24odCl7dmFyIGUsbj0hdFs2XSYmdFsyXTtyZXR1cm4gRy5DSElMRC50ZXN0KHRbMF0pP251bGw6KHRbM10/dFsyXT10WzRdfHx0WzVdfHwiIjpuJiZZLnRlc3QobikmJihlPWEobiwhMCkpJiYoZT1uLmluZGV4T2YoIikiLG4ubGVuZ3RoLWUpLW4ubGVuZ3RoKSYmKHRbMF09dFswXS5zbGljZSgwLGUpLHRbMl09bi5zbGljZSgwLGUpKSx0LnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKGV0LG50KS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PXQ/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24odCl7cmV0dXJuIHQubm9kZU5hbWUmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWV9fSxDTEFTUzpmdW5jdGlvbih0KXt2YXIgZT1FW3QrIiAiXTtyZXR1cm4gZXx8KGU9bmV3IFJlZ0V4cCgiKF58IitNKyIpIit0KyIoIitNKyJ8JCkiKSkmJkUodCxmdW5jdGlvbih0KXtyZXR1cm4gZS50ZXN0KCJzdHJpbmciPT10eXBlb2YgdC5jbGFzc05hbWUmJnQuY2xhc3NOYW1lfHx2b2lkIDAhPT10LmdldEF0dHJpYnV0ZSYmdC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIG89c3QuYXR0cihyLHQpO3JldHVybiBudWxsPT1vPyIhPSI9PT1lOiFlfHwobys9IiIsIj0iPT09ZT9vPT09bjoiIT0iPT09ZT9vIT09bjoiXj0iPT09ZT9uJiYwPT09by5pbmRleE9mKG4pOiIqPSI9PT1lP24mJm8uaW5kZXhPZihuKT4tMToiJD0iPT09ZT9uJiZvLnNsaWNlKC1uLmxlbmd0aCk9PT1uOiJ+PSI9PT1lPygiICIrby5yZXBsYWNlKEYsIiAiKSsiICIpLmluZGV4T2Yobik+LTE6Inw9Ij09PWUmJihvPT09bnx8by5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bisiLSIpKX19LENISUxEOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGk9Im50aCIhPT10LnNsaWNlKDAsMyksYT0ibGFzdCIhPT10LnNsaWNlKC00KSxzPSJvZi10eXBlIj09PWU7cmV0dXJuIDE9PT1yJiYwPT09bz9mdW5jdGlvbih0KXtyZXR1cm4hIXQucGFyZW50Tm9kZX06ZnVuY3Rpb24oZSxuLHUpe3ZhciBjLGwsZixwLGgsZCxnPWkhPT1hPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIsdj1lLnBhcmVudE5vZGUseT1zJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbT0hdSYmIXMsYj0hMTtpZih2KXtpZihpKXtmb3IoO2c7KXtmb3IocD1lO3A9cFtnXTspaWYocz9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT15OjE9PT1wLm5vZGVUeXBlKXJldHVybiExO2Q9Zz0ib25seSI9PT10JiYhZCYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihkPVthP3YuZmlyc3RDaGlsZDp2Lmxhc3RDaGlsZF0sYSYmbSl7Zm9yKGI9KGg9KGM9KGw9KGY9KHA9dilbeF18fChwW3hdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbdF18fFtdKVswXT09PWsmJmNbMV0pJiZjWzJdLHA9aCYmdi5jaGlsZE5vZGVzW2hdO3A9KytoJiZwJiZwW2ddfHwoYj1oPTApfHxkLnBvcCgpOylpZigxPT09cC5ub2RlVHlwZSYmKytiJiZwPT09ZSl7bFt0XT1bayxoLGJdO2JyZWFrfX1lbHNlIGlmKG0mJihiPWg9KGM9KGw9KGY9KHA9ZSlbeF18fChwW3hdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbdF18fFtdKVswXT09PWsmJmNbMV0pLCExPT09Yilmb3IoOyhwPSsraCYmcCYmcFtnXXx8KGI9aD0wKXx8ZC5wb3AoKSkmJigocz9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT15OjEhPT1wLm5vZGVUeXBlKXx8ISsrYnx8KG0mJigobD0oZj1wW3hdfHwocFt4XT17fSkpW3AudW5pcXVlSURdfHwoZltwLnVuaXF1ZUlEXT17fSkpW3RdPVtrLGJdKSxwIT09ZSkpOyk7cmV0dXJuKGItPW8pPT09cnx8YiVyPT0wJiZiL3I+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKHQsZSl7dmFyIG4sbz1yLnBzZXVkb3NbdF18fHIuc2V0RmlsdGVyc1t0LnRvTG93ZXJDYXNlKCldfHxzdC5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK3QpO3JldHVybiBvW3hdP28oZSk6by5sZW5ndGg+MT8obj1bdCx0LCIiLGVdLHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSh0LnRvTG93ZXJDYXNlKCkpP2N0KGZ1bmN0aW9uKHQsbil7Zm9yKHZhciByLGk9byh0LGUpLGE9aS5sZW5ndGg7YS0tOyl0W3I9RCh0LGlbYV0pXT0hKG5bcl09aVthXSl9KTpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsbil9KTpvfX0scHNldWRvczp7bm90OmN0KGZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49W10scj1zKHQucmVwbGFjZShILCIkMSIpKTtyZXR1cm4gclt4XT9jdChmdW5jdGlvbih0LGUsbixvKXtmb3IodmFyIGksYT1yKHQsbnVsbCxvLFtdKSxzPXQubGVuZ3RoO3MtLTspKGk9YVtzXSkmJih0W3NdPSEoZVtzXT1pKSl9KTpmdW5jdGlvbih0LG8saSl7cmV0dXJuIGVbMF09dCxyKGUsbnVsbCxpLG4pLGVbMF09bnVsbCwhbi5wb3AoKX19KSxoYXM6Y3QoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBzdCh0LGUpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmN0KGZ1bmN0aW9uKHQpe3JldHVybiB0PXQucmVwbGFjZShldCxudCksZnVuY3Rpb24oZSl7cmV0dXJuKGUudGV4dENvbnRlbnR8fG8oZSkpLmluZGV4T2YodCk+LTF9fSksbGFuZzpjdChmdW5jdGlvbih0KXtyZXR1cm4gVi50ZXN0KHR8fCIiKXx8c3QuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrdCksdD10LnJlcGxhY2UoZXQsbnQpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oZSl7dmFyIG47ZG97aWYobj1nP2UubGFuZzplLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8ZS5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4obj1uLnRvTG93ZXJDYXNlKCkpPT09dHx8MD09PW4uaW5kZXhPZih0KyItIil9d2hpbGUoKGU9ZS5wYXJlbnROb2RlKSYmMT09PWUubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihlKXt2YXIgbj10LmxvY2F0aW9uJiZ0LmxvY2F0aW9uLmhhc2g7cmV0dXJuIG4mJm4uc2xpY2UoMSk9PT1lLmlkfSxyb290OmZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZH0sZm9jdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1oLmFjdGl2ZUVsZW1lbnQmJighaC5oYXNGb2N1c3x8aC5oYXNGb2N1cygpKSYmISEodC50eXBlfHx0LmhyZWZ8fH50LnRhYkluZGV4KX0sZW5hYmxlZDpndCghMSksZGlzYWJsZWQ6Z3QoITApLGNoZWNrZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1lJiYhIXQuY2hlY2tlZHx8Im9wdGlvbiI9PT1lJiYhIXQuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKHQpe3JldHVybiB0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LCEwPT09dC5zZWxlY3RlZH0sZW1wdHk6ZnVuY3Rpb24odCl7Zm9yKHQ9dC5maXJzdENoaWxkO3Q7dD10Lm5leHRTaWJsaW5nKWlmKHQubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKHQpe3JldHVybiFyLnBzZXVkb3MuZW1wdHkodCl9LGhlYWRlcjpmdW5jdGlvbih0KXtyZXR1cm4gSi50ZXN0KHQubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbih0KXtyZXR1cm4gWC50ZXN0KHQubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24odCl7dmFyIGU9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1lJiYiYnV0dG9uIj09PXQudHlwZXx8ImJ1dHRvbiI9PT1lfSx0ZXh0OmZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiJpbnB1dCI9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PXQudHlwZSYmKG51bGw9PShlPXQuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT1lLnRvTG93ZXJDYXNlKCkpfSxmaXJzdDp2dChmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6dnQoZnVuY3Rpb24odCxlKXtyZXR1cm5bZS0xXX0pLGVxOnZ0KGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm5bbjwwP24rZTpuXX0pLGV2ZW46dnQoZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPGU7bis9Mil0LnB1c2gobik7cmV0dXJuIHR9KSxvZGQ6dnQoZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MTtuPGU7bis9Mil0LnB1c2gobik7cmV0dXJuIHR9KSxsdDp2dChmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW48MD9uK2U6bj5lP2U6bjstLXI+PTA7KXQucHVzaChyKTtyZXR1cm4gdH0pLGd0OnZ0KGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bjwwP24rZTpuOysrcjxlOyl0LnB1c2gocik7cmV0dXJuIHR9KX19KS5wc2V1ZG9zLm50aD1yLnBzZXVkb3MuZXEse3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KXIucHNldWRvc1tlXT1odChlKTtmb3IoZSBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KXIucHNldWRvc1tlXT1kdChlKTtmdW5jdGlvbiBtdCgpe31mdW5jdGlvbiBidCh0KXtmb3IodmFyIGU9MCxuPXQubGVuZ3RoLHI9IiI7ZTxuO2UrKylyKz10W2VdLnZhbHVlO3JldHVybiByfWZ1bmN0aW9uIHh0KHQsZSxuKXt2YXIgcj1lLmRpcixvPWUubmV4dCxpPW98fHIsYT1uJiYicGFyZW50Tm9kZSI9PT1pLHM9UysrO3JldHVybiBlLmZpcnN0P2Z1bmN0aW9uKGUsbixvKXtmb3IoO2U9ZVtyXTspaWYoMT09PWUubm9kZVR5cGV8fGEpcmV0dXJuIHQoZSxuLG8pO3JldHVybiExfTpmdW5jdGlvbihlLG4sdSl7dmFyIGMsbCxmLHA9W2ssc107aWYodSl7Zm9yKDtlPWVbcl07KWlmKCgxPT09ZS5ub2RlVHlwZXx8YSkmJnQoZSxuLHUpKXJldHVybiEwfWVsc2UgZm9yKDtlPWVbcl07KWlmKDE9PT1lLm5vZGVUeXBlfHxhKWlmKGw9KGY9ZVt4XXx8KGVbeF09e30pKVtlLnVuaXF1ZUlEXXx8KGZbZS51bmlxdWVJRF09e30pLG8mJm89PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpZT1lW3JdfHxlO2Vsc2V7aWYoKGM9bFtpXSkmJmNbMF09PT1rJiZjWzFdPT09cylyZXR1cm4gcFsyXT1jWzJdO2lmKGxbaV09cCxwWzJdPXQoZSxuLHUpKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiB3dCh0KXtyZXR1cm4gdC5sZW5ndGg+MT9mdW5jdGlvbihlLG4scil7Zm9yKHZhciBvPXQubGVuZ3RoO28tLTspaWYoIXRbb10oZSxuLHIpKXJldHVybiExO3JldHVybiEwfTp0WzBdfWZ1bmN0aW9uIGt0KHQsZSxuLHIsbyl7Zm9yKHZhciBpLGE9W10scz0wLHU9dC5sZW5ndGgsYz1udWxsIT1lO3M8dTtzKyspKGk9dFtzXSkmJihuJiYhbihpLHIsbyl8fChhLnB1c2goaSksYyYmZS5wdXNoKHMpKSk7cmV0dXJuIGF9ZnVuY3Rpb24gU3QodCxlLG4scixvLGkpe3JldHVybiByJiYhclt4XSYmKHI9U3QocikpLG8mJiFvW3hdJiYobz1TdChvLGkpKSxjdChmdW5jdGlvbihpLGEscyx1KXt2YXIgYyxsLGYscD1bXSxoPVtdLGQ9YS5sZW5ndGgsZz1pfHxmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTAsbz1lLmxlbmd0aDtyPG87cisrKXN0KHQsZVtyXSxuKTtyZXR1cm4gbn0oZXx8IioiLHMubm9kZVR5cGU/W3NdOnMsW10pLHY9IXR8fCFpJiZlP2c6a3QoZyxwLHQscyx1KSx5PW4/b3x8KGk/dDpkfHxyKT9bXTphOnY7aWYobiYmbih2LHkscyx1KSxyKWZvcihjPWt0KHksaCkscihjLFtdLHMsdSksbD1jLmxlbmd0aDtsLS07KShmPWNbbF0pJiYoeVtoW2xdXT0hKHZbaFtsXV09ZikpO2lmKGkpe2lmKG98fHQpe2lmKG8pe2ZvcihjPVtdLGw9eS5sZW5ndGg7bC0tOykoZj15W2xdKSYmYy5wdXNoKHZbbF09Zik7byhudWxsLHk9W10sYyx1KX1mb3IobD15Lmxlbmd0aDtsLS07KShmPXlbbF0pJiYoYz1vP0QoaSxmKTpwW2xdKT4tMSYmKGlbY109IShhW2NdPWYpKX19ZWxzZSB5PWt0KHk9PT1hP3kuc3BsaWNlKGQseS5sZW5ndGgpOnkpLG8/byhudWxsLGEseSx1KTpOLmFwcGx5KGEseSl9KX1mdW5jdGlvbiBFdCh0KXtmb3IodmFyIGUsbixvLGk9dC5sZW5ndGgsYT1yLnJlbGF0aXZlW3RbMF0udHlwZV0scz1hfHxyLnJlbGF0aXZlWyIgIl0sdT1hPzE6MCxsPXh0KGZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZX0scywhMCksZj14dChmdW5jdGlvbih0KXtyZXR1cm4gRChlLHQpPi0xfSxzLCEwKSxwPVtmdW5jdGlvbih0LG4scil7dmFyIG89IWEmJihyfHxuIT09Yyl8fCgoZT1uKS5ub2RlVHlwZT9sKHQsbixyKTpmKHQsbixyKSk7cmV0dXJuIGU9bnVsbCxvfV07dTxpO3UrKylpZihuPXIucmVsYXRpdmVbdFt1XS50eXBlXSlwPVt4dCh3dChwKSxuKV07ZWxzZXtpZigobj1yLmZpbHRlclt0W3VdLnR5cGVdLmFwcGx5KG51bGwsdFt1XS5tYXRjaGVzKSlbeF0pe2ZvcihvPSsrdTtvPGkmJiFyLnJlbGF0aXZlW3Rbb10udHlwZV07bysrKTtyZXR1cm4gU3QodT4xJiZ3dChwKSx1PjEmJmJ0KHQuc2xpY2UoMCx1LTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09dFt1LTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoSCwiJDEiKSxuLHU8byYmRXQodC5zbGljZSh1LG8pKSxvPGkmJkV0KHQ9dC5zbGljZShvKSksbzxpJiZidCh0KSl9cC5wdXNoKG4pfXJldHVybiB3dChwKX1yZXR1cm4gbXQucHJvdG90eXBlPXIuZmlsdGVycz1yLnBzZXVkb3Msci5zZXRGaWx0ZXJzPW5ldyBtdCxhPXN0LnRva2VuaXplPWZ1bmN0aW9uKHQsZSl7dmFyIG4sbyxpLGEscyx1LGMsbD1UW3QrIiAiXTtpZihsKXJldHVybiBlPzA6bC5zbGljZSgwKTtmb3Iocz10LHU9W10sYz1yLnByZUZpbHRlcjtzOyl7Zm9yKGEgaW4gbiYmIShvPXouZXhlYyhzKSl8fChvJiYocz1zLnNsaWNlKG9bMF0ubGVuZ3RoKXx8cyksdS5wdXNoKGk9W10pKSxuPSExLChvPVcuZXhlYyhzKSkmJihuPW8uc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpvWzBdLnJlcGxhY2UoSCwiICIpfSkscz1zLnNsaWNlKG4ubGVuZ3RoKSksci5maWx0ZXIpIShvPUdbYV0uZXhlYyhzKSl8fGNbYV0mJiEobz1jW2FdKG8pKXx8KG49by5zaGlmdCgpLGkucHVzaCh7dmFsdWU6bix0eXBlOmEsbWF0Y2hlczpvfSkscz1zLnNsaWNlKG4ubGVuZ3RoKSk7aWYoIW4pYnJlYWt9cmV0dXJuIGU/cy5sZW5ndGg6cz9zdC5lcnJvcih0KTpUKHQsdSkuc2xpY2UoMCl9LHM9c3QuY29tcGlsZT1mdW5jdGlvbih0LGUpe3ZhciBuLG89W10saT1bXSxzPWpbdCsiICJdO2lmKCFzKXtmb3IoZXx8KGU9YSh0KSksbj1lLmxlbmd0aDtuLS07KShzPUV0KGVbbl0pKVt4XT9vLnB1c2gocyk6aS5wdXNoKHMpOyhzPWoodCxmdW5jdGlvbih0LGUpe3ZhciBuPWUubGVuZ3RoPjAsbz10Lmxlbmd0aD4wLGk9ZnVuY3Rpb24oaSxhLHMsdSxsKXt2YXIgZixkLHYseT0wLG09IjAiLGI9aSYmW10seD1bXSx3PWMsUz1pfHxvJiZyLmZpbmQuVEFHKCIqIixsKSxFPWsrPW51bGw9PXc/MTpNYXRoLnJhbmRvbSgpfHwuMSxUPVMubGVuZ3RoO2ZvcihsJiYoYz1hPT09aHx8YXx8bCk7bSE9PVQmJm51bGwhPShmPVNbbV0pO20rKyl7aWYobyYmZil7Zm9yKGQ9MCxhfHxmLm93bmVyRG9jdW1lbnQ9PT1ofHwocChmKSxzPSFnKTt2PXRbZCsrXTspaWYodihmLGF8fGgscykpe3UucHVzaChmKTticmVha31sJiYoaz1FKX1uJiYoKGY9IXYmJmYpJiZ5LS0saSYmYi5wdXNoKGYpKX1pZih5Kz1tLG4mJm0hPT15KXtmb3IoZD0wO3Y9ZVtkKytdOyl2KGIseCxhLHMpO2lmKGkpe2lmKHk+MClmb3IoO20tLTspYlttXXx8eFttXXx8KHhbbV09Ui5jYWxsKHUpKTt4PWt0KHgpfU4uYXBwbHkodSx4KSxsJiYhaSYmeC5sZW5ndGg+MCYmeStlLmxlbmd0aD4xJiZzdC51bmlxdWVTb3J0KHUpfXJldHVybiBsJiYoaz1FLGM9dyksYn07cmV0dXJuIG4/Y3QoaSk6aX0oaSxvKSkpLnNlbGVjdG9yPXR9cmV0dXJuIHN9LHU9c3Quc2VsZWN0PWZ1bmN0aW9uKHQsZSxuLG8pe3ZhciBpLHUsYyxsLGYscD0iZnVuY3Rpb24iPT10eXBlb2YgdCYmdCxoPSFvJiZhKHQ9cC5zZWxlY3Rvcnx8dCk7aWYobj1ufHxbXSwxPT09aC5sZW5ndGgpe2lmKCh1PWhbMF09aFswXS5zbGljZSgwKSkubGVuZ3RoPjImJiJJRCI9PT0oYz11WzBdKS50eXBlJiY5PT09ZS5ub2RlVHlwZSYmZyYmci5yZWxhdGl2ZVt1WzFdLnR5cGVdKXtpZighKGU9KHIuZmluZC5JRChjLm1hdGNoZXNbMF0ucmVwbGFjZShldCxudCksZSl8fFtdKVswXSkpcmV0dXJuIG47cCYmKGU9ZS5wYXJlbnROb2RlKSx0PXQuc2xpY2UodS5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9Zm9yKGk9Ry5uZWVkc0NvbnRleHQudGVzdCh0KT8wOnUubGVuZ3RoO2ktLSYmKGM9dVtpXSwhci5yZWxhdGl2ZVtsPWMudHlwZV0pOylpZigoZj1yLmZpbmRbbF0pJiYobz1mKGMubWF0Y2hlc1swXS5yZXBsYWNlKGV0LG50KSx0dC50ZXN0KHVbMF0udHlwZSkmJnl0KGUucGFyZW50Tm9kZSl8fGUpKSl7aWYodS5zcGxpY2UoaSwxKSwhKHQ9by5sZW5ndGgmJmJ0KHUpKSlyZXR1cm4gTi5hcHBseShuLG8pLG47YnJlYWt9fXJldHVybihwfHxzKHQsaCkpKG8sZSwhZyxuLCFlfHx0dC50ZXN0KHQpJiZ5dChlLnBhcmVudE5vZGUpfHxlKSxufSxuLnNvcnRTdGFibGU9eC5zcGxpdCgiIikuc29ydChPKS5qb2luKCIiKT09PXgsbi5kZXRlY3REdXBsaWNhdGVzPSEhZixwKCksbi5zb3J0RGV0YWNoZWQ9bHQoZnVuY3Rpb24odCl7cmV0dXJuIDEmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihoLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0IikpfSksbHQoZnVuY3Rpb24odCl7cmV0dXJuIHQuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT10LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8ZnQoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKHQsZSxuKXtpZighbilyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoZSwidHlwZSI9PT1lLnRvTG93ZXJDYXNlKCk/MToyKX0pLG4uYXR0cmlidXRlcyYmbHQoZnVuY3Rpb24odCl7cmV0dXJuIHQuaW5uZXJIVE1MPSI8aW5wdXQvPiIsdC5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PXQuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8ZnQoInZhbHVlIixmdW5jdGlvbih0LGUsbil7aWYoIW4mJiJpbnB1dCI9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHQuZGVmYXVsdFZhbHVlfSksbHQoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGZ0KF8sZnVuY3Rpb24odCxlLG4pe3ZhciByO2lmKCFuKXJldHVybiEwPT09dFtlXT9lLnRvTG93ZXJDYXNlKCk6KHI9dC5nZXRBdHRyaWJ1dGVOb2RlKGUpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSksc3R9KG4pO1MuZmluZD1qLFMuZXhwcj1qLnNlbGVjdG9ycyxTLmV4cHJbIjoiXT1TLmV4cHIucHNldWRvcyxTLnVuaXF1ZVNvcnQ9Uy51bmlxdWU9ai51bmlxdWVTb3J0LFMudGV4dD1qLmdldFRleHQsUy5pc1hNTERvYz1qLmlzWE1MLFMuY29udGFpbnM9ai5jb250YWlucyxTLmVzY2FwZVNlbGVjdG9yPWouZXNjYXBlO3ZhciBBPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9W10sbz12b2lkIDAhPT1uOyh0PXRbZV0pJiY5IT09dC5ub2RlVHlwZTspaWYoMT09PXQubm9kZVR5cGUpe2lmKG8mJlModCkuaXMobikpYnJlYWs7ci5wdXNoKHQpfXJldHVybiByfSxPPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdO3Q7dD10Lm5leHRTaWJsaW5nKTE9PT10Lm5vZGVUeXBlJiZ0IT09ZSYmbi5wdXNoKHQpO3JldHVybiBufSxDPVMuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7ZnVuY3Rpb24gTCh0LGUpe3JldHVybiB0Lm5vZGVOYW1lJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1lLnRvTG93ZXJDYXNlKCl9dmFyIFI9L148KFthLXpdW15cL1wwPjpceDIwXHRcclxuXGZdKilbXHgyMFx0XHJcblxmXSpcLz8+KD86PFwvXDE+fCkkL2k7ZnVuY3Rpb24gUCh0LGUsbil7cmV0dXJuIG0oZSk/Uy5ncmVwKHQsZnVuY3Rpb24odCxyKXtyZXR1cm4hIWUuY2FsbCh0LHIsdCkhPT1ufSk6ZS5ub2RlVHlwZT9TLmdyZXAodCxmdW5jdGlvbih0KXtyZXR1cm4gdD09PWUhPT1ufSk6InN0cmluZyIhPXR5cGVvZiBlP1MuZ3JlcCh0LGZ1bmN0aW9uKHQpe3JldHVybiBmLmNhbGwoZSx0KT4tMSE9PW59KTpTLmZpbHRlcihlLHQsbil9Uy5maWx0ZXI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWVbMF07cmV0dXJuIG4mJih0PSI6bm90KCIrdCsiKSIpLDE9PT1lLmxlbmd0aCYmMT09PXIubm9kZVR5cGU/Uy5maW5kLm1hdGNoZXNTZWxlY3RvcihyLHQpP1tyXTpbXTpTLmZpbmQubWF0Y2hlcyh0LFMuZ3JlcChlLGZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5ub2RlVHlwZX0pKX0sUy5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24odCl7dmFyIGUsbixyPXRoaXMubGVuZ3RoLG89dGhpcztpZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIHRoaXMucHVzaFN0YWNrKFModCkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGU9MDtlPHI7ZSsrKWlmKFMuY29udGFpbnMob1tlXSx0aGlzKSlyZXR1cm4hMH0pKTtmb3Iobj10aGlzLnB1c2hTdGFjayhbXSksZT0wO2U8cjtlKyspUy5maW5kKHQsb1tlXSxuKTtyZXR1cm4gcj4xP1MudW5pcXVlU29ydChuKTpufSxmaWx0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFAodGhpcyx0fHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFAodGhpcyx0fHxbXSwhMCkpfSxpczpmdW5jdGlvbih0KXtyZXR1cm4hIVAodGhpcywic3RyaW5nIj09dHlwZW9mIHQmJkMudGVzdCh0KT9TKHQpOnR8fFtdLCExKS5sZW5ndGh9fSk7dmFyIE4sST0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSspKSQvOyhTLmZuLmluaXQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByLG87aWYoIXQpcmV0dXJuIHRoaXM7aWYobj1ufHxOLCJzdHJpbmciPT10eXBlb2YgdCl7aWYoIShyPSI8Ij09PXRbMF0mJiI+Ij09PXRbdC5sZW5ndGgtMV0mJnQubGVuZ3RoPj0zP1tudWxsLHQsbnVsbF06SS5leGVjKHQpKXx8IXJbMV0mJmUpcmV0dXJuIWV8fGUuanF1ZXJ5PyhlfHxuKS5maW5kKHQpOnRoaXMuY29uc3RydWN0b3IoZSkuZmluZCh0KTtpZihyWzFdKXtpZihlPWUgaW5zdGFuY2VvZiBTP2VbMF06ZSxTLm1lcmdlKHRoaXMsUy5wYXJzZUhUTUwoclsxXSxlJiZlLm5vZGVUeXBlP2Uub3duZXJEb2N1bWVudHx8ZTphLCEwKSksUi50ZXN0KHJbMV0pJiZTLmlzUGxhaW5PYmplY3QoZSkpZm9yKHIgaW4gZSltKHRoaXNbcl0pP3RoaXNbcl0oZVtyXSk6dGhpcy5hdHRyKHIsZVtyXSk7cmV0dXJuIHRoaXN9cmV0dXJuKG89YS5nZXRFbGVtZW50QnlJZChyWzJdKSkmJih0aGlzWzBdPW8sdGhpcy5sZW5ndGg9MSksdGhpc31yZXR1cm4gdC5ub2RlVHlwZT8odGhpc1swXT10LHRoaXMubGVuZ3RoPTEsdGhpcyk6bSh0KT92b2lkIDAhPT1uLnJlYWR5P24ucmVhZHkodCk6dChTKTpTLm1ha2VBcnJheSh0LHRoaXMpfSkucHJvdG90eXBlPVMuZm4sTj1TKGEpO3ZhciBEPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLF89e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07ZnVuY3Rpb24gTSh0LGUpe2Zvcig7KHQ9dFtlXSkmJjEhPT10Lm5vZGVUeXBlOyk7cmV0dXJuIHR9Uy5mbi5leHRlbmQoe2hhczpmdW5jdGlvbih0KXt2YXIgZT1TKHQsdGhpcyksbj1lLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PG47dCsrKWlmKFMuY29udGFpbnModGhpcyxlW3RdKSlyZXR1cm4hMH0pfSxjbG9zZXN0OmZ1bmN0aW9uKHQsZSl7dmFyIG4scj0wLG89dGhpcy5sZW5ndGgsaT1bXSxhPSJzdHJpbmciIT10eXBlb2YgdCYmUyh0KTtpZighQy50ZXN0KHQpKWZvcig7cjxvO3IrKylmb3Iobj10aGlzW3JdO24mJm4hPT1lO249bi5wYXJlbnROb2RlKWlmKG4ubm9kZVR5cGU8MTEmJihhP2EuaW5kZXgobik+LTE6MT09PW4ubm9kZVR5cGUmJlMuZmluZC5tYXRjaGVzU2VsZWN0b3Iobix0KSkpe2kucHVzaChuKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soaS5sZW5ndGg+MT9TLnVuaXF1ZVNvcnQoaSk6aSl9LGluZGV4OmZ1bmN0aW9uKHQpe3JldHVybiB0PyJzdHJpbmciPT10eXBlb2YgdD9mLmNhbGwoUyh0KSx0aGlzWzBdKTpmLmNhbGwodGhpcyx0LmpxdWVyeT90WzBdOnQpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMudW5pcXVlU29ydChTLm1lcmdlKHRoaXMuZ2V0KCksUyh0LGUpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFkZChudWxsPT10P3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKHQpKX19KSxTLmVhY2goe3BhcmVudDpmdW5jdGlvbih0KXt2YXIgZT10LnBhcmVudE5vZGU7cmV0dXJuIGUmJjExIT09ZS5ub2RlVHlwZT9lOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24odCl7cmV0dXJuIEEodCwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBBKHQsInBhcmVudE5vZGUiLG4pfSxuZXh0OmZ1bmN0aW9uKHQpe3JldHVybiBNKHQsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24odCl7cmV0dXJuIE0odCwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIEEodCwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbih0KXtyZXR1cm4gQSh0LCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gQSh0LCJuZXh0U2libGluZyIsbil9LHByZXZVbnRpbDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIEEodCwicHJldmlvdXNTaWJsaW5nIixuKX0sc2libGluZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIE8oKHQucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsdCl9LGNoaWxkcmVuOmZ1bmN0aW9uKHQpe3JldHVybiBPKHQuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10LmNvbnRlbnREb2N1bWVudD90LmNvbnRlbnREb2N1bWVudDooTCh0LCJ0ZW1wbGF0ZSIpJiYodD10LmNvbnRlbnR8fHQpLFMubWVyZ2UoW10sdC5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbih0LGUpe1MuZm5bdF09ZnVuY3Rpb24obixyKXt2YXIgbz1TLm1hcCh0aGlzLGUsbik7cmV0dXJuIlVudGlsIiE9PXQuc2xpY2UoLTUpJiYocj1uKSxyJiYic3RyaW5nIj09dHlwZW9mIHImJihvPVMuZmlsdGVyKHIsbykpLHRoaXMubGVuZ3RoPjEmJihfW3RdfHxTLnVuaXF1ZVNvcnQobyksRC50ZXN0KHQpJiZvLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2sobyl9fSk7dmFyIFU9L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiBCKHQpe3JldHVybiB0fWZ1bmN0aW9uIHEodCl7dGhyb3cgdH1mdW5jdGlvbiBGKHQsZSxuLHIpe3ZhciBvO3RyeXt0JiZtKG89dC5wcm9taXNlKT9vLmNhbGwodCkuZG9uZShlKS5mYWlsKG4pOnQmJm0obz10LnRoZW4pP28uY2FsbCh0LGUsbik6ZS5hcHBseSh2b2lkIDAsW3RdLnNsaWNlKHIpKX1jYXRjaCh0KXtuLmFwcGx5KHZvaWQgMCxbdF0pfX1TLkNhbGxiYWNrcz1mdW5jdGlvbih0KXt0PSJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gUy5lYWNoKHQubWF0Y2goVSl8fFtdLGZ1bmN0aW9uKHQsbil7ZVtuXT0hMH0pLGV9KHQpOlMuZXh0ZW5kKHt9LHQpO3ZhciBlLG4scixvLGk9W10sYT1bXSxzPS0xLHU9ZnVuY3Rpb24oKXtmb3Iobz1vfHx0Lm9uY2Uscj1lPSEwO2EubGVuZ3RoO3M9LTEpZm9yKG49YS5zaGlmdCgpOysrczxpLmxlbmd0aDspITE9PT1pW3NdLmFwcGx5KG5bMF0sblsxXSkmJnQuc3RvcE9uRmFsc2UmJihzPWkubGVuZ3RoLG49ITEpO3QubWVtb3J5fHwobj0hMSksZT0hMSxvJiYoaT1uP1tdOiIiKX0sYz17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIGkmJihuJiYhZSYmKHM9aS5sZW5ndGgtMSxhLnB1c2gobikpLGZ1bmN0aW9uIGUobil7Uy5lYWNoKG4sZnVuY3Rpb24obixyKXttKHIpP3QudW5pcXVlJiZjLmhhcyhyKXx8aS5wdXNoKHIpOnImJnIubGVuZ3RoJiYic3RyaW5nIiE9PWsocikmJmUocil9KX0oYXJndW1lbnRzKSxuJiYhZSYmdSgpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gUy5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbjsobj1TLmluQXJyYXkoZSxpLG4pKT4tMTspaS5zcGxpY2UobiwxKSxuPD1zJiZzLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ/Uy5pbkFycmF5KHQsaSk+LTE6aS5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gaSYmKGk9W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gbz1hPVtdLGk9bj0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFpfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIG89YT1bXSxufHxlfHwoaT1uPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIW99LGZpcmVXaXRoOmZ1bmN0aW9uKHQsbil7cmV0dXJuIG98fChuPVt0LChuPW58fFtdKS5zbGljZT9uLnNsaWNlKCk6bl0sYS5wdXNoKG4pLGV8fHUoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBjLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhcn19O3JldHVybiBjfSxTLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24odCl7dmFyIGU9W1sibm90aWZ5IiwicHJvZ3Jlc3MiLFMuQ2FsbGJhY2tzKCJtZW1vcnkiKSxTLkNhbGxiYWNrcygibWVtb3J5IiksMl0sWyJyZXNvbHZlIiwiZG9uZSIsUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMCwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDEsInJlamVjdGVkIl1dLHI9InBlbmRpbmciLG89e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBpLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sY2F0Y2g6ZnVuY3Rpb24odCl7cmV0dXJuIG8udGhlbihudWxsLHQpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzO3JldHVybiBTLkRlZmVycmVkKGZ1bmN0aW9uKG4pe1MuZWFjaChlLGZ1bmN0aW9uKGUscil7dmFyIG89bSh0W3JbNF1dKSYmdFtyWzRdXTtpW3JbMV1dKGZ1bmN0aW9uKCl7dmFyIHQ9byYmby5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dCYmbSh0LnByb21pc2UpP3QucHJvbWlzZSgpLnByb2dyZXNzKG4ubm90aWZ5KS5kb25lKG4ucmVzb2x2ZSkuZmFpbChuLnJlamVjdCk6bltyWzBdKyJXaXRoIl0odGhpcyxvP1t0XTphcmd1bWVudHMpfSl9KSx0PW51bGx9KS5wcm9taXNlKCl9LHRoZW46ZnVuY3Rpb24odCxyLG8pe3ZhciBpPTA7ZnVuY3Rpb24gYSh0LGUscixvKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcz10aGlzLHU9YXJndW1lbnRzLGM9ZnVuY3Rpb24oKXt2YXIgbixjO2lmKCEodDxpKSl7aWYoKG49ci5hcHBseShzLHUpKT09PWUucHJvbWlzZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvbiIpO2M9biYmKCJvYmplY3QiPT10eXBlb2Ygbnx8ImZ1bmN0aW9uIj09dHlwZW9mIG4pJiZuLnRoZW4sbShjKT9vP2MuY2FsbChuLGEoaSxlLEIsbyksYShpLGUscSxvKSk6KGkrKyxjLmNhbGwobixhKGksZSxCLG8pLGEoaSxlLHEsbyksYShpLGUsQixlLm5vdGlmeVdpdGgpKSk6KHIhPT1CJiYocz12b2lkIDAsdT1bbl0pLChvfHxlLnJlc29sdmVXaXRoKShzLHUpKX19LGw9bz9jOmZ1bmN0aW9uKCl7dHJ5e2MoKX1jYXRjaChuKXtTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJlMuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhuLGwuc3RhY2tUcmFjZSksdCsxPj1pJiYociE9PXEmJihzPXZvaWQgMCx1PVtuXSksZS5yZWplY3RXaXRoKHMsdSkpfX07dD9sKCk6KFMuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYobC5zdGFja1RyYWNlPVMuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLG4uc2V0VGltZW91dChsKSl9fXJldHVybiBTLkRlZmVycmVkKGZ1bmN0aW9uKG4pe2VbMF1bM10uYWRkKGEoMCxuLG0obyk/bzpCLG4ubm90aWZ5V2l0aCkpLGVbMV1bM10uYWRkKGEoMCxuLG0odCk/dDpCKSksZVsyXVszXS5hZGQoYSgwLG4sbShyKT9yOnEpKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dD9TLmV4dGVuZCh0LG8pOm99fSxpPXt9O3JldHVybiBTLmVhY2goZSxmdW5jdGlvbih0LG4pe3ZhciBhPW5bMl0scz1uWzVdO29bblsxXV09YS5hZGQscyYmYS5hZGQoZnVuY3Rpb24oKXtyPXN9LGVbMy10XVsyXS5kaXNhYmxlLGVbMy10XVszXS5kaXNhYmxlLGVbMF1bMl0ubG9jayxlWzBdWzNdLmxvY2spLGEuYWRkKG5bM10uZmlyZSksaVtuWzBdXT1mdW5jdGlvbigpe3JldHVybiBpW25bMF0rIldpdGgiXSh0aGlzPT09aT92b2lkIDA6dGhpcyxhcmd1bWVudHMpLHRoaXN9LGlbblswXSsiV2l0aCJdPWEuZmlyZVdpdGh9KSxvLnByb21pc2UoaSksdCYmdC5jYWxsKGksaSksaX0sd2hlbjpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoLG49ZSxyPUFycmF5KG4pLG89dS5jYWxsKGFyZ3VtZW50cyksaT1TLkRlZmVycmVkKCksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7clt0XT10aGlzLG9bdF09YXJndW1lbnRzLmxlbmd0aD4xP3UuY2FsbChhcmd1bWVudHMpOm4sLS1lfHxpLnJlc29sdmVXaXRoKHIsbyl9fTtpZihlPD0xJiYoRih0LGkuZG9uZShhKG4pKS5yZXNvbHZlLGkucmVqZWN0LCFlKSwicGVuZGluZyI9PT1pLnN0YXRlKCl8fG0ob1tuXSYmb1tuXS50aGVuKSkpcmV0dXJuIGkudGhlbigpO2Zvcig7bi0tOylGKG9bbl0sYShuKSxpLnJlamVjdCk7cmV0dXJuIGkucHJvbWlzZSgpfX0pO3ZhciBIPS9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO1MuRGVmZXJyZWQuZXhjZXB0aW9uSG9vaz1mdW5jdGlvbih0LGUpe24uY29uc29sZSYmbi5jb25zb2xlLndhcm4mJnQmJkgudGVzdCh0Lm5hbWUpJiZuLmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIit0Lm1lc3NhZ2UsdC5zdGFjayxlKX0sUy5yZWFkeUV4Y2VwdGlvbj1mdW5jdGlvbih0KXtuLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyB0fSl9O3ZhciB6PVMuRGVmZXJyZWQoKTtmdW5jdGlvbiBXKCl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixXKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLFcpLFMucmVhZHkoKX1TLmZuLnJlYWR5PWZ1bmN0aW9uKHQpe3JldHVybiB6LnRoZW4odCkuY2F0Y2goZnVuY3Rpb24odCl7Uy5yZWFkeUV4Y2VwdGlvbih0KX0pLHRoaXN9LFMuZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKHQpeyghMD09PXQ/LS1TLnJlYWR5V2FpdDpTLmlzUmVhZHkpfHwoUy5pc1JlYWR5PSEwLCEwIT09dCYmLS1TLnJlYWR5V2FpdD4wfHx6LnJlc29sdmVXaXRoKGEsW1NdKSl9fSksUy5yZWFkeS50aGVuPXoudGhlbiwiY29tcGxldGUiPT09YS5yZWFkeVN0YXRlfHwibG9hZGluZyIhPT1hLnJlYWR5U3RhdGUmJiFhLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD9uLnNldFRpbWVvdXQoUy5yZWFkeSk6KGEuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsVyksbi5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixXKSk7dmFyICQ9ZnVuY3Rpb24odCxlLG4scixvLGksYSl7dmFyIHM9MCx1PXQubGVuZ3RoLGM9bnVsbD09bjtpZigib2JqZWN0Ij09PWsobikpZm9yKHMgaW4gbz0hMCxuKSQodCxlLHMsbltzXSwhMCxpLGEpO2Vsc2UgaWYodm9pZCAwIT09ciYmKG89ITAsbShyKXx8KGE9ITApLGMmJihhPyhlLmNhbGwodCxyKSxlPW51bGwpOihjPWUsZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGMuY2FsbChTKHQpLG4pfSkpLGUpKWZvcig7czx1O3MrKyllKHRbc10sbixhP3I6ci5jYWxsKHRbc10scyxlKHRbc10sbikpKTtyZXR1cm4gbz90OmM/ZS5jYWxsKHQpOnU/ZSh0WzBdLG4pOml9LFk9L14tbXMtLyxWPS8tKFthLXpdKS9nO2Z1bmN0aW9uIEcodCxlKXtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIEsodCl7cmV0dXJuIHQucmVwbGFjZShZLCJtcy0iKS5yZXBsYWNlKFYsRyl9dmFyIFg9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10Lm5vZGVUeXBlfHw5PT09dC5ub2RlVHlwZXx8ISt0Lm5vZGVUeXBlfTtmdW5jdGlvbiBKKCl7dGhpcy5leHBhbmRvPVMuZXhwYW5kbytKLnVpZCsrfUoudWlkPTEsSi5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKHQpe3ZhciBlPXRbdGhpcy5leHBhbmRvXTtyZXR1cm4gZXx8KGU9e30sWCh0KSYmKHQubm9kZVR5cGU/dFt0aGlzLmV4cGFuZG9dPWU6T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsdGhpcy5leHBhbmRvLHt2YWx1ZTplLGNvbmZpZ3VyYWJsZTohMH0pKSksZX0sc2V0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvPXRoaXMuY2FjaGUodCk7aWYoInN0cmluZyI9PXR5cGVvZiBlKW9bSyhlKV09bjtlbHNlIGZvcihyIGluIGUpb1tLKHIpXT1lW3JdO3JldHVybiBvfSxnZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLmNhY2hlKHQpOnRbdGhpcy5leHBhbmRvXSYmdFt0aGlzLmV4cGFuZG9dW0soZSldfSxhY2Nlc3M6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB2b2lkIDA9PT1lfHxlJiYic3RyaW5nIj09dHlwZW9mIGUmJnZvaWQgMD09PW4/dGhpcy5nZXQodCxlKToodGhpcy5zZXQodCxlLG4pLHZvaWQgMCE9PW4/bjplKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSl7dmFyIG4scj10W3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09cil7aWYodm9pZCAwIT09ZSl7bj0oZT1BcnJheS5pc0FycmF5KGUpP2UubWFwKEspOihlPUsoZSkpaW4gcj9bZV06ZS5tYXRjaChVKXx8W10pLmxlbmd0aDtmb3IoO24tLTspZGVsZXRlIHJbZVtuXV19KHZvaWQgMD09PWV8fFMuaXNFbXB0eU9iamVjdChyKSkmJih0Lm5vZGVUeXBlP3RbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIHRbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKHQpe3ZhciBlPXRbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09ZSYmIVMuaXNFbXB0eU9iamVjdChlKX19O3ZhciBRPW5ldyBKLFo9bmV3IEosdHQ9L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxldD0vW0EtWl0vZztmdW5jdGlvbiBudCh0LGUsbil7dmFyIHI7aWYodm9pZCAwPT09biYmMT09PXQubm9kZVR5cGUpaWYocj0iZGF0YS0iK2UucmVwbGFjZShldCwiLSQmIikudG9Mb3dlckNhc2UoKSwic3RyaW5nIj09dHlwZW9mKG49dC5nZXRBdHRyaWJ1dGUocikpKXt0cnl7bj1mdW5jdGlvbih0KXtyZXR1cm4idHJ1ZSI9PT10fHwiZmFsc2UiIT09dCYmKCJudWxsIj09PXQ/bnVsbDp0PT09K3QrIiI/K3Q6dHQudGVzdCh0KT9KU09OLnBhcnNlKHQpOnQpfShuKX1jYXRjaCh0KXt9Wi5zZXQodCxlLG4pfWVsc2Ugbj12b2lkIDA7cmV0dXJuIG59Uy5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24odCl7cmV0dXJuIFouaGFzRGF0YSh0KXx8US5oYXNEYXRhKHQpfSxkYXRhOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gWi5hY2Nlc3ModCxlLG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKHQsZSl7Wi5yZW1vdmUodCxlKX0sX2RhdGE6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBRLmFjY2Vzcyh0LGUsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKHQsZSl7US5yZW1vdmUodCxlKX19KSxTLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbyxpPXRoaXNbMF0sYT1pJiZpLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09dCl7aWYodGhpcy5sZW5ndGgmJihvPVouZ2V0KGkpLDE9PT1pLm5vZGVUeXBlJiYhUS5nZXQoaSwiaGFzRGF0YUF0dHJzIikpKXtmb3Iobj1hLmxlbmd0aDtuLS07KWFbbl0mJjA9PT0ocj1hW25dLm5hbWUpLmluZGV4T2YoImRhdGEtIikmJihyPUsoci5zbGljZSg1KSksbnQoaSxyLG9bcl0pKTtRLnNldChpLCJoYXNEYXRhQXR0cnMiLCEwKX1yZXR1cm4gb31yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Wi5zZXQodGhpcyx0KX0pOiQodGhpcyxmdW5jdGlvbihlKXt2YXIgbjtpZihpJiZ2b2lkIDA9PT1lKXJldHVybiB2b2lkIDAhPT0obj1aLmdldChpLHQpKT9uOnZvaWQgMCE9PShuPW50KGksdCkpP246dm9pZCAwO3RoaXMuZWFjaChmdW5jdGlvbigpe1ouc2V0KHRoaXMsdCxlKX0pfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtaLnJlbW92ZSh0aGlzLHQpfSl9fSksUy5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcjtpZih0KXJldHVybiBlPShlfHwiZngiKSsicXVldWUiLHI9US5nZXQodCxlKSxuJiYoIXJ8fEFycmF5LmlzQXJyYXkobik/cj1RLmFjY2Vzcyh0LGUsUy5tYWtlQXJyYXkobikpOnIucHVzaChuKSkscnx8W119LGRlcXVldWU6ZnVuY3Rpb24odCxlKXtlPWV8fCJmeCI7dmFyIG49Uy5xdWV1ZSh0LGUpLHI9bi5sZW5ndGgsbz1uLnNoaWZ0KCksaT1TLl9xdWV1ZUhvb2tzKHQsZSk7ImlucHJvZ3Jlc3MiPT09byYmKG89bi5zaGlmdCgpLHItLSksbyYmKCJmeCI9PT1lJiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgaS5zdG9wLG8uY2FsbCh0LGZ1bmN0aW9uKCl7Uy5kZXF1ZXVlKHQsZSl9LGkpKSwhciYmaSYmaS5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZSsicXVldWVIb29rcyI7cmV0dXJuIFEuZ2V0KHQsbil8fFEuYWNjZXNzKHQsbix7ZW1wdHk6Uy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7US5yZW1vdmUodCxbZSsicXVldWUiLG5dKX0pfSl9fSksUy5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJihlPXQsdD0iZngiLG4tLSksYXJndW1lbnRzLmxlbmd0aDxuP1MucXVldWUodGhpc1swXSx0KTp2b2lkIDA9PT1lP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49Uy5xdWV1ZSh0aGlzLHQsZSk7Uy5fcXVldWVIb29rcyh0aGlzLHQpLCJmeCI9PT10JiYiaW5wcm9ncmVzcyIhPT1uWzBdJiZTLmRlcXVldWUodGhpcyx0KX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmRlcXVldWUodGhpcyx0KX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnF1ZXVlKHR8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKHQsZSl7dmFyIG4scj0xLG89Uy5EZWZlcnJlZCgpLGk9dGhpcyxhPXRoaXMubGVuZ3RoLHM9ZnVuY3Rpb24oKXstLXJ8fG8ucmVzb2x2ZVdpdGgoaSxbaV0pfTtmb3IoInN0cmluZyIhPXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSx0PXR8fCJmeCI7YS0tOykobj1RLmdldChpW2FdLHQrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQocykpO3JldHVybiBzKCksby5wcm9taXNlKGUpfX0pO3ZhciBydD0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxvdD1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrcnQrIikoW2EteiVdKikkIiwiaSIpLGl0PVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sYXQ9YS5kb2N1bWVudEVsZW1lbnQsc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIFMuY29udGFpbnModC5vd25lckRvY3VtZW50LHQpfSx1dD17Y29tcG9zZWQ6ITB9O2F0LmdldFJvb3ROb2RlJiYoc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIFMuY29udGFpbnModC5vd25lckRvY3VtZW50LHQpfHx0LmdldFJvb3ROb2RlKHV0KT09PXQub3duZXJEb2N1bWVudH0pO3ZhciBjdD1mdW5jdGlvbih0LGUpe3JldHVybiJub25lIj09PSh0PWV8fHQpLnN0eWxlLmRpc3BsYXl8fCIiPT09dC5zdHlsZS5kaXNwbGF5JiZzdCh0KSYmIm5vbmUiPT09Uy5jc3ModCwiZGlzcGxheSIpfSxsdD1mdW5jdGlvbih0LGUsbixyKXt2YXIgbyxpLGE9e307Zm9yKGkgaW4gZSlhW2ldPXQuc3R5bGVbaV0sdC5zdHlsZVtpXT1lW2ldO2ZvcihpIGluIG89bi5hcHBseSh0LHJ8fFtdKSxlKXQuc3R5bGVbaV09YVtpXTtyZXR1cm4gb307ZnVuY3Rpb24gZnQodCxlLG4scil7dmFyIG8saSxhPTIwLHM9cj9mdW5jdGlvbigpe3JldHVybiByLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiBTLmNzcyh0LGUsIiIpfSx1PXMoKSxjPW4mJm5bM118fChTLmNzc051bWJlcltlXT8iIjoicHgiKSxsPXQubm9kZVR5cGUmJihTLmNzc051bWJlcltlXXx8InB4IiE9PWMmJit1KSYmb3QuZXhlYyhTLmNzcyh0LGUpKTtpZihsJiZsWzNdIT09Yyl7Zm9yKHUvPTIsYz1jfHxsWzNdLGw9K3V8fDE7YS0tOylTLnN0eWxlKHQsZSxsK2MpLCgxLWkpKigxLShpPXMoKS91fHwuNSkpPD0wJiYoYT0wKSxsLz1pO2wqPTIsUy5zdHlsZSh0LGUsbCtjKSxuPW58fFtdfXJldHVybiBuJiYobD0rbHx8K3V8fDAsbz1uWzFdP2wrKG5bMV0rMSkqblsyXTorblsyXSxyJiYoci51bml0PWMsci5zdGFydD1sLHIuZW5kPW8pKSxvfXZhciBwdD17fTtmdW5jdGlvbiBodCh0KXt2YXIgZSxuPXQub3duZXJEb2N1bWVudCxyPXQubm9kZU5hbWUsbz1wdFtyXTtyZXR1cm4gb3x8KGU9bi5ib2R5LmFwcGVuZENoaWxkKG4uY3JlYXRlRWxlbWVudChyKSksbz1TLmNzcyhlLCJkaXNwbGF5IiksZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLCJub25lIj09PW8mJihvPSJibG9jayIpLHB0W3JdPW8sbyl9ZnVuY3Rpb24gZHQodCxlKXtmb3IodmFyIG4scixvPVtdLGk9MCxhPXQubGVuZ3RoO2k8YTtpKyspKHI9dFtpXSkuc3R5bGUmJihuPXIuc3R5bGUuZGlzcGxheSxlPygibm9uZSI9PT1uJiYob1tpXT1RLmdldChyLCJkaXNwbGF5Iil8fG51bGwsb1tpXXx8KHIuc3R5bGUuZGlzcGxheT0iIikpLCIiPT09ci5zdHlsZS5kaXNwbGF5JiZjdChyKSYmKG9baV09aHQocikpKToibm9uZSIhPT1uJiYob1tpXT0ibm9uZSIsUS5zZXQociwiZGlzcGxheSIsbikpKTtmb3IoaT0wO2k8YTtpKyspbnVsbCE9b1tpXSYmKHRbaV0uc3R5bGUuZGlzcGxheT1vW2ldKTtyZXR1cm4gdH1TLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiBkdCh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBkdCh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHQ/dD90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtjdCh0aGlzKT9TKHRoaXMpLnNob3coKTpTKHRoaXMpLmhpZGUoKX0pfX0pO3ZhciBndD0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSx2dD0vPChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKikvaSx5dD0vXiR8Xm1vZHVsZSR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksbXQ9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtmdW5jdGlvbiBidCh0LGUpe3ZhciBuO3JldHVybiBuPXZvaWQgMCE9PXQuZ2V0RWxlbWVudHNCeVRhZ05hbWU/dC5nZXRFbGVtZW50c0J5VGFnTmFtZShlfHwiKiIpOnZvaWQgMCE9PXQucXVlcnlTZWxlY3RvckFsbD90LnF1ZXJ5U2VsZWN0b3JBbGwoZXx8IioiKTpbXSx2b2lkIDA9PT1lfHxlJiZMKHQsZSk/Uy5tZXJnZShbdF0sbik6bn1mdW5jdGlvbiB4dCh0LGUpe2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylRLnNldCh0W25dLCJnbG9iYWxFdmFsIiwhZXx8US5nZXQoZVtuXSwiZ2xvYmFsRXZhbCIpKX1tdC5vcHRncm91cD1tdC5vcHRpb24sbXQudGJvZHk9bXQudGZvb3Q9bXQuY29sZ3JvdXA9bXQuY2FwdGlvbj1tdC50aGVhZCxtdC50aD1tdC50ZDt2YXIgd3Qsa3QsU3Q9Lzx8JiM/XHcrOy87ZnVuY3Rpb24gRXQodCxlLG4scixvKXtmb3IodmFyIGksYSxzLHUsYyxsLGY9ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxoPTAsZD10Lmxlbmd0aDtoPGQ7aCsrKWlmKChpPXRbaF0pfHwwPT09aSlpZigib2JqZWN0Ij09PWsoaSkpUy5tZXJnZShwLGkubm9kZVR5cGU/W2ldOmkpO2Vsc2UgaWYoU3QudGVzdChpKSl7Zm9yKGE9YXx8Zi5hcHBlbmRDaGlsZChlLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxzPSh2dC5leGVjKGkpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLHU9bXRbc118fG10Ll9kZWZhdWx0LGEuaW5uZXJIVE1MPXVbMV0rUy5odG1sUHJlZmlsdGVyKGkpK3VbMl0sbD11WzBdO2wtLTspYT1hLmxhc3RDaGlsZDtTLm1lcmdlKHAsYS5jaGlsZE5vZGVzKSwoYT1mLmZpcnN0Q2hpbGQpLnRleHRDb250ZW50PSIifWVsc2UgcC5wdXNoKGUuY3JlYXRlVGV4dE5vZGUoaSkpO2ZvcihmLnRleHRDb250ZW50PSIiLGg9MDtpPXBbaCsrXTspaWYociYmUy5pbkFycmF5KGkscik+LTEpbyYmby5wdXNoKGkpO2Vsc2UgaWYoYz1zdChpKSxhPWJ0KGYuYXBwZW5kQ2hpbGQoaSksInNjcmlwdCIpLGMmJnh0KGEpLG4pZm9yKGw9MDtpPWFbbCsrXTspeXQudGVzdChpLnR5cGV8fCIiKSYmbi5wdXNoKGkpO3JldHVybiBmfXd0PWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudCgiZGl2IikpLChrdD1hLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksa3Quc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLGt0LnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSx3dC5hcHBlbmRDaGlsZChrdCkseS5jaGVja0Nsb25lPXd0LmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCx3dC5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLHkubm9DbG9uZUNoZWNrZWQ9ISF3dC5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWU7dmFyIFR0PS9ea2V5LyxqdD0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wKXxjbGljay8sQXQ9L14oW14uXSopKD86XC4oLispfCkvO2Z1bmN0aW9uIE90KCl7cmV0dXJuITB9ZnVuY3Rpb24gQ3QoKXtyZXR1cm4hMX1mdW5jdGlvbiBMdCh0LGUpe3JldHVybiB0PT09ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGEuYWN0aXZlRWxlbWVudH1jYXRjaCh0KXt9fSgpPT0oImZvY3VzIj09PWUpfWZ1bmN0aW9uIFJ0KHQsZSxuLHIsbyxpKXt2YXIgYSxzO2lmKCJvYmplY3QiPT10eXBlb2YgZSl7Zm9yKHMgaW4ic3RyaW5nIiE9dHlwZW9mIG4mJihyPXJ8fG4sbj12b2lkIDApLGUpUnQodCxzLG4scixlW3NdLGkpO3JldHVybiB0fWlmKG51bGw9PXImJm51bGw9PW8/KG89bixyPW49dm9pZCAwKTpudWxsPT1vJiYoInN0cmluZyI9PXR5cGVvZiBuPyhvPXIscj12b2lkIDApOihvPXIscj1uLG49dm9pZCAwKSksITE9PT1vKW89Q3Q7ZWxzZSBpZighbylyZXR1cm4gdDtyZXR1cm4gMT09PWkmJihhPW8sKG89ZnVuY3Rpb24odCl7cmV0dXJuIFMoKS5vZmYodCksYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KS5ndWlkPWEuZ3VpZHx8KGEuZ3VpZD1TLmd1aWQrKykpLHQuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQuYWRkKHRoaXMsZSxvLHIsbil9KX1mdW5jdGlvbiBQdCh0LGUsbil7bj8oUS5zZXQodCxlLCExKSxTLmV2ZW50LmFkZCh0LGUse25hbWVzcGFjZTohMSxoYW5kbGVyOmZ1bmN0aW9uKHQpe3ZhciByLG8saT1RLmdldCh0aGlzLGUpO2lmKDEmdC5pc1RyaWdnZXImJnRoaXNbZV0pe2lmKGkubGVuZ3RoKShTLmV2ZW50LnNwZWNpYWxbZV18fHt9KS5kZWxlZ2F0ZVR5cGUmJnQuc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZihpPXUuY2FsbChhcmd1bWVudHMpLFEuc2V0KHRoaXMsZSxpKSxyPW4odGhpcyxlKSx0aGlzW2VdKCksaSE9PShvPVEuZ2V0KHRoaXMsZSkpfHxyP1Euc2V0KHRoaXMsZSwhMSk6bz17fSxpIT09bylyZXR1cm4gdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0LnByZXZlbnREZWZhdWx0KCksby52YWx1ZX1lbHNlIGkubGVuZ3RoJiYoUS5zZXQodGhpcyxlLHt2YWx1ZTpTLmV2ZW50LnRyaWdnZXIoUy5leHRlbmQoaVswXSxTLkV2ZW50LnByb3RvdHlwZSksaS5zbGljZSgxKSx0aGlzKX0pLHQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfX0pKTp2b2lkIDA9PT1RLmdldCh0LGUpJiZTLmV2ZW50LmFkZCh0LGUsT3QpfVMuZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaSxhLHMsdSxjLGwsZixwLGgsZCxnLHY9US5nZXQodCk7aWYodilmb3Iobi5oYW5kbGVyJiYobj0oaT1uKS5oYW5kbGVyLG89aS5zZWxlY3RvciksbyYmUy5maW5kLm1hdGNoZXNTZWxlY3RvcihhdCxvKSxuLmd1aWR8fChuLmd1aWQ9Uy5ndWlkKyspLCh1PXYuZXZlbnRzKXx8KHU9di5ldmVudHM9e30pLChhPXYuaGFuZGxlKXx8KGE9di5oYW5kbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PVMmJlMuZXZlbnQudHJpZ2dlcmVkIT09ZS50eXBlP1MuZXZlbnQuZGlzcGF0Y2guYXBwbHkodCxhcmd1bWVudHMpOnZvaWQgMH0pLGM9KGU9KGV8fCIiKS5tYXRjaChVKXx8WyIiXSkubGVuZ3RoO2MtLTspaD1nPShzPUF0LmV4ZWMoZVtjXSl8fFtdKVsxXSxkPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksaCYmKGY9Uy5ldmVudC5zcGVjaWFsW2hdfHx7fSxoPShvP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxoLGY9Uy5ldmVudC5zcGVjaWFsW2hdfHx7fSxsPVMuZXh0ZW5kKHt0eXBlOmgsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOm8sbmVlZHNDb250ZXh0Om8mJlMuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChvKSxuYW1lc3BhY2U6ZC5qb2luKCIuIil9LGkpLChwPXVbaF0pfHwoKHA9dVtoXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKHQscixkLGEpfHx0LmFkZEV2ZW50TGlzdGVuZXImJnQuYWRkRXZlbnRMaXN0ZW5lcihoLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwodCxsKSxsLmhhbmRsZXIuZ3VpZHx8KGwuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLG8/cC5zcGxpY2UocC5kZWxlZ2F0ZUNvdW50KyssMCxsKTpwLnB1c2gobCksUy5ldmVudC5nbG9iYWxbaF09ITApfSxyZW1vdmU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaSxhLHMsdSxjLGwsZixwLGgsZCxnLHY9US5oYXNEYXRhKHQpJiZRLmdldCh0KTtpZih2JiYodT12LmV2ZW50cykpe2ZvcihjPShlPShlfHwiIikubWF0Y2goVSl8fFsiIl0pLmxlbmd0aDtjLS07KWlmKGg9Zz0ocz1BdC5leGVjKGVbY10pfHxbXSlbMV0sZD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGgpe2ZvcihmPVMuZXZlbnQuc3BlY2lhbFtoXXx8e30scD11W2g9KHI/Zi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGhdfHxbXSxzPXNbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK2Quam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksYT1pPXAubGVuZ3RoO2ktLTspbD1wW2ldLCFvJiZnIT09bC5vcmlnVHlwZXx8biYmbi5ndWlkIT09bC5ndWlkfHxzJiYhcy50ZXN0KGwubmFtZXNwYWNlKXx8ciYmciE9PWwuc2VsZWN0b3ImJigiKioiIT09cnx8IWwuc2VsZWN0b3IpfHwocC5zcGxpY2UoaSwxKSxsLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxmLnJlbW92ZSYmZi5yZW1vdmUuY2FsbCh0LGwpKTthJiYhcC5sZW5ndGgmJihmLnRlYXJkb3duJiYhMSE9PWYudGVhcmRvd24uY2FsbCh0LGQsdi5oYW5kbGUpfHxTLnJlbW92ZUV2ZW50KHQsaCx2LmhhbmRsZSksZGVsZXRlIHVbaF0pfWVsc2UgZm9yKGggaW4gdSlTLmV2ZW50LnJlbW92ZSh0LGgrZVtjXSxuLHIsITApO1MuaXNFbXB0eU9iamVjdCh1KSYmUS5yZW1vdmUodCwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhLHM9Uy5ldmVudC5maXgodCksdT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksYz0oUS5nZXQodGhpcywiZXZlbnRzIil8fHt9KVtzLnR5cGVdfHxbXSxsPVMuZXZlbnQuc3BlY2lhbFtzLnR5cGVdfHx7fTtmb3IodVswXT1zLGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXVbZV09YXJndW1lbnRzW2VdO2lmKHMuZGVsZWdhdGVUYXJnZXQ9dGhpcywhbC5wcmVEaXNwYXRjaHx8ITEhPT1sLnByZURpc3BhdGNoLmNhbGwodGhpcyxzKSl7Zm9yKGE9Uy5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMscyxjKSxlPTA7KG89YVtlKytdKSYmIXMuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTspZm9yKHMuY3VycmVudFRhcmdldD1vLmVsZW0sbj0wOyhpPW8uaGFuZGxlcnNbbisrXSkmJiFzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7KXMucm5hbWVzcGFjZSYmITEhPT1pLm5hbWVzcGFjZSYmIXMucm5hbWVzcGFjZS50ZXN0KGkubmFtZXNwYWNlKXx8KHMuaGFuZGxlT2JqPWkscy5kYXRhPWkuZGF0YSx2b2lkIDAhPT0ocj0oKFMuZXZlbnQuc3BlY2lhbFtpLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8aS5oYW5kbGVyKS5hcHBseShvLmVsZW0sdSkpJiYhMT09PShzLnJlc3VsdD1yKSYmKHMucHJldmVudERlZmF1bHQoKSxzLnN0b3BQcm9wYWdhdGlvbigpKSk7cmV0dXJuIGwucG9zdERpc3BhdGNoJiZsLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMscykscy5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbyxpLGEscz1bXSx1PWUuZGVsZWdhdGVDb3VudCxjPXQudGFyZ2V0O2lmKHUmJmMubm9kZVR5cGUmJiEoImNsaWNrIj09PXQudHlwZSYmdC5idXR0b24+PTEpKWZvcig7YyE9PXRoaXM7Yz1jLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWMubm9kZVR5cGUmJigiY2xpY2siIT09dC50eXBlfHwhMCE9PWMuZGlzYWJsZWQpKXtmb3IoaT1bXSxhPXt9LG49MDtuPHU7bisrKXZvaWQgMD09PWFbbz0ocj1lW25dKS5zZWxlY3RvcisiICJdJiYoYVtvXT1yLm5lZWRzQ29udGV4dD9TKG8sdGhpcykuaW5kZXgoYyk+LTE6Uy5maW5kKG8sdGhpcyxudWxsLFtjXSkubGVuZ3RoKSxhW29dJiZpLnB1c2gocik7aS5sZW5ndGgmJnMucHVzaCh7ZWxlbTpjLGhhbmRsZXJzOml9KX1yZXR1cm4gYz10aGlzLHU8ZS5sZW5ndGgmJnMucHVzaCh7ZWxlbTpjLGhhbmRsZXJzOmUuc2xpY2UodSl9KSxzfSxhZGRQcm9wOmZ1bmN0aW9uKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KFMuRXZlbnQucHJvdG90eXBlLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDptKGUpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiBlKHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbdF19LHNldDpmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSl9fSl9LGZpeDpmdW5jdGlvbih0KXtyZXR1cm4gdFtTLmV4cGFuZG9dP3Q6bmV3IFMuRXZlbnQodCl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxjbGljazp7c2V0dXA6ZnVuY3Rpb24odCl7dmFyIGU9dGhpc3x8dDtyZXR1cm4gZ3QudGVzdChlLnR5cGUpJiZlLmNsaWNrJiZMKGUsImlucHV0IikmJlB0KGUsImNsaWNrIixPdCksITF9LHRyaWdnZXI6ZnVuY3Rpb24odCl7dmFyIGU9dGhpc3x8dDtyZXR1cm4gZ3QudGVzdChlLnR5cGUpJiZlLmNsaWNrJiZMKGUsImlucHV0IikmJlB0KGUsImNsaWNrIiksITB9LF9kZWZhdWx0OmZ1bmN0aW9uKHQpe3ZhciBlPXQudGFyZ2V0O3JldHVybiBndC50ZXN0KGUudHlwZSkmJmUuY2xpY2smJkwoZSwiaW5wdXQiKSYmUS5nZXQoZSwiY2xpY2siKXx8TChlLCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbih0KXt2b2lkIDAhPT10LnJlc3VsdCYmdC5vcmlnaW5hbEV2ZW50JiYodC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPXQucmVzdWx0KX19fX0sUy5yZW1vdmVFdmVudD1mdW5jdGlvbih0LGUsbil7dC5yZW1vdmVFdmVudExpc3RlbmVyJiZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxuKX0sUy5FdmVudD1mdW5jdGlvbih0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFMuRXZlbnQpKXJldHVybiBuZXcgUy5FdmVudCh0LGUpO3QmJnQudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PXQsdGhpcy50eXBlPXQudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD10LmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PXQuZGVmYXVsdFByZXZlbnRlZCYmITE9PT10LnJldHVyblZhbHVlP090OkN0LHRoaXMudGFyZ2V0PXQudGFyZ2V0JiYzPT09dC50YXJnZXQubm9kZVR5cGU/dC50YXJnZXQucGFyZW50Tm9kZTp0LnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9dC5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD10LnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT10LGUmJlMuZXh0ZW5kKHRoaXMsZSksdGhpcy50aW1lU3RhbXA9dCYmdC50aW1lU3RhbXB8fERhdGUubm93KCksdGhpc1tTLmV4cGFuZG9dPSEwfSxTLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6Uy5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6Q3QsaXNQcm9wYWdhdGlvblN0b3BwZWQ6Q3QsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6Q3QsaXNTaW11bGF0ZWQ6ITEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9T3QsdCYmIXRoaXMuaXNTaW11bGF0ZWQmJnQucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9T3QsdCYmIXRoaXMuaXNTaW11bGF0ZWQmJnQuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPU90LHQmJiF0aGlzLmlzU2ltdWxhdGVkJiZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSxTLmVhY2goe2FsdEtleTohMCxidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY2hhbmdlZFRvdWNoZXM6ITAsY3RybEtleTohMCxkZXRhaWw6ITAsZXZlbnRQaGFzZTohMCxtZXRhS2V5OiEwLHBhZ2VYOiEwLHBhZ2VZOiEwLHNoaWZ0S2V5OiEwLHZpZXc6ITAsY2hhcjohMCxjb2RlOiEwLGNoYXJDb2RlOiEwLGtleTohMCxrZXlDb2RlOiEwLGJ1dHRvbjohMCxidXR0b25zOiEwLGNsaWVudFg6ITAsY2xpZW50WTohMCxvZmZzZXRYOiEwLG9mZnNldFk6ITAscG9pbnRlcklkOiEwLHBvaW50ZXJUeXBlOiEwLHNjcmVlblg6ITAsc2NyZWVuWTohMCx0YXJnZXRUb3VjaGVzOiEwLHRvRWxlbWVudDohMCx0b3VjaGVzOiEwLHdoaWNoOmZ1bmN0aW9uKHQpe3ZhciBlPXQuYnV0dG9uO3JldHVybiBudWxsPT10LndoaWNoJiZUdC50ZXN0KHQudHlwZSk/bnVsbCE9dC5jaGFyQ29kZT90LmNoYXJDb2RlOnQua2V5Q29kZTohdC53aGljaCYmdm9pZCAwIT09ZSYmanQudGVzdCh0LnR5cGUpPzEmZT8xOjImZT8zOjQmZT8yOjA6dC53aGljaH19LFMuZXZlbnQuYWRkUHJvcCksUy5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbih0LGUpe1MuZXZlbnQuc3BlY2lhbFt0XT17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gUHQodGhpcyx0LEx0KSwhMX0sdHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBQdCh0aGlzLHQpLCEwfSxkZWxlZ2F0ZVR5cGU6ZX19KSxTLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQiLHBvaW50ZXJlbnRlcjoicG9pbnRlcm92ZXIiLHBvaW50ZXJsZWF2ZToicG9pbnRlcm91dCJ9LGZ1bmN0aW9uKHQsZSl7Uy5ldmVudC5zcGVjaWFsW3RdPXtkZWxlZ2F0ZVR5cGU6ZSxiaW5kVHlwZTplLGhhbmRsZTpmdW5jdGlvbih0KXt2YXIgbixyPXRoaXMsbz10LnJlbGF0ZWRUYXJnZXQsaT10LmhhbmRsZU9iajtyZXR1cm4gbyYmKG89PT1yfHxTLmNvbnRhaW5zKHIsbykpfHwodC50eXBlPWkub3JpZ1R5cGUsbj1pLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQudHlwZT1lKSxufX19KSxTLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIFJ0KHRoaXMsdCxlLG4scil9LG9uZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gUnQodGhpcyx0LGUsbixyLDEpfSxvZmY6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG87aWYodCYmdC5wcmV2ZW50RGVmYXVsdCYmdC5oYW5kbGVPYmopcmV0dXJuIHI9dC5oYW5kbGVPYmosUyh0LmRlbGVnYXRlVGFyZ2V0KS5vZmYoci5uYW1lc3BhY2U/ci5vcmlnVHlwZSsiLiIrci5uYW1lc3BhY2U6ci5vcmlnVHlwZSxyLnNlbGVjdG9yLHIuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIHQpe2ZvcihvIGluIHQpdGhpcy5vZmYobyxlLHRbb10pO3JldHVybiB0aGlzfXJldHVybiExIT09ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGV8fChuPWUsZT12b2lkIDApLCExPT09biYmKG49Q3QpLHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQucmVtb3ZlKHRoaXMsdCxuLGUpfSl9fSk7dmFyIE50PS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKVtePl0qKVwvPi9naSxJdD0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxEdD0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxfdD0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2c7ZnVuY3Rpb24gTXQodCxlKXtyZXR1cm4gTCh0LCJ0YWJsZSIpJiZMKDExIT09ZS5ub2RlVHlwZT9lOmUuZmlyc3RDaGlsZCwidHIiKSYmUyh0KS5jaGlsZHJlbigidGJvZHkiKVswXXx8dH1mdW5jdGlvbiBVdCh0KXtyZXR1cm4gdC50eXBlPShudWxsIT09dC5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK3QudHlwZSx0fWZ1bmN0aW9uIEJ0KHQpe3JldHVybiJ0cnVlLyI9PT0odC50eXBlfHwiIikuc2xpY2UoMCw1KT90LnR5cGU9dC50eXBlLnNsaWNlKDUpOnQucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksdH1mdW5jdGlvbiBxdCh0LGUpe3ZhciBuLHIsbyxpLGEscyx1LGM7aWYoMT09PWUubm9kZVR5cGUpe2lmKFEuaGFzRGF0YSh0KSYmKGk9US5hY2Nlc3ModCksYT1RLnNldChlLGkpLGM9aS5ldmVudHMpKWZvcihvIGluIGRlbGV0ZSBhLmhhbmRsZSxhLmV2ZW50cz17fSxjKWZvcihuPTAscj1jW29dLmxlbmd0aDtuPHI7bisrKVMuZXZlbnQuYWRkKGUsbyxjW29dW25dKTtaLmhhc0RhdGEodCkmJihzPVouYWNjZXNzKHQpLHU9Uy5leHRlbmQoe30scyksWi5zZXQoZSx1KSl9fWZ1bmN0aW9uIEZ0KHQsZSl7dmFyIG49ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyJpbnB1dCI9PT1uJiZndC50ZXN0KHQudHlwZSk/ZS5jaGVja2VkPXQuY2hlY2tlZDoiaW5wdXQiIT09biYmInRleHRhcmVhIiE9PW58fChlLmRlZmF1bHRWYWx1ZT10LmRlZmF1bHRWYWx1ZSl9ZnVuY3Rpb24gSHQodCxlLG4scil7ZT1jLmFwcGx5KFtdLGUpO3ZhciBvLGksYSxzLHUsbCxmPTAscD10Lmxlbmd0aCxoPXAtMSxkPWVbMF0sZz1tKGQpO2lmKGd8fHA+MSYmInN0cmluZyI9PXR5cGVvZiBkJiYheS5jaGVja0Nsb25lJiZEdC50ZXN0KGQpKXJldHVybiB0LmVhY2goZnVuY3Rpb24obyl7dmFyIGk9dC5lcShvKTtnJiYoZVswXT1kLmNhbGwodGhpcyxvLGkuaHRtbCgpKSksSHQoaSxlLG4scil9KTtpZihwJiYoaT0obz1FdChlLHRbMF0ub3duZXJEb2N1bWVudCwhMSx0LHIpKS5maXJzdENoaWxkLDE9PT1vLmNoaWxkTm9kZXMubGVuZ3RoJiYobz1pKSxpfHxyKSl7Zm9yKHM9KGE9Uy5tYXAoYnQobywic2NyaXB0IiksVXQpKS5sZW5ndGg7ZjxwO2YrKyl1PW8sZiE9PWgmJih1PVMuY2xvbmUodSwhMCwhMCkscyYmUy5tZXJnZShhLGJ0KHUsInNjcmlwdCIpKSksbi5jYWxsKHRbZl0sdSxmKTtpZihzKWZvcihsPWFbYS5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxTLm1hcChhLEJ0KSxmPTA7ZjxzO2YrKyl1PWFbZl0seXQudGVzdCh1LnR5cGV8fCIiKSYmIVEuYWNjZXNzKHUsImdsb2JhbEV2YWwiKSYmUy5jb250YWlucyhsLHUpJiYodS5zcmMmJiJtb2R1bGUiIT09KHUudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk/Uy5fZXZhbFVybCYmIXUubm9Nb2R1bGUmJlMuX2V2YWxVcmwodS5zcmMse25vbmNlOnUubm9uY2V8fHUuZ2V0QXR0cmlidXRlKCJub25jZSIpfSk6dyh1LnRleHRDb250ZW50LnJlcGxhY2UoX3QsIiIpLHUsbCkpfXJldHVybiB0fWZ1bmN0aW9uIHp0KHQsZSxuKXtmb3IodmFyIHIsbz1lP1MuZmlsdGVyKGUsdCk6dCxpPTA7bnVsbCE9KHI9b1tpXSk7aSsrKW58fDEhPT1yLm5vZGVUeXBlfHxTLmNsZWFuRGF0YShidChyKSksci5wYXJlbnROb2RlJiYobiYmc3QocikmJnh0KGJ0KHIsInNjcmlwdCIpKSxyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpO3JldHVybiB0fVMuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoTnQsIjwkMT48LyQyPiIpfSxjbG9uZTpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGEscz10LmNsb25lTm9kZSghMCksdT1zdCh0KTtpZighKHkubm9DbG9uZUNoZWNrZWR8fDEhPT10Lm5vZGVUeXBlJiYxMSE9PXQubm9kZVR5cGV8fFMuaXNYTUxEb2ModCkpKWZvcihhPWJ0KHMpLHI9MCxvPShpPWJ0KHQpKS5sZW5ndGg7cjxvO3IrKylGdChpW3JdLGFbcl0pO2lmKGUpaWYobilmb3IoaT1pfHxidCh0KSxhPWF8fGJ0KHMpLHI9MCxvPWkubGVuZ3RoO3I8bztyKyspcXQoaVtyXSxhW3JdKTtlbHNlIHF0KHQscyk7cmV0dXJuKGE9YnQocywic2NyaXB0IikpLmxlbmd0aD4wJiZ4dChhLCF1JiZidCh0LCJzY3JpcHQiKSksc30sY2xlYW5EYXRhOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuLHIsbz1TLmV2ZW50LnNwZWNpYWwsaT0wO3ZvaWQgMCE9PShuPXRbaV0pO2krKylpZihYKG4pKXtpZihlPW5bUS5leHBhbmRvXSl7aWYoZS5ldmVudHMpZm9yKHIgaW4gZS5ldmVudHMpb1tyXT9TLmV2ZW50LnJlbW92ZShuLHIpOlMucmVtb3ZlRXZlbnQobixyLGUuaGFuZGxlKTtuW1EuZXhwYW5kb109dm9pZCAwfW5bWi5leHBhbmRvXSYmKG5bWi5leHBhbmRvXT12b2lkIDApfX19KSxTLmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKHQpe3JldHVybiB6dCh0aGlzLHQsITApfSxyZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHp0KHRoaXMsdCl9LHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuICQodGhpcyxmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dD9TLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9dCl9KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24odCl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fE10KHRoaXMsdCkuYXBwZW5kQ2hpbGQodCl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGU9TXQodGhpcyx0KTtlLmluc2VydEJlZm9yZSh0LGUuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodCx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodCx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgdCxlPTA7bnVsbCE9KHQ9dGhpc1tlXSk7ZSsrKTE9PT10Lm5vZGVUeXBlJiYoUy5jbGVhbkRhdGEoYnQodCwhMSkpLHQudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbih0LGUpe3JldHVybiB0PW51bGwhPXQmJnQsZT1udWxsPT1lP3Q6ZSx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBTLmNsb25lKHRoaXMsdCxlKX0pfSxodG1sOmZ1bmN0aW9uKHQpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24odCl7dmFyIGU9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09dCYmMT09PWUubm9kZVR5cGUpcmV0dXJuIGUuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgdCYmIUl0LnRlc3QodCkmJiFtdFsodnQuZXhlYyh0KXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe3Q9Uy5odG1sUHJlZmlsdGVyKHQpO3RyeXtmb3IoO248cjtuKyspMT09PShlPXRoaXNbbl18fHt9KS5ub2RlVHlwZSYmKFMuY2xlYW5EYXRhKGJ0KGUsITEpKSxlLmlubmVySFRNTD10KTtlPTB9Y2F0Y2godCl7fX1lJiZ0aGlzLmVtcHR5KCkuYXBwZW5kKHQpfSxudWxsLHQsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIEh0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMucGFyZW50Tm9kZTtTLmluQXJyYXkodGhpcyx0KTwwJiYoUy5jbGVhbkRhdGEoYnQodGhpcykpLG4mJm4ucmVwbGFjZUNoaWxkKGUsdGhpcykpfSx0KX19KSxTLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbih0LGUpe1MuZm5bdF09ZnVuY3Rpb24odCl7Zm9yKHZhciBuLHI9W10sbz1TKHQpLGk9by5sZW5ndGgtMSxhPTA7YTw9aTthKyspbj1hPT09aT90aGlzOnRoaXMuY2xvbmUoITApLFMob1thXSlbZV0obiksbC5hcHBseShyLG4uZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhyKX19KTt2YXIgV3Q9bmV3IFJlZ0V4cCgiXigiK3J0KyIpKD8hcHgpW2EteiVdKyQiLCJpIiksJHQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiBlJiZlLm9wZW5lcnx8KGU9biksZS5nZXRDb21wdXRlZFN0eWxlKHQpfSxZdD1uZXcgUmVnRXhwKGl0LmpvaW4oInwiKSwiaSIpO2Z1bmN0aW9uIFZ0KHQsZSxuKXt2YXIgcixvLGksYSxzPXQuc3R5bGU7cmV0dXJuKG49bnx8JHQodCkpJiYoIiIhPT0oYT1uLmdldFByb3BlcnR5VmFsdWUoZSl8fG5bZV0pfHxzdCh0KXx8KGE9Uy5zdHlsZSh0LGUpKSwheS5waXhlbEJveFN0eWxlcygpJiZXdC50ZXN0KGEpJiZZdC50ZXN0KGUpJiYocj1zLndpZHRoLG89cy5taW5XaWR0aCxpPXMubWF4V2lkdGgscy5taW5XaWR0aD1zLm1heFdpZHRoPXMud2lkdGg9YSxhPW4ud2lkdGgscy53aWR0aD1yLHMubWluV2lkdGg9byxzLm1heFdpZHRoPWkpKSx2b2lkIDAhPT1hP2ErIiI6YX1mdW5jdGlvbiBHdCh0LGUpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtpZighdCgpKXJldHVybih0aGlzLmdldD1lKS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZGVsZXRlIHRoaXMuZ2V0fX19IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2lmKGwpe2Muc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O21hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MCIsbC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo2MCU7dG9wOjElIixhdC5hcHBlbmRDaGlsZChjKS5hcHBlbmRDaGlsZChsKTt2YXIgdD1uLmdldENvbXB1dGVkU3R5bGUobCk7cj0iMSUiIT09dC50b3AsdT0xMj09PWUodC5tYXJnaW5MZWZ0KSxsLnN0eWxlLnJpZ2h0PSI2MCUiLHM9MzY9PT1lKHQucmlnaHQpLG89MzY9PT1lKHQud2lkdGgpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixpPTEyPT09ZShsLm9mZnNldFdpZHRoLzMpLGF0LnJlbW92ZUNoaWxkKGMpLGw9bnVsbH19ZnVuY3Rpb24gZSh0KXtyZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHQpKX12YXIgcixvLGkscyx1LGM9YS5jcmVhdGVFbGVtZW50KCJkaXYiKSxsPWEuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5zdHlsZSYmKGwuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixsLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIseS5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWwuc3R5bGUuYmFja2dyb3VuZENsaXAsUy5leHRlbmQoeSx7Ym94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLG99LHBpeGVsQm94U3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxzfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxyfSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHV9LHNjcm9sbGJveFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLGl9fSkpfSgpO3ZhciBLdD1bIldlYmtpdCIsIk1veiIsIm1zIl0sWHQ9YS5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZSxKdD17fTtmdW5jdGlvbiBRdCh0KXt2YXIgZT1TLmNzc1Byb3BzW3RdfHxKdFt0XTtyZXR1cm4gZXx8KHQgaW4gWHQ/dDpKdFt0XT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSksbj1LdC5sZW5ndGg7bi0tOylpZigodD1LdFtuXStlKWluIFh0KXJldHVybiB0fSh0KXx8dCl9dmFyIFp0PS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyx0ZT0vXi0tLyxlZT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sbmU9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9O2Z1bmN0aW9uIHJlKHQsZSxuKXt2YXIgcj1vdC5leGVjKGUpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHwicHgiKTplfWZ1bmN0aW9uIG9lKHQsZSxuLHIsbyxpKXt2YXIgYT0id2lkdGgiPT09ZT8xOjAscz0wLHU9MDtpZihuPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKSJtYXJnaW4iPT09biYmKHUrPVMuY3NzKHQsbitpdFthXSwhMCxvKSkscj8oImNvbnRlbnQiPT09biYmKHUtPVMuY3NzKHQsInBhZGRpbmciK2l0W2FdLCEwLG8pKSwibWFyZ2luIiE9PW4mJih1LT1TLmNzcyh0LCJib3JkZXIiK2l0W2FdKyJXaWR0aCIsITAsbykpKToodSs9Uy5jc3ModCwicGFkZGluZyIraXRbYV0sITAsbyksInBhZGRpbmciIT09bj91Kz1TLmNzcyh0LCJib3JkZXIiK2l0W2FdKyJXaWR0aCIsITAsbyk6cys9Uy5jc3ModCwiYm9yZGVyIitpdFthXSsiV2lkdGgiLCEwLG8pKTtyZXR1cm4hciYmaT49MCYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKHRbIm9mZnNldCIrZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSldLWktdS1zLS41KSl8fDApLHV9ZnVuY3Rpb24gaWUodCxlLG4pe3ZhciByPSR0KHQpLG89KCF5LmJveFNpemluZ1JlbGlhYmxlKCl8fG4pJiYiYm9yZGVyLWJveCI9PT1TLmNzcyh0LCJib3hTaXppbmciLCExLHIpLGk9byxhPVZ0KHQsZSxyKSxzPSJvZmZzZXQiK2VbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpO2lmKFd0LnRlc3QoYSkpe2lmKCFuKXJldHVybiBhO2E9ImF1dG8ifXJldHVybigheS5ib3hTaXppbmdSZWxpYWJsZSgpJiZvfHwiYXV0byI9PT1hfHwhcGFyc2VGbG9hdChhKSYmImlubGluZSI9PT1TLmNzcyh0LCJkaXNwbGF5IiwhMSxyKSkmJnQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJihvPSJib3JkZXItYm94Ij09PVMuY3NzKHQsImJveFNpemluZyIsITEsciksKGk9cyBpbiB0KSYmKGE9dFtzXSkpLChhPXBhcnNlRmxvYXQoYSl8fDApK29lKHQsZSxufHwobz8iYm9yZGVyIjoiY29udGVudCIpLGkscixhKSsicHgifWZ1bmN0aW9uIGFlKHQsZSxuLHIsbyl7cmV0dXJuIG5ldyBhZS5wcm90b3R5cGUuaW5pdCh0LGUsbixyLG8pfVMuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKHQsZSl7aWYoZSl7dmFyIG49VnQodCwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsZ3JpZEFyZWE6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TdGFydDohMCxncmlkUm93OiEwLGdyaWRSb3dFbmQ6ITAsZ3JpZFJvd1N0YXJ0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6e30sc3R5bGU6ZnVuY3Rpb24odCxlLG4scil7aWYodCYmMyE9PXQubm9kZVR5cGUmJjghPT10Lm5vZGVUeXBlJiZ0LnN0eWxlKXt2YXIgbyxpLGEscz1LKGUpLHU9dGUudGVzdChlKSxjPXQuc3R5bGU7aWYodXx8KGU9UXQocykpLGE9Uy5jc3NIb29rc1tlXXx8Uy5jc3NIb29rc1tzXSx2b2lkIDA9PT1uKXJldHVybiBhJiYiZ2V0ImluIGEmJnZvaWQgMCE9PShvPWEuZ2V0KHQsITEscikpP286Y1tlXTsic3RyaW5nIj09PShpPXR5cGVvZiBuKSYmKG89b3QuZXhlYyhuKSkmJm9bMV0mJihuPWZ0KHQsZSxvKSxpPSJudW1iZXIiKSxudWxsIT1uJiZuPT1uJiYoIm51bWJlciIhPT1pfHx1fHwobis9byYmb1szXXx8KFMuY3NzTnVtYmVyW3NdPyIiOiJweCIpKSx5LmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1ufHwwIT09ZS5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fChjW2VdPSJpbmhlcml0IiksYSYmInNldCJpbiBhJiZ2b2lkIDA9PT0obj1hLnNldCh0LG4scikpfHwodT9jLnNldFByb3BlcnR5KGUsbik6Y1tlXT1uKSl9fSxjc3M6ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhLHM9SyhlKTtyZXR1cm4gdGUudGVzdChlKXx8KGU9UXQocykpLChhPVMuY3NzSG9va3NbZV18fFMuY3NzSG9va3Nbc10pJiYiZ2V0ImluIGEmJihvPWEuZ2V0KHQsITAsbikpLHZvaWQgMD09PW8mJihvPVZ0KHQsZSxyKSksIm5vcm1hbCI9PT1vJiZlIGluIG5lJiYobz1uZVtlXSksIiI9PT1ufHxuPyhpPXBhcnNlRmxvYXQobyksITA9PT1ufHxpc0Zpbml0ZShpKT9pfHwwOm8pOm99fSksUy5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbih0LGUpe1MuY3NzSG9va3NbZV09e2dldDpmdW5jdGlvbih0LG4scil7aWYobilyZXR1cm4hWnQudGVzdChTLmNzcyh0LCJkaXNwbGF5IikpfHx0LmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiZ0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoP2llKHQsZSxyKTpsdCh0LGVlLGZ1bmN0aW9uKCl7cmV0dXJuIGllKHQsZSxyKX0pfSxzZXQ6ZnVuY3Rpb24odCxuLHIpe3ZhciBvLGk9JHQodCksYT0heS5zY3JvbGxib3hTaXplKCkmJiJhYnNvbHV0ZSI9PT1pLnBvc2l0aW9uLHM9KGF8fHIpJiYiYm9yZGVyLWJveCI9PT1TLmNzcyh0LCJib3hTaXppbmciLCExLGkpLHU9cj9vZSh0LGUscixzLGkpOjA7cmV0dXJuIHMmJmEmJih1LT1NYXRoLmNlaWwodFsib2Zmc2V0IitlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKV0tcGFyc2VGbG9hdChpW2VdKS1vZSh0LGUsImJvcmRlciIsITEsaSktLjUpKSx1JiYobz1vdC5leGVjKG4pKSYmInB4IiE9PShvWzNdfHwicHgiKSYmKHQuc3R5bGVbZV09bixuPVMuY3NzKHQsZSkpLHJlKDAsbix1KX19fSksUy5jc3NIb29rcy5tYXJnaW5MZWZ0PUd0KHkucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKHQsZSl7aWYoZSlyZXR1cm4ocGFyc2VGbG9hdChWdCh0LCJtYXJnaW5MZWZ0IikpfHx0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtbHQodCx7bWFyZ2luTGVmdDowfSxmdW5jdGlvbigpe3JldHVybiB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9KSkrInB4In0pLFMuZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKHQsZSl7Uy5jc3NIb29rc1t0K2VdPXtleHBhbmQ6ZnVuY3Rpb24obil7Zm9yKHZhciByPTAsbz17fSxpPSJzdHJpbmciPT10eXBlb2Ygbj9uLnNwbGl0KCIgIik6W25dO3I8NDtyKyspb1t0K2l0W3JdK2VdPWlbcl18fGlbci0yXXx8aVswXTtyZXR1cm4gb319LCJtYXJnaW4iIT09dCYmKFMuY3NzSG9va3NbdCtlXS5zZXQ9cmUpfSksUy5mbi5leHRlbmQoe2NzczpmdW5jdGlvbih0LGUpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saT17fSxhPTA7aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHI9JHQodCksbz1lLmxlbmd0aDthPG87YSsrKWlbZVthXV09Uy5jc3ModCxlW2FdLCExLHIpO3JldHVybiBpfXJldHVybiB2b2lkIDAhPT1uP1Muc3R5bGUodCxlLG4pOlMuY3NzKHQsZSl9LHQsZSxhcmd1bWVudHMubGVuZ3RoPjEpfX0pLFMuVHdlZW49YWUsYWUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjphZSxpbml0OmZ1bmN0aW9uKHQsZSxuLHIsbyxpKXt0aGlzLmVsZW09dCx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1vfHxTLmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9ZSx0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9cix0aGlzLnVuaXQ9aXx8KFMuY3NzTnVtYmVyW25dPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgdD1hZS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdCYmdC5nZXQ/dC5nZXQodGhpcyk6YWUucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKHQpe3ZhciBlLG49YWUucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz1lPVMuZWFzaW5nW3RoaXMuZWFzaW5nXSh0LHRoaXMub3B0aW9ucy5kdXJhdGlvbip0LDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPWU9dCx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqZSt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTphZS5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxhZS5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9YWUucHJvdG90eXBlLGFlLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gMSE9PXQuZWxlbS5ub2RlVHlwZXx8bnVsbCE9dC5lbGVtW3QucHJvcF0mJm51bGw9PXQuZWxlbS5zdHlsZVt0LnByb3BdP3QuZWxlbVt0LnByb3BdOihlPVMuY3NzKHQuZWxlbSx0LnByb3AsIiIpKSYmImF1dG8iIT09ZT9lOjB9LHNldDpmdW5jdGlvbih0KXtTLmZ4LnN0ZXBbdC5wcm9wXT9TLmZ4LnN0ZXBbdC5wcm9wXSh0KToxIT09dC5lbGVtLm5vZGVUeXBlfHwhUy5jc3NIb29rc1t0LnByb3BdJiZudWxsPT10LmVsZW0uc3R5bGVbUXQodC5wcm9wKV0/dC5lbGVtW3QucHJvcF09dC5ub3c6Uy5zdHlsZSh0LmVsZW0sdC5wcm9wLHQubm93K3QudW5pdCl9fX0sYWUucHJvcEhvb2tzLnNjcm9sbFRvcD1hZS5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKHQpe3QuZWxlbS5ub2RlVHlwZSYmdC5lbGVtLnBhcmVudE5vZGUmJih0LmVsZW1bdC5wcm9wXT10Lm5vdyl9fSxTLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxzd2luZzpmdW5jdGlvbih0KXtyZXR1cm4uNS1NYXRoLmNvcyh0Kk1hdGguUEkpLzJ9LF9kZWZhdWx0OiJzd2luZyJ9LFMuZng9YWUucHJvdG90eXBlLmluaXQsUy5meC5zdGVwPXt9O3ZhciBzZSx1ZSxjZT0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sbGU9L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBmZSgpe3VlJiYoITE9PT1hLmhpZGRlbiYmbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/bi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZmUpOm4uc2V0VGltZW91dChmZSxTLmZ4LmludGVydmFsKSxTLmZ4LnRpY2soKSl9ZnVuY3Rpb24gcGUoKXtyZXR1cm4gbi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2U9dm9pZCAwfSksc2U9RGF0ZS5ub3coKX1mdW5jdGlvbiBoZSh0LGUpe3ZhciBuLHI9MCxvPXtoZWlnaHQ6dH07Zm9yKGU9ZT8xOjA7cjw0O3IrPTItZSlvWyJtYXJnaW4iKyhuPWl0W3JdKV09b1sicGFkZGluZyIrbl09dDtyZXR1cm4gZSYmKG8ub3BhY2l0eT1vLndpZHRoPXQpLG99ZnVuY3Rpb24gZGUodCxlLG4pe2Zvcih2YXIgcixvPShnZS50d2VlbmVyc1tlXXx8W10pLmNvbmNhdChnZS50d2VlbmVyc1siKiJdKSxpPTAsYT1vLmxlbmd0aDtpPGE7aSsrKWlmKHI9b1tpXS5jYWxsKG4sZSx0KSlyZXR1cm4gcn1mdW5jdGlvbiBnZSh0LGUsbil7dmFyIHIsbyxpPTAsYT1nZS5wcmVmaWx0ZXJzLmxlbmd0aCxzPVMuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgdS5lbGVtfSksdT1mdW5jdGlvbigpe2lmKG8pcmV0dXJuITE7Zm9yKHZhciBlPXNlfHxwZSgpLG49TWF0aC5tYXgoMCxjLnN0YXJ0VGltZStjLmR1cmF0aW9uLWUpLHI9MS0obi9jLmR1cmF0aW9ufHwwKSxpPTAsYT1jLnR3ZWVucy5sZW5ndGg7aTxhO2krKyljLnR3ZWVuc1tpXS5ydW4ocik7cmV0dXJuIHMubm90aWZ5V2l0aCh0LFtjLHIsbl0pLHI8MSYmYT9uOihhfHxzLm5vdGlmeVdpdGgodCxbYywxLDBdKSxzLnJlc29sdmVXaXRoKHQsW2NdKSwhMSl9LGM9cy5wcm9taXNlKHtlbGVtOnQscHJvcHM6Uy5leHRlbmQoe30sZSksb3B0czpTLmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fSxlYXNpbmc6Uy5lYXNpbmcuX2RlZmF1bHR9LG4pLG9yaWdpbmFsUHJvcGVydGllczplLG9yaWdpbmFsT3B0aW9uczpuLHN0YXJ0VGltZTpzZXx8cGUoKSxkdXJhdGlvbjpuLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihlLG4pe3ZhciByPVMuVHdlZW4odCxjLm9wdHMsZSxuLGMub3B0cy5zcGVjaWFsRWFzaW5nW2VdfHxjLm9wdHMuZWFzaW5nKTtyZXR1cm4gYy50d2VlbnMucHVzaChyKSxyfSxzdG9wOmZ1bmN0aW9uKGUpe3ZhciBuPTAscj1lP2MudHdlZW5zLmxlbmd0aDowO2lmKG8pcmV0dXJuIHRoaXM7Zm9yKG89ITA7bjxyO24rKyljLnR3ZWVuc1tuXS5ydW4oMSk7cmV0dXJuIGU/KHMubm90aWZ5V2l0aCh0LFtjLDEsMF0pLHMucmVzb2x2ZVdpdGgodCxbYyxlXSkpOnMucmVqZWN0V2l0aCh0LFtjLGVdKSx0aGlzfX0pLGw9Yy5wcm9wcztmb3IoIWZ1bmN0aW9uKHQsZSl7dmFyIG4scixvLGksYTtmb3IobiBpbiB0KWlmKG89ZVtyPUsobildLGk9dFtuXSxBcnJheS5pc0FycmF5KGkpJiYobz1pWzFdLGk9dFtuXT1pWzBdKSxuIT09ciYmKHRbcl09aSxkZWxldGUgdFtuXSksKGE9Uy5jc3NIb29rc1tyXSkmJiJleHBhbmQiaW4gYSlmb3IobiBpbiBpPWEuZXhwYW5kKGkpLGRlbGV0ZSB0W3JdLGkpbiBpbiB0fHwodFtuXT1pW25dLGVbbl09byk7ZWxzZSBlW3JdPW99KGwsYy5vcHRzLnNwZWNpYWxFYXNpbmcpO2k8YTtpKyspaWYocj1nZS5wcmVmaWx0ZXJzW2ldLmNhbGwoYyx0LGwsYy5vcHRzKSlyZXR1cm4gbShyLnN0b3ApJiYoUy5fcXVldWVIb29rcyhjLmVsZW0sYy5vcHRzLnF1ZXVlKS5zdG9wPXIuc3RvcC5iaW5kKHIpKSxyO3JldHVybiBTLm1hcChsLGRlLGMpLG0oYy5vcHRzLnN0YXJ0KSYmYy5vcHRzLnN0YXJ0LmNhbGwodCxjKSxjLnByb2dyZXNzKGMub3B0cy5wcm9ncmVzcykuZG9uZShjLm9wdHMuZG9uZSxjLm9wdHMuY29tcGxldGUpLmZhaWwoYy5vcHRzLmZhaWwpLmFsd2F5cyhjLm9wdHMuYWx3YXlzKSxTLmZ4LnRpbWVyKFMuZXh0ZW5kKHUse2VsZW06dCxhbmltOmMscXVldWU6Yy5vcHRzLnF1ZXVlfSkpLGN9Uy5BbmltYXRpb249Uy5leHRlbmQoZ2Use3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jcmVhdGVUd2Vlbih0LGUpO3JldHVybiBmdChuLmVsZW0sdCxvdC5leGVjKGUpLG4pLG59XX0sdHdlZW5lcjpmdW5jdGlvbih0LGUpe20odCk/KGU9dCx0PVsiKiJdKTp0PXQubWF0Y2goVSk7Zm9yKHZhciBuLHI9MCxvPXQubGVuZ3RoO3I8bztyKyspbj10W3JdLGdlLnR3ZWVuZXJzW25dPWdlLnR3ZWVuZXJzW25dfHxbXSxnZS50d2VlbmVyc1tuXS51bnNoaWZ0KGUpfSxwcmVmaWx0ZXJzOltmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGEscyx1LGMsbCxmPSJ3aWR0aCJpbiBlfHwiaGVpZ2h0ImluIGUscD10aGlzLGg9e30sZD10LnN0eWxlLGc9dC5ub2RlVHlwZSYmY3QodCksdj1RLmdldCh0LCJmeHNob3ciKTtmb3IociBpbiBuLnF1ZXVlfHwobnVsbD09KGE9Uy5fcXVldWVIb29rcyh0LCJmeCIpKS51bnF1ZXVlZCYmKGEudW5xdWV1ZWQ9MCxzPWEuZW1wdHkuZmlyZSxhLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXthLnVucXVldWVkfHxzKCl9KSxhLnVucXVldWVkKysscC5hbHdheXMoZnVuY3Rpb24oKXtwLmFsd2F5cyhmdW5jdGlvbigpe2EudW5xdWV1ZWQtLSxTLnF1ZXVlKHQsImZ4IikubGVuZ3RofHxhLmVtcHR5LmZpcmUoKX0pfSkpLGUpaWYobz1lW3JdLGNlLnRlc3Qobykpe2lmKGRlbGV0ZSBlW3JdLGk9aXx8InRvZ2dsZSI9PT1vLG89PT0oZz8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09b3x8IXZ8fHZvaWQgMD09PXZbcl0pY29udGludWU7Zz0hMH1oW3JdPXYmJnZbcl18fFMuc3R5bGUodCxyKX1pZigodT0hUy5pc0VtcHR5T2JqZWN0KGUpKXx8IVMuaXNFbXB0eU9iamVjdChoKSlmb3IociBpbiBmJiYxPT09dC5ub2RlVHlwZSYmKG4ub3ZlcmZsb3c9W2Qub3ZlcmZsb3csZC5vdmVyZmxvd1gsZC5vdmVyZmxvd1ldLG51bGw9PShjPXYmJnYuZGlzcGxheSkmJihjPVEuZ2V0KHQsImRpc3BsYXkiKSksIm5vbmUiPT09KGw9Uy5jc3ModCwiZGlzcGxheSIpKSYmKGM/bD1jOihkdChbdF0sITApLGM9dC5zdHlsZS5kaXNwbGF5fHxjLGw9Uy5jc3ModCwiZGlzcGxheSIpLGR0KFt0XSkpKSwoImlubGluZSI9PT1sfHwiaW5saW5lLWJsb2NrIj09PWwmJm51bGwhPWMpJiYibm9uZSI9PT1TLmNzcyh0LCJmbG9hdCIpJiYodXx8KHAuZG9uZShmdW5jdGlvbigpe2QuZGlzcGxheT1jfSksbnVsbD09YyYmKGw9ZC5kaXNwbGF5LGM9Im5vbmUiPT09bD8iIjpsKSksZC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKGQub3ZlcmZsb3c9ImhpZGRlbiIscC5hbHdheXMoZnVuY3Rpb24oKXtkLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0sZC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxkLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpLHU9ITEsaCl1fHwodj8iaGlkZGVuImluIHYmJihnPXYuaGlkZGVuKTp2PVEuYWNjZXNzKHQsImZ4c2hvdyIse2Rpc3BsYXk6Y30pLGkmJih2LmhpZGRlbj0hZyksZyYmZHQoW3RdLCEwKSxwLmRvbmUoZnVuY3Rpb24oKXtmb3IociBpbiBnfHxkdChbdF0pLFEucmVtb3ZlKHQsImZ4c2hvdyIpLGgpUy5zdHlsZSh0LHIsaFtyXSl9KSksdT1kZShnP3Zbcl06MCxyLHApLHIgaW4gdnx8KHZbcl09dS5zdGFydCxnJiYodS5lbmQ9dS5zdGFydCx1LnN0YXJ0PTApKX1dLHByZWZpbHRlcjpmdW5jdGlvbih0LGUpe2U/Z2UucHJlZmlsdGVycy51bnNoaWZ0KHQpOmdlLnByZWZpbHRlcnMucHVzaCh0KX19KSxTLnNwZWVkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10JiYib2JqZWN0Ij09dHlwZW9mIHQ/Uy5leHRlbmQoe30sdCk6e2NvbXBsZXRlOm58fCFuJiZlfHxtKHQpJiZ0LGR1cmF0aW9uOnQsZWFzaW5nOm4mJmV8fGUmJiFtKGUpJiZlfTtyZXR1cm4gUy5meC5vZmY/ci5kdXJhdGlvbj0wOiJudW1iZXIiIT10eXBlb2Ygci5kdXJhdGlvbiYmKHIuZHVyYXRpb24gaW4gUy5meC5zcGVlZHM/ci5kdXJhdGlvbj1TLmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTpyLmR1cmF0aW9uPVMuZnguc3BlZWRzLl9kZWZhdWx0KSxudWxsIT1yLnF1ZXVlJiYhMCE9PXIucXVldWV8fChyLnF1ZXVlPSJmeCIpLHIub2xkPXIuY29tcGxldGUsci5jb21wbGV0ZT1mdW5jdGlvbigpe20oci5vbGQpJiZyLm9sZC5jYWxsKHRoaXMpLHIucXVldWUmJlMuZGVxdWV1ZSh0aGlzLHIucXVldWUpfSxyfSxTLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0aGlzLmZpbHRlcihjdCkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTplfSx0LG4scil9LGFuaW1hdGU6ZnVuY3Rpb24odCxlLG4scil7dmFyIG89Uy5pc0VtcHR5T2JqZWN0KHQpLGk9Uy5zcGVlZChlLG4sciksYT1mdW5jdGlvbigpe3ZhciBlPWdlKHRoaXMsUy5leHRlbmQoe30sdCksaSk7KG98fFEuZ2V0KHRoaXMsImZpbmlzaCIpKSYmZS5zdG9wKCEwKX07cmV0dXJuIGEuZmluaXNoPWEsb3x8ITE9PT1pLnF1ZXVlP3RoaXMuZWFjaChhKTp0aGlzLnF1ZXVlKGkucXVldWUsYSl9LHN0b3A6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc3RvcDtkZWxldGUgdC5zdG9wLGUobil9O3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmKG49ZSxlPXQsdD12b2lkIDApLGUmJiExIT09dCYmdGhpcy5xdWV1ZSh0fHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT0hMCxvPW51bGwhPXQmJnQrInF1ZXVlSG9va3MiLGk9Uy50aW1lcnMsYT1RLmdldCh0aGlzKTtpZihvKWFbb10mJmFbb10uc3RvcCYmcihhW29dKTtlbHNlIGZvcihvIGluIGEpYVtvXSYmYVtvXS5zdG9wJiZsZS50ZXN0KG8pJiZyKGFbb10pO2ZvcihvPWkubGVuZ3RoO28tLTspaVtvXS5lbGVtIT09dGhpc3x8bnVsbCE9dCYmaVtvXS5xdWV1ZSE9PXR8fChpW29dLmFuaW0uc3RvcChuKSxlPSExLGkuc3BsaWNlKG8sMSkpOyFlJiZufHxTLmRlcXVldWUodGhpcyx0KX0pfSxmaW5pc2g6ZnVuY3Rpb24odCl7cmV0dXJuITEhPT10JiYodD10fHwiZngiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSxuPVEuZ2V0KHRoaXMpLHI9blt0KyJxdWV1ZSJdLG89blt0KyJxdWV1ZUhvb2tzIl0saT1TLnRpbWVycyxhPXI/ci5sZW5ndGg6MDtmb3Iobi5maW5pc2g9ITAsUy5xdWV1ZSh0aGlzLHQsW10pLG8mJm8uc3RvcCYmby5zdG9wLmNhbGwodGhpcywhMCksZT1pLmxlbmd0aDtlLS07KWlbZV0uZWxlbT09PXRoaXMmJmlbZV0ucXVldWU9PT10JiYoaVtlXS5hbmltLnN0b3AoITApLGkuc3BsaWNlKGUsMSkpO2ZvcihlPTA7ZTxhO2UrKylyW2VdJiZyW2VdLmZpbmlzaCYmcltlXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgbi5maW5pc2h9KX19KSxTLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKHQsZSl7dmFyIG49Uy5mbltlXTtTLmZuW2VdPWZ1bmN0aW9uKHQscixvKXtyZXR1cm4gbnVsbD09dHx8ImJvb2xlYW4iPT10eXBlb2YgdD9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoaGUoZSwhMCksdCxyLG8pfX0pLFMuZWFjaCh7c2xpZGVEb3duOmhlKCJzaG93Iiksc2xpZGVVcDpoZSgiaGlkZSIpLHNsaWRlVG9nZ2xlOmhlKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKHQsZSl7Uy5mblt0XT1mdW5jdGlvbih0LG4scil7cmV0dXJuIHRoaXMuYW5pbWF0ZShlLHQsbixyKX19KSxTLnRpbWVycz1bXSxTLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgdCxlPTAsbj1TLnRpbWVycztmb3Ioc2U9RGF0ZS5ub3coKTtlPG4ubGVuZ3RoO2UrKykodD1uW2VdKSgpfHxuW2VdIT09dHx8bi5zcGxpY2UoZS0tLDEpO24ubGVuZ3RofHxTLmZ4LnN0b3AoKSxzZT12b2lkIDB9LFMuZngudGltZXI9ZnVuY3Rpb24odCl7Uy50aW1lcnMucHVzaCh0KSxTLmZ4LnN0YXJ0KCl9LFMuZnguaW50ZXJ2YWw9MTMsUy5meC5zdGFydD1mdW5jdGlvbigpe3VlfHwodWU9ITAsZmUoKSl9LFMuZnguc3RvcD1mdW5jdGlvbigpe3VlPW51bGx9LFMuZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LFMuZm4uZGVsYXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1TLmZ4JiZTLmZ4LnNwZWVkc1t0XXx8dCxlPWV8fCJmeCIsdGhpcy5xdWV1ZShlLGZ1bmN0aW9uKGUscil7dmFyIG89bi5zZXRUaW1lb3V0KGUsdCk7ci5zdG9wPWZ1bmN0aW9uKCl7bi5jbGVhclRpbWVvdXQobyl9fSl9LGZ1bmN0aW9uKCl7dmFyIHQ9YS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGU9YS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKS5hcHBlbmRDaGlsZChhLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTt0LnR5cGU9ImNoZWNrYm94Iix5LmNoZWNrT249IiIhPT10LnZhbHVlLHkub3B0U2VsZWN0ZWQ9ZS5zZWxlY3RlZCwodD1hLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnZhbHVlPSJ0Iix0LnR5cGU9InJhZGlvIix5LnJhZGlvVmFsdWU9InQiPT09dC52YWx1ZX0oKTt2YXIgdmUseWU9Uy5leHByLmF0dHJIYW5kbGU7Uy5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gJCh0aGlzLFMuYXR0cix0LGUsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5yZW1vdmVBdHRyKHRoaXMsdCl9KX19KSxTLmV4dGVuZCh7YXR0cjpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpPXQubm9kZVR5cGU7aWYoMyE9PWkmJjghPT1pJiYyIT09aSlyZXR1cm4gdm9pZCAwPT09dC5nZXRBdHRyaWJ1dGU/Uy5wcm9wKHQsZSxuKTooMT09PWkmJlMuaXNYTUxEb2ModCl8fChvPVMuYXR0ckhvb2tzW2UudG9Mb3dlckNhc2UoKV18fChTLmV4cHIubWF0Y2guYm9vbC50ZXN0KGUpP3ZlOnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCBTLnJlbW92ZUF0dHIodCxlKTpvJiYic2V0ImluIG8mJnZvaWQgMCE9PShyPW8uc2V0KHQsbixlKSk/cjoodC5zZXRBdHRyaWJ1dGUoZSxuKyIiKSxuKTpvJiYiZ2V0ImluIG8mJm51bGwhPT0ocj1vLmdldCh0LGUpKT9yOm51bGw9PShyPVMuZmluZC5hdHRyKHQsZSkpP3ZvaWQgMDpyKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24odCxlKXtpZigheS5yYWRpb1ZhbHVlJiYicmFkaW8iPT09ZSYmTCh0LCJpbnB1dCIpKXt2YXIgbj10LnZhbHVlO3JldHVybiB0LnNldEF0dHJpYnV0ZSgidHlwZSIsZSksbiYmKHQudmFsdWU9biksZX19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbih0LGUpe3ZhciBuLHI9MCxvPWUmJmUubWF0Y2goVSk7aWYobyYmMT09PXQubm9kZVR5cGUpZm9yKDtuPW9bcisrXTspdC5yZW1vdmVBdHRyaWJ1dGUobil9fSksdmU9e3NldDpmdW5jdGlvbih0LGUsbil7cmV0dXJuITE9PT1lP1MucmVtb3ZlQXR0cih0LG4pOnQuc2V0QXR0cmlidXRlKG4sbiksbn19LFMuZWFjaChTLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbih0LGUpe3ZhciBuPXllW2VdfHxTLmZpbmQuYXR0cjt5ZVtlXT1mdW5jdGlvbih0LGUscil7dmFyIG8saSxhPWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gcnx8KGk9eWVbYV0seWVbYV09byxvPW51bGwhPW4odCxlLHIpP2E6bnVsbCx5ZVthXT1pKSxvfX0pO3ZhciBtZT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLGJlPS9eKD86YXxhcmVhKSQvaTtmdW5jdGlvbiB4ZSh0KXtyZXR1cm4odC5tYXRjaChVKXx8W10pLmpvaW4oIiAiKX1mdW5jdGlvbiB3ZSh0KXtyZXR1cm4gdC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn1mdW5jdGlvbiBrZSh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90OiJzdHJpbmciPT10eXBlb2YgdCYmdC5tYXRjaChVKXx8W119Uy5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24odCxlKXtyZXR1cm4gJCh0aGlzLFMucHJvcCx0LGUsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbUy5wcm9wRml4W3RdfHx0XX0pfX0pLFMuZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGk9dC5ub2RlVHlwZTtpZigzIT09aSYmOCE9PWkmJjIhPT1pKXJldHVybiAxPT09aSYmUy5pc1hNTERvYyh0KXx8KGU9Uy5wcm9wRml4W2VdfHxlLG89Uy5wcm9wSG9va3NbZV0pLHZvaWQgMCE9PW4/byYmInNldCJpbiBvJiZ2b2lkIDAhPT0ocj1vLnNldCh0LG4sZSkpP3I6dFtlXT1uOm8mJiJnZXQiaW4gbyYmbnVsbCE9PShyPW8uZ2V0KHQsZSkpP3I6dFtlXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlPVMuZmluZC5hdHRyKHQsInRhYmluZGV4Iik7cmV0dXJuIGU/cGFyc2VJbnQoZSwxMCk6bWUudGVzdCh0Lm5vZGVOYW1lKXx8YmUudGVzdCh0Lm5vZGVOYW1lKSYmdC5ocmVmPzA6LTF9fX0scHJvcEZpeDp7Zm9yOiJodG1sRm9yIixjbGFzczoiY2xhc3NOYW1lIn19KSx5Lm9wdFNlbGVjdGVkfHwoUy5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbih0KXt2YXIgZT10LnBhcmVudE5vZGU7cmV0dXJuIGUmJmUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXQucGFyZW50Tm9kZTtlJiYoZS5zZWxlY3RlZEluZGV4LGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLFMuZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7Uy5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLFMuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGEscyx1PTA7aWYobSh0KSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykuYWRkQ2xhc3ModC5jYWxsKHRoaXMsZSx3ZSh0aGlzKSkpfSk7aWYoKGU9a2UodCkpLmxlbmd0aClmb3IoO249dGhpc1t1KytdOylpZihvPXdlKG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIit4ZShvKSsiICIpe2ZvcihhPTA7aT1lW2ErK107KXIuaW5kZXhPZigiICIraSsiICIpPDAmJihyKz1pKyIgIik7byE9PShzPXhlKHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLnJlbW92ZUNsYXNzKHQuY2FsbCh0aGlzLGUsd2UodGhpcykpKX0pO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmF0dHIoImNsYXNzIiwiIik7aWYoKGU9a2UodCkpLmxlbmd0aClmb3IoO249dGhpc1t1KytdOylpZihvPXdlKG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIit4ZShvKSsiICIpe2ZvcihhPTA7aT1lW2ErK107KWZvcig7ci5pbmRleE9mKCIgIitpKyIgIik+LTE7KXI9ci5yZXBsYWNlKCIgIitpKyIgIiwiICIpO28hPT0ocz14ZShyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKHQsZSl7dmFyIG49dHlwZW9mIHQscj0ic3RyaW5nIj09PW58fEFycmF5LmlzQXJyYXkodCk7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZSYmcj9lP3RoaXMuYWRkQ2xhc3ModCk6dGhpcy5yZW1vdmVDbGFzcyh0KTptKHQpP3RoaXMuZWFjaChmdW5jdGlvbihuKXtTKHRoaXMpLnRvZ2dsZUNsYXNzKHQuY2FsbCh0aGlzLG4sd2UodGhpcyksZSksZSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSxvLGksYTtpZihyKWZvcihvPTAsaT1TKHRoaXMpLGE9a2UodCk7ZT1hW28rK107KWkuaGFzQ2xhc3MoZSk/aS5yZW1vdmVDbGFzcyhlKTppLmFkZENsYXNzKGUpO2Vsc2Ugdm9pZCAwIT09dCYmImJvb2xlYW4iIT09bnx8KChlPXdlKHRoaXMpKSYmUS5zZXQodGhpcywiX19jbGFzc05hbWVfXyIsZSksdGhpcy5zZXRBdHRyaWJ1dGUmJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsZXx8ITE9PT10PyIiOlEuZ2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpKX0pfSxoYXNDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHI9MDtmb3IoZT0iICIrdCsiICI7bj10aGlzW3IrK107KWlmKDE9PT1uLm5vZGVUeXBlJiYoIiAiK3hlKHdlKG4pKSsiICIpLmluZGV4T2YoZSk+LTEpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIFNlPS9cci9nO1MuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG89dGhpc1swXTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1tKHQpLHRoaXMuZWFjaChmdW5jdGlvbihuKXt2YXIgbzsxPT09dGhpcy5ub2RlVHlwZSYmKG51bGw9PShvPXI/dC5jYWxsKHRoaXMsbixTKHRoaXMpLnZhbCgpKTp0KT9vPSIiOiJudW1iZXIiPT10eXBlb2Ygbz9vKz0iIjpBcnJheS5pc0FycmF5KG8pJiYobz1TLm1hcChvLGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOnQrIiJ9KSksKGU9Uy52YWxIb29rc1t0aGlzLnR5cGVdfHxTLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYic2V0ImluIGUmJnZvaWQgMCE9PWUuc2V0KHRoaXMsbywidmFsdWUiKXx8KHRoaXMudmFsdWU9bykpfSkpOm8/KGU9Uy52YWxIb29rc1tvLnR5cGVdfHxTLnZhbEhvb2tzW28ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYiZ2V0ImluIGUmJnZvaWQgMCE9PShuPWUuZ2V0KG8sInZhbHVlIikpP246InN0cmluZyI9PXR5cGVvZihuPW8udmFsdWUpP24ucmVwbGFjZShTZSwiIik6bnVsbD09bj8iIjpuOnZvaWQgMH19KSxTLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlPVMuZmluZC5hdHRyKHQsInZhbHVlIik7cmV0dXJuIG51bGwhPWU/ZTp4ZShTLnRleHQodCkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG89dC5vcHRpb25zLGk9dC5zZWxlY3RlZEluZGV4LGE9InNlbGVjdC1vbmUiPT09dC50eXBlLHM9YT9udWxsOltdLHU9YT9pKzE6by5sZW5ndGg7Zm9yKHI9aTwwP3U6YT9pOjA7cjx1O3IrKylpZigoKG49b1tyXSkuc2VsZWN0ZWR8fHI9PT1pKSYmIW4uZGlzYWJsZWQmJighbi5wYXJlbnROb2RlLmRpc2FibGVkfHwhTChuLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZihlPVMobikudmFsKCksYSlyZXR1cm4gZTtzLnB1c2goZSl9cmV0dXJuIHN9LHNldDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyLG89dC5vcHRpb25zLGk9Uy5tYWtlQXJyYXkoZSksYT1vLmxlbmd0aDthLS07KSgocj1vW2FdKS5zZWxlY3RlZD1TLmluQXJyYXkoUy52YWxIb29rcy5vcHRpb24uZ2V0KHIpLGkpPi0xKSYmKG49ITApO3JldHVybiBufHwodC5zZWxlY3RlZEluZGV4PS0xKSxpfX19fSksUy5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Uy52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKHQsZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gdC5jaGVja2VkPVMuaW5BcnJheShTKHQpLnZhbCgpLGUpPi0xfX0seS5jaGVja09ufHwoUy52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PT10LmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOnQudmFsdWV9KX0pLHkuZm9jdXNpbj0ib25mb2N1c2luImluIG47dmFyIEVlPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxUZT1mdW5jdGlvbih0KXt0LnN0b3BQcm9wYWdhdGlvbigpfTtTLmV4dGVuZChTLmV2ZW50LHt0cmlnZ2VyOmZ1bmN0aW9uKHQsZSxyLG8pe3ZhciBpLHMsdSxjLGwsZixwLGgsZz1bcnx8YV0sdj1kLmNhbGwodCwidHlwZSIpP3QudHlwZTp0LHk9ZC5jYWxsKHQsIm5hbWVzcGFjZSIpP3QubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYocz1oPXU9cj1yfHxhLDMhPT1yLm5vZGVUeXBlJiY4IT09ci5ub2RlVHlwZSYmIUVlLnRlc3QoditTLmV2ZW50LnRyaWdnZXJlZCkmJih2LmluZGV4T2YoIi4iKT4tMSYmKHk9di5zcGxpdCgiLiIpLHY9eS5zaGlmdCgpLHkuc29ydCgpKSxsPXYuaW5kZXhPZigiOiIpPDAmJiJvbiIrdiwodD10W1MuZXhwYW5kb10/dDpuZXcgUy5FdmVudCh2LCJvYmplY3QiPT10eXBlb2YgdCYmdCkpLmlzVHJpZ2dlcj1vPzI6Myx0Lm5hbWVzcGFjZT15LmpvaW4oIi4iKSx0LnJuYW1lc3BhY2U9dC5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIreS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLHQucmVzdWx0PXZvaWQgMCx0LnRhcmdldHx8KHQudGFyZ2V0PXIpLGU9bnVsbD09ZT9bdF06Uy5tYWtlQXJyYXkoZSxbdF0pLHA9Uy5ldmVudC5zcGVjaWFsW3ZdfHx7fSxvfHwhcC50cmlnZ2VyfHwhMSE9PXAudHJpZ2dlci5hcHBseShyLGUpKSl7aWYoIW8mJiFwLm5vQnViYmxlJiYhYihyKSl7Zm9yKGM9cC5kZWxlZ2F0ZVR5cGV8fHYsRWUudGVzdChjK3YpfHwocz1zLnBhcmVudE5vZGUpO3M7cz1zLnBhcmVudE5vZGUpZy5wdXNoKHMpLHU9czt1PT09KHIub3duZXJEb2N1bWVudHx8YSkmJmcucHVzaCh1LmRlZmF1bHRWaWV3fHx1LnBhcmVudFdpbmRvd3x8bil9Zm9yKGk9MDsocz1nW2krK10pJiYhdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpOyloPXMsdC50eXBlPWk+MT9jOnAuYmluZFR5cGV8fHYsKGY9KFEuZ2V0KHMsImV2ZW50cyIpfHx7fSlbdC50eXBlXSYmUS5nZXQocywiaGFuZGxlIikpJiZmLmFwcGx5KHMsZSksKGY9bCYmc1tsXSkmJmYuYXBwbHkmJlgocykmJih0LnJlc3VsdD1mLmFwcGx5KHMsZSksITE9PT10LnJlc3VsdCYmdC5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gdC50eXBlPXYsb3x8dC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8cC5fZGVmYXVsdCYmITEhPT1wLl9kZWZhdWx0LmFwcGx5KGcucG9wKCksZSl8fCFYKHIpfHxsJiZtKHJbdl0pJiYhYihyKSYmKCh1PXJbbF0pJiYocltsXT1udWxsKSxTLmV2ZW50LnRyaWdnZXJlZD12LHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmaC5hZGRFdmVudExpc3RlbmVyKHYsVGUpLHJbdl0oKSx0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmgucmVtb3ZlRXZlbnRMaXN0ZW5lcih2LFRlKSxTLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsdSYmKHJbbF09dSkpLHQucmVzdWx0fX0sc2ltdWxhdGU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPVMuZXh0ZW5kKG5ldyBTLkV2ZW50LG4se3R5cGU6dCxpc1NpbXVsYXRlZDohMH0pO1MuZXZlbnQudHJpZ2dlcihyLG51bGwsZSl9fSksUy5mbi5leHRlbmQoe3RyaWdnZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5ldmVudC50cmlnZ2VyKHQsZSx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXNbMF07aWYobilyZXR1cm4gUy5ldmVudC50cmlnZ2VyKHQsZSxuLCEwKX19KSx5LmZvY3VzaW58fFMuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24odCxlKXt2YXIgbj1mdW5jdGlvbih0KXtTLmV2ZW50LnNpbXVsYXRlKGUsdC50YXJnZXQsUy5ldmVudC5maXgodCkpfTtTLmV2ZW50LnNwZWNpYWxbZV09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLG89US5hY2Nlc3MocixlKTtvfHxyLmFkZEV2ZW50TGlzdGVuZXIodCxuLCEwKSxRLmFjY2VzcyhyLGUsKG98fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciByPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxvPVEuYWNjZXNzKHIsZSktMTtvP1EuYWNjZXNzKHIsZSxvKTooci5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMCksUS5yZW1vdmUocixlKSl9fX0pO3ZhciBqZT1uLmxvY2F0aW9uLEFlPURhdGUubm93KCksT2U9L1w/LztTLnBhcnNlWE1MPWZ1bmN0aW9uKHQpe3ZhciBlO2lmKCF0fHwic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIG51bGw7dHJ5e2U9KG5ldyBuLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsInRleHQveG1sIil9Y2F0Y2godCl7ZT12b2lkIDB9cmV0dXJuIGUmJiFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8Uy5lcnJvcigiSW52YWxpZCBYTUw6ICIrdCksZX07dmFyIENlPS9cW1xdJC8sTGU9L1xyP1xuL2csUmU9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLFBlPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBOZSh0LGUsbixyKXt2YXIgbztpZihBcnJheS5pc0FycmF5KGUpKVMuZWFjaChlLGZ1bmN0aW9uKGUsbyl7bnx8Q2UudGVzdCh0KT9yKHQsbyk6TmUodCsiWyIrKCJvYmplY3QiPT10eXBlb2YgbyYmbnVsbCE9bz9lOiIiKSsiXSIsbyxuLHIpfSk7ZWxzZSBpZihufHwib2JqZWN0IiE9PWsoZSkpcih0LGUpO2Vsc2UgZm9yKG8gaW4gZSlOZSh0KyJbIitvKyJdIixlW29dLG4scil9Uy5wYXJhbT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9W10sbz1mdW5jdGlvbih0LGUpe3ZhciBuPW0oZSk/ZSgpOmU7cltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KHQpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj8iIjpuKX07aWYobnVsbD09dClyZXR1cm4iIjtpZihBcnJheS5pc0FycmF5KHQpfHx0LmpxdWVyeSYmIVMuaXNQbGFpbk9iamVjdCh0KSlTLmVhY2godCxmdW5jdGlvbigpe28odGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IobiBpbiB0KU5lKG4sdFtuXSxlLG8pO3JldHVybiByLmpvaW4oIiYiKX0sUy5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBTLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIHQ9Uy5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIHQ/Uy5tYWtlQXJyYXkodCk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciB0PXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhUyh0aGlzKS5pcygiOmRpc2FibGVkIikmJlBlLnRlc3QodGhpcy5ub2RlTmFtZSkmJiFSZS50ZXN0KHQpJiYodGhpcy5jaGVja2VkfHwhZ3QudGVzdCh0KSl9KS5tYXAoZnVuY3Rpb24odCxlKXt2YXIgbj1TKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1uP251bGw6QXJyYXkuaXNBcnJheShuKT9TLm1hcChuLGZ1bmN0aW9uKHQpe3JldHVybntuYW1lOmUubmFtZSx2YWx1ZTp0LnJlcGxhY2UoTGUsIlxyXG4iKX19KTp7bmFtZTplLm5hbWUsdmFsdWU6bi5yZXBsYWNlKExlLCJcclxuIil9fSkuZ2V0KCl9fSk7dmFyIEllPS8lMjAvZyxEZT0vIy4qJC8sX2U9LyhbPyZdKV89W14mXSovLE1lPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKSQvZ20sVWU9L14oPzpHRVR8SEVBRCkkLyxCZT0vXlwvXC8vLHFlPXt9LEZlPXt9LEhlPSIqLyIuY29uY2F0KCIqIiksemU9YS5jcmVhdGVFbGVtZW50KCJhIik7ZnVuY3Rpb24gV2UodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7InN0cmluZyIhPXR5cGVvZiBlJiYobj1lLGU9IioiKTt2YXIgcixvPTAsaT1lLnRvTG93ZXJDYXNlKCkubWF0Y2goVSl8fFtdO2lmKG0obikpZm9yKDtyPWlbbysrXTspIisiPT09clswXT8ocj1yLnNsaWNlKDEpfHwiKiIsKHRbcl09dFtyXXx8W10pLnVuc2hpZnQobikpOih0W3JdPXRbcl18fFtdKS5wdXNoKG4pfX1mdW5jdGlvbiAkZSh0LGUsbixyKXt2YXIgbz17fSxpPXQ9PT1GZTtmdW5jdGlvbiBhKHMpe3ZhciB1O3JldHVybiBvW3NdPSEwLFMuZWFjaCh0W3NdfHxbXSxmdW5jdGlvbih0LHMpe3ZhciBjPXMoZSxuLHIpO3JldHVybiJzdHJpbmciIT10eXBlb2YgY3x8aXx8b1tjXT9pPyEodT1jKTp2b2lkIDA6KGUuZGF0YVR5cGVzLnVuc2hpZnQoYyksYShjKSwhMSl9KSx1fXJldHVybiBhKGUuZGF0YVR5cGVzWzBdKXx8IW9bIioiXSYmYSgiKiIpfWZ1bmN0aW9uIFllKHQsZSl7dmFyIG4scixvPVMuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiBlKXZvaWQgMCE9PWVbbl0mJigob1tuXT90OnJ8fChyPXt9KSlbbl09ZVtuXSk7cmV0dXJuIHImJlMuZXh0ZW5kKCEwLHQsciksdH16ZS5ocmVmPWplLmhyZWYsUy5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOmplLmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOi9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLnRlc3QoamUucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6SGUsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOlMucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbih0LGUpe3JldHVybiBlP1llKFllKHQsUy5hamF4U2V0dGluZ3MpLGUpOlllKFMuYWpheFNldHRpbmdzLHQpfSxhamF4UHJlZmlsdGVyOldlKHFlKSxhamF4VHJhbnNwb3J0OldlKEZlKSxhamF4OmZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSxlPWV8fHt9O3ZhciByLG8saSxzLHUsYyxsLGYscCxoLGQ9Uy5hamF4U2V0dXAoe30sZSksZz1kLmNvbnRleHR8fGQsdj1kLmNvbnRleHQmJihnLm5vZGVUeXBlfHxnLmpxdWVyeSk/UyhnKTpTLmV2ZW50LHk9Uy5EZWZlcnJlZCgpLG09Uy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksYj1kLnN0YXR1c0NvZGV8fHt9LHg9e30sdz17fSxrPSJjYW5jZWxlZCIsRT17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKHQpe3ZhciBlO2lmKGwpe2lmKCFzKWZvcihzPXt9O2U9TWUuZXhlYyhpKTspc1tlWzFdLnRvTG93ZXJDYXNlKCkrIiAiXT0oc1tlWzFdLnRvTG93ZXJDYXNlKCkrIiAiXXx8W10pLmNvbmNhdChlWzJdKTtlPXNbdC50b0xvd2VyQ2FzZSgpKyIgIl19cmV0dXJuIG51bGw9PWU/bnVsbDplLmpvaW4oIiwgIil9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBsP2k6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1sJiYodD13W3QudG9Mb3dlckNhc2UoKV09d1t0LnRvTG93ZXJDYXNlKCldfHx0LHhbdF09ZSksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09bCYmKGQubWltZVR5cGU9dCksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbih0KXt2YXIgZTtpZih0KWlmKGwpRS5hbHdheXModFtFLnN0YXR1c10pO2Vsc2UgZm9yKGUgaW4gdCliW2VdPVtiW2VdLHRbZV1dO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbih0KXt2YXIgZT10fHxrO3JldHVybiByJiZyLmFib3J0KGUpLFQoMCxlKSx0aGlzfX07aWYoeS5wcm9taXNlKEUpLGQudXJsPSgodHx8ZC51cmx8fGplLmhyZWYpKyIiKS5yZXBsYWNlKEJlLGplLnByb3RvY29sKyIvLyIpLGQudHlwZT1lLm1ldGhvZHx8ZS50eXBlfHxkLm1ldGhvZHx8ZC50eXBlLGQuZGF0YVR5cGVzPShkLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goVSl8fFsiIl0sbnVsbD09ZC5jcm9zc0RvbWFpbil7Yz1hLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7Yy5ocmVmPWQudXJsLGMuaHJlZj1jLmhyZWYsZC5jcm9zc0RvbWFpbj16ZS5wcm90b2NvbCsiLy8iK3plLmhvc3QhPWMucHJvdG9jb2wrIi8vIitjLmhvc3R9Y2F0Y2godCl7ZC5jcm9zc0RvbWFpbj0hMH19aWYoZC5kYXRhJiZkLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGQuZGF0YSYmKGQuZGF0YT1TLnBhcmFtKGQuZGF0YSxkLnRyYWRpdGlvbmFsKSksJGUocWUsZCxlLEUpLGwpcmV0dXJuIEU7Zm9yKHAgaW4oZj1TLmV2ZW50JiZkLmdsb2JhbCkmJjA9PVMuYWN0aXZlKysmJlMuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0IiksZC50eXBlPWQudHlwZS50b1VwcGVyQ2FzZSgpLGQuaGFzQ29udGVudD0hVWUudGVzdChkLnR5cGUpLG89ZC51cmwucmVwbGFjZShEZSwiIiksZC5oYXNDb250ZW50P2QuZGF0YSYmZC5wcm9jZXNzRGF0YSYmMD09PShkLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJihkLmRhdGE9ZC5kYXRhLnJlcGxhY2UoSWUsIisiKSk6KGg9ZC51cmwuc2xpY2Uoby5sZW5ndGgpLGQuZGF0YSYmKGQucHJvY2Vzc0RhdGF8fCJzdHJpbmciPT10eXBlb2YgZC5kYXRhKSYmKG8rPShPZS50ZXN0KG8pPyImIjoiPyIpK2QuZGF0YSxkZWxldGUgZC5kYXRhKSwhMT09PWQuY2FjaGUmJihvPW8ucmVwbGFjZShfZSwiJDEiKSxoPShPZS50ZXN0KG8pPyImIjoiPyIpKyJfPSIrQWUrKytoKSxkLnVybD1vK2gpLGQuaWZNb2RpZmllZCYmKFMubGFzdE1vZGlmaWVkW29dJiZFLnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixTLmxhc3RNb2RpZmllZFtvXSksUy5ldGFnW29dJiZFLnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLFMuZXRhZ1tvXSkpLChkLmRhdGEmJmQuaGFzQ29udGVudCYmITEhPT1kLmNvbnRlbnRUeXBlfHxlLmNvbnRlbnRUeXBlKSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGQuY29udGVudFR5cGUpLEUuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixkLmRhdGFUeXBlc1swXSYmZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXT9kLmFjY2VwdHNbZC5kYXRhVHlwZXNbMF1dKygiKiIhPT1kLmRhdGFUeXBlc1swXT8iLCAiK0hlKyI7IHE9MC4wMSI6IiIpOmQuYWNjZXB0c1siKiJdKSxkLmhlYWRlcnMpRS5zZXRSZXF1ZXN0SGVhZGVyKHAsZC5oZWFkZXJzW3BdKTtpZihkLmJlZm9yZVNlbmQmJighMT09PWQuYmVmb3JlU2VuZC5jYWxsKGcsRSxkKXx8bCkpcmV0dXJuIEUuYWJvcnQoKTtpZihrPSJhYm9ydCIsbS5hZGQoZC5jb21wbGV0ZSksRS5kb25lKGQuc3VjY2VzcyksRS5mYWlsKGQuZXJyb3IpLHI9JGUoRmUsZCxlLEUpKXtpZihFLnJlYWR5U3RhdGU9MSxmJiZ2LnRyaWdnZXIoImFqYXhTZW5kIixbRSxkXSksbClyZXR1cm4gRTtkLmFzeW5jJiZkLnRpbWVvdXQ+MCYmKHU9bi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7RS5hYm9ydCgidGltZW91dCIpfSxkLnRpbWVvdXQpKTt0cnl7bD0hMSxyLnNlbmQoeCxUKX1jYXRjaCh0KXtpZihsKXRocm93IHQ7VCgtMSx0KX19ZWxzZSBUKC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiBUKHQsZSxhLHMpe3ZhciBjLHAsaCx4LHcsaz1lO2x8fChsPSEwLHUmJm4uY2xlYXJUaW1lb3V0KHUpLHI9dm9pZCAwLGk9c3x8IiIsRS5yZWFkeVN0YXRlPXQ+MD80OjAsYz10Pj0yMDAmJnQ8MzAwfHwzMDQ9PT10LGEmJih4PWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHIsbyxpLGEscz10LmNvbnRlbnRzLHU9dC5kYXRhVHlwZXM7IioiPT09dVswXTspdS5zaGlmdCgpLHZvaWQgMD09PXImJihyPXQubWltZVR5cGV8fGUuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihyKWZvcihvIGluIHMpaWYoc1tvXSYmc1tvXS50ZXN0KHIpKXt1LnVuc2hpZnQobyk7YnJlYWt9aWYodVswXWluIG4paT11WzBdO2Vsc2V7Zm9yKG8gaW4gbil7aWYoIXVbMF18fHQuY29udmVydGVyc1tvKyIgIit1WzBdXSl7aT1vO2JyZWFrfWF8fChhPW8pfWk9aXx8YX1pZihpKXJldHVybiBpIT09dVswXSYmdS51bnNoaWZ0KGkpLG5baV19KGQsRSxhKSkseD1mdW5jdGlvbih0LGUsbixyKXt2YXIgbyxpLGEscyx1LGM9e30sbD10LmRhdGFUeXBlcy5zbGljZSgpO2lmKGxbMV0pZm9yKGEgaW4gdC5jb252ZXJ0ZXJzKWNbYS50b0xvd2VyQ2FzZSgpXT10LmNvbnZlcnRlcnNbYV07Zm9yKGk9bC5zaGlmdCgpO2k7KWlmKHQucmVzcG9uc2VGaWVsZHNbaV0mJihuW3QucmVzcG9uc2VGaWVsZHNbaV1dPWUpLCF1JiZyJiZ0LmRhdGFGaWx0ZXImJihlPXQuZGF0YUZpbHRlcihlLHQuZGF0YVR5cGUpKSx1PWksaT1sLnNoaWZ0KCkpaWYoIioiPT09aSlpPXU7ZWxzZSBpZigiKiIhPT11JiZ1IT09aSl7aWYoIShhPWNbdSsiICIraV18fGNbIiogIitpXSkpZm9yKG8gaW4gYylpZigocz1vLnNwbGl0KCIgIikpWzFdPT09aSYmKGE9Y1t1KyIgIitzWzBdXXx8Y1siKiAiK3NbMF1dKSl7ITA9PT1hP2E9Y1tvXTohMCE9PWNbb10mJihpPXNbMF0sbC51bnNoaWZ0KHNbMV0pKTticmVha31pZighMCE9PWEpaWYoYSYmdC50aHJvd3MpZT1hKGUpO2Vsc2UgdHJ5e2U9YShlKX1jYXRjaCh0KXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjphP3Q6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK3UrIiB0byAiK2l9fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6ZX19KGQseCxFLGMpLGM/KGQuaWZNb2RpZmllZCYmKCh3PUUuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSkmJihTLmxhc3RNb2RpZmllZFtvXT13KSwodz1FLmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIikpJiYoUy5ldGFnW29dPXcpKSwyMDQ9PT10fHwiSEVBRCI9PT1kLnR5cGU/az0ibm9jb250ZW50IjozMDQ9PT10P2s9Im5vdG1vZGlmaWVkIjooaz14LnN0YXRlLHA9eC5kYXRhLGM9IShoPXguZXJyb3IpKSk6KGg9aywhdCYma3x8KGs9ImVycm9yIix0PDAmJih0PTApKSksRS5zdGF0dXM9dCxFLnN0YXR1c1RleHQ9KGV8fGspKyIiLGM/eS5yZXNvbHZlV2l0aChnLFtwLGssRV0pOnkucmVqZWN0V2l0aChnLFtFLGssaF0pLEUuc3RhdHVzQ29kZShiKSxiPXZvaWQgMCxmJiZ2LnRyaWdnZXIoYz8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFtFLGQsYz9wOmhdKSxtLmZpcmVXaXRoKGcsW0Usa10pLGYmJih2LnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW0UsZF0pLC0tUy5hY3RpdmV8fFMuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiBFfSxnZXRKU09OOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUy5nZXQodCxlLG4sImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFMuZ2V0KHQsdm9pZCAwLGUsInNjcmlwdCIpfX0pLFMuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbih0LGUpe1NbZV09ZnVuY3Rpb24odCxuLHIsbyl7cmV0dXJuIG0obikmJihvPW98fHIscj1uLG49dm9pZCAwKSxTLmFqYXgoUy5leHRlbmQoe3VybDp0LHR5cGU6ZSxkYXRhVHlwZTpvLGRhdGE6bixzdWNjZXNzOnJ9LFMuaXNQbGFpbk9iamVjdCh0KSYmdCkpfX0pLFMuX2V2YWxVcmw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gUy5hamF4KHt1cmw6dCx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKCl7fX0sZGF0YUZpbHRlcjpmdW5jdGlvbih0KXtTLmdsb2JhbEV2YWwodCxlKX19KX0sUy5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIHRoaXNbMF0mJihtKHQpJiYodD10LmNhbGwodGhpc1swXSkpLGU9Uyh0LHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApLHRoaXNbMF0ucGFyZW50Tm9kZSYmZS5pbnNlcnRCZWZvcmUodGhpc1swXSksZS5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpczt0LmZpcnN0RWxlbWVudENoaWxkOyl0PXQuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIHR9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbih0KXtyZXR1cm4gbSh0KT90aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS53cmFwSW5uZXIodC5jYWxsKHRoaXMsZSkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9Uyh0aGlzKSxuPWUuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwodCk6ZS5hcHBlbmQodCl9KX0sd3JhcDpmdW5jdGlvbih0KXt2YXIgZT1tKHQpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24obil7Uyh0aGlzKS53cmFwQWxsKGU/dC5jYWxsKHRoaXMsbik6dCl9KX0sdW53cmFwOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnBhcmVudCh0KS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7Uyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSxTLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24odCl7cmV0dXJuIVMuZXhwci5wc2V1ZG9zLnZpc2libGUodCl9LFMuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24odCl7cmV0dXJuISEodC5vZmZzZXRXaWR0aHx8dC5vZmZzZXRIZWlnaHR8fHQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxTLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBuLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKHQpe319O3ZhciBWZT17MDoyMDAsMTIyMzoyMDR9LEdlPVMuYWpheFNldHRpbmdzLnhocigpO3kuY29ycz0hIUdlJiYid2l0aENyZWRlbnRpYWxzImluIEdlLHkuYWpheD1HZT0hIUdlLFMuYWpheFRyYW5zcG9ydChmdW5jdGlvbih0KXt2YXIgZSxyO2lmKHkuY29yc3x8R2UmJiF0LmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKG8saSl7dmFyIGEscz10LnhocigpO2lmKHMub3Blbih0LnR5cGUsdC51cmwsdC5hc3luYyx0LnVzZXJuYW1lLHQucGFzc3dvcmQpLHQueGhyRmllbGRzKWZvcihhIGluIHQueGhyRmllbGRzKXNbYV09dC54aHJGaWVsZHNbYV07Zm9yKGEgaW4gdC5taW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUodC5taW1lVHlwZSksdC5jcm9zc0RvbWFpbnx8b1siWC1SZXF1ZXN0ZWQtV2l0aCJdfHwob1siWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpLG8pcy5zZXRSZXF1ZXN0SGVhZGVyKGEsb1thXSk7ZT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtlJiYoZT1yPXMub25sb2FkPXMub25lcnJvcj1zLm9uYWJvcnQ9cy5vbnRpbWVvdXQ9cy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09dD9zLmFib3J0KCk6ImVycm9yIj09PXQ/Im51bWJlciIhPXR5cGVvZiBzLnN0YXR1cz9pKDAsImVycm9yIik6aShzLnN0YXR1cyxzLnN0YXR1c1RleHQpOmkoVmVbcy5zdGF0dXNdfHxzLnN0YXR1cyxzLnN0YXR1c1RleHQsInRleHQiIT09KHMucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIHMucmVzcG9uc2VUZXh0P3tiaW5hcnk6cy5yZXNwb25zZX06e3RleHQ6cy5yZXNwb25zZVRleHR9LHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHMub25sb2FkPWUoKSxyPXMub25lcnJvcj1zLm9udGltZW91dD1lKCJlcnJvciIpLHZvaWQgMCE9PXMub25hYm9ydD9zLm9uYWJvcnQ9cjpzLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1zLnJlYWR5U3RhdGUmJm4uc2V0VGltZW91dChmdW5jdGlvbigpe2UmJnIoKX0pfSxlPWUoImFib3J0Iik7dHJ5e3Muc2VuZCh0Lmhhc0NvbnRlbnQmJnQuZGF0YXx8bnVsbCl9Y2F0Y2godCl7aWYoZSl0aHJvdyB0fX0sYWJvcnQ6ZnVuY3Rpb24oKXtlJiZlKCl9fX0pLFMuYWpheFByZWZpbHRlcihmdW5jdGlvbih0KXt0LmNyb3NzRG9tYWluJiYodC5jb250ZW50cy5zY3JpcHQ9ITEpfSksUy5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24odCl7cmV0dXJuIFMuZ2xvYmFsRXZhbCh0KSx0fX19KSxTLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24odCl7dm9pZCAwPT09dC5jYWNoZSYmKHQuY2FjaGU9ITEpLHQuY3Jvc3NEb21haW4mJih0LnR5cGU9IkdFVCIpfSksUy5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKHQpe3ZhciBlLG47aWYodC5jcm9zc0RvbWFpbnx8dC5zY3JpcHRBdHRycylyZXR1cm57c2VuZDpmdW5jdGlvbihyLG8pe2U9UygiPHNjcmlwdD4iKS5hdHRyKHQuc2NyaXB0QXR0cnN8fHt9KS5wcm9wKHtjaGFyc2V0OnQuc2NyaXB0Q2hhcnNldCxzcmM6dC51cmx9KS5vbigibG9hZCBlcnJvciIsbj1mdW5jdGlvbih0KXtlLnJlbW92ZSgpLG49bnVsbCx0JiZvKCJlcnJvciI9PT10LnR5cGU/NDA0OjIwMCx0LnR5cGUpfSksYS5oZWFkLmFwcGVuZENoaWxkKGVbMF0pfSxhYm9ydDpmdW5jdGlvbigpe24mJm4oKX19fSk7dmFyIEtlLFhlPVtdLEplPS8oPSlcPyg/PSZ8JCl8XD9cPy87Uy5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciB0PVhlLnBvcCgpfHxTLmV4cGFuZG8rIl8iK0FlKys7cmV0dXJuIHRoaXNbdF09ITAsdH19KSxTLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKHQsZSxyKXt2YXIgbyxpLGEscz0hMSE9PXQuanNvbnAmJihKZS50ZXN0KHQudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIHQuZGF0YSYmMD09PSh0LmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJkplLnRlc3QodC5kYXRhKSYmImRhdGEiKTtpZihzfHwianNvbnAiPT09dC5kYXRhVHlwZXNbMF0pcmV0dXJuIG89dC5qc29ucENhbGxiYWNrPW0odC5qc29ucENhbGxiYWNrKT90Lmpzb25wQ2FsbGJhY2soKTp0Lmpzb25wQ2FsbGJhY2sscz90W3NdPXRbc10ucmVwbGFjZShKZSwiJDEiK28pOiExIT09dC5qc29ucCYmKHQudXJsKz0oT2UudGVzdCh0LnVybCk/IiYiOiI/IikrdC5qc29ucCsiPSIrbyksdC5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIGF8fFMuZXJyb3IobysiIHdhcyBub3QgY2FsbGVkIiksYVswXX0sdC5kYXRhVHlwZXNbMF09Impzb24iLGk9bltvXSxuW29dPWZ1bmN0aW9uKCl7YT1hcmd1bWVudHN9LHIuYWx3YXlzKGZ1bmN0aW9uKCl7dm9pZCAwPT09aT9TKG4pLnJlbW92ZVByb3Aobyk6bltvXT1pLHRbb10mJih0Lmpzb25wQ2FsbGJhY2s9ZS5qc29ucENhbGxiYWNrLFhlLnB1c2gobykpLGEmJm0oaSkmJmkoYVswXSksYT1pPXZvaWQgMH0pLCJzY3JpcHQifSkseS5jcmVhdGVIVE1MRG9jdW1lbnQ9KChLZT1hLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikuYm9keSkuaW5uZXJIVE1MPSI8Zm9ybT48L2Zvcm0+PGZvcm0+PC9mb3JtPiIsMj09PUtlLmNoaWxkTm9kZXMubGVuZ3RoKSxTLnBhcnNlSFRNTD1mdW5jdGlvbih0LGUsbil7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0P1tdOigiYm9vbGVhbiI9PXR5cGVvZiBlJiYobj1lLGU9ITEpLGV8fCh5LmNyZWF0ZUhUTUxEb2N1bWVudD8oKHI9KGU9YS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpKS5jcmVhdGVFbGVtZW50KCJiYXNlIikpLmhyZWY9YS5sb2NhdGlvbi5ocmVmLGUuaGVhZC5hcHBlbmRDaGlsZChyKSk6ZT1hKSxpPSFuJiZbXSwobz1SLmV4ZWModCkpP1tlLmNyZWF0ZUVsZW1lbnQob1sxXSldOihvPUV0KFt0XSxlLGkpLGkmJmkubGVuZ3RoJiZTKGkpLnJlbW92ZSgpLFMubWVyZ2UoW10sby5jaGlsZE5vZGVzKSkpO3ZhciByLG8saX0sUy5mbi5sb2FkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYT10aGlzLHM9dC5pbmRleE9mKCIgIik7cmV0dXJuIHM+LTEmJihyPXhlKHQuc2xpY2UocykpLHQ9dC5zbGljZSgwLHMpKSxtKGUpPyhuPWUsZT12b2lkIDApOmUmJiJvYmplY3QiPT10eXBlb2YgZSYmKG89IlBPU1QiKSxhLmxlbmd0aD4wJiZTLmFqYXgoe3VybDp0LHR5cGU6b3x8IkdFVCIsZGF0YVR5cGU6Imh0bWwiLGRhdGE6ZX0pLmRvbmUoZnVuY3Rpb24odCl7aT1hcmd1bWVudHMsYS5odG1sKHI/UygiPGRpdj4iKS5hcHBlbmQoUy5wYXJzZUhUTUwodCkpLmZpbmQocik6dCl9KS5hbHdheXMobiYmZnVuY3Rpb24odCxlKXthLmVhY2goZnVuY3Rpb24oKXtuLmFwcGx5KHRoaXMsaXx8W3QucmVzcG9uc2VUZXh0LGUsdF0pfSl9KSx0aGlzfSxTLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbih0LGUpe1MuZm5bZV09ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub24oZSx0KX19KSxTLmV4cHIucHNldWRvcy5hbmltYXRlZD1mdW5jdGlvbih0KXtyZXR1cm4gUy5ncmVwKFMudGltZXJzLGZ1bmN0aW9uKGUpe3JldHVybiB0PT09ZS5lbGVtfSkubGVuZ3RofSxTLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYSxzLHUsYz1TLmNzcyh0LCJwb3NpdGlvbiIpLGw9Uyh0KSxmPXt9OyJzdGF0aWMiPT09YyYmKHQuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikscz1sLm9mZnNldCgpLGk9Uy5jc3ModCwidG9wIiksdT1TLmNzcyh0LCJsZWZ0IiksKCJhYnNvbHV0ZSI9PT1jfHwiZml4ZWQiPT09YykmJihpK3UpLmluZGV4T2YoImF1dG8iKT4tMT8oYT0ocj1sLnBvc2l0aW9uKCkpLnRvcCxvPXIubGVmdCk6KGE9cGFyc2VGbG9hdChpKXx8MCxvPXBhcnNlRmxvYXQodSl8fDApLG0oZSkmJihlPWUuY2FsbCh0LG4sUy5leHRlbmQoe30scykpKSxudWxsIT1lLnRvcCYmKGYudG9wPWUudG9wLXMudG9wK2EpLG51bGwhPWUubGVmdCYmKGYubGVmdD1lLmxlZnQtcy5sZWZ0K28pLCJ1c2luZyJpbiBlP2UudXNpbmcuY2FsbCh0LGYpOmwuY3NzKGYpfX0sUy5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbih0KXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1Mub2Zmc2V0LnNldE9mZnNldCh0aGlzLHQsZSl9KTt2YXIgZSxuLHI9dGhpc1swXTtyZXR1cm4gcj9yLmdldENsaWVudFJlY3RzKCkubGVuZ3RoPyhlPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1yLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcse3RvcDplLnRvcCtuLnBhZ2VZT2Zmc2V0LGxlZnQ6ZS5sZWZ0K24ucGFnZVhPZmZzZXR9KTp7dG9wOjAsbGVmdDowfTp2b2lkIDB9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIHQsZSxuLHI9dGhpc1swXSxvPXt0b3A6MCxsZWZ0OjB9O2lmKCJmaXhlZCI9PT1TLmNzcyhyLCJwb3NpdGlvbiIpKWU9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle2ZvcihlPXRoaXMub2Zmc2V0KCksbj1yLm93bmVyRG9jdW1lbnQsdD1yLm9mZnNldFBhcmVudHx8bi5kb2N1bWVudEVsZW1lbnQ7dCYmKHQ9PT1uLmJvZHl8fHQ9PT1uLmRvY3VtZW50RWxlbWVudCkmJiJzdGF0aWMiPT09Uy5jc3ModCwicG9zaXRpb24iKTspdD10LnBhcmVudE5vZGU7dCYmdCE9PXImJjE9PT10Lm5vZGVUeXBlJiYoKG89Uyh0KS5vZmZzZXQoKSkudG9wKz1TLmNzcyh0LCJib3JkZXJUb3BXaWR0aCIsITApLG8ubGVmdCs9Uy5jc3ModCwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpfXJldHVybnt0b3A6ZS50b3Atby50b3AtUy5jc3MociwibWFyZ2luVG9wIiwhMCksbGVmdDplLmxlZnQtby5sZWZ0LVMuY3NzKHIsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5vZmZzZXRQYXJlbnQ7dCYmInN0YXRpYyI9PT1TLmNzcyh0LCJwb3NpdGlvbiIpOyl0PXQub2Zmc2V0UGFyZW50O3JldHVybiB0fHxhdH0pfX0pLFMuZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbih0LGUpe3ZhciBuPSJwYWdlWU9mZnNldCI9PT1lO1MuZm5bdF09ZnVuY3Rpb24ocil7cmV0dXJuICQodGhpcyxmdW5jdGlvbih0LHIsbyl7dmFyIGk7aWYoYih0KT9pPXQ6OT09PXQubm9kZVR5cGUmJihpPXQuZGVmYXVsdFZpZXcpLHZvaWQgMD09PW8pcmV0dXJuIGk/aVtlXTp0W3JdO2k/aS5zY3JvbGxUbyhuP2kucGFnZVhPZmZzZXQ6byxuP286aS5wYWdlWU9mZnNldCk6dFtyXT1vfSx0LHIsYXJndW1lbnRzLmxlbmd0aCl9fSksUy5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKHQsZSl7Uy5jc3NIb29rc1tlXT1HdCh5LnBpeGVsUG9zaXRpb24sZnVuY3Rpb24odCxuKXtpZihuKXJldHVybiBuPVZ0KHQsZSksV3QudGVzdChuKT9TKHQpLnBvc2l0aW9uKClbZV0rInB4IjpufSl9KSxTLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbih0LGUpe1MuZWFjaCh7cGFkZGluZzoiaW5uZXIiK3QsY29udGVudDplLCIiOiJvdXRlciIrdH0sZnVuY3Rpb24obixyKXtTLmZuW3JdPWZ1bmN0aW9uKG8saSl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aCYmKG58fCJib29sZWFuIiE9dHlwZW9mIG8pLHM9bnx8KCEwPT09b3x8ITA9PT1pPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUsbixvKXt2YXIgaTtyZXR1cm4gYihlKT8wPT09ci5pbmRleE9mKCJvdXRlciIpP2VbImlubmVyIit0XTplLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50Iit0XTo5PT09ZS5ub2RlVHlwZT8oaT1lLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChlLmJvZHlbInNjcm9sbCIrdF0saVsic2Nyb2xsIit0XSxlLmJvZHlbIm9mZnNldCIrdF0saVsib2Zmc2V0Iit0XSxpWyJjbGllbnQiK3RdKSk6dm9pZCAwPT09bz9TLmNzcyhlLG4scyk6Uy5zdHlsZShlLG4sbyxzKX0sZSxhP286dm9pZCAwLGEpfX0pfSksUy5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKHQsZSl7Uy5mbltlXT1mdW5jdGlvbih0LG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbihlLG51bGwsdCxuKTp0aGlzLnRyaWdnZXIoZSl9fSksUy5mbi5leHRlbmQoe2hvdmVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubW91c2VlbnRlcih0KS5tb3VzZWxlYXZlKGV8fHQpfX0pLFMuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5vbih0LG51bGwsZSxuKX0sdW5iaW5kOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMub2ZmKHQsbnVsbCxlKX0sZGVsZWdhdGU6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHRoaXMub24oZSx0LG4scil9LHVuZGVsZWdhdGU6ZnVuY3Rpb24odCxlLG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZih0LCIqKiIpOnRoaXMub2ZmKGUsdHx8IioqIixuKX19KSxTLnByb3h5PWZ1bmN0aW9uKHQsZSl7dmFyIG4scixvO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmKG49dFtlXSxlPXQsdD1uKSxtKHQpKXJldHVybiByPXUuY2FsbChhcmd1bWVudHMsMiksKG89ZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlfHx0aGlzLHIuY29uY2F0KHUuY2FsbChhcmd1bWVudHMpKSl9KS5ndWlkPXQuZ3VpZD10Lmd1aWR8fFMuZ3VpZCsrLG99LFMuaG9sZFJlYWR5PWZ1bmN0aW9uKHQpe3Q/Uy5yZWFkeVdhaXQrKzpTLnJlYWR5KCEwKX0sUy5pc0FycmF5PUFycmF5LmlzQXJyYXksUy5wYXJzZUpTT049SlNPTi5wYXJzZSxTLm5vZGVOYW1lPUwsUy5pc0Z1bmN0aW9uPW0sUy5pc1dpbmRvdz1iLFMuY2FtZWxDYXNlPUssUy50eXBlPWssUy5ub3c9RGF0ZS5ub3csUy5pc051bWVyaWM9ZnVuY3Rpb24odCl7dmFyIGU9Uy50eXBlKHQpO3JldHVybigibnVtYmVyIj09PWV8fCJzdHJpbmciPT09ZSkmJiFpc05hTih0LXBhcnNlRmxvYXQodCkpfSx2b2lkIDA9PT0ocj1mdW5jdGlvbigpe3JldHVybiBTfS5hcHBseShlLFtdKSl8fCh0LmV4cG9ydHM9cik7dmFyIFFlPW4ualF1ZXJ5LFplPW4uJDtyZXR1cm4gUy5ub0NvbmZsaWN0PWZ1bmN0aW9uKHQpe3JldHVybiBuLiQ9PT1TJiYobi4kPVplKSx0JiZuLmpRdWVyeT09PVMmJihuLmpRdWVyeT1RZSksU30sb3x8KG4ualF1ZXJ5PW4uJD1TKSxTfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDEpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQyKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0OCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI1Mik7ZnVuY3Rpb24gbyh0LGUsbixvLGksYSxzKXt0cnl7dmFyIHU9dFthXShzKSxjPXUudmFsdWV9Y2F0Y2godCl7cmV0dXJuIHZvaWQgbih0KX11LmRvbmU/ZShjKTpyLnJlc29sdmUoYykudGhlbihvLGkpfXQuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49YXJndW1lbnRzO3JldHVybiBuZXcgcihmdW5jdGlvbihyLGkpe3ZhciBhPXQuYXBwbHkoZSxuKTtmdW5jdGlvbiBzKHQpe28oYSxyLGkscyx1LCJuZXh0Iix0KX1mdW5jdGlvbiB1KHQpe28oYSxyLGkscyx1LCJ0aHJvdyIsdCl9cyh2b2lkIDApfSl9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjY0KS5kZWZhdWx0O3QuZXhwb3J0cz1yLHQuZXhwb3J0cy5kZWZhdWx0PXJ9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyOTgpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCJcXCQmIil9ci5wcm90bz1mdW5jdGlvbigpe3JldHVybiBSZWdFeHAuZXNjYXBlPXIscn0sdC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMzcpfSxmdW5jdGlvbih0LGUsbil7bigxMzgpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuUmVmbGVjdC5jb25zdHJ1Y3R9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigzMiksaT1uKDIyKSxhPW4oMTEpLHM9big2KSx1PW4oNDYpLGM9big5MSksbD1uKDUpLGY9bygiUmVmbGVjdCIsImNvbnN0cnVjdCIpLHA9bChmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIShmKGZ1bmN0aW9uKCl7fSxbXSx0KWluc3RhbmNlb2YgdCl9KSxoPSFsKGZ1bmN0aW9uKCl7ZihmdW5jdGlvbigpe30pfSksZD1wfHxoO3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMCxmb3JjZWQ6ZCxzaGFtOmR9LHtjb25zdHJ1Y3Q6ZnVuY3Rpb24odCxlKXtpKHQpLGEoZSk7dmFyIG49YXJndW1lbnRzLmxlbmd0aDwzP3Q6aShhcmd1bWVudHNbMl0pO2lmKGgmJiFwKXJldHVybiBmKHQsZSxuKTtpZih0PT1uKXtzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlWzBdKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSk7Y2FzZSAzOnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSk7Y2FzZSA0OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdKX12YXIgcj1bbnVsbF07cmV0dXJuIHIucHVzaC5hcHBseShyLGUpLG5ldyhjLmFwcGx5KHQscikpfXZhciBvPW4ucHJvdG90eXBlLGw9dShzKG8pP286T2JqZWN0LnByb3RvdHlwZSksZD1GdW5jdGlvbi5hcHBseS5jYWxsKHQsbCxlKTtyZXR1cm4gcyhkKT9kOmx9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKSxvPW4oMjMpLGk9bigxMSksYT1uKDU1KTt0LmV4cG9ydHM9cj9PYmplY3QuZGVmaW5lUHJvcGVydGllczpmdW5jdGlvbih0LGUpe2kodCk7Zm9yKHZhciBuLHI9YShlKSxzPXIubGVuZ3RoLHU9MDtzPnU7KW8uZih0LG49clt1KytdLGVbbl0pO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCksbz1uKDE3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt0cnl7byhyLHQsZSl9Y2F0Y2gobil7clt0XT1lfXJldHVybiBlfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE0Mil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEpLG89ci5KU09OfHwoci5KU09OPXtzdHJpbmdpZnk6SlNPTi5zdHJpbmdpZnl9KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG8uc3RyaW5naWZ5LmFwcGx5KG8sYXJndW1lbnRzKX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNDQpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDUpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmNvbmNhdDtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8uY29uY2F0P3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDkyKTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5jb25jYXR9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNDcpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDgpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10Lm1hcDtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8ubWFwP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDE0OSk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIkFycmF5IikubWFwfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDczKS5tYXA7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFuKDcyKSgibWFwIil9LHttYXA6ZnVuY3Rpb24odCl7cmV0dXJuIG8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE1MSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNTIpfSxmdW5jdGlvbih0LGUsbil7bigxNTMpO3ZhciByPW4oMSkuT2JqZWN0LG89dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gci5kZWZpbmVQcm9wZXJ0eSh0LGUsbil9O3IuZGVmaW5lUHJvcGVydHkuc2hhbSYmKG8uc2hhbT0hMCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigxMyk7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFvLHNoYW06IW99LHtkZWZpbmVQcm9wZXJ0eTpuKDIzKS5mfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNTUpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTU2KX0sZnVuY3Rpb24odCxlLG4pe24oMTU3KTt2YXIgcj1uKDEpLk9iamVjdCxvPXQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiByLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpfTtyLmdldE93blByb3BlcnR5RGVzY3JpcHRvci5zaGFtJiYoby5zaGFtPSEwKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDUpLGk9bigyMSksYT1uKDQ0KS5mLHM9bigxMyksdT1vKGZ1bmN0aW9uKCl7YSgxKX0pO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDohc3x8dSxzaGFtOiFzfSx7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGEoaSh0KSxlKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE1OSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjApfSxmdW5jdGlvbih0LGUsbil7bigxNjEpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuUmVmbGVjdC5nZXR9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big2KSxpPW4oMTEpLGE9bigxNCkscz1uKDQ0KSx1PW4oNDgpO3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMH0se2dldDpmdW5jdGlvbiB0KGUsbil7dmFyIHIsYyxsPWFyZ3VtZW50cy5sZW5ndGg8Mz9lOmFyZ3VtZW50c1syXTtyZXR1cm4gaShlKT09PWw/ZVtuXToocj1zLmYoZSxuKSk/YShyLCJ2YWx1ZSIpP3IudmFsdWU6dm9pZCAwPT09ci5nZXQ/dm9pZCAwOnIuZ2V0LmNhbGwobCk6byhjPXUoZSkpP3QoYyxuLGwpOnZvaWQgMH19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Zvcig7IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpJiZudWxsIT09KHQ9cih0KSk7KTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjQpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTY1KX0sZnVuY3Rpb24odCxlLG4pe24oMTY2KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLk9iamVjdC5nZXRQcm90b3R5cGVPZn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDUpLGk9bigyNCksYT1uKDQ4KSxzPW4oOTUpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpvKGZ1bmN0aW9uKCl7YSgxKX0pLHNoYW06IXN9LHtnZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gYShpKHQpKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE2OCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE2OSk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3Quc2V0UHJvdG90eXBlT2Z9LGZ1bmN0aW9uKHQsZSxuKXtuKDApKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMH0se3NldFByb3RvdHlwZU9mOm4oNzQpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighcih0KSYmbnVsbCE9PXQpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBzZXQgIitTdHJpbmcodCkrIiBhcyBhIHByb3RvdHlwZSIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE3Mil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzMpfSxmdW5jdGlvbih0LGUsbil7bigxNzQpO3ZhciByPW4oMSkuT2JqZWN0O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiByLmNyZWF0ZSh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe24oMCkoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLHNoYW06IW4oMTMpfSx7Y3JlYXRlOm4oNDYpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDk2KTtmdW5jdGlvbiBvKGUsbil7cmV0dXJuIHQuZXhwb3J0cz1vPXJ8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0sbyhlLG4pfXQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNzcpLG89bigxMDIpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQuZXhwb3J0cz1pPSJmdW5jdGlvbiI9PXR5cGVvZiBvJiYic3ltYm9sIj09dHlwZW9mIHI/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIG8mJnQuY29uc3RydWN0b3I9PT1vJiZ0IT09by5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LGkoZSl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzgpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTc5KX0sZnVuY3Rpb24odCxlLG4pe24oOTcpLG4oMzQpLG4oNTApO3ZhciByPW4oNzUpO3QuZXhwb3J0cz1yLmYoIml0ZXJhdG9yIil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY4KSxvPW4oNDUpLGk9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGksYSxzPVN0cmluZyhvKGUpKSx1PXIobiksYz1zLmxlbmd0aDtyZXR1cm4gdTwwfHx1Pj1jP3Q/IiI6dm9pZCAwOihpPXMuY2hhckNvZGVBdCh1KSk8NTUyOTZ8fGk+NTYzMTl8fHUrMT09PWN8fChhPXMuY2hhckNvZGVBdCh1KzEpKTw1NjMyMHx8YT41NzM0Mz90P3MuY2hhckF0KHUpOmk6dD9zLnNsaWNlKHUsdSsyKTphLTU2MzIwKyhpLTU1Mjk2PDwxMCkrNjU1MzZ9fTt0LmV4cG9ydHM9e2NvZGVBdDppKCExKSxjaGFyQXQ6aSghMCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KSxvPW4oMTgyKSxpPXIuV2Vha01hcDt0LmV4cG9ydHM9ImZ1bmN0aW9uIj09dHlwZW9mIGkmJi9uYXRpdmUgY29kZS8udGVzdChvLmNhbGwoaSkpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1OCk7dC5leHBvcnRzPXIoIm5hdGl2ZS1mdW5jdGlvbi10by1zdHJpbmciLEZ1bmN0aW9uLnRvU3RyaW5nKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDc2KSxvPXt9O29bbigyKSgidG9TdHJpbmdUYWciKV09InoiLHQuZXhwb3J0cz0iW29iamVjdCB6XSIhPT1TdHJpbmcobyk/ZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCAiK3IodGhpcykrIl0ifTpvLnRvU3RyaW5nfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17Q1NTUnVsZUxpc3Q6MCxDU1NTdHlsZURlY2xhcmF0aW9uOjAsQ1NTVmFsdWVMaXN0OjAsQ2xpZW50UmVjdExpc3Q6MCxET01SZWN0TGlzdDowLERPTVN0cmluZ0xpc3Q6MCxET01Ub2tlbkxpc3Q6MSxEYXRhVHJhbnNmZXJJdGVtTGlzdDowLEZpbGVMaXN0OjAsSFRNTEFsbENvbGxlY3Rpb246MCxIVE1MQ29sbGVjdGlvbjowLEhUTUxGb3JtRWxlbWVudDowLEhUTUxTZWxlY3RFbGVtZW50OjAsTWVkaWFMaXN0OjAsTWltZVR5cGVBcnJheTowLE5hbWVkTm9kZU1hcDowLE5vZGVMaXN0OjEsUGFpbnRSZXF1ZXN0TGlzdDowLFBsdWdpbjowLFBsdWdpbkFycmF5OjAsU1ZHTGVuZ3RoTGlzdDowLFNWR051bWJlckxpc3Q6MCxTVkdQYXRoU2VnTGlzdDowLFNWR1BvaW50TGlzdDowLFNWR1N0cmluZ0xpc3Q6MCxTVkdUcmFuc2Zvcm1MaXN0OjAsU291cmNlQnVmZmVyTGlzdDowLFN0eWxlU2hlZXRMaXN0OjAsVGV4dFRyYWNrQ3VlTGlzdDowLFRleHRUcmFja0xpc3Q6MCxUb3VjaExpc3Q6MH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMDMpLG4oMjAzKSxuKDIwNCksbigyMDUpLG4oMjA2KSxuKDIwNyl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNCksaT1uKDI3KSxhPW4oMTMpLHM9big5NCksdT1uKDUpLGM9bigxNCksbD1uKDQ3KSxmPW4oNikscD1uKDExKSxoPW4oMjQpLGQ9bigyMSksZz1uKDU0KSx2PW4oMzApLHk9big0NiksbT1uKDU1KSxiPW4oMTA1KSx4PW4oMTg3KSx3PW4oMTA2KSxrPW4oNDQpLFM9bigyMyksRT1uKDY0KSxUPW4oMTcpLGo9bigzNSksQT1uKDU4KSxPPW4oNTcpLEM9big1NiksTD1uKDcwKSxSPW4oMiksUD1uKDc1KSxOPW4oMyksST1uKDI4KSxEPW4oNDkpLF89big3MykuZm9yRWFjaCxNPU8oImhpZGRlbiIpLFU9UigidG9QcmltaXRpdmUiKSxCPUQuc2V0LHE9RC5nZXR0ZXJGb3IoIlN5bWJvbCIpLEY9T2JqZWN0LnByb3RvdHlwZSxIPW8uU3ltYm9sLHo9by5KU09OLFc9eiYmei5zdHJpbmdpZnksJD1rLmYsWT1TLmYsVj14LmYsRz1FLmYsSz1BKCJzeW1ib2xzIiksWD1BKCJvcC1zeW1ib2xzIiksSj1BKCJzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5IiksUT1BKCJzeW1ib2wtdG8tc3RyaW5nLXJlZ2lzdHJ5IiksWj1BKCJ3a3MiKSx0dD1vLlFPYmplY3QsZXQ9IXR0fHwhdHQucHJvdG90eXBlfHwhdHQucHJvdG90eXBlLmZpbmRDaGlsZCxudD1hJiZ1KGZ1bmN0aW9uKCl7cmV0dXJuIDchPXkoWSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiBZKHRoaXMsImEiLHt2YWx1ZTo3fSkuYX19KSkuYX0pP2Z1bmN0aW9uKHQsZSxuKXt2YXIgcj0kKEYsZSk7ciYmZGVsZXRlIEZbZV0sWSh0LGUsbiksciYmdCE9PUYmJlkoRixlLHIpfTpZLHJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49S1t0XT15KEgucHJvdG90eXBlKTtyZXR1cm4gQihuLHt0eXBlOiJTeW1ib2wiLHRhZzp0LGRlc2NyaXB0aW9uOmV9KSxhfHwobi5kZXNjcmlwdGlvbj1lKSxufSxvdD1zJiYic3ltYm9sIj09dHlwZW9mIEguaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHQpaW5zdGFuY2VvZiBIfSxpdD1mdW5jdGlvbih0LGUsbil7dD09PUYmJml0KFgsZSxuKSxwKHQpO3ZhciByPWcoZSwhMCk7cmV0dXJuIHAobiksYyhLLHIpPyhuLmVudW1lcmFibGU/KGModCxNKSYmdFtNXVtyXSYmKHRbTV1bcl09ITEpLG49eShuLHtlbnVtZXJhYmxlOnYoMCwhMSl9KSk6KGModCxNKXx8WSh0LE0sdigxLHt9KSksdFtNXVtyXT0hMCksbnQodCxyLG4pKTpZKHQscixuKX0sYXQ9ZnVuY3Rpb24odCxlKXtwKHQpO3ZhciBuPWQoZSkscj1tKG4pLmNvbmNhdChsdChuKSk7cmV0dXJuIF8ocixmdW5jdGlvbihlKXthJiYhc3QuY2FsbChuLGUpfHxpdCh0LGUsbltlXSl9KSx0fSxzdD1mdW5jdGlvbih0KXt2YXIgZT1nKHQsITApLG49Ry5jYWxsKHRoaXMsZSk7cmV0dXJuISh0aGlzPT09RiYmYyhLLGUpJiYhYyhYLGUpKSYmKCEobnx8IWModGhpcyxlKXx8IWMoSyxlKXx8Yyh0aGlzLE0pJiZ0aGlzW01dW2VdKXx8bil9LHV0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZCh0KSxyPWcoZSwhMCk7aWYobiE9PUZ8fCFjKEsscil8fGMoWCxyKSl7dmFyIG89JChuLHIpO3JldHVybiFvfHwhYyhLLHIpfHxjKG4sTSkmJm5bTV1bcl18fChvLmVudW1lcmFibGU9ITApLG99fSxjdD1mdW5jdGlvbih0KXt2YXIgZT1WKGQodCkpLG49W107cmV0dXJuIF8oZSxmdW5jdGlvbih0KXtjKEssdCl8fGMoQyx0KXx8bi5wdXNoKHQpfSksbn0sbHQ9ZnVuY3Rpb24odCl7dmFyIGU9dD09PUYsbj1WKGU/WDpkKHQpKSxyPVtdO3JldHVybiBfKG4sZnVuY3Rpb24odCl7IWMoSyx0KXx8ZSYmIWMoRix0KXx8ci5wdXNoKEtbdF0pfSkscn07c3x8KGooKEg9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgSCl0aHJvdyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9TdHJpbmcoYXJndW1lbnRzWzBdKTp2b2lkIDAsZT1MKHQpLG49ZnVuY3Rpb24odCl7dGhpcz09PUYmJm4uY2FsbChYLHQpLGModGhpcyxNKSYmYyh0aGlzW01dLGUpJiYodGhpc1tNXVtlXT0hMSksbnQodGhpcyxlLHYoMSx0KSl9O3JldHVybiBhJiZldCYmbnQoRixlLHtjb25maWd1cmFibGU6ITAsc2V0Om59KSxydChlLHQpfSkucHJvdG90eXBlLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4gcSh0aGlzKS50YWd9KSxFLmY9c3QsUy5mPWl0LGsuZj11dCxiLmY9eC5mPWN0LHcuZj1sdCxhJiYoWShILnByb3RvdHlwZSwiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHEodGhpcykuZGVzY3JpcHRpb259fSksaXx8aihGLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsc3Qse3Vuc2FmZTohMH0pKSxQLmY9ZnVuY3Rpb24odCl7cmV0dXJuIHJ0KFIodCksdCl9KSxyKHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6IXMsc2hhbTohc30se1N5bWJvbDpIfSksXyhtKFopLGZ1bmN0aW9uKHQpe04odCl9KSxyKHt0YXJnZXQ6IlN5bWJvbCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtmb3I6ZnVuY3Rpb24odCl7dmFyIGU9U3RyaW5nKHQpO2lmKGMoSixlKSlyZXR1cm4gSltlXTt2YXIgbj1IKGUpO3JldHVybiBKW2VdPW4sUVtuXT1lLG59LGtleUZvcjpmdW5jdGlvbih0KXtpZighb3QodCkpdGhyb3cgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBzeW1ib2wiKTtpZihjKFEsdCkpcmV0dXJuIFFbdF19LHVzZVNldHRlcjpmdW5jdGlvbigpe2V0PSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtldD0hMX19KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXMsc2hhbTohYX0se2NyZWF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP3kodCk6YXQoeSh0KSxlKX0sZGVmaW5lUHJvcGVydHk6aXQsZGVmaW5lUHJvcGVydGllczphdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6dXR9KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtnZXRPd25Qcm9wZXJ0eU5hbWVzOmN0LGdldE93blByb3BlcnR5U3ltYm9sczpsdH0pLHIoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDp1KGZ1bmN0aW9uKCl7dy5mKDEpfSl9LHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHcuZihoKHQpKX19KSx6JiZyKHt0YXJnZXQ6IkpTT04iLHN0YXQ6ITAsZm9yY2VkOiFzfHx1KGZ1bmN0aW9uKCl7dmFyIHQ9SCgpO3JldHVybiJbbnVsbF0iIT1XKFt0XSl8fCJ7fSIhPVcoe2E6dH0pfHwie30iIT1XKE9iamVjdCh0KSl9KX0se3N0cmluZ2lmeTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbixyPVt0XSxvPTE7YXJndW1lbnRzLmxlbmd0aD5vOylyLnB1c2goYXJndW1lbnRzW28rK10pO2lmKG49ZT1yWzFdLChmKGUpfHx2b2lkIDAhPT10KSYmIW90KHQpKXJldHVybiBsKGUpfHwoZT1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuJiYoZT1uLmNhbGwodGhpcyx0LGUpKSwhb3QoZSkpcmV0dXJuIGV9KSxyWzFdPWUsVy5hcHBseSh6LHIpfX0pLEgucHJvdG90eXBlW1VdfHxUKEgucHJvdG90eXBlLFUsSC5wcm90b3R5cGUudmFsdWVPZiksSShILCJTeW1ib2wiKSxDW01dPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMSksbz1uKDEwNSkuZixpPXt9LnRvU3RyaW5nLGE9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gYSYmIltvYmplY3QgV2luZG93XSI9PWkuY2FsbCh0KT9mdW5jdGlvbih0KXt0cnl7cmV0dXJuIG8odCl9Y2F0Y2godCl7cmV0dXJuIGEuc2xpY2UoKX19KHQpOm8ocih0KSl9fSxmdW5jdGlvbih0LGUsbil7bigzKSgiYXN5bmNJdGVyYXRvciIpfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4pe24oMykoImhhc0luc3RhbmNlIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJpc0NvbmNhdFNwcmVhZGFibGUiKX0sZnVuY3Rpb24odCxlLG4pe24oMykoIm1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJtYXRjaEFsbCIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgicmVwbGFjZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgic2VhcmNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJzcGVjaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJzcGxpdCIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgidG9QcmltaXRpdmUiKX0sZnVuY3Rpb24odCxlLG4pe24oMykoInRvU3RyaW5nVGFnIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJ1bnNjb3BhYmxlcyIpfSxmdW5jdGlvbih0LGUsbil7bigyOCkoTWF0aCwiTWF0aCIsITApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KTtuKDI4KShyLkpTT04sIkpTT04iLCEwKX0sZnVuY3Rpb24odCxlLG4pe24oMykoImFzeW5jRGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgiZGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgib2JzZXJ2YWJsZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgicGF0dGVybk1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJyZXBsYWNlQWxsIil9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMTEpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmZpbmQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLmZpbmQ/cjplfX0sZnVuY3Rpb24odCxlLG4pe24oMjEyKTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5maW5kfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDczKS5maW5kLGk9big3NyksYT0hMDsiZmluZCJpbltdJiZBcnJheSgxKS5maW5kKGZ1bmN0aW9uKCl7YT0hMX0pLHIoe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDphfSx7ZmluZDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLGkoImZpbmQiKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIxNCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxNSksbz1TdHJpbmcucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LnRyaW07cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHx0PT09b3x8dCBpbnN0YW5jZW9mIFN0cmluZyYmZT09PW8udHJpbT9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyMTYpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJTdHJpbmciKS50cmltfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDEwNykudHJpbTtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOm4oMjE3KSgidHJpbSIpfSx7dHJpbTpmdW5jdGlvbigpe3JldHVybiBvKHRoaXMpfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KSxvPW4oNzgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcihmdW5jdGlvbigpe3JldHVybiEhb1t0XSgpfHwi4oCLwoXhoI4iIT0i4oCLwoXhoI4iW3RdKCl8fG9bdF0ubmFtZSE9PXR9KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTkpfSxmdW5jdGlvbih0LGUsbil7bigyMjApO3ZhciByPW4oMSk7dC5leHBvcnRzPXIucGFyc2VJbnR9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigyMjEpO3Ioe2dsb2JhbDohMCxmb3JjZWQ6cGFyc2VJbnQhPW99LHtwYXJzZUludDpvfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpLG89bigxMDcpLnRyaW0saT1uKDc4KSxhPXIucGFyc2VJbnQscz0vXlsrLV0/MFtYeF0vLHU9OCE9PWEoaSsiMDgiKXx8MjIhPT1hKGkrIjB4MTYiKTt0LmV4cG9ydHM9dT9mdW5jdGlvbih0LGUpe3ZhciBuPW8oU3RyaW5nKHQpKTtyZXR1cm4gYShuLGU+Pj4wfHwocy50ZXN0KG4pPzE2OjEwKSl9OmF9LGZ1bmN0aW9uKHQsZSxuKXtuKDUwKSxuKDM0KSx0LmV4cG9ydHM9bigxMDgpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTA5KX0sZnVuY3Rpb24odCxlLG4pe24oMCkoe3RhcmdldDoiQXJyYXkiLHN0YXQ6ITB9LHtpc0FycmF5Om4oNDcpfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDUwKSxuKDM0KSx0LmV4cG9ydHM9big1MSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMDMpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTEwKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDIyOSk7cih7dGFyZ2V0OiJBcnJheSIsc3RhdDohMCxmb3JjZWQ6IW4oMTEzKShmdW5jdGlvbih0KXtBcnJheS5mcm9tKHQpfSl9LHtmcm9tOm99KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMxKSxvPW4oMjQpLGk9bigxMTEpLGE9bigxMTIpLHM9bigzMyksdT1uKDcxKSxjPW4oNTEpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZSxuLGwsZixwPW8odCksaD0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcz90aGlzOkFycmF5LGQ9YXJndW1lbnRzLmxlbmd0aCxnPWQ+MT9hcmd1bWVudHNbMV06dm9pZCAwLHY9dm9pZCAwIT09Zyx5PTAsbT1jKHApO2lmKHYmJihnPXIoZyxkPjI/YXJndW1lbnRzWzJdOnZvaWQgMCwyKSksbnVsbD09bXx8aD09QXJyYXkmJmEobSkpZm9yKG49bmV3IGgoZT1zKHAubGVuZ3RoKSk7ZT55O3krKyl1KG4seSx2P2cocFt5XSx5KTpwW3ldKTtlbHNlIGZvcihmPW0uY2FsbChwKSxuPW5ldyBoOyEobD1mLm5leHQoKSkuZG9uZTt5KyspdShuLHksdj9pKGYsZyxbbC52YWx1ZSx5XSwhMCk6bC52YWx1ZSk7cmV0dXJuIG4ubGVuZ3RoPXksbn19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTQpfSxmdW5jdGlvbih0LGUsbil7bigyMzIpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLnNsaWNlfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDYpLGk9big0NyksYT1uKDg5KSxzPW4oMzMpLHU9bigyMSksYz1uKDcxKSxsPW4oNzIpLGY9bigyKSgic3BlY2llcyIpLHA9W10uc2xpY2UsaD1NYXRoLm1heDtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWwoInNsaWNlIil9LHtzbGljZTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbCxkPXUodGhpcyksZz1zKGQubGVuZ3RoKSx2PWEodCxnKSx5PWEodm9pZCAwPT09ZT9nOmUsZyk7aWYoaShkKSYmKCJmdW5jdGlvbiIhPXR5cGVvZihuPWQuY29uc3RydWN0b3IpfHxuIT09QXJyYXkmJiFpKG4ucHJvdG90eXBlKT9vKG4pJiZudWxsPT09KG49bltmXSkmJihuPXZvaWQgMCk6bj12b2lkIDAsbj09PUFycmF5fHx2b2lkIDA9PT1uKSlyZXR1cm4gcC5jYWxsKGQsdix5KTtmb3Iocj1uZXcodm9pZCAwPT09bj9BcnJheTpuKShoKHktdiwwKSksbD0wO3Y8eTt2KyssbCsrKXYgaW4gZCYmYyhyLGwsZFt2XSk7cmV0dXJuIHIubGVuZ3RoPWwscn19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzNCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDIzNSk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3Qua2V5c30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDI0KSxpPW4oNTUpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpuKDUpKGZ1bmN0aW9uKCl7aSgxKX0pfSx7a2V5czpmdW5jdGlvbih0KXtyZXR1cm4gaShvKHQpKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzNyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzOCksbz1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5kZXhPZjtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8uaW5kZXhPZj9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyMzkpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLmluZGV4T2Z9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNjcpLmluZGV4T2YsaT1uKDI0MCksYT1bXS5pbmRleE9mLHM9ISFhJiYxL1sxXS5pbmRleE9mKDEsLTApPDAsdT1pKCJpbmRleE9mIik7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOnN8fHV9LHtpbmRleE9mOmZ1bmN0aW9uKHQpe3JldHVybiBzP2EuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwwOm8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPVtdW3RdO3JldHVybiFufHwhcihmdW5jdGlvbigpe24uY2FsbChudWxsLGV8fGZ1bmN0aW9uKCl7dGhyb3cgMX0sMSl9KX19LGZ1bmN0aW9uKHQsZSxuKXtuKDExNSksdC5leHBvcnRzPW4oMSkuc2V0VGltZW91dH0sZnVuY3Rpb24odCxlLG4pe24oMTE1KSx0LmV4cG9ydHM9bigxKS5zZXRJbnRlcnZhbH0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0NCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDI0NSk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3QuYXNzaWdufSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oMjQ2KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6T2JqZWN0LmFzc2lnbiE9PW99LHthc3NpZ246b30pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTMpLG89big1KSxpPW4oNTUpLGE9bigxMDYpLHM9big2NCksdT1uKDI0KSxjPW4oNjUpLGw9T2JqZWN0LmFzc2lnbjt0LmV4cG9ydHM9IWx8fG8oZnVuY3Rpb24oKXt2YXIgdD17fSxlPXt9LG49U3ltYm9sKCk7cmV0dXJuIHRbbl09NywiYWJjZGVmZ2hpamtsbW5vcHFyc3QiLnNwbGl0KCIiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09dH0pLDchPWwoe30sdClbbl18fCJhYmNkZWZnaGlqa2xtbm9wcXJzdCIhPWkobCh7fSxlKSkuam9pbigiIil9KT9mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj11KHQpLG89YXJndW1lbnRzLmxlbmd0aCxsPTEsZj1hLmYscD1zLmY7bz5sOylmb3IodmFyIGgsZD1jKGFyZ3VtZW50c1tsKytdKSxnPWY/aShkKS5jb25jYXQoZihkKSk6aShkKSx2PWcubGVuZ3RoLHk9MDt2Pnk7KWg9Z1t5KytdLHImJiFwLmNhbGwoZCxoKXx8KG5baF09ZFtoXSk7cmV0dXJuIG59Omx9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1mdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGUsbj1PYmplY3QucHJvdG90eXBlLHI9bi5oYXNPd25Qcm9wZXJ0eSxvPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2w/U3ltYm9sOnt9LGk9by5pdGVyYXRvcnx8IkBAaXRlcmF0b3IiLGE9by5hc3luY0l0ZXJhdG9yfHwiQEBhc3luY0l0ZXJhdG9yIixzPW8udG9TdHJpbmdUYWd8fCJAQHRvU3RyaW5nVGFnIjtmdW5jdGlvbiB1KHQsZSxuKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pLHRbZV19dHJ5e3Uoe30sIiIpfWNhdGNoKHQpe3U9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0W2VdPW59fWZ1bmN0aW9uIGModCxlLG4scil7dmFyIG89ZSYmZS5wcm90b3R5cGUgaW5zdGFuY2VvZiB2P2U6dixpPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpLGE9bmV3IE8ocnx8W10pO3JldHVybiBpLl9pbnZva2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWY7cmV0dXJuIGZ1bmN0aW9uKG8saSl7aWYocj09PWgpdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7aWYocj09PWQpe2lmKCJ0aHJvdyI9PT1vKXRocm93IGk7cmV0dXJuIEwoKX1mb3Iobi5tZXRob2Q9byxuLmFyZz1pOzspe3ZhciBhPW4uZGVsZWdhdGU7aWYoYSl7dmFyIHM9VChhLG4pO2lmKHMpe2lmKHM9PT1nKWNvbnRpbnVlO3JldHVybiBzfX1pZigibmV4dCI9PT1uLm1ldGhvZCluLnNlbnQ9bi5fc2VudD1uLmFyZztlbHNlIGlmKCJ0aHJvdyI9PT1uLm1ldGhvZCl7aWYocj09PWYpdGhyb3cgcj1kLG4uYXJnO24uZGlzcGF0Y2hFeGNlcHRpb24obi5hcmcpfWVsc2UicmV0dXJuIj09PW4ubWV0aG9kJiZuLmFicnVwdCgicmV0dXJuIixuLmFyZyk7cj1oO3ZhciB1PWwodCxlLG4pO2lmKCJub3JtYWwiPT09dS50eXBlKXtpZihyPW4uZG9uZT9kOnAsdS5hcmc9PT1nKWNvbnRpbnVlO3JldHVybnt2YWx1ZTp1LmFyZyxkb25lOm4uZG9uZX19InRocm93Ij09PXUudHlwZSYmKHI9ZCxuLm1ldGhvZD0idGhyb3ciLG4uYXJnPXUuYXJnKX19fSh0LG4sYSksaX1mdW5jdGlvbiBsKHQsZSxuKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOnQuY2FsbChlLG4pfX1jYXRjaCh0KXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzp0fX19dC53cmFwPWM7dmFyIGY9InN1c3BlbmRlZFN0YXJ0IixwPSJzdXNwZW5kZWRZaWVsZCIsaD0iZXhlY3V0aW5nIixkPSJjb21wbGV0ZWQiLGc9e307ZnVuY3Rpb24gdigpe31mdW5jdGlvbiB5KCl7fWZ1bmN0aW9uIG0oKXt9dmFyIGI9e307YltpXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt2YXIgeD1PYmplY3QuZ2V0UHJvdG90eXBlT2Ysdz14JiZ4KHgoQyhbXSkpKTt3JiZ3IT09biYmci5jYWxsKHcsaSkmJihiPXcpO3ZhciBrPW0ucHJvdG90eXBlPXYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYik7ZnVuY3Rpb24gUyh0KXtbIm5leHQiLCJ0aHJvdyIsInJldHVybiJdLmZvckVhY2goZnVuY3Rpb24oZSl7dSh0LGUsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ludm9rZShlLHQpfSl9KX1mdW5jdGlvbiBFKHQsZSl7dmFyIG47dGhpcy5faW52b2tlPWZ1bmN0aW9uKG8saSl7ZnVuY3Rpb24gYSgpe3JldHVybiBuZXcgZShmdW5jdGlvbihuLGEpeyFmdW5jdGlvbiBuKG8saSxhLHMpe3ZhciB1PWwodFtvXSx0LGkpO2lmKCJ0aHJvdyIhPT11LnR5cGUpe3ZhciBjPXUuYXJnLGY9Yy52YWx1ZTtyZXR1cm4gZiYmIm9iamVjdCI9PXR5cGVvZiBmJiZyLmNhbGwoZiwiX19hd2FpdCIpP2UucmVzb2x2ZShmLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odCl7bigibmV4dCIsdCxhLHMpfSxmdW5jdGlvbih0KXtuKCJ0aHJvdyIsdCxhLHMpfSk6ZS5yZXNvbHZlKGYpLnRoZW4oZnVuY3Rpb24odCl7Yy52YWx1ZT10LGEoYyl9LGZ1bmN0aW9uKHQpe3JldHVybiBuKCJ0aHJvdyIsdCxhLHMpfSl9cyh1LmFyZyl9KG8saSxuLGEpfSl9cmV0dXJuIG49bj9uLnRoZW4oYSxhKTphKCl9fWZ1bmN0aW9uIFQodCxuKXt2YXIgcj10Lml0ZXJhdG9yW24ubWV0aG9kXTtpZihyPT09ZSl7aWYobi5kZWxlZ2F0ZT1udWxsLCJ0aHJvdyI9PT1uLm1ldGhvZCl7aWYodC5pdGVyYXRvci5yZXR1cm4mJihuLm1ldGhvZD0icmV0dXJuIixuLmFyZz1lLFQodCxuKSwidGhyb3ciPT09bi5tZXRob2QpKXJldHVybiBnO24ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9bmV3IFR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZCIpfXJldHVybiBnfXZhciBvPWwocix0Lml0ZXJhdG9yLG4uYXJnKTtpZigidGhyb3ciPT09by50eXBlKXJldHVybiBuLm1ldGhvZD0idGhyb3ciLG4uYXJnPW8uYXJnLG4uZGVsZWdhdGU9bnVsbCxnO3ZhciBpPW8uYXJnO3JldHVybiBpP2kuZG9uZT8oblt0LnJlc3VsdE5hbWVdPWkudmFsdWUsbi5uZXh0PXQubmV4dExvYywicmV0dXJuIiE9PW4ubWV0aG9kJiYobi5tZXRob2Q9Im5leHQiLG4uYXJnPWUpLG4uZGVsZWdhdGU9bnVsbCxnKTppOihuLm1ldGhvZD0idGhyb3ciLG4uYXJnPW5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0Iiksbi5kZWxlZ2F0ZT1udWxsLGcpfWZ1bmN0aW9uIGoodCl7dmFyIGU9e3RyeUxvYzp0WzBdfTsxIGluIHQmJihlLmNhdGNoTG9jPXRbMV0pLDIgaW4gdCYmKGUuZmluYWxseUxvYz10WzJdLGUuYWZ0ZXJMb2M9dFszXSksdGhpcy50cnlFbnRyaWVzLnB1c2goZSl9ZnVuY3Rpb24gQSh0KXt2YXIgZT10LmNvbXBsZXRpb258fHt9O2UudHlwZT0ibm9ybWFsIixkZWxldGUgZS5hcmcsdC5jb21wbGV0aW9uPWV9ZnVuY3Rpb24gTyh0KXt0aGlzLnRyeUVudHJpZXM9W3t0cnlMb2M6InJvb3QifV0sdC5mb3JFYWNoKGosdGhpcyksdGhpcy5yZXNldCghMCl9ZnVuY3Rpb24gQyh0KXtpZih0KXt2YXIgbj10W2ldO2lmKG4pcmV0dXJuIG4uY2FsbCh0KTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5uZXh0KXJldHVybiB0O2lmKCFpc05hTih0Lmxlbmd0aCkpe3ZhciBvPS0xLGE9ZnVuY3Rpb24gbigpe2Zvcig7KytvPHQubGVuZ3RoOylpZihyLmNhbGwodCxvKSlyZXR1cm4gbi52YWx1ZT10W29dLG4uZG9uZT0hMSxuO3JldHVybiBuLnZhbHVlPWUsbi5kb25lPSEwLG59O3JldHVybiBhLm5leHQ9YX19cmV0dXJue25leHQ6TH19ZnVuY3Rpb24gTCgpe3JldHVybnt2YWx1ZTplLGRvbmU6ITB9fXJldHVybiB5LnByb3RvdHlwZT1rLmNvbnN0cnVjdG9yPW0sbS5jb25zdHJ1Y3Rvcj15LHkuZGlzcGxheU5hbWU9dShtLHMsIkdlbmVyYXRvckZ1bmN0aW9uIiksdC5pc0dlbmVyYXRvckZ1bmN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LmNvbnN0cnVjdG9yO3JldHVybiEhZSYmKGU9PT15fHwiR2VuZXJhdG9yRnVuY3Rpb24iPT09KGUuZGlzcGxheU5hbWV8fGUubmFtZSkpfSx0Lm1hcms9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxtKToodC5fX3Byb3RvX189bSx1KHQscywiR2VuZXJhdG9yRnVuY3Rpb24iKSksdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShrKSx0fSx0LmF3cmFwPWZ1bmN0aW9uKHQpe3JldHVybntfX2F3YWl0OnR9fSxTKEUucHJvdG90eXBlKSxFLnByb3RvdHlwZVthXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSx0LkFzeW5jSXRlcmF0b3I9RSx0LmFzeW5jPWZ1bmN0aW9uKGUsbixyLG8saSl7dm9pZCAwPT09aSYmKGk9UHJvbWlzZSk7dmFyIGE9bmV3IEUoYyhlLG4scixvKSxpKTtyZXR1cm4gdC5pc0dlbmVyYXRvckZ1bmN0aW9uKG4pP2E6YS5uZXh0KCkudGhlbihmdW5jdGlvbih0KXtyZXR1cm4gdC5kb25lP3QudmFsdWU6YS5uZXh0KCl9KX0sUyhrKSx1KGsscywiR2VuZXJhdG9yIiksa1tpXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxrLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgR2VuZXJhdG9yXSJ9LHQua2V5cz1mdW5jdGlvbih0KXt2YXIgZT1bXTtmb3IodmFyIG4gaW4gdCllLnB1c2gobik7cmV0dXJuIGUucmV2ZXJzZSgpLGZ1bmN0aW9uIG4oKXtmb3IoO2UubGVuZ3RoOyl7dmFyIHI9ZS5wb3AoKTtpZihyIGluIHQpcmV0dXJuIG4udmFsdWU9cixuLmRvbmU9ITEsbn1yZXR1cm4gbi5kb25lPSEwLG59fSx0LnZhbHVlcz1DLE8ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpPLHJlc2V0OmZ1bmN0aW9uKHQpe2lmKHRoaXMucHJldj0wLHRoaXMubmV4dD0wLHRoaXMuc2VudD10aGlzLl9zZW50PWUsdGhpcy5kb25lPSExLHRoaXMuZGVsZWdhdGU9bnVsbCx0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5hcmc9ZSx0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChBKSwhdClmb3IodmFyIG4gaW4gdGhpcykidCI9PT1uLmNoYXJBdCgwKSYmci5jYWxsKHRoaXMsbikmJiFpc05hTigrbi5zbGljZSgxKSkmJih0aGlzW25dPWUpfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5kb25lPSEwO3ZhciB0PXRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uO2lmKCJ0aHJvdyI9PT10LnR5cGUpdGhyb3cgdC5hcmc7cmV0dXJuIHRoaXMucnZhbH0sZGlzcGF0Y2hFeGNlcHRpb246ZnVuY3Rpb24odCl7aWYodGhpcy5kb25lKXRocm93IHQ7dmFyIG49dGhpcztmdW5jdGlvbiBvKHIsbyl7cmV0dXJuIHMudHlwZT0idGhyb3ciLHMuYXJnPXQsbi5uZXh0PXIsbyYmKG4ubWV0aG9kPSJuZXh0IixuLmFyZz1lKSwhIW99Zm9yKHZhciBpPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtpPj0wOy0taSl7dmFyIGE9dGhpcy50cnlFbnRyaWVzW2ldLHM9YS5jb21wbGV0aW9uO2lmKCJyb290Ij09PWEudHJ5TG9jKXJldHVybiBvKCJlbmQiKTtpZihhLnRyeUxvYzw9dGhpcy5wcmV2KXt2YXIgdT1yLmNhbGwoYSwiY2F0Y2hMb2MiKSxjPXIuY2FsbChhLCJmaW5hbGx5TG9jIik7aWYodSYmYyl7aWYodGhpcy5wcmV2PGEuY2F0Y2hMb2MpcmV0dXJuIG8oYS5jYXRjaExvYywhMCk7aWYodGhpcy5wcmV2PGEuZmluYWxseUxvYylyZXR1cm4gbyhhLmZpbmFsbHlMb2MpfWVsc2UgaWYodSl7aWYodGhpcy5wcmV2PGEuY2F0Y2hMb2MpcmV0dXJuIG8oYS5jYXRjaExvYywhMCl9ZWxzZXtpZighYyl0aHJvdyBuZXcgRXJyb3IoInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5Iik7aWYodGhpcy5wcmV2PGEuZmluYWxseUxvYylyZXR1cm4gbyhhLmZpbmFsbHlMb2MpfX19fSxhYnJ1cHQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO24+PTA7LS1uKXt2YXIgbz10aGlzLnRyeUVudHJpZXNbbl07aWYoby50cnlMb2M8PXRoaXMucHJldiYmci5jYWxsKG8sImZpbmFsbHlMb2MiKSYmdGhpcy5wcmV2PG8uZmluYWxseUxvYyl7dmFyIGk9bzticmVha319aSYmKCJicmVhayI9PT10fHwiY29udGludWUiPT09dCkmJmkudHJ5TG9jPD1lJiZlPD1pLmZpbmFsbHlMb2MmJihpPW51bGwpO3ZhciBhPWk/aS5jb21wbGV0aW9uOnt9O3JldHVybiBhLnR5cGU9dCxhLmFyZz1lLGk/KHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLm5leHQ9aS5maW5hbGx5TG9jLGcpOnRoaXMuY29tcGxldGUoYSl9LGNvbXBsZXRlOmZ1bmN0aW9uKHQsZSl7aWYoInRocm93Ij09PXQudHlwZSl0aHJvdyB0LmFyZztyZXR1cm4iYnJlYWsiPT09dC50eXBlfHwiY29udGludWUiPT09dC50eXBlP3RoaXMubmV4dD10LmFyZzoicmV0dXJuIj09PXQudHlwZT8odGhpcy5ydmFsPXRoaXMuYXJnPXQuYXJnLHRoaXMubWV0aG9kPSJyZXR1cm4iLHRoaXMubmV4dD0iZW5kIik6Im5vcm1hbCI9PT10LnR5cGUmJmUmJih0aGlzLm5leHQ9ZSksZ30sZmluaXNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7ZT49MDstLWUpe3ZhciBuPXRoaXMudHJ5RW50cmllc1tlXTtpZihuLmZpbmFsbHlMb2M9PT10KXJldHVybiB0aGlzLmNvbXBsZXRlKG4uY29tcGxldGlvbixuLmFmdGVyTG9jKSxBKG4pLGd9fSxjYXRjaDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2U+PTA7LS1lKXt2YXIgbj10aGlzLnRyeUVudHJpZXNbZV07aWYobi50cnlMb2M9PT10KXt2YXIgcj1uLmNvbXBsZXRpb247aWYoInRocm93Ij09PXIudHlwZSl7dmFyIG89ci5hcmc7QShuKX1yZXR1cm4gb319dGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHQiKX0sZGVsZWdhdGVZaWVsZDpmdW5jdGlvbih0LG4scil7cmV0dXJuIHRoaXMuZGVsZWdhdGU9e2l0ZXJhdG9yOkModCkscmVzdWx0TmFtZTpuLG5leHRMb2M6cn0sIm5leHQiPT09dGhpcy5tZXRob2QmJih0aGlzLmFyZz1lKSxnfX0sdH0odC5leHBvcnRzKTt0cnl7cmVnZW5lcmF0b3JSdW50aW1lPXJ9Y2F0Y2godCl7RnVuY3Rpb24oInIiLCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByIikocil9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQ5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjUwKSxvPUZ1bmN0aW9uLnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5iaW5kO3JldHVybiB0PT09b3x8dCBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZlPT09by5iaW5kP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDI1MSk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIkZ1bmN0aW9uIikuYmluZH0sZnVuY3Rpb24odCxlLG4pe24oMCkoe3RhcmdldDoiRnVuY3Rpb24iLHByb3RvOiEwfSx7YmluZDpuKDkxKX0pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjUzKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDExNiksbigyNTkpLG4oMjYwKSxuKDI2MSksbigyNjIpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByLG8saSxhLHM9bigwKSx1PW4oMjcpLGM9big0KSxsPW4oMSksZj1uKDExNykscD1uKDM1KSxoPW4oMTE4KSxkPW4oMjgpLGc9bigyNTUpLHY9big2KSx5PW4oMjIpLG09bigxMTkpLGI9bigyNikseD1uKDU5KSx3PW4oMTEzKSxrPW4oMTIwKSxTPW4oMTIxKS5zZXQsRT1uKDI1NiksVD1uKDEyMiksaj1uKDI1NyksQT1uKDUyKSxPPW4oNjApLEM9big3OSksTD1uKDQ5KSxSPW4oODcpLFA9bigyKSgic3BlY2llcyIpLE49IlByb21pc2UiLEk9TC5nZXQsRD1MLnNldCxfPUwuZ2V0dGVyRm9yKE4pLE09ZixVPWMuVHlwZUVycm9yLEI9Yy5kb2N1bWVudCxxPWMucHJvY2VzcyxGPWMuZmV0Y2gsSD1xJiZxLnZlcnNpb25zLHo9SCYmSC52OHx8IiIsVz1BLmYsJD1XLFk9InByb2Nlc3MiPT1iKHEpLFY9ISEoQiYmQi5jcmVhdGVFdmVudCYmYy5kaXNwYXRjaEV2ZW50KSxHPVIoTixmdW5jdGlvbigpe3ZhciB0PU0ucmVzb2x2ZSgxKSxlPWZ1bmN0aW9uKCl7fSxuPSh0LmNvbnN0cnVjdG9yPXt9KVtQXT1mdW5jdGlvbih0KXt0KGUsZSl9O3JldHVybiEoKFl8fCJmdW5jdGlvbiI9PXR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQpJiYoIXV8fHQuZmluYWxseSkmJnQudGhlbihlKWluc3RhbmNlb2YgbiYmMCE9PXouaW5kZXhPZigiNi42IikmJi0xPT09Qy5pbmRleE9mKCJDaHJvbWUvNjYiKSl9KSxLPUd8fCF3KGZ1bmN0aW9uKHQpe00uYWxsKHQpLmNhdGNoKGZ1bmN0aW9uKCl7fSl9KSxYPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiEoIXYodCl8fCJmdW5jdGlvbiIhPXR5cGVvZihlPXQudGhlbikpJiZlfSxKPWZ1bmN0aW9uKHQsZSxuKXtpZighZS5ub3RpZmllZCl7ZS5ub3RpZmllZD0hMDt2YXIgcj1lLnJlYWN0aW9ucztFKGZ1bmN0aW9uKCl7Zm9yKHZhciBvPWUudmFsdWUsaT0xPT1lLnN0YXRlLGE9MDtyLmxlbmd0aD5hOyl7dmFyIHMsdSxjLGw9clthKytdLGY9aT9sLm9rOmwuZmFpbCxwPWwucmVzb2x2ZSxoPWwucmVqZWN0LGQ9bC5kb21haW47dHJ5e2Y/KGl8fCgyPT09ZS5yZWplY3Rpb24mJmV0KHQsZSksZS5yZWplY3Rpb249MSksITA9PT1mP3M9bzooZCYmZC5lbnRlcigpLHM9ZihvKSxkJiYoZC5leGl0KCksYz0hMCkpLHM9PT1sLnByb21pc2U/aChVKCJQcm9taXNlLWNoYWluIGN5Y2xlIikpOih1PVgocykpP3UuY2FsbChzLHAsaCk6cChzKSk6aChvKX1jYXRjaCh0KXtkJiYhYyYmZC5leGl0KCksaCh0KX19ZS5yZWFjdGlvbnM9W10sZS5ub3RpZmllZD0hMSxuJiYhZS5yZWplY3Rpb24mJloodCxlKX0pfX0sUT1mdW5jdGlvbih0LGUsbil7dmFyIHIsbztWPygocj1CLmNyZWF0ZUV2ZW50KCJFdmVudCIpKS5wcm9taXNlPWUsci5yZWFzb249bixyLmluaXRFdmVudCh0LCExLCEwKSxjLmRpc3BhdGNoRXZlbnQocikpOnI9e3Byb21pc2U6ZSxyZWFzb246bn0sKG89Y1sib24iK3RdKT9vKHIpOiJ1bmhhbmRsZWRyZWplY3Rpb24iPT09dCYmaigiVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIixuKX0sWj1mdW5jdGlvbih0LGUpe1MuY2FsbChjLGZ1bmN0aW9uKCl7dmFyIG4scj1lLnZhbHVlO2lmKHR0KGUpJiYobj1PKGZ1bmN0aW9uKCl7WT9xLmVtaXQoInVuaGFuZGxlZFJlamVjdGlvbiIscix0KTpRKCJ1bmhhbmRsZWRyZWplY3Rpb24iLHQscil9KSxlLnJlamVjdGlvbj1ZfHx0dChlKT8yOjEsbi5lcnJvcikpdGhyb3cgbi52YWx1ZX0pfSx0dD1mdW5jdGlvbih0KXtyZXR1cm4gMSE9PXQucmVqZWN0aW9uJiYhdC5wYXJlbnR9LGV0PWZ1bmN0aW9uKHQsZSl7Uy5jYWxsKGMsZnVuY3Rpb24oKXtZP3EuZW1pdCgicmVqZWN0aW9uSGFuZGxlZCIsdCk6USgicmVqZWN0aW9uaGFuZGxlZCIsdCxlLnZhbHVlKX0pfSxudD1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gZnVuY3Rpb24obyl7dChlLG4sbyxyKX19LHJ0PWZ1bmN0aW9uKHQsZSxuLHIpe2UuZG9uZXx8KGUuZG9uZT0hMCxyJiYoZT1yKSxlLnZhbHVlPW4sZS5zdGF0ZT0yLEoodCxlLCEwKSl9LG90PWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCFlLmRvbmUpe2UuZG9uZT0hMCxyJiYoZT1yKTt0cnl7aWYodD09PW4pdGhyb3cgVSgiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGYiKTt2YXIgbz1YKG4pO28/RShmdW5jdGlvbigpe3ZhciByPXtkb25lOiExfTt0cnl7by5jYWxsKG4sbnQob3QsdCxyLGUpLG50KHJ0LHQscixlKSl9Y2F0Y2gobil7cnQodCxyLG4sZSl9fSk6KGUudmFsdWU9bixlLnN0YXRlPTEsSih0LGUsITEpKX1jYXRjaChuKXtydCh0LHtkb25lOiExfSxuLGUpfX19O0cmJihNPWZ1bmN0aW9uKHQpe20odGhpcyxNLE4pLHkodCksci5jYWxsKHRoaXMpO3ZhciBlPUkodGhpcyk7dHJ5e3QobnQob3QsdGhpcyxlKSxudChydCx0aGlzLGUpKX1jYXRjaCh0KXtydCh0aGlzLGUsdCl9fSwocj1mdW5jdGlvbih0KXtEKHRoaXMse3R5cGU6Tixkb25lOiExLG5vdGlmaWVkOiExLHBhcmVudDohMSxyZWFjdGlvbnM6W10scmVqZWN0aW9uOiExLHN0YXRlOjAsdmFsdWU6dm9pZCAwfSl9KS5wcm90b3R5cGU9aChNLnByb3RvdHlwZSx7dGhlbjpmdW5jdGlvbih0LGUpe3ZhciBuPV8odGhpcykscj1XKGsodGhpcyxNKSk7cmV0dXJuIHIub2s9ImZ1bmN0aW9uIiE9dHlwZW9mIHR8fHQsci5mYWlsPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLHIuZG9tYWluPVk/cS5kb21haW46dm9pZCAwLG4ucGFyZW50PSEwLG4ucmVhY3Rpb25zLnB1c2gociksMCE9bi5zdGF0ZSYmSih0aGlzLG4sITEpLHIucHJvbWlzZX0sY2F0Y2g6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudGhlbih2b2lkIDAsdCl9fSksbz1mdW5jdGlvbigpe3ZhciB0PW5ldyByLGU9SSh0KTt0aGlzLnByb21pc2U9dCx0aGlzLnJlc29sdmU9bnQob3QsdCxlKSx0aGlzLnJlamVjdD1udChydCx0LGUpfSxBLmY9Vz1mdW5jdGlvbih0KXtyZXR1cm4gdD09PU18fHQ9PT1pP25ldyBvKHQpOiQodCl9LHV8fCJmdW5jdGlvbiIhPXR5cGVvZiBmfHwoYT1mLnByb3RvdHlwZS50aGVuLHAoZi5wcm90b3R5cGUsInRoZW4iLGZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gbmV3IE0oZnVuY3Rpb24odCxlKXthLmNhbGwobix0LGUpfSkudGhlbih0LGUpfSksImZ1bmN0aW9uIj09dHlwZW9mIEYmJnMoe2dsb2JhbDohMCxlbnVtZXJhYmxlOiEwLGZvcmNlZDohMH0se2ZldGNoOmZ1bmN0aW9uKHQpe3JldHVybiBUKE0sRi5hcHBseShjLGFyZ3VtZW50cykpfX0pKSkscyh7Z2xvYmFsOiEwLHdyYXA6ITAsZm9yY2VkOkd9LHtQcm9taXNlOk19KSxkKE0sTiwhMSwhMCksZyhOKSxpPWwuUHJvbWlzZSxzKHt0YXJnZXQ6TixzdGF0OiEwLGZvcmNlZDpHfSx7cmVqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPVcodGhpcyk7cmV0dXJuIGUucmVqZWN0LmNhbGwodm9pZCAwLHQpLGUucHJvbWlzZX19KSxzKHt0YXJnZXQ6TixzdGF0OiEwLGZvcmNlZDp1fHxHfSx7cmVzb2x2ZTpmdW5jdGlvbih0KXtyZXR1cm4gVCh1JiZ0aGlzPT09aT9NOnRoaXMsdCl9fSkscyh7dGFyZ2V0Ok4sc3RhdDohMCxmb3JjZWQ6S30se2FsbDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49VyhlKSxyPW4ucmVzb2x2ZSxvPW4ucmVqZWN0LGk9TyhmdW5jdGlvbigpe3ZhciBuPXkoZS5yZXNvbHZlKSxpPVtdLGE9MCxzPTE7eCh0LGZ1bmN0aW9uKHQpe3ZhciB1PWErKyxjPSExO2kucHVzaCh2b2lkIDApLHMrKyxuLmNhbGwoZSx0KS50aGVuKGZ1bmN0aW9uKHQpe2N8fChjPSEwLGlbdV09dCwtLXN8fHIoaSkpfSxvKX0pLC0tc3x8cihpKX0pO3JldHVybiBpLmVycm9yJiZvKGkudmFsdWUpLG4ucHJvbWlzZX0scmFjZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49VyhlKSxyPW4ucmVqZWN0LG89TyhmdW5jdGlvbigpe3ZhciBvPXkoZS5yZXNvbHZlKTt4KHQsZnVuY3Rpb24odCl7by5jYWxsKGUsdCkudGhlbihuLnJlc29sdmUscil9KX0pO3JldHVybiBvLmVycm9yJiZyKG8udmFsdWUpLG4ucHJvbWlzZX19KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMyKSxvPW4oMjMpLGk9bigyKSxhPW4oMTMpLHM9aSgic3BlY2llcyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1yKHQpLG49by5mO2EmJmUmJiFlW3NdJiZuKGUscyx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzfX0pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhLHMsdSxjLGw9big0KSxmPW4oNDQpLmYscD1uKDI2KSxoPW4oMTIxKS5zZXQsZD1uKDc5KSxnPWwuTXV0YXRpb25PYnNlcnZlcnx8bC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyLHY9bC5wcm9jZXNzLHk9bC5Qcm9taXNlLG09InByb2Nlc3MiPT1wKHYpLGI9ZihsLCJxdWV1ZU1pY3JvdGFzayIpLHg9YiYmYi52YWx1ZTt4fHwocj1mdW5jdGlvbigpe3ZhciB0LGU7Zm9yKG0mJih0PXYuZG9tYWluKSYmdC5leGl0KCk7bzspe2U9by5mbixvPW8ubmV4dDt0cnl7ZSgpfWNhdGNoKHQpe3Rocm93IG8/YSgpOmk9dm9pZCAwLHR9fWk9dm9pZCAwLHQmJnQuZW50ZXIoKX0sbT9hPWZ1bmN0aW9uKCl7di5uZXh0VGljayhyKX06ZyYmIS8oaXBob25lfGlwb2R8aXBhZCkuKmFwcGxld2Via2l0L2kudGVzdChkKT8ocz0hMCx1PWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSxuZXcgZyhyKS5vYnNlcnZlKHUse2NoYXJhY3RlckRhdGE6ITB9KSxhPWZ1bmN0aW9uKCl7dS5kYXRhPXM9IXN9KTp5JiZ5LnJlc29sdmU/KGM9eS5yZXNvbHZlKHZvaWQgMCksYT1mdW5jdGlvbigpe2MudGhlbihyKX0pOmE9ZnVuY3Rpb24oKXtoLmNhbGwobCxyKX0pLHQuZXhwb3J0cz14fHxmdW5jdGlvbih0KXt2YXIgZT17Zm46dCxuZXh0OnZvaWQgMH07aSYmKGkubmV4dD1lKSxvfHwobz1lLGEoKSksaT1lfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49ci5jb25zb2xlO24mJm4uZXJyb3ImJigxPT09YXJndW1lbnRzLmxlbmd0aD9uLmVycm9yKHQpOm4uZXJyb3IodCxlKSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDI3KSxpPW4oMTE3KSxhPW4oMzIpLHM9bigxMjApLHU9bigxMjIpLGM9bigzNSk7cih7dGFyZ2V0OiJQcm9taXNlIixwcm90bzohMCxyZWFsOiEwfSx7ZmluYWxseTpmdW5jdGlvbih0KXt2YXIgZT1zKHRoaXMsYSgiUHJvbWlzZSIpKSxuPSJmdW5jdGlvbiI9PXR5cGVvZiB0O3JldHVybiB0aGlzLnRoZW4obj9mdW5jdGlvbihuKXtyZXR1cm4gdShlLHQoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBufSl9OnQsbj9mdW5jdGlvbihuKXtyZXR1cm4gdShlLHQoKSkudGhlbihmdW5jdGlvbigpe3Rocm93IG59KX06dCl9fSksb3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGl8fGkucHJvdG90eXBlLmZpbmFsbHl8fGMoaS5wcm90b3R5cGUsImZpbmFsbHkiLGEoIlByb21pc2UiKS5wcm90b3R5cGUuZmluYWxseSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big0OCksaT1uKDc0KSxhPW4oNDYpLHM9bigzMCksdT1uKDU5KSxjPW4oMTcpLGw9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKCEobiBpbnN0YW5jZW9mIGwpKXJldHVybiBuZXcgbCh0LGUpO2kmJihuPWkobmV3IEVycm9yKGUpLG8obikpKTt2YXIgcj1bXTtyZXR1cm4gdSh0LHIucHVzaCxyKSxjKG4sImVycm9ycyIsciksdm9pZCAwIT09ZSYmYyhuLCJtZXNzYWdlIixTdHJpbmcoZSkpLG59O2wucHJvdG90eXBlPWEoRXJyb3IucHJvdG90eXBlLHtjb25zdHJ1Y3RvcjpzKDUsbCksbmFtZTpzKDUsIkFnZ3JlZ2F0ZUVycm9yIil9KSxyKHtnbG9iYWw6ITB9LHtBZ2dyZWdhdGVFcnJvcjpsfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDEyMyl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNTIpLGk9big2MCk7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7dHJ5OmZ1bmN0aW9uKHQpe3ZhciBlPW8uZih0aGlzKSxuPWkodCk7cmV0dXJuKG4uZXJyb3I/ZS5yZWplY3Q6ZS5yZXNvbHZlKShuLnZhbHVlKSxlLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMjIpLGk9bigzMiksYT1uKDUyKSxzPW4oNjApLHU9big1OSk7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7YW55OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hLmYoZSkscj1uLnJlc29sdmUsYz1uLnJlamVjdCxsPXMoZnVuY3Rpb24oKXt2YXIgbj1vKGUucmVzb2x2ZSksYT1bXSxzPTAsbD0xLGY9ITE7dSh0LGZ1bmN0aW9uKHQpe3ZhciBvPXMrKyx1PSExO2EucHVzaCh2b2lkIDApLGwrKyxuLmNhbGwoZSx0KS50aGVuKGZ1bmN0aW9uKHQpe3V8fGZ8fChmPSEwLHIodCkpfSxmdW5jdGlvbih0KXt1fHxmfHwodT0hMCxhW29dPXQsLS1sfHxjKG5ldyhpKCJBZ2dyZWdhdGVFcnJvciIpKShhLCJObyBvbmUgcHJvbWlzZSByZXNvbHZlZCIpKSl9KX0pLC0tbHx8YyhuZXcoaSgiQWdncmVnYXRlRXJyb3IiKSkoYSwiTm8gb25lIHByb21pc2UgcmVzb2x2ZWQiKSl9KTtyZXR1cm4gbC5lcnJvciYmYyhsLnZhbHVlKSxuLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTYpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24oZSxuLHIpe3JldHVybiBuJiZ0KGUucHJvdG90eXBlLG4pLHImJnQoZSxyKSxlfX0oKSxvPWZ1bmN0aW9uKHQpe2lmKHQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgZT17fTtpZihudWxsIT10KWZvcih2YXIgbiBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pJiYoZVtuXT10W25dKTtyZXR1cm4gZS5kZWZhdWx0PXQsZX0obigyNjUpKSxpPXAobigyNjYpKSxhPXAobigyNjcpKSxzPXAobigyNjgpKSx1PXAobigyNjkpKSxjPXAobigyNzApKSxsPXAobigyNzEpKSxmPXAobigyNzIpKTtmdW5jdGlvbiBwKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX12YXIgaD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9OyFmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLHQpLHRoaXMudHlwZT0ibGFuZ3VhZ2VEZXRlY3RvciIsdGhpcy5kZXRlY3RvcnM9e30sdGhpcy5pbml0KGUsbil9cmV0dXJuIHIodCxbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9O3RoaXMuc2VydmljZXM9dCx0aGlzLm9wdGlvbnM9by5kZWZhdWx0cyhlLHRoaXMub3B0aW9uc3x8e30se29yZGVyOlsicXVlcnlzdHJpbmciLCJjb29raWUiLCJsb2NhbFN0b3JhZ2UiLCJuYXZpZ2F0b3IiLCJodG1sVGFnIl0sbG9va3VwUXVlcnlzdHJpbmc6ImxuZyIsbG9va3VwQ29va2llOiJpMThuZXh0Iixsb29rdXBMb2NhbFN0b3JhZ2U6ImkxOG5leHRMbmciLGNhY2hlczpbImxvY2FsU3RvcmFnZSJdLGV4Y2x1ZGVDYWNoZUZvcjpbImNpbW9kZSJdfSksdGhpcy5vcHRpb25zLmxvb2t1cEZyb21VcmxJbmRleCYmKHRoaXMub3B0aW9ucy5sb29rdXBGcm9tUGF0aEluZGV4PXRoaXMub3B0aW9ucy5sb29rdXBGcm9tVXJsSW5kZXgpLHRoaXMuaTE4bk9wdGlvbnM9bix0aGlzLmFkZERldGVjdG9yKGkuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihhLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3Iocy5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKHUuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihjLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3IobC5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKGYuZGVmYXVsdCl9fSx7a2V5OiJhZGREZXRlY3RvciIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZXRlY3RvcnNbdC5uYW1lXT10fX0se2tleToiZGV0ZWN0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzO3R8fCh0PXRoaXMub3B0aW9ucy5vcmRlcik7dmFyIG49W107dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKGUuZGV0ZWN0b3JzW3RdKXt2YXIgcj1lLmRldGVjdG9yc1t0XS5sb29rdXAoZS5vcHRpb25zKTtyJiYic3RyaW5nIj09dHlwZW9mIHImJihyPVtyXSksciYmKG49bi5jb25jYXQocikpfX0pO3ZhciByPXZvaWQgMDtpZihuLmZvckVhY2goZnVuY3Rpb24odCl7aWYoIXIpe3ZhciBuPWUuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5mb3JtYXRMYW5ndWFnZUNvZGUodCk7ZS5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmlzV2hpdGVsaXN0ZWQobikmJihyPW4pfX0pLCFyKXt2YXIgbz10aGlzLmkxOG5PcHRpb25zLmZhbGxiYWNrTG5nOyJzdHJpbmciPT10eXBlb2YgbyYmKG89W29dKSxvfHwobz1bXSkscj0iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShvKT9vWzBdOm9bMF18fG8uZGVmYXVsdCYmby5kZWZhdWx0WzBdfXJldHVybiByfX0se2tleToiY2FjaGVVc2VyTGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztlfHwoZT10aGlzLm9wdGlvbnMuY2FjaGVzKSxlJiYodGhpcy5vcHRpb25zLmV4Y2x1ZGVDYWNoZUZvciYmdGhpcy5vcHRpb25zLmV4Y2x1ZGVDYWNoZUZvci5pbmRleE9mKHQpPi0xfHxlLmZvckVhY2goZnVuY3Rpb24oZSl7bi5kZXRlY3RvcnNbZV0mJm4uZGV0ZWN0b3JzW2VdLmNhY2hlVXNlckxhbmd1YWdlKHQsbi5vcHRpb25zKX0pKX19XSksdH0oKTtoLnR5cGU9Imxhbmd1YWdlRGV0ZWN0b3IiLGUuZGVmYXVsdD1ofSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHRzPWZ1bmN0aW9uKHQpe3JldHVybiBvLmNhbGwoaS5jYWxsKGFyZ3VtZW50cywxKSxmdW5jdGlvbihlKXtpZihlKWZvcih2YXIgbiBpbiBlKXZvaWQgMD09PXRbbl0mJih0W25dPWVbbl0pfSksdH0sZS5leHRlbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG8uY2FsbChpLmNhbGwoYXJndW1lbnRzLDEpLGZ1bmN0aW9uKGUpe2lmKGUpZm9yKHZhciBuIGluIGUpdFtuXT1lW25dfSksdH07dmFyIHI9W10sbz1yLmZvckVhY2gsaT1yLnNsaWNlfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1mdW5jdGlvbih0LGUsbixyKXt2YXIgbz12b2lkIDA7aWYobil7dmFyIGk9bmV3IERhdGU7aS5zZXRUaW1lKGkuZ2V0VGltZSgpKzYwKm4qMWUzKSxvPSI7IGV4cGlyZXM9IitpLnRvR01UU3RyaW5nKCl9ZWxzZSBvPSIiO3I9cj8iZG9tYWluPSIrcisiOyI6IiIsZG9jdW1lbnQuY29va2llPXQrIj0iK2UrbysiOyIrcisicGF0aD0vIn0sbz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dCsiPSIsbj1kb2N1bWVudC5jb29raWUuc3BsaXQoIjsiKSxyPTA7cjxuLmxlbmd0aDtyKyspe2Zvcih2YXIgbz1uW3JdOyIgIj09PW8uY2hhckF0KDApOylvPW8uc3Vic3RyaW5nKDEsby5sZW5ndGgpO2lmKDA9PT1vLmluZGV4T2YoZSkpcmV0dXJuIG8uc3Vic3RyaW5nKGUubGVuZ3RoLG8ubGVuZ3RoKX1yZXR1cm4gbnVsbH07ZS5kZWZhdWx0PXtuYW1lOiJjb29raWUiLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYodC5sb29rdXBDb29raWUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBuPW8odC5sb29rdXBDb29raWUpO24mJihlPW4pfXJldHVybiBlfSxjYWNoZVVzZXJMYW5ndWFnZTpmdW5jdGlvbih0LGUpe2UubG9va3VwQ29va2llJiYidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZyKGUubG9va3VwQ29va2llLHQsZS5jb29raWVNaW51dGVzLGUuY29va2llRG9tYWluKX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6InF1ZXJ5c3RyaW5nIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KWZvcih2YXIgbj13aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKS5zcGxpdCgiJiIpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXS5pbmRleE9mKCI9Iik7aWYobz4wKW5bcl0uc3Vic3RyaW5nKDAsbyk9PT10Lmxvb2t1cFF1ZXJ5c3RyaW5nJiYoZT1uW3JdLnN1YnN0cmluZyhvKzEpKX1yZXR1cm4gZX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj12b2lkIDA7dHJ5e3I9InVuZGVmaW5lZCIhPT13aW5kb3cmJm51bGwhPT13aW5kb3cubG9jYWxTdG9yYWdlO3dpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiaTE4bmV4dC50cmFuc2xhdGUuYm9vIiwiZm9vIiksd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJpMThuZXh0LnRyYW5zbGF0ZS5ib28iKX1jYXRjaCh0KXtyPSExfWUuZGVmYXVsdD17bmFtZToibG9jYWxTdG9yYWdlIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwO2lmKHQubG9va3VwTG9jYWxTdG9yYWdlJiZyKXt2YXIgbj13aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odC5sb29rdXBMb2NhbFN0b3JhZ2UpO24mJihlPW4pfXJldHVybiBlfSxjYWNoZVVzZXJMYW5ndWFnZTpmdW5jdGlvbih0LGUpe2UubG9va3VwTG9jYWxTdG9yYWdlJiZyJiZ3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oZS5sb29rdXBMb2NhbFN0b3JhZ2UsdCl9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXtuYW1lOiJuYXZpZ2F0b3IiLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT1bXTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvcil7aWYobmF2aWdhdG9yLmxhbmd1YWdlcylmb3IodmFyIG49MDtuPG5hdmlnYXRvci5sYW5ndWFnZXMubGVuZ3RoO24rKyllLnB1c2gobmF2aWdhdG9yLmxhbmd1YWdlc1tuXSk7bmF2aWdhdG9yLnVzZXJMYW5ndWFnZSYmZS5wdXNoKG5hdmlnYXRvci51c2VyTGFuZ3VhZ2UpLG5hdmlnYXRvci5sYW5ndWFnZSYmZS5wdXNoKG5hdmlnYXRvci5sYW5ndWFnZSl9cmV0dXJuIGUubGVuZ3RoPjA/ZTp2b2lkIDB9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXtuYW1lOiJodG1sVGFnIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwLG49dC5odG1sVGFnfHwoInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudD9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ6bnVsbCk7cmV0dXJuIG4mJiJmdW5jdGlvbiI9PXR5cGVvZiBuLmdldEF0dHJpYnV0ZSYmKGU9bi5nZXRBdHRyaWJ1dGUoImxhbmciKSksZX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6InBhdGgiLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cpe3ZhciBuPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5tYXRjaCgvXC8oW2EtekEtWi1dKikvZyk7aWYobiBpbnN0YW5jZW9mIEFycmF5KWlmKCJudW1iZXIiPT10eXBlb2YgdC5sb29rdXBGcm9tUGF0aEluZGV4KXtpZigic3RyaW5nIiE9dHlwZW9mIG5bdC5sb29rdXBGcm9tUGF0aEluZGV4XSlyZXR1cm47ZT1uW3QubG9va3VwRnJvbVBhdGhJbmRleF0ucmVwbGFjZSgiLyIsIiIpfWVsc2UgZT1uWzBdLnJlcGxhY2UoIi8iLCIiKX1yZXR1cm4gZX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6InN1YmRvbWFpbiIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyl7dmFyIG49d2luZG93LmxvY2F0aW9uLmhyZWYubWF0Y2goLyg/Omh0dHBbc10qXDpcL1wvKSooLio/KVwuKD89W15cL10qXC4uezIsNX0pL2dpKTtuIGluc3RhbmNlb2YgQXJyYXkmJihlPSJudW1iZXIiPT10eXBlb2YgdC5sb29rdXBGcm9tU3ViZG9tYWluSW5kZXg/blt0Lmxvb2t1cEZyb21TdWJkb21haW5JbmRleF0ucmVwbGFjZSgiaHR0cDovLyIsIiIpLnJlcGxhY2UoImh0dHBzOi8vIiwiIikucmVwbGFjZSgiLiIsIiIpOm5bMF0ucmVwbGFjZSgiaHR0cDovLyIsIiIpLnJlcGxhY2UoImh0dHBzOi8vIiwiIikucmVwbGFjZSgiLiIsIiIpKX1yZXR1cm4gZX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNzQpLG89bigxMjQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihyKHQpKXJldHVybiBvKHQpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI3NSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMDkpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMjUpLG89bigyNzgpLGk9bigxMDIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZih2b2lkIDAhPT1pJiZvKE9iamVjdCh0KSkpcmV0dXJuIHIodCl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTEwKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI3OSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDUwKSxuKDM0KSx0LmV4cG9ydHM9bigyODApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3Niksbz1uKDIpLGk9bigyOSksYT1vKCJpdGVyYXRvciIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1PYmplY3QodCk7cmV0dXJuIHZvaWQgMCE9PWVbYV18fCJAQGl0ZXJhdG9yImluIGV8fGkuaGFzT3duUHJvcGVydHkocihlKSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMjUpLG89bigyODIpLGk9bigxMjQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gaSh0LGUpO3ZhciBhPW8obj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTtyZXR1cm4iT2JqZWN0Ij09PWEmJnQuY29uc3RydWN0b3ImJihhPXQuY29uc3RydWN0b3IubmFtZSksIk1hcCI9PT1hfHwiU2V0Ij09PWE/cih0KToiQXJndW1lbnRzIj09PWF8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KGEpP2kodCxlKTp2b2lkIDB9fX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI4Myl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTQpfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI4Nil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI4Nyksbz1uKDI4OSksaT1BcnJheS5wcm90b3R5cGUsYT1TdHJpbmcucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmluY2x1ZGVzO3JldHVybiB0PT09aXx8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09aS5pbmNsdWRlcz9yOiJzdHJpbmciPT10eXBlb2YgdHx8dD09PWF8fHQgaW5zdGFuY2VvZiBTdHJpbmcmJmU9PT1hLmluY2x1ZGVzP286ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDI4OCk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIkFycmF5IikuaW5jbHVkZXN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNjcpLmluY2x1ZGVzLGk9big3Nyk7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITB9LHtpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLGkoImluY2x1ZGVzIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDI5MCk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIlN0cmluZyIpLmluY2x1ZGVzfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDI5MSksaT1uKDQ1KTtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOiFuKDI5MykoImluY2x1ZGVzIil9LHtpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4hIX5TdHJpbmcoaSh0aGlzKSkuaW5kZXhPZihvKHQpLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjkyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYocih0KSl0aHJvdyBUeXBlRXJyb3IoIlRoZSBtZXRob2QgZG9lc24ndCBhY2NlcHQgcmVndWxhciBleHByZXNzaW9ucyIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNiksbz1uKDI2KSxpPW4oMikoIm1hdGNoIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiByKHQpJiYodm9pZCAwIT09KGU9dFtpXSk/ISFlOiJSZWdFeHAiPT1vKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIpKCJtYXRjaCIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT0vLi87dHJ5eyIvLi8iW3RdKGUpfWNhdGNoKG4pe3RyeXtyZXR1cm4gZVtyXT0hMSwiLy4vIlt0XShlKX1jYXRjaCh0KXt9fXJldHVybiExfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24odCl7Ci8qIQogKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci4KICoKICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+CiAqIEBsaWNlbnNlICBNSVQKICovCnZhciByPW4oMjk1KSxvPW4oMjk2KSxpPW4oMjk3KTtmdW5jdGlvbiBhKCl7cmV0dXJuIHUuVFlQRURfQVJSQVlfU1VQUE9SVD8yMTQ3NDgzNjQ3OjEwNzM3NDE4MjN9ZnVuY3Rpb24gcyh0LGUpe2lmKGEoKTxlKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiB1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9bmV3IFVpbnQ4QXJyYXkoZSkpLl9fcHJvdG9fXz11LnByb3RvdHlwZToobnVsbD09PXQmJih0PW5ldyB1KGUpKSx0Lmxlbmd0aD1lKSx0fWZ1bmN0aW9uIHUodCxlLG4pe2lmKCEodS5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgdSkpcmV0dXJuIG5ldyB1KHQsZSxuKTtpZigibnVtYmVyIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIGYodGhpcyx0KX1yZXR1cm4gYyh0aGlzLHQsZSxuKX1mdW5jdGlvbiBjKHQsZSxuLHIpe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2Z1bmN0aW9uKHQsZSxuLHIpe2lmKGUuYnl0ZUxlbmd0aCxuPDB8fGUuYnl0ZUxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzIik7aWYoZS5ieXRlTGVuZ3RoPG4rKHJ8fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCInbGVuZ3RoJyBpcyBvdXQgb2YgYm91bmRzIik7ZT12b2lkIDA9PT1uJiZ2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KGUpOnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkoZSxuKTpuZXcgVWludDhBcnJheShlLG4scik7dS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PWUpLl9fcHJvdG9fXz11LnByb3RvdHlwZTp0PXAodCxlKTtyZXR1cm4gdH0odCxlLG4scik6InN0cmluZyI9PXR5cGVvZiBlP2Z1bmN0aW9uKHQsZSxuKXsic3RyaW5nIj09dHlwZW9mIG4mJiIiIT09bnx8KG49InV0ZjgiKTtpZighdS5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJlbmNvZGluZyIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpO3ZhciByPTB8ZChlLG4pLG89KHQ9cyh0LHIpKS53cml0ZShlLG4pO28hPT1yJiYodD10LnNsaWNlKDAsbykpO3JldHVybiB0fSh0LGUsbik6ZnVuY3Rpb24odCxlKXtpZih1LmlzQnVmZmVyKGUpKXt2YXIgbj0wfGgoZS5sZW5ndGgpO3JldHVybiAwPT09KHQ9cyh0LG4pKS5sZW5ndGg/dDooZS5jb3B5KHQsMCwwLG4pLHQpfWlmKGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gZSlyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIGUubGVuZ3RofHwocj1lLmxlbmd0aCkhPXI/cyh0LDApOnAodCxlKTtpZigiQnVmZmVyIj09PWUudHlwZSYmaShlLmRhdGEpKXJldHVybiBwKHQsZS5kYXRhKX12YXIgcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KHQsZSl9ZnVuY3Rpb24gbCh0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIGYodCxlKXtpZihsKGUpLHQ9cyh0LGU8MD8wOjB8aChlKSksIXUuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIG49MDtuPGU7KytuKXRbbl09MDtyZXR1cm4gdH1mdW5jdGlvbiBwKHQsZSl7dmFyIG49ZS5sZW5ndGg8MD8wOjB8aChlLmxlbmd0aCk7dD1zKHQsbik7Zm9yKHZhciByPTA7cjxuO3IrPTEpdFtyXT0yNTUmZVtyXTtyZXR1cm4gdH1mdW5jdGlvbiBoKHQpe2lmKHQ+PWEoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIrYSgpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8dH1mdW5jdGlvbiBkKHQsZSl7aWYodS5pc0J1ZmZlcih0KSlyZXR1cm4gdC5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gdC5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgdCYmKHQ9IiIrdCk7dmFyIG49dC5sZW5ndGg7aWYoMD09PW4pcmV0dXJuIDA7Zm9yKHZhciByPSExOzspc3dpdGNoKGUpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIG47Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gRih0KS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKm47Y2FzZSJoZXgiOnJldHVybiBuPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIEgodCkubGVuZ3RoO2RlZmF1bHQ6aWYocilyZXR1cm4gRih0KS5sZW5ndGg7ZT0oIiIrZSkudG9Mb3dlckNhc2UoKSxyPSEwfX1mdW5jdGlvbiBnKHQsZSxuKXt2YXIgcj0hMTtpZigodm9pZCAwPT09ZXx8ZTwwKSYmKGU9MCksZT50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09bnx8bj50aGlzLmxlbmd0aCkmJihuPXRoaXMubGVuZ3RoKSxuPD0wKXJldHVybiIiO2lmKChuPj4+PTApPD0oZT4+Pj0wKSlyZXR1cm4iIjtmb3IodHx8KHQ9InV0ZjgiKTs7KXN3aXRjaCh0KXtjYXNlImhleCI6cmV0dXJuIEwodGhpcyxlLG4pO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIGoodGhpcyxlLG4pO2Nhc2UiYXNjaWkiOnJldHVybiBPKHRoaXMsZSxuKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBDKHRoaXMsZSxuKTtjYXNlImJhc2U2NCI6cmV0dXJuIFQodGhpcyxlLG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gUih0aGlzLGUsbik7ZGVmYXVsdDppZihyKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7dD0odCsiIikudG9Mb3dlckNhc2UoKSxyPSEwfX1mdW5jdGlvbiB2KHQsZSxuKXt2YXIgcj10W2VdO3RbZV09dFtuXSx0W25dPXJ9ZnVuY3Rpb24geSh0LGUsbixyLG8pe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIG4/KHI9bixuPTApOm4+MjE0NzQ4MzY0Nz9uPTIxNDc0ODM2NDc6bjwtMjE0NzQ4MzY0OCYmKG49LTIxNDc0ODM2NDgpLG49K24saXNOYU4obikmJihuPW8/MDp0Lmxlbmd0aC0xKSxuPDAmJihuPXQubGVuZ3RoK24pLG4+PXQubGVuZ3RoKXtpZihvKXJldHVybi0xO249dC5sZW5ndGgtMX1lbHNlIGlmKG48MCl7aWYoIW8pcmV0dXJuLTE7bj0wfWlmKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9dS5mcm9tKGUscikpLHUuaXNCdWZmZXIoZSkpcmV0dXJuIDA9PT1lLmxlbmd0aD8tMTptKHQsZSxuLHIsbyk7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBlJj0yNTUsdS5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9vP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0LGUsbik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbCh0LGUsbik6bSh0LFtlXSxuLHIsbyk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gbSh0LGUsbixyLG8pe3ZhciBpLGE9MSxzPXQubGVuZ3RoLHU9ZS5sZW5ndGg7aWYodm9pZCAwIT09ciYmKCJ1Y3MyIj09PShyPVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PXJ8fCJ1dGYxNmxlIj09PXJ8fCJ1dGYtMTZsZSI9PT1yKSl7aWYodC5sZW5ndGg8Mnx8ZS5sZW5ndGg8MilyZXR1cm4tMTthPTIscy89Mix1Lz0yLG4vPTJ9ZnVuY3Rpb24gYyh0LGUpe3JldHVybiAxPT09YT90W2VdOnQucmVhZFVJbnQxNkJFKGUqYSl9aWYobyl7dmFyIGw9LTE7Zm9yKGk9bjtpPHM7aSsrKWlmKGModCxpKT09PWMoZSwtMT09PWw/MDppLWwpKXtpZigtMT09PWwmJihsPWkpLGktbCsxPT09dSlyZXR1cm4gbCphfWVsc2UtMSE9PWwmJihpLT1pLWwpLGw9LTF9ZWxzZSBmb3Iobit1PnMmJihuPXMtdSksaT1uO2k+PTA7aS0tKXtmb3IodmFyIGY9ITAscD0wO3A8dTtwKyspaWYoYyh0LGkrcCkhPT1jKGUscCkpe2Y9ITE7YnJlYWt9aWYoZilyZXR1cm4gaX1yZXR1cm4tMX1mdW5jdGlvbiBiKHQsZSxuLHIpe249TnVtYmVyKG4pfHwwO3ZhciBvPXQubGVuZ3RoLW47cj8ocj1OdW1iZXIocikpPm8mJihyPW8pOnI9bzt2YXIgaT1lLmxlbmd0aDtpZihpJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7cj5pLzImJihyPWkvMik7Zm9yKHZhciBhPTA7YTxyOysrYSl7dmFyIHM9cGFyc2VJbnQoZS5zdWJzdHIoMiphLDIpLDE2KTtpZihpc05hTihzKSlyZXR1cm4gYTt0W24rYV09c31yZXR1cm4gYX1mdW5jdGlvbiB4KHQsZSxuLHIpe3JldHVybiB6KEYoZSx0Lmxlbmd0aC1uKSx0LG4scil9ZnVuY3Rpb24gdyh0LGUsbixyKXtyZXR1cm4geihmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wO248dC5sZW5ndGg7KytuKWUucHVzaCgyNTUmdC5jaGFyQ29kZUF0KG4pKTtyZXR1cm4gZX0oZSksdCxuLHIpfWZ1bmN0aW9uIGsodCxlLG4scil7cmV0dXJuIHcodCxlLG4scil9ZnVuY3Rpb24gUyh0LGUsbixyKXtyZXR1cm4geihIKGUpLHQsbixyKX1mdW5jdGlvbiBFKHQsZSxuLHIpe3JldHVybiB6KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHIsbyxpPVtdLGE9MDthPHQubGVuZ3RoJiYhKChlLT0yKTwwKTsrK2Epbj10LmNoYXJDb2RlQXQoYSkscj1uPj44LG89biUyNTYsaS5wdXNoKG8pLGkucHVzaChyKTtyZXR1cm4gaX0oZSx0Lmxlbmd0aC1uKSx0LG4scil9ZnVuY3Rpb24gVCh0LGUsbil7cmV0dXJuIDA9PT1lJiZuPT09dC5sZW5ndGg/ci5mcm9tQnl0ZUFycmF5KHQpOnIuZnJvbUJ5dGVBcnJheSh0LnNsaWNlKGUsbikpfWZ1bmN0aW9uIGoodCxlLG4pe249TWF0aC5taW4odC5sZW5ndGgsbik7Zm9yKHZhciByPVtdLG89ZTtvPG47KXt2YXIgaSxhLHMsdSxjPXRbb10sbD1udWxsLGY9Yz4yMzk/NDpjPjIyMz8zOmM+MTkxPzI6MTtpZihvK2Y8PW4pc3dpdGNoKGYpe2Nhc2UgMTpjPDEyOCYmKGw9Yyk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYoaT10W28rMV0pKSYmKHU9KDMxJmMpPDw2fDYzJmkpPjEyNyYmKGw9dSk7YnJlYWs7Y2FzZSAzOmk9dFtvKzFdLGE9dFtvKzJdLDEyOD09KDE5MiZpKSYmMTI4PT0oMTkyJmEpJiYodT0oMTUmYyk8PDEyfCg2MyZpKTw8Nnw2MyZhKT4yMDQ3JiYodTw1NTI5Nnx8dT41NzM0MykmJihsPXUpO2JyZWFrO2Nhc2UgNDppPXRbbysxXSxhPXRbbysyXSxzPXRbbyszXSwxMjg9PSgxOTImaSkmJjEyOD09KDE5MiZhKSYmMTI4PT0oMTkyJnMpJiYodT0oMTUmYyk8PDE4fCg2MyZpKTw8MTJ8KDYzJmEpPDw2fDYzJnMpPjY1NTM1JiZ1PDExMTQxMTImJihsPXUpfW51bGw9PT1sPyhsPTY1NTMzLGY9MSk6bD42NTUzNSYmKGwtPTY1NTM2LHIucHVzaChsPj4+MTAmMTAyM3w1NTI5NiksbD01NjMyMHwxMDIzJmwpLHIucHVzaChsKSxvKz1mfXJldHVybiBmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aDtpZihlPD1BKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0KTt2YXIgbj0iIixyPTA7Zm9yKDtyPGU7KW4rPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQuc2xpY2UocixyKz1BKSk7cmV0dXJuIG59KHIpfWUuQnVmZmVyPXUsZS5TbG93QnVmZmVyPWZ1bmN0aW9uKHQpeyt0IT10JiYodD0wKTtyZXR1cm4gdS5hbGxvYygrdCl9LGUuSU5TUEVDVF9NQVhfQllURVM9NTAsdS5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMCE9PXQuVFlQRURfQVJSQVlfU1VQUE9SVD90LlRZUEVEX0FSUkFZX1NVUFBPUlQ6ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9bmV3IFVpbnQ4QXJyYXkoMSk7cmV0dXJuIHQuX19wcm90b19fPXtfX3Byb3RvX186VWludDhBcnJheS5wcm90b3R5cGUsZm9vOmZ1bmN0aW9uKCl7cmV0dXJuIDQyfX0sNDI9PT10LmZvbygpJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zdWJhcnJheSYmMD09PXQuc3ViYXJyYXkoMSwxKS5ieXRlTGVuZ3RofWNhdGNoKHQpe3JldHVybiExfX0oKSxlLmtNYXhMZW5ndGg9YSgpLHUucG9vbFNpemU9ODE5Mix1Ll9hdWdtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fXz11LnByb3RvdHlwZSx0fSx1LmZyb209ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjKG51bGwsdCxlLG4pfSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQmJih1LnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsdS5fX3Byb3RvX189VWludDhBcnJheSwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnNwZWNpZXMmJnVbU3ltYm9sLnNwZWNpZXNdPT09dSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHUsU3ltYm9sLnNwZWNpZXMse3ZhbHVlOm51bGwsY29uZmlndXJhYmxlOiEwfSkpLHUuYWxsb2M9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gbChlKSxlPD0wP3ModCxlKTp2b2lkIDAhPT1uPyJzdHJpbmciPT10eXBlb2Ygcj9zKHQsZSkuZmlsbChuLHIpOnModCxlKS5maWxsKG4pOnModCxlKX0obnVsbCx0LGUsbil9LHUuYWxsb2NVbnNhZmU9ZnVuY3Rpb24odCl7cmV0dXJuIGYobnVsbCx0KX0sdS5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24odCl7cmV0dXJuIGYobnVsbCx0KX0sdS5pc0J1ZmZlcj1mdW5jdGlvbih0KXtyZXR1cm4hKG51bGw9PXR8fCF0Ll9pc0J1ZmZlcil9LHUuY29tcGFyZT1mdW5jdGlvbih0LGUpe2lmKCF1LmlzQnVmZmVyKHQpfHwhdS5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYodD09PWUpcmV0dXJuIDA7Zm9yKHZhciBuPXQubGVuZ3RoLHI9ZS5sZW5ndGgsbz0wLGk9TWF0aC5taW4obixyKTtvPGk7KytvKWlmKHRbb10hPT1lW29dKXtuPXRbb10scj1lW29dO2JyZWFrfXJldHVybiBuPHI/LTE6cjxuPzE6MH0sdS5pc0VuY29kaW5nPWZ1bmN0aW9uKHQpe3N3aXRjaChTdHJpbmcodCkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSx1LmNvbmNhdD1mdW5jdGlvbih0LGUpe2lmKCFpKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHUuYWxsb2MoMCk7dmFyIG47aWYodm9pZCAwPT09ZSlmb3IoZT0wLG49MDtuPHQubGVuZ3RoOysrbillKz10W25dLmxlbmd0aDt2YXIgcj11LmFsbG9jVW5zYWZlKGUpLG89MDtmb3Iobj0wO248dC5sZW5ndGg7KytuKXt2YXIgYT10W25dO2lmKCF1LmlzQnVmZmVyKGEpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTthLmNvcHkocixvKSxvKz1hLmxlbmd0aH1yZXR1cm4gcn0sdS5ieXRlTGVuZ3RoPWQsdS5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLHUucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9Mil2KHRoaXMsZSxlKzEpO3JldHVybiB0aGlzfSx1LnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTQpdih0aGlzLGUsZSszKSx2KHRoaXMsZSsxLGUrMik7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9OCl2KHRoaXMsZSxlKzcpLHYodGhpcyxlKzEsZSs2KSx2KHRoaXMsZSsyLGUrNSksdih0aGlzLGUrMyxlKzQpO3JldHVybiB0aGlzfSx1LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT10PyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoP2oodGhpcywwLHQpOmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx1LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7aWYoIXUuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09dHx8MD09PXUuY29tcGFyZSh0aGlzLHQpfSx1LnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9IiIsbj1lLklOU1BFQ1RfTUFYX0JZVEVTO3JldHVybiB0aGlzLmxlbmd0aD4wJiYodD10aGlzLnRvU3RyaW5nKCJoZXgiLDAsbikubWF0Y2goLy57Mn0vZykuam9pbigiICIpLHRoaXMubGVuZ3RoPm4mJih0Kz0iIC4uLiAiKSksIjxCdWZmZXIgIit0KyI+In0sdS5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUsbixyLG8pe2lmKCF1LmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1uJiYobj10P3QubGVuZ3RoOjApLHZvaWQgMD09PXImJihyPTApLHZvaWQgMD09PW8mJihvPXRoaXMubGVuZ3RoKSxlPDB8fG4+dC5sZW5ndGh8fHI8MHx8bz50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocj49byYmZT49bilyZXR1cm4gMDtpZihyPj1vKXJldHVybi0xO2lmKGU+PW4pcmV0dXJuIDE7aWYodGhpcz09PXQpcmV0dXJuIDA7Zm9yKHZhciBpPShvPj4+PTApLShyPj4+PTApLGE9KG4+Pj49MCktKGU+Pj49MCkscz1NYXRoLm1pbihpLGEpLGM9dGhpcy5zbGljZShyLG8pLGw9dC5zbGljZShlLG4pLGY9MDtmPHM7KytmKWlmKGNbZl0hPT1sW2ZdKXtpPWNbZl0sYT1sW2ZdO2JyZWFrfXJldHVybiBpPGE/LTE6YTxpPzE6MH0sdS5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24odCxlLG4pe3JldHVybi0xIT09dGhpcy5pbmRleE9mKHQsZSxuKX0sdS5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkodGhpcyx0LGUsbiwhMCl9LHUucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geSh0aGlzLHQsZSxuLCExKX0sdS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLG4scil7aWYodm9pZCAwPT09ZSlyPSJ1dGY4IixuPXRoaXMubGVuZ3RoLGU9MDtlbHNlIGlmKHZvaWQgMD09PW4mJiJzdHJpbmciPT10eXBlb2YgZSlyPWUsbj10aGlzLmxlbmd0aCxlPTA7ZWxzZXtpZighaXNGaW5pdGUoZSkpdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIpO2V8PTAsaXNGaW5pdGUobik/KG58PTAsdm9pZCAwPT09ciYmKHI9InV0ZjgiKSk6KHI9bixuPXZvaWQgMCl9dmFyIG89dGhpcy5sZW5ndGgtZTtpZigodm9pZCAwPT09bnx8bj5vKSYmKG49byksdC5sZW5ndGg+MCYmKG48MHx8ZTwwKXx8ZT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiKTtyfHwocj0idXRmOCIpO2Zvcih2YXIgaT0hMTs7KXN3aXRjaChyKXtjYXNlImhleCI6cmV0dXJuIGIodGhpcyx0LGUsbik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4geCh0aGlzLHQsZSxuKTtjYXNlImFzY2lpIjpyZXR1cm4gdyh0aGlzLHQsZSxuKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBrKHRoaXMsdCxlLG4pO2Nhc2UiYmFzZTY0IjpyZXR1cm4gUyh0aGlzLHQsZSxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIEUodGhpcyx0LGUsbik7ZGVmYXVsdDppZihpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrcik7cj0oIiIrcikudG9Mb3dlckNhc2UoKSxpPSEwfX0sdS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTt2YXIgQT00MDk2O2Z1bmN0aW9uIE8odCxlLG4pe3ZhciByPSIiO249TWF0aC5taW4odC5sZW5ndGgsbik7Zm9yKHZhciBvPWU7bzxuOysrbylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZ0W29dKTtyZXR1cm4gcn1mdW5jdGlvbiBDKHQsZSxuKXt2YXIgcj0iIjtuPU1hdGgubWluKHQubGVuZ3RoLG4pO2Zvcih2YXIgbz1lO288bjsrK28pcis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W29dKTtyZXR1cm4gcn1mdW5jdGlvbiBMKHQsZSxuKXt2YXIgcj10Lmxlbmd0aDsoIWV8fGU8MCkmJihlPTApLCghbnx8bjwwfHxuPnIpJiYobj1yKTtmb3IodmFyIG89IiIsaT1lO2k8bjsrK2kpbys9cSh0W2ldKTtyZXR1cm4gb31mdW5jdGlvbiBSKHQsZSxuKXtmb3IodmFyIHI9dC5zbGljZShlLG4pLG89IiIsaT0wO2k8ci5sZW5ndGg7aSs9MilvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJbaV0rMjU2KnJbaSsxXSk7cmV0dXJuIG99ZnVuY3Rpb24gUCh0LGUsbil7aWYodCUxIT0wfHx0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKHQrZT5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gTih0LGUsbixyLG8saSl7aWYoIXUuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKGU+b3x8ZTxpKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihuK3I+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEkodCxlLG4scil7ZTwwJiYoZT02NTUzNStlKzEpO2Zvcih2YXIgbz0wLGk9TWF0aC5taW4odC5sZW5ndGgtbiwyKTtvPGk7KytvKXRbbitvXT0oZSYyNTU8PDgqKHI/bzoxLW8pKT4+PjgqKHI/bzoxLW8pfWZ1bmN0aW9uIEQodCxlLG4scil7ZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSk7Zm9yKHZhciBvPTAsaT1NYXRoLm1pbih0Lmxlbmd0aC1uLDQpO288aTsrK28pdFtuK29dPWU+Pj44KihyP286My1vKSYyNTV9ZnVuY3Rpb24gXyh0LGUsbixyLG8saSl7aWYobityPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIE0odCxlLG4scixpKXtyZXR1cm4gaXx8Xyh0LDAsbiw0KSxvLndyaXRlKHQsZSxuLHIsMjMsNCksbis0fWZ1bmN0aW9uIFUodCxlLG4scixpKXtyZXR1cm4gaXx8Xyh0LDAsbiw4KSxvLndyaXRlKHQsZSxuLHIsNTIsOCksbis4fXUucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj10aGlzLmxlbmd0aDtpZigodD1+fnQpPDA/KHQrPXIpPDAmJih0PTApOnQ+ciYmKHQ9ciksKGU9dm9pZCAwPT09ZT9yOn5+ZSk8MD8oZSs9cik8MCYmKGU9MCk6ZT5yJiYoZT1yKSxlPHQmJihlPXQpLHUuVFlQRURfQVJSQVlfU1VQUE9SVCkobj10aGlzLnN1YmFycmF5KHQsZSkpLl9fcHJvdG9fXz11LnByb3RvdHlwZTtlbHNle3ZhciBvPWUtdDtuPW5ldyB1KG8sdm9pZCAwKTtmb3IodmFyIGk9MDtpPG87KytpKW5baV09dGhpc1tpK3RdfXJldHVybiBufSx1LnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8UCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW3RdLG89MSxpPTA7KytpPGUmJihvKj0yNTYpOylyKz10aGlzW3QraV0qbztyZXR1cm4gcn0sdS5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFAodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1t0Ky0tZV0sbz0xO2U+MCYmKG8qPTI1Nik7KXIrPXRoaXNbdCstLWVdKm87cmV0dXJuIHJ9LHUucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsMSx0aGlzLmxlbmd0aCksdGhpc1t0XX0sdS5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OH0sdS5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdPDw4fHRoaXNbdCsxXX0sdS5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw0LHRoaXMubGVuZ3RoKSwodGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNikrMTY3NzcyMTYqdGhpc1t0KzNdfSx1LnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbdF0rKHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXSl9LHUucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFAodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1t0XSxvPTEsaT0wOysraTxlJiYobyo9MjU2KTspcis9dGhpc1t0K2ldKm87cmV0dXJuIHI+PShvKj0xMjgpJiYoci09TWF0aC5wb3coMiw4KmUpKSxyfSx1LnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24odCxlLG4pe3R8PTAsZXw9MCxufHxQKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPWUsbz0xLGk9dGhpc1t0Ky0tcl07cj4wJiYobyo9MjU2KTspaSs9dGhpc1t0Ky0tcl0qbztyZXR1cm4gaT49KG8qPTEyOCkmJihpLT1NYXRoLnBvdygyLDgqZSkpLGl9LHUucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1t0XT8tMSooMjU1LXRoaXNbdF0rMSk6dGhpc1t0XX0sdS5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24odCxlKXtlfHxQKHQsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1t0XXx0aGlzW3QrMV08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LHUucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7ZXx8UCh0LDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbdCsxXXx0aGlzW3RdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSx1LnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNnx0aGlzW3QrM108PDI0fSx1LnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XTw8MjR8dGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdfSx1LnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsdCwhMCwyMyw0KX0sdS5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDQsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLHQsITEsMjMsNCl9LHUucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsOCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsdCwhMCw1Miw4KX0sdS5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw4LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyx0LCExLDUyLDgpfSx1LnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbih0LGUsbixyKXsodD0rdCxlfD0wLG58PTAscil8fE4odGhpcyx0LGUsbixNYXRoLnBvdygyLDgqbiktMSwwKTt2YXIgbz0xLGk9MDtmb3IodGhpc1tlXT0yNTUmdDsrK2k8biYmKG8qPTI1Nik7KXRoaXNbZStpXT10L28mMjU1O3JldHVybiBlK259LHUucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKHQsZSxuLHIpeyh0PSt0LGV8PTAsbnw9MCxyKXx8Tih0aGlzLHQsZSxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciBvPW4tMSxpPTE7Zm9yKHRoaXNbZStvXT0yNTUmdDstLW8+PTAmJihpKj0yNTYpOyl0aGlzW2Urb109dC9pJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMSwyNTUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0aGlzW2VdPTI1NSZ0LGUrMX0sdS5wcm90b3R5cGUud3JpdGVVSW50MTZMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDIsNjU1MzUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6SSh0aGlzLHQsZSwhMCksZSsyfSx1LnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMiw2NTUzNSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTpJKHRoaXMsdCxlLCExKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2UrM109dD4+PjI0LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZV09MjU1JnQpOkQodGhpcyx0LGUsITApLGUrNH0sdS5wcm90b3R5cGUud3JpdGVVSW50MzJCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6RCh0aGlzLHQsZSwhMSksZSs0fSx1LnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9K3QsZXw9MCwhcil7dmFyIG89TWF0aC5wb3coMiw4Km4tMSk7Tih0aGlzLHQsZSxuLG8tMSwtbyl9dmFyIGk9MCxhPTEscz0wO2Zvcih0aGlzW2VdPTI1NSZ0OysraTxuJiYoYSo9MjU2KTspdDwwJiYwPT09cyYmMCE9PXRoaXNbZStpLTFdJiYocz0xKSx0aGlzW2UraV09KHQvYT4+MCktcyYyNTU7cmV0dXJuIGUrbn0sdS5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbih0LGUsbixyKXtpZih0PSt0LGV8PTAsIXIpe3ZhciBvPU1hdGgucG93KDIsOCpuLTEpO04odGhpcyx0LGUsbixvLTEsLW8pfXZhciBpPW4tMSxhPTEscz0wO2Zvcih0aGlzW2UraV09MjU1JnQ7LS1pPj0wJiYoYSo9MjU2KTspdDwwJiYwPT09cyYmMCE9PXRoaXNbZStpKzFdJiYocz0xKSx0aGlzW2UraV09KHQvYT4+MCktcyYyNTU7cmV0dXJuIGUrbn0sdS5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMSwxMjcsLTEyOCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0PDAmJih0PTI1NSt0KzEpLHRoaXNbZV09MjU1JnQsZSsxfSx1LnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6SSh0aGlzLHQsZSwhMCksZSsyfSx1LnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6SSh0aGlzLHQsZSwhMSksZSsyfSx1LnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrM109dD4+PjI0KTpEKHRoaXMsdCxlLCEwKSxlKzR9LHUucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksdDwwJiYodD00Mjk0OTY3Mjk1K3QrMSksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOkQodGhpcyx0LGUsITEpLGUrNH0sdS5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTSh0aGlzLHQsZSwhMCxuKX0sdS5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTSh0aGlzLHQsZSwhMSxuKX0sdS5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIFUodGhpcyx0LGUsITAsbil9LHUucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBVKHRoaXMsdCxlLCExLG4pfSx1LnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKHQsZSxuLHIpe2lmKG58fChuPTApLHJ8fDA9PT1yfHwocj10aGlzLmxlbmd0aCksZT49dC5sZW5ndGgmJihlPXQubGVuZ3RoKSxlfHwoZT0wKSxyPjAmJnI8biYmKHI9bikscj09PW4pcmV0dXJuIDA7aWYoMD09PXQubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwfHxuPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTtyPnRoaXMubGVuZ3RoJiYocj10aGlzLmxlbmd0aCksdC5sZW5ndGgtZTxyLW4mJihyPXQubGVuZ3RoLWUrbik7dmFyIG8saT1yLW47aWYodGhpcz09PXQmJm48ZSYmZTxyKWZvcihvPWktMTtvPj0wOy0tbyl0W28rZV09dGhpc1tvK25dO2Vsc2UgaWYoaTwxZTN8fCF1LlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKG89MDtvPGk7KytvKXRbbytlXT10aGlzW28rbl07ZWxzZSBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbCh0LHRoaXMuc3ViYXJyYXkobixuK2kpLGUpO3JldHVybiBpfSx1LnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlPyhyPWUsZT0wLG49dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgbiYmKHI9bixuPXRoaXMubGVuZ3RoKSwxPT09dC5sZW5ndGgpe3ZhciBvPXQuY2hhckNvZGVBdCgwKTtvPDI1NiYmKHQ9byl9aWYodm9pZCAwIT09ciYmInN0cmluZyIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIHImJiF1LmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKX1lbHNlIm51bWJlciI9PXR5cGVvZiB0JiYodCY9MjU1KTtpZihlPDB8fHRoaXMubGVuZ3RoPGV8fHRoaXMubGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpO2lmKG48PWUpcmV0dXJuIHRoaXM7dmFyIGk7aWYoZT4+Pj0wLG49dm9pZCAwPT09bj90aGlzLmxlbmd0aDpuPj4+MCx0fHwodD0wKSwibnVtYmVyIj09dHlwZW9mIHQpZm9yKGk9ZTtpPG47KytpKXRoaXNbaV09dDtlbHNle3ZhciBhPXUuaXNCdWZmZXIodCk/dDpGKG5ldyB1KHQscikudG9TdHJpbmcoKSkscz1hLmxlbmd0aDtmb3IoaT0wO2k8bi1lOysraSl0aGlzW2krZV09YVtpJXNdfXJldHVybiB0aGlzfTt2YXIgQj0vW14rXC8wLTlBLVphLXotX10vZztmdW5jdGlvbiBxKHQpe3JldHVybiB0PDE2PyIwIit0LnRvU3RyaW5nKDE2KTp0LnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBGKHQsZSl7dmFyIG47ZT1lfHwxLzA7Zm9yKHZhciByPXQubGVuZ3RoLG89bnVsbCxpPVtdLGE9MDthPHI7KythKXtpZigobj10LmNoYXJDb2RlQXQoYSkpPjU1Mjk1JiZuPDU3MzQ0KXtpZighbyl7aWYobj41NjMxOSl7KGUtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKGErMT09PXIpeyhlLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1vPW47Y29udGludWV9aWYobjw1NjMyMCl7KGUtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpLG89bjtjb250aW51ZX1uPTY1NTM2KyhvLTU1Mjk2PDwxMHxuLTU2MzIwKX1lbHNlIG8mJihlLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtpZihvPW51bGwsbjwxMjgpe2lmKChlLT0xKTwwKWJyZWFrO2kucHVzaChuKX1lbHNlIGlmKG48MjA0OCl7aWYoKGUtPTIpPDApYnJlYWs7aS5wdXNoKG4+PjZ8MTkyLDYzJm58MTI4KX1lbHNlIGlmKG48NjU1MzYpe2lmKChlLT0zKTwwKWJyZWFrO2kucHVzaChuPj4xMnwyMjQsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfWVsc2V7aWYoIShuPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKGUtPTQpPDApYnJlYWs7aS5wdXNoKG4+PjE4fDI0MCxuPj4xMiY2M3wxMjgsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfX1yZXR1cm4gaX1mdW5jdGlvbiBIKHQpe3JldHVybiByLnRvQnl0ZUFycmF5KGZ1bmN0aW9uKHQpe2lmKCh0PWZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0/dC50cmltKCk6dC5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9KHQpLnJlcGxhY2UoQiwiIikpLmxlbmd0aDwyKXJldHVybiIiO2Zvcig7dC5sZW5ndGglNCE9MDspdCs9Ij0iO3JldHVybiB0fSh0KSl9ZnVuY3Rpb24geih0LGUsbixyKXtmb3IodmFyIG89MDtvPHImJiEobytuPj1lLmxlbmd0aHx8bz49dC5sZW5ndGgpOysrbyllW28rbl09dFtvXTtyZXR1cm4gb319KS5jYWxsKHRoaXMsbig4NSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2UuYnl0ZUxlbmd0aD1mdW5jdGlvbih0KXt2YXIgZT1jKHQpLG49ZVswXSxyPWVbMV07cmV0dXJuIDMqKG4rcikvNC1yfSxlLnRvQnl0ZUFycmF5PWZ1bmN0aW9uKHQpe3ZhciBlLG4scj1jKHQpLGE9clswXSxzPXJbMV0sdT1uZXcgaShmdW5jdGlvbih0LGUsbil7cmV0dXJuIDMqKGUrbikvNC1ufSgwLGEscykpLGw9MCxmPXM+MD9hLTQ6YTtmb3Iobj0wO248ZjtuKz00KWU9b1t0LmNoYXJDb2RlQXQobildPDwxOHxvW3QuY2hhckNvZGVBdChuKzEpXTw8MTJ8b1t0LmNoYXJDb2RlQXQobisyKV08PDZ8b1t0LmNoYXJDb2RlQXQobiszKV0sdVtsKytdPWU+PjE2JjI1NSx1W2wrK109ZT4+OCYyNTUsdVtsKytdPTI1NSZlOzI9PT1zJiYoZT1vW3QuY2hhckNvZGVBdChuKV08PDJ8b1t0LmNoYXJDb2RlQXQobisxKV0+PjQsdVtsKytdPTI1NSZlKTsxPT09cyYmKGU9b1t0LmNoYXJDb2RlQXQobildPDwxMHxvW3QuY2hhckNvZGVBdChuKzEpXTw8NHxvW3QuY2hhckNvZGVBdChuKzIpXT4+Mix1W2wrK109ZT4+OCYyNTUsdVtsKytdPTI1NSZlKTtyZXR1cm4gdX0sZS5mcm9tQnl0ZUFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPXQubGVuZ3RoLG89biUzLGk9W10sYT0wLHM9bi1vO2E8czthKz0xNjM4MylpLnB1c2gobCh0LGEsYSsxNjM4Mz5zP3M6YSsxNjM4MykpOzE9PT1vPyhlPXRbbi0xXSxpLnB1c2gocltlPj4yXStyW2U8PDQmNjNdKyI9PSIpKToyPT09byYmKGU9KHRbbi0yXTw8OCkrdFtuLTFdLGkucHVzaChyW2U+PjEwXStyW2U+PjQmNjNdK3JbZTw8MiY2M10rIj0iKSk7cmV0dXJuIGkuam9pbigiIil9O2Zvcih2YXIgcj1bXSxvPVtdLGk9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksYT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIscz0wLHU9YS5sZW5ndGg7czx1OysrcylyW3NdPWFbc10sb1thLmNoYXJDb2RlQXQocyldPXM7ZnVuY3Rpb24gYyh0KXt2YXIgZT10Lmxlbmd0aDtpZihlJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTt2YXIgbj10LmluZGV4T2YoIj0iKTtyZXR1cm4tMT09PW4mJihuPWUpLFtuLG49PT1lPzA6NC1uJTRdfWZ1bmN0aW9uIGwodCxlLG4pe2Zvcih2YXIgbyxpLGE9W10scz1lO3M8bjtzKz0zKW89KHRbc108PDE2JjE2NzExNjgwKSsodFtzKzFdPDw4JjY1MjgwKSsoMjU1JnRbcysyXSksYS5wdXNoKHJbKGk9byk+PjE4JjYzXStyW2k+PjEyJjYzXStyW2k+PjYmNjNdK3JbNjMmaV0pO3JldHVybiBhLmpvaW4oIiIpfW9bIi0iLmNoYXJDb2RlQXQoMCldPTYyLG9bIl8iLmNoYXJDb2RlQXQoMCldPTYzfSxmdW5jdGlvbih0LGUpe2UucmVhZD1mdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpLGEscz04Km8tci0xLHU9KDE8PHMpLTEsYz11Pj4xLGw9LTcsZj1uP28tMTowLHA9bj8tMToxLGg9dFtlK2ZdO2ZvcihmKz1wLGk9aCYoMTw8LWwpLTEsaD4+PS1sLGwrPXM7bD4wO2k9MjU2KmkrdFtlK2ZdLGYrPXAsbC09OCk7Zm9yKGE9aSYoMTw8LWwpLTEsaT4+PS1sLGwrPXI7bD4wO2E9MjU2KmErdFtlK2ZdLGYrPXAsbC09OCk7aWYoMD09PWkpaT0xLWM7ZWxzZXtpZihpPT09dSlyZXR1cm4gYT9OYU46MS8wKihoPy0xOjEpO2ErPU1hdGgucG93KDIsciksaS09Y31yZXR1cm4oaD8tMToxKSphKk1hdGgucG93KDIsaS1yKX0sZS53cml0ZT1mdW5jdGlvbih0LGUsbixyLG8saSl7dmFyIGEscyx1LGM9OCppLW8tMSxsPSgxPDxjKS0xLGY9bD4+MSxwPTIzPT09bz9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsaD1yPzA6aS0xLGQ9cj8xOi0xLGc9ZTwwfHwwPT09ZSYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhzPWlzTmFOKGUpPzE6MCxhPWwpOihhPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKHU9TWF0aC5wb3coMiwtYSkpPDEmJihhLS0sdSo9MiksKGUrPWErZj49MT9wL3U6cCpNYXRoLnBvdygyLDEtZikpKnU+PTImJihhKyssdS89MiksYStmPj1sPyhzPTAsYT1sKTphK2Y+PTE/KHM9KGUqdS0xKSpNYXRoLnBvdygyLG8pLGErPWYpOihzPWUqTWF0aC5wb3coMixmLTEpKk1hdGgucG93KDIsbyksYT0wKSk7bz49ODt0W24raF09MjU1JnMsaCs9ZCxzLz0yNTYsby09OCk7Zm9yKGE9YTw8b3xzLGMrPW87Yz4wO3RbbitoXT0yNTUmYSxoKz1kLGEvPTI1NixjLT04KTt0W24raC1kXXw9MTI4Kmd9fSxmdW5jdGlvbih0LGUpe3ZhciBuPXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1uLmNhbGwodCl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjk5KX0sZnVuY3Rpb24odCxlLG4pe24oMzAwKTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLlVSTFNlYXJjaFBhcmFtc30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuKDEwMSk7dmFyIHI9bigwKSxvPW4oMzAxKSxpPW4oMzUpLGE9bigxMTgpLHM9bigyOCksdT1uKDk5KSxjPW4oNDkpLGw9bigxMTkpLGY9bigxNCkscD1uKDMxKSxoPW4oMTEpLGQ9big2KSxnPW4oMTA4KSx2PW4oNTEpLHk9bigyKSgiaXRlcmF0b3IiKSxtPWMuc2V0LGI9Yy5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtcyIpLHg9Yy5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yIiksdz0vXCsvZyxrPUFycmF5KDQpLFM9ZnVuY3Rpb24odCl7cmV0dXJuIGtbdC0xXXx8KGtbdC0xXT1SZWdFeHAoIigoPzolW1xcZGEtZl17Mn0peyIrdCsifSkiLCJnaSIpKX0sRT1mdW5jdGlvbih0KXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0KX1jYXRjaChlKXtyZXR1cm4gdH19LFQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKHcsIiAiKSxuPTQ7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZSl9Y2F0Y2godCl7Zm9yKDtuOyllPWUucmVwbGFjZShTKG4tLSksRSk7cmV0dXJuIGV9fSxqPS9bIScoKX5dfCUyMC9nLEE9eyIhIjoiJTIxIiwiJyI6IiUyNyIsIigiOiIlMjgiLCIpIjoiJTI5IiwifiI6IiU3RSIsIiUyMCI6IisifSxPPWZ1bmN0aW9uKHQpe3JldHVybiBBW3RdfSxDPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQodCkucmVwbGFjZShqLE8pfSxMPWZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IodmFyIG4scixvPWUuc3BsaXQoIiYiKSxpPTA7aTxvLmxlbmd0aDspKG49b1tpKytdKS5sZW5ndGgmJihyPW4uc3BsaXQoIj0iKSx0LnB1c2goe2tleTpUKHIuc2hpZnQoKSksdmFsdWU6VChyLmpvaW4oIj0iKSl9KSl9LFI9ZnVuY3Rpb24odCl7dGhpcy5lbnRyaWVzLmxlbmd0aD0wLEwodGhpcy5lbnRyaWVzLHQpfSxQPWZ1bmN0aW9uKHQsZSl7aWYodDxlKXRocm93IFR5cGVFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMiKX0sTj11KGZ1bmN0aW9uKHQsZSl7bSh0aGlzLHt0eXBlOiJVUkxTZWFyY2hQYXJhbXNJdGVyYXRvciIsaXRlcmF0b3I6ZyhiKHQpLmVudHJpZXMpLGtpbmQ6ZX0pfSwiSXRlcmF0b3IiLGZ1bmN0aW9uKCl7dmFyIHQ9eCh0aGlzKSxlPXQua2luZCxuPXQuaXRlcmF0b3IubmV4dCgpLHI9bi52YWx1ZTtyZXR1cm4gbi5kb25lfHwobi52YWx1ZT0ia2V5cyI9PT1lP3Iua2V5OiJ2YWx1ZXMiPT09ZT9yLnZhbHVlOltyLmtleSxyLnZhbHVlXSksbn0pLEk9ZnVuY3Rpb24oKXtsKHRoaXMsSSwiVVJMU2VhcmNoUGFyYW1zIik7dmFyIHQsZSxuLHIsbyxpLGEscz1hcmd1bWVudHMubGVuZ3RoPjA/YXJndW1lbnRzWzBdOnZvaWQgMCx1PXRoaXMsYz1bXTtpZihtKHUse3R5cGU6IlVSTFNlYXJjaFBhcmFtcyIsZW50cmllczpjLHVwZGF0ZVVSTDpmdW5jdGlvbigpe30sdXBkYXRlU2VhcmNoUGFyYW1zOlJ9KSx2b2lkIDAhPT1zKWlmKGQocykpaWYoImZ1bmN0aW9uIj09dHlwZW9mKHQ9dihzKSkpZm9yKGU9dC5jYWxsKHMpOyEobj1lLm5leHQoKSkuZG9uZTspe2lmKChvPShyPWcoaChuLnZhbHVlKSkpLm5leHQoKSkuZG9uZXx8KGk9ci5uZXh0KCkpLmRvbmV8fCFyLm5leHQoKS5kb25lKXRocm93IFR5cGVFcnJvcigiRXhwZWN0ZWQgc2VxdWVuY2Ugd2l0aCBsZW5ndGggMiIpO2MucHVzaCh7a2V5Om8udmFsdWUrIiIsdmFsdWU6aS52YWx1ZSsiIn0pfWVsc2UgZm9yKGEgaW4gcylmKHMsYSkmJmMucHVzaCh7a2V5OmEsdmFsdWU6c1thXSsiIn0pO2Vsc2UgTChjLCJzdHJpbmciPT10eXBlb2Ygcz8iPyI9PT1zLmNoYXJBdCgwKT9zLnNsaWNlKDEpOnM6cysiIil9LEQ9SS5wcm90b3R5cGU7YShELHthcHBlbmQ6ZnVuY3Rpb24odCxlKXtQKGFyZ3VtZW50cy5sZW5ndGgsMik7dmFyIG49Yih0aGlzKTtuLmVudHJpZXMucHVzaCh7a2V5OnQrIiIsdmFsdWU6ZSsiIn0pLG4udXBkYXRlVVJMKCl9LGRlbGV0ZTpmdW5jdGlvbih0KXtQKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPWIodGhpcyksbj1lLmVudHJpZXMscj10KyIiLG89MDtvPG4ubGVuZ3RoOyluW29dLmtleT09PXI/bi5zcGxpY2UobywxKTpvKys7ZS51cGRhdGVVUkwoKX0sZ2V0OmZ1bmN0aW9uKHQpe1AoYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIGU9Yih0aGlzKS5lbnRyaWVzLG49dCsiIixyPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5rZXk9PT1uKXJldHVybiBlW3JdLnZhbHVlO3JldHVybiBudWxsfSxnZXRBbGw6ZnVuY3Rpb24odCl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9W10sbz0wO288ZS5sZW5ndGg7bysrKWVbb10ua2V5PT09biYmci5wdXNoKGVbb10udmFsdWUpO3JldHVybiByfSxoYXM6ZnVuY3Rpb24odCl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9MDtyPGUubGVuZ3RoOylpZihlW3IrK10ua2V5PT09bilyZXR1cm4hMDtyZXR1cm4hMX0sc2V0OmZ1bmN0aW9uKHQsZSl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgbixyPWIodGhpcyksbz1yLmVudHJpZXMsaT0hMSxhPXQrIiIscz1lKyIiLHU9MDt1PG8ubGVuZ3RoO3UrKykobj1vW3VdKS5rZXk9PT1hJiYoaT9vLnNwbGljZSh1LS0sMSk6KGk9ITAsbi52YWx1ZT1zKSk7aXx8by5wdXNoKHtrZXk6YSx2YWx1ZTpzfSksci51cGRhdGVVUkwoKX0sc29ydDpmdW5jdGlvbigpe3ZhciB0LGUsbixyPWIodGhpcyksbz1yLmVudHJpZXMsaT1vLnNsaWNlKCk7Zm9yKG8ubGVuZ3RoPTAsbj0wO248aS5sZW5ndGg7bisrKXtmb3IodD1pW25dLGU9MDtlPG47ZSsrKWlmKG9bZV0ua2V5PnQua2V5KXtvLnNwbGljZShlLDAsdCk7YnJlYWt9ZT09PW4mJm8ucHVzaCh0KX1yLnVwZGF0ZVVSTCgpfSxmb3JFYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPWIodGhpcykuZW50cmllcyxyPXAodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKSxvPTA7bzxuLmxlbmd0aDspcigoZT1uW28rK10pLnZhbHVlLGUua2V5LHRoaXMpfSxrZXlzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsImtleXMiKX0sdmFsdWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsInZhbHVlcyIpfSxlbnRyaWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsImVudHJpZXMiKX19LHtlbnVtZXJhYmxlOiEwfSksaShELHksRC5lbnRyaWVzKSxpKEQsInRvU3RyaW5nIixmdW5jdGlvbigpe2Zvcih2YXIgdCxlPWIodGhpcykuZW50cmllcyxuPVtdLHI9MDtyPGUubGVuZ3RoOyl0PWVbcisrXSxuLnB1c2goQyh0LmtleSkrIj0iK0ModC52YWx1ZSkpO3JldHVybiBuLmpvaW4oIiYiKX0se2VudW1lcmFibGU6ITB9KSxzKEksIlVSTFNlYXJjaFBhcmFtcyIpLHIoe2dsb2JhbDohMCxmb3JjZWQ6IW99LHtVUkxTZWFyY2hQYXJhbXM6SX0pLHQuZXhwb3J0cz17VVJMU2VhcmNoUGFyYW1zOkksZ2V0U3RhdGU6Yn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89bigyKSxpPW4oMjcpLGE9bygiaXRlcmF0b3IiKTt0LmV4cG9ydHM9IXIoZnVuY3Rpb24oKXt2YXIgdD1uZXcgVVJMKCJiP2U9MSIsImh0dHA6Ly9hIiksZT10LnNlYXJjaFBhcmFtcztyZXR1cm4gdC5wYXRobmFtZT0iYyUyMGQiLGkmJiF0LnRvSlNPTnx8IWUuc29ydHx8Imh0dHA6Ly9hL2MlMjBkP2U9MSIhPT10LmhyZWZ8fCIxIiE9PWUuZ2V0KCJlIil8fCJhPTEiIT09U3RyaW5nKG5ldyBVUkxTZWFyY2hQYXJhbXMoIj9hPTEiKSl8fCFlW2FdfHwiYSIhPT1uZXcgVVJMKCJodHRwczovL2FAYiIpLnVzZXJuYW1lfHwiYiIhPT1uZXcgVVJMU2VhcmNoUGFyYW1zKG5ldyBVUkxTZWFyY2hQYXJhbXMoImE9YiIpKS5nZXQoImEiKXx8InhuLS1lMWF5YmMiIT09bmV3IFVSTCgiaHR0cDovL9GC0LXRgdGCIikuaG9zdHx8IiMlRDAlQjEiIT09bmV3IFVSTCgiaHR0cDovL2Ej0LEiKS5oYXNofSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5yKGUpO3ZhciByPW4oOCksbz1uLm4ociksaT1uKDYxKSxhPW4ubihpKSxzPW4oOSksdT1uLm4ocyksYz1uKDIwKSxsPW4ubihjKSxmPW4oNykscD1uLm4oZiksaD1uKDEyKSxkPW4ubihoKSxnPW4oMTI2KSx2PW4ubihnKSx5PW4oMTkpLG09bi5uKHkpLGI9bigzNikseD1uLm4oYiksdz1uKDE1KSxrPW4ubih3KSxTPW4oMTApLEU9bi5uKFMpLFQ9KG4oMTYpLG4oODApKSxqPW4ubihUKTtmdW5jdGlvbiBBKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLG49aigpKHQucmVwbGFjZSgvW14wLTldL2dpLCIiKSwxMCk7cmV0dXJuIG58fGV9ZnVuY3Rpb24gTyh0KXt2YXIgZT0iIixuPXQuY29udGVudHMoKTtpZihuLmxlbmd0aD4wKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cis9MSl7dmFyIG89bi5nZXQocik7Mz09PW8ubm9kZVR5cGUmJm8uZGF0YSYmKGUrPW8uZGF0YSl9cmV0dXJuIGV9ZnVuY3Rpb24gQyh0LGUpe2lmKCFlKXRocm93IG5ldyBFcnJvcigic2VsZWN0b3IgcmVxdWlyZWQiKTtyZXR1cm4gdChlKS5sZW5ndGg+MCYmImltZyI9PT10KGUpLnByb3AoInRhZ05hbWUiKS50b0xvd2VyQ2FzZSgpP3QoZSkuYXR0cigiYWx0Iil8fCIiOnQoZSkudGV4dCgpLnJlcGxhY2UoL1xuLywiIil9ZnVuY3Rpb24gTCh0LGUpe2lmKCFlKXRocm93IG5ldyBFcnJvcigic2VsZWN0b3IgcmVxdWlyZWQiKTt2YXIgbj0iIjtpZih0KGUpLmxlbmd0aD4wKXt2YXIgcj10KGUpLnByb3AoInRhZ05hbWUiKS50b0xvd2VyQ2FzZSgpO249ImlucHV0Ij09PXI/dChlKS52YWwoKToibWV0YSI9PT1yP3QoZSkuYXR0cigiY29udGVudCIpfHwiIjpPKHQoZSkpfXJldHVybiBuPW4ucmVwbGFjZSgvW14wLTldL2csIiIpLGooKShuLDEwKX12YXIgUj1uKDM3KSxQPW4ubihSKSxOPW4oMzgpLEk9bi5uKE4pLEQ9bigzOSksXz1uLm4oRCksTT1uKDQwKSxVPW4ubihNKSxCPW4oNDEpLHE9bi5uKEIpLEY9big0MiksSD1uLm4oRiksej1uKDYyKSxXPW4ubih6KTtmdW5jdGlvbiAkKHQsZSl7dmFyIG47aWYodm9pZCAwPT09VS5hfHxudWxsPT1fKCkodCkpe2lmKEkoKSh0KXx8KG49ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBZKHQsZSk7dmFyIHI9SCgpKG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKS5jYWxsKG4sOCwtMSk7Ik9iamVjdCI9PT1yJiZ0LmNvbnN0cnVjdG9yJiYocj10LmNvbnN0cnVjdG9yLm5hbWUpO2lmKCJNYXAiPT09cnx8IlNldCI9PT1yKXJldHVybiBxKCkodCk7aWYoIkFyZ3VtZW50cyI9PT1yfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChyKSlyZXR1cm4gWSh0LGUpfSh0KSl8fGUmJnQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpe24mJih0PW4pO3ZhciByPTAsbz1mdW5jdGlvbigpe307cmV0dXJue3M6byxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKHQpe3Rocm93IHR9LGY6b319dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfXZhciBpLGE9ITAscz0hMTtyZXR1cm57czpmdW5jdGlvbigpe249UCgpKHQpfSxuOmZ1bmN0aW9uKCl7dmFyIHQ9bi5uZXh0KCk7cmV0dXJuIGE9dC5kb25lLHR9LGU6ZnVuY3Rpb24odCl7cz0hMCxpPXR9LGY6ZnVuY3Rpb24oKXt0cnl7YXx8bnVsbD09bi5yZXR1cm58fG4ucmV0dXJuKCl9ZmluYWxseXtpZihzKXRocm93IGl9fX19ZnVuY3Rpb24gWSh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIFYodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJTS1XjgYzkuI3mraPjgafjgZkiKTtpZigwPT09VygpKHQpLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlNLVemgheebruaVsOOBjOS4jeato+OBp+OBmSIpfXZhciBHPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgbj1lLiQscj1lLm5hbWUsbz1lLnByaWNlO3AoKSh0aGlzLHQpLHRoaXMuJD1uLHRoaXMubmFtZVNlbGVjdG9yPXJ8fCIiLHRoaXMucHJpY2VTZWxlY3Rvcj1vfHwiIn1yZXR1cm4gZCgpKHQsW3trZXk6ImdldFB1cmNoYXNhYmxlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4hMH19LHtrZXk6ImV4ZWN1dGUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZSxuLHI9ITA7dHJ5e3JldHVybiB0PXRoaXMuZ2V0SXRlbSgpLGU9dGhpcy5nZXRTa3VSb3dzKHQpLHI9dGhpcy5nZXRQdXJjaGFzYWJsZSh7aXRlbTp0LHNrdVJvd3M6ZX0pLGZ1bmN0aW9uKHQpe3ZhciBlPXQuaXRlbSxuPXQuc2t1Um93cztpZighZSl0aHJvdyBuZXcgRXJyb3IoIuOCouOCpOODhuODoOOBjOS4jeato+OBp+OBmSIpO2lmKCFlLm5hbWUpdGhyb3cgbmV3IEVycm9yKCLjgqLjgqTjg4bjg6DlkI3liY3jgYzkuI3mraPjgafjgZkiKTtpZighKG4mJjAhPT1uLmxlbmd0aHx8ZS5wcmljZSkpdGhyb3cgbmV3IEVycm9yKCLjgqLjgqTjg4bjg6Dph5HpoY3jgYzkuI3mraPjgafjgZkiKTtpZihuKXt2YXIgcixvPSQobik7dHJ5e2ZvcihvLnMoKTshKHI9by5uKCkpLmRvbmU7KXtWKHIudmFsdWUpfX1jYXRjaCh0KXtvLmUodCl9ZmluYWxseXtvLmYoKX19fSh7aXRlbTp0LHNrdVJvd3M6ZX0pLHtpdGVtOnQsc2t1Um93czplLHB1cmNoYXNhYmxlOnJ9fWNhdGNoKHQpe249dH12YXIgbz17cHVyY2hhc2FibGU6cn07cmV0dXJuIHQmJihvLml0ZW09dCksZSYmKG8uc2t1Um93cz1lKSxuJiYoby5lcnJvcj1uKSxvfX0se2tleToiZ2V0SXRlbSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD17bmFtZToiIixwcmljZTowfTt0aGlzLm5hbWVTZWxlY3Rvcj90Lm5hbWU9dGhpcy5nZXRJdGVtTmFtZShDKHRoaXMuJCx0aGlzLm5hbWVTZWxlY3RvcikpOnQubmFtZT10aGlzLmdldEl0ZW1OYW1lKCksdGhpcy5wcmljZVNlbGVjdG9yP3QucHJpY2U9dGhpcy5nZXRJdGVtUHJpY2UoTCh0aGlzLiQsdGhpcy5wcmljZVNlbGVjdG9yKSk6dC5wcmljZT10aGlzLmdldEl0ZW1QcmljZSgpO3ZhciBlPXRoaXMuZ2V0SXRlbUNvZGUoKTtyZXR1cm4gZSYmKHQuY29kZT1lKSx0fX0se2tleToiZ2V0SXRlbU5hbWUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiIiO3JldHVybiB0aGlzLm5hbWVTZWxlY3Rvcj9DKHRoaXMuJCx0aGlzLm5hbWVTZWxlY3Rvcik6dH19LHtrZXk6ImdldEl0ZW1QcmljZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MDtyZXR1cm4gdGhpcy5wcmljZVNlbGVjdG9yP0wodGhpcy4kLHRoaXMucHJpY2VTZWxlY3Rvcik6dH19LHtrZXk6ImdldEl0ZW1Db2RlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiIifX0se2tleToiZ2V0U2t1Um93cyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuW119fV0pLHR9KCksSz1uKDEyNyksWD1uLm4oSyksSj1uKDEyOCk7ZnVuY3Rpb24gUSgpe3JldHVybiB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlcyYmd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx3aW5kb3cubmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZX12YXIgWj1uKDEyOSksdHQ9bi5uKFopLGV0PW4oMTMwKSxudD1uLm4oZXQpLHJ0PW4oNTMpLG90PW4ubihydCksaXQ9InppZ3phZyI7dmFyIGF0PW4oMjUpLHN0PSJ1c2FnZSIsdXQ9InppZ3phZy1mbG93LWNvbnRyb2xsZWQiO2Z1bmN0aW9uIGN0KHQsZSl7d2luZG93LiQmJmZ1bmN0aW9uKG4pe3ZhciByPW4odCk7aWYociYmci5sZW5ndGg+MClmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rPTEpe3ZhciBpPXIuZ2V0KG8pO2kuaGFzQXR0cmlidXRlKHV0KXx8KCJjbGljayI9PT1lP2kub25jbGljaz1udWxsOiJzdWJtaXQiPT09ZSYmKGkub25zdWJtaXQ9bnVsbCksIm9mZiJpbiBuKGkpP24oaSkub2ZmKGUpOiJ1bmJpbmQiaW4gbihpKSYmbihpKS51bmJpbmQoZSkpfX0od2luZG93LiQpfXZhciBsdD17cHJlc2VydmVPcmlnaW5hbEV2ZW50OiExLGRpc2FibGVQb2ludGVyRXZlbnQ6ITEsZGlzYWJsZVJlcG9ydDohMX07dmFyIGZ0PXtkaXNhYmxlUmVwb3J0OiExfTtmdW5jdGlvbiBwdCh0KXt2YXIgZT1udCgpKGZ1bmN0aW9uKCl7dmFyIG4scixvPXdpbmRvdy56aWd6YWc7ImRlYWN0aXZhdGVkIj09PShuPXN0LHI9d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGl0KSxKU09OLnBhcnNlKHI/ZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IocikpOiJ7fSIpW25dKXx8by5pc0RlbmllZHx8KHQoKSxjbGVhckludGVydmFsKGUpKX0sNTAwKX1mdW5jdGlvbiBodCh0LGUpe3ZhciBuPXdpbmRvdy56aWd6YWc7dHQoKShmdW5jdGlvbigpey9DaHJvbWUvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpJiYwPT09dChlKS5sZW5ndGgmJm4mJiJpdGVtIj09PW4uZGlzY292ZXJ5U3RhdHVzJiZhdC5hLmVycm9yKCIiLmNvbmNhdChlLCI6IOOCouOCpOODhuODoOODmuODvOOCuOOBp+ipsuW9k+OBmeOCi+ODleODreODvOWItuW+oeeUqOOBruimgee0oOOBjOimi+OBpOOBi+OCiuOBvuOBm+OCkyIpKX0sNWUzKX12YXIgZHQ9e29uQ2hhbmdlc1JlYWR5OmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpbImphIl07Qm9vbGVhbihFKCkoZSkuY2FsbChlLGZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybi0xIT09WCgpKGU9USgpKS5jYWxsKGUsdCl9KSl8fHB0KGZ1bmN0aW9uKCl7dChKKX0pfSxvdmVycmlkZUNsaWNrRXZlbnQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpsdDtpZigocj1vdCgpKG90KCkoe30sbHQpLHIpKS5kaXNhYmxlUmVwb3J0fHxodCh0LGUpLHIuZGlzYWJsZVBvaW50ZXJFdmVudCl7aWYod2luZG93LmRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKHV0KSlyZXR1cm47dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtvLmlubmVySFRNTD0iXG4gICAgIi5jb25jYXQoZSwiIHtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH0iKTt2YXIgaT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHQiKTtyZXR1cm4gaSYmaS5wYXJlbnROb2RlJiZpLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG8saSksdChkb2N1bWVudCkub24oImNsaWNrIixmdW5jdGlvbihyKXtyLnRhcmdldCYmdChyLnRhcmdldCkuY2xvc2VzdCh0KGUpLnBhcmVudCgpKS5sZW5ndGg+MCYmbihyKX0pLHZvaWQgd2luZG93LmRvY3VtZW50LmJvZHkuc2V0QXR0cmlidXRlKHV0LCIxIil9ci5wcmVzZXJ2ZU9yaWdpbmFsRXZlbnR8fGN0KGUsImNsaWNrIik7Zm9yKHZhciBhPXQoZSkscz0wO3M8YS5sZW5ndGg7cys9MSl7dmFyIHU9YS5nZXQocyk7dS5oYXNBdHRyaWJ1dGUodXQpfHwodS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24odCl7ci5wcmVzZXJ2ZU9yaWdpbmFsRXZlbnR8fCh0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSksbih0KX0sITApLHUuc2V0QXR0cmlidXRlKHV0LCIxIikpfX0sb3ZlcnJpZGVTdWJtaXRFdmVudDpmdW5jdGlvbih0LGUsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOmZ0OyhyPW90KCkob3QoKSh7fSxmdCkscikpLmRpc2FibGVSZXBvcnR8fGh0KHQsZSksY3QoZSwic3VibWl0Iik7dmFyIG89dChlKTtpZihvJiZvLmxlbmd0aD4wKWZvcih2YXIgaT0wO2k8by5sZW5ndGg7aSs9MSl7dmFyIGE9by5nZXQoaSk7YS5oYXNBdHRyaWJ1dGUodXQpfHwodChhKS5vbigic3VibWl0IixuKSxhLnNldEF0dHJpYnV0ZSh1dCwiMSIpKX19LHVuYmluZE9yaWdpbmFsSlF1ZXJ5RXZlbnRzOmN0fTt2YXIgZ3Q9big4MSksdnQ9bi5uKGd0KSx5dD1uKDEzMSksbXQ9bi5uKHl0KSxidD1uKDEzMikseHQ9bi5uKGJ0KSx3dD1uKDgyKSxrdD1uLm4od3QpO2Z1bmN0aW9uIFN0KHQpe3JldHVybihTdD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIEV0KHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH1mdW5jdGlvbiBUdCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/T2JqZWN0KGFyZ3VtZW50c1tlXSk6e30scj1PYmplY3Qua2V5cyhuKTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKHI9ci5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxyLmZvckVhY2goZnVuY3Rpb24oZSl7RXQodCxlLG5bZV0pfSl9cmV0dXJuIHR9ZnVuY3Rpb24ganQodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBBdCh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIE90KHQsZSxuKXtyZXR1cm4gZSYmQXQodC5wcm90b3R5cGUsZSksbiYmQXQodCxuKSx0fWZ1bmN0aW9uIEN0KHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBMdCh0LGUpe3JldHVybiFlfHwib2JqZWN0IiE9PVN0KGUpJiYiZnVuY3Rpb24iIT10eXBlb2YgZT9DdCh0KTplfWZ1bmN0aW9uIFJ0KHQpe3JldHVybihSdD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gUHQodCxlKXtyZXR1cm4oUHQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9KSh0LGUpfWZ1bmN0aW9uIE50KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJlB0KHQsZSl9dmFyIEl0PXt0eXBlOiJsb2dnZXIiLGxvZzpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgibG9nIix0KX0sd2FybjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgid2FybiIsdCl9LGVycm9yOmZ1bmN0aW9uKHQpe3RoaXMub3V0cHV0KCJlcnJvciIsdCl9LG91dHB1dDpmdW5jdGlvbih0LGUpe2NvbnNvbGUmJmNvbnNvbGVbdF0mJmNvbnNvbGVbdF0uYXBwbHkoY29uc29sZSxlKX19LER0PW5ldyhmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2p0KHRoaXMsdCksdGhpcy5pbml0KGUsbil9cmV0dXJuIE90KHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTt0aGlzLnByZWZpeD1lLnByZWZpeHx8ImkxOG5leHQ6Iix0aGlzLmxvZ2dlcj10fHxJdCx0aGlzLm9wdGlvbnM9ZSx0aGlzLmRlYnVnPWUuZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZWJ1Zz10fX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuZm9yd2FyZChlLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gciYmIXRoaXMuZGVidWc/bnVsbDooInN0cmluZyI9PXR5cGVvZiB0WzBdJiYodFswXT0iIi5jb25jYXQobikuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KHRbMF0pKSx0aGlzLmxvZ2dlcltlXSh0KSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdCh0aGlzLmxvZ2dlcixUdCh7fSx7cHJlZml4OiIiLmNvbmNhdCh0aGlzLnByZWZpeCwiOiIpLmNvbmNhdChlLCI6Iil9LHRoaXMub3B0aW9ucykpfX1dKSx0fSgpKSxfdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtqdCh0aGlzLHQpLHRoaXMub2JzZXJ2ZXJzPXt9fXJldHVybiBPdCh0LFt7a2V5OiJvbiIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiB0LnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbih0KXtuLm9ic2VydmVyc1t0XT1uLm9ic2VydmVyc1t0XXx8W10sbi5vYnNlcnZlcnNbdF0ucHVzaChlKX0pLHRoaXN9fSx7a2V5OiJvZmYiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5vYnNlcnZlcnNbdF0mJihlP3RoaXMub2JzZXJ2ZXJzW3RdPXRoaXMub2JzZXJ2ZXJzW3RdLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdCE9PWV9KTpkZWxldGUgdGhpcy5vYnNlcnZlcnNbdF0pfX0se2tleToiZW1pdCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZT4xP2UtMTowKSxyPTE7cjxlO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2lmKHRoaXMub2JzZXJ2ZXJzW3RdKXt2YXIgbz1bXS5jb25jYXQodGhpcy5vYnNlcnZlcnNbdF0pO28uZm9yRWFjaChmdW5jdGlvbih0KXt0LmFwcGx5KHZvaWQgMCxuKX0pfWlmKHRoaXMub2JzZXJ2ZXJzWyIqIl0pe3ZhciBpPVtdLmNvbmNhdCh0aGlzLm9ic2VydmVyc1siKiJdKTtpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hcHBseShlLFt0XS5jb25jYXQobikpfSl9fX1dKSx0fSgpO2Z1bmN0aW9uIE10KCl7dmFyIHQsZSxuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4scil7dD1uLGU9cn0pO3JldHVybiBuLnJlc29sdmU9dCxuLnJlamVjdD1lLG59ZnVuY3Rpb24gVXQodCl7cmV0dXJuIG51bGw9PXQ/IiI6IiIrdH1mdW5jdGlvbiBCdCh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mdW5jdGlvbiBvKCl7cmV0dXJuIXR8fCJzdHJpbmciPT10eXBlb2YgdH1mb3IodmFyIGk9InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7aS5sZW5ndGg+MTspe2lmKG8oKSlyZXR1cm57fTt2YXIgYT1yKGkuc2hpZnQoKSk7IXRbYV0mJm4mJih0W2FdPW5ldyBuKSx0PXRbYV19cmV0dXJuIG8oKT97fTp7b2JqOnQsazpyKGkuc2hpZnQoKSl9fWZ1bmN0aW9uIHF0KHQsZSxuKXt2YXIgcj1CdCh0LGUsT2JqZWN0KTtyLm9ialtyLmtdPW59ZnVuY3Rpb24gRnQodCxlKXt2YXIgbj1CdCh0LGUpLHI9bi5vYmosbz1uLms7aWYocilyZXR1cm4gcltvXX1mdW5jdGlvbiBIdCh0LGUsbil7dmFyIHI9RnQodCxuKTtyZXR1cm4gdm9pZCAwIT09cj9yOkZ0KGUsbil9ZnVuY3Rpb24genQodCxlLG4pe2Zvcih2YXIgciBpbiBlKSJfX3Byb3RvX18iIT09ciYmImNvbnN0cnVjdG9yIiE9PXImJihyIGluIHQ/InN0cmluZyI9PXR5cGVvZiB0W3JdfHx0W3JdaW5zdGFuY2VvZiBTdHJpbmd8fCJzdHJpbmciPT10eXBlb2YgZVtyXXx8ZVtyXWluc3RhbmNlb2YgU3RyaW5nP24mJih0W3JdPWVbcl0pOnp0KHRbcl0sZVtyXSxuKTp0W3JdPWVbcl0pO3JldHVybiB0fWZ1bmN0aW9uIFd0KHQpe3JldHVybiB0LnJlcGxhY2UoL1tcLVxbXF1cL1x7XH1cKFwpXCpcK1w/XC5cXFxeXCRcfF0vZywiXFwkJiIpfXZhciAkdD17IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjMzk7IiwiLyI6IiYjeDJGOyJ9O2Z1bmN0aW9uIFl0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnJlcGxhY2UoL1smPD4iJ1wvXS9nLGZ1bmN0aW9uKHQpe3JldHVybiAkdFt0XX0pOnR9dmFyIFZ0PSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cubmF2aWdhdG9yJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCYmd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpPi0xLEd0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIG4scj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e25zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6InRyYW5zbGF0aW9uIn07cmV0dXJuIGp0KHRoaXMsZSksbj1MdCh0aGlzLFJ0KGUpLmNhbGwodGhpcykpLFZ0JiZfdC5jYWxsKEN0KG4pKSxuLmRhdGE9dHx8e30sbi5vcHRpb25zPXIsdm9pZCAwPT09bi5vcHRpb25zLmtleVNlcGFyYXRvciYmKG4ub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxufXJldHVybiBOdChlLF90KSxPdChlLFt7a2V5OiJhZGROYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMubnMuaW5kZXhPZih0KTwwJiZ0aGlzLm9wdGlvbnMubnMucHVzaCh0KX19LHtrZXk6InJlbW92ZU5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucy5ucy5pbmRleE9mKHQpO2U+LTEmJnRoaXMub3B0aW9ucy5ucy5zcGxpY2UoZSwxKX19LHtrZXk6ImdldFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9LG89dm9pZCAwIT09ci5rZXlTZXBhcmF0b3I/ci5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixpPVt0LGVdO3JldHVybiBuJiYic3RyaW5nIiE9dHlwZW9mIG4mJihpPWkuY29uY2F0KG4pKSxuJiYic3RyaW5nIj09dHlwZW9mIG4mJihpPWkuY29uY2F0KG8/bi5zcGxpdChvKTpuKSksdC5pbmRleE9mKCIuIik+LTEmJihpPXQuc3BsaXQoIi4iKSksRnQodGhpcy5kYXRhLGkpfX0se2tleToiYWRkUmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTp7c2lsZW50OiExfSxpPXRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3I7dm9pZCAwPT09aSYmKGk9Ii4iKTt2YXIgYT1bdCxlXTtuJiYoYT1hLmNvbmNhdChpP24uc3BsaXQoaSk6bikpLHQuaW5kZXhPZigiLiIpPi0xJiYocj1lLGU9KGE9dC5zcGxpdCgiLiIpKVsxXSksdGhpcy5hZGROYW1lc3BhY2VzKGUpLHF0KHRoaXMuZGF0YSxhLHIpLG8uc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbixyKX19LHtrZXk6ImFkZFJlc291cmNlcyIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7c2lsZW50OiExfTtmb3IodmFyIG8gaW4gbikic3RyaW5nIiE9dHlwZW9mIG5bb10mJiJbb2JqZWN0IEFycmF5XSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG5bb10pfHx0aGlzLmFkZFJlc291cmNlKHQsZSxvLG5bb10se3NpbGVudDohMH0pO3Iuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbil9fSx7a2V5OiJhZGRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06e3NpbGVudDohMX0sYT1bdCxlXTt0LmluZGV4T2YoIi4iKT4tMSYmKHI9bixuPWUsZT0oYT10LnNwbGl0KCIuIikpWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoZSk7dmFyIHM9RnQodGhpcy5kYXRhLGEpfHx7fTtyP3p0KHMsbixvKTpzPVR0KHt9LHMsbikscXQodGhpcy5kYXRhLGEscyksaS5zaWxlbnR8fHRoaXMuZW1pdCgiYWRkZWQiLHQsZSxuKX19LHtrZXk6InJlbW92ZVJlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuaGFzUmVzb3VyY2VCdW5kbGUodCxlKSYmZGVsZXRlIHRoaXMuZGF0YVt0XVtlXSx0aGlzLnJlbW92ZU5hbWVzcGFjZXMoZSksdGhpcy5lbWl0KCJyZW1vdmVkIix0LGUpfX0se2tleToiaGFzUmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuZ2V0UmVzb3VyY2UodCxlKX19LHtrZXk6ImdldFJlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiBlfHwoZT10aGlzLm9wdGlvbnMuZGVmYXVsdE5TKSwidjEiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEk/VHQoe30se30sdGhpcy5nZXRSZXNvdXJjZSh0LGUpKTp0aGlzLmdldFJlc291cmNlKHQsZSl9fSx7a2V5OiJnZXREYXRhQnlMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YVt0XX19LHtrZXk6InRvSlNPTiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhfX1dKSxlfSgpLEt0PXtwcm9jZXNzb3JzOnt9LGFkZFBvc3RQcm9jZXNzb3I6ZnVuY3Rpb24odCl7dGhpcy5wcm9jZXNzb3JzW3QubmFtZV09dH0saGFuZGxlOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGk9dGhpcztyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2kucHJvY2Vzc29yc1t0XSYmKGU9aS5wcm9jZXNzb3JzW3RdLnByb2Nlc3MoZSxuLHIsbykpfSksZX19LFh0PXt9LEp0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIG4scixvLGksYT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307cmV0dXJuIGp0KHRoaXMsZSksbj1MdCh0aGlzLFJ0KGUpLmNhbGwodGhpcykpLFZ0JiZfdC5jYWxsKEN0KG4pKSxyPVsicmVzb3VyY2VTdG9yZSIsImxhbmd1YWdlVXRpbHMiLCJwbHVyYWxSZXNvbHZlciIsImludGVycG9sYXRvciIsImJhY2tlbmRDb25uZWN0b3IiLCJpMThuRm9ybWF0IiwidXRpbHMiXSxvPXQsaT1DdChuKSxyLmZvckVhY2goZnVuY3Rpb24odCl7b1t0XSYmKGlbdF09b1t0XSl9KSxuLm9wdGlvbnM9YSx2b2lkIDA9PT1uLm9wdGlvbnMua2V5U2VwYXJhdG9yJiYobi5vcHRpb25zLmtleVNlcGFyYXRvcj0iLiIpLG4ubG9nZ2VyPUR0LmNyZWF0ZSgidHJhbnNsYXRvciIpLG59cmV0dXJuIE50KGUsX3QpLE90KGUsW3trZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0KXt0JiYodGhpcy5sYW5ndWFnZT10KX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOntpbnRlcnBvbGF0aW9uOnt9fSxuPXRoaXMucmVzb2x2ZSh0LGUpO3JldHVybiBuJiZ2b2lkIDAhPT1uLnJlc319LHtrZXk6ImV4dHJhY3RGcm9tS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXZvaWQgMCE9PWUubnNTZXBhcmF0b3I/ZS5uc1NlcGFyYXRvcjp0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7dm9pZCAwPT09biYmKG49IjoiKTt2YXIgcj12b2lkIDAhPT1lLmtleVNlcGFyYXRvcj9lLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLG89ZS5uc3x8dGhpcy5vcHRpb25zLmRlZmF1bHROUztpZihuJiZ0LmluZGV4T2Yobik+LTEpe3ZhciBpPXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7aWYoaSYmaS5sZW5ndGg+MClyZXR1cm57a2V5OnQsbmFtZXNwYWNlczpvfTt2YXIgYT10LnNwbGl0KG4pOyhuIT09cnx8bj09PXImJnRoaXMub3B0aW9ucy5ucy5pbmRleE9mKGFbMF0pPi0xKSYmKG89YS5zaGlmdCgpKSx0PWEuam9pbihyKX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIG8mJihvPVtvXSkse2tleTp0LG5hbWVzcGFjZXM6b319fSx7a2V5OiJ0cmFuc2xhdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzO2lmKCJvYmplY3QiIT09U3QoZSkmJnRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlciYmKGU9dGhpcy5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKGFyZ3VtZW50cykpLGV8fChlPXt9KSxudWxsPT10KXJldHVybiIiO0FycmF5LmlzQXJyYXkodCl8fCh0PVtTdHJpbmcodCldKTt2YXIgbz12b2lkIDAhPT1lLmtleVNlcGFyYXRvcj9lLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLGk9dGhpcy5leHRyYWN0RnJvbUtleSh0W3QubGVuZ3RoLTFdLGUpLGE9aS5rZXkscz1pLm5hbWVzcGFjZXMsdT1zW3MubGVuZ3RoLTFdLGM9ZS5sbmd8fHRoaXMubGFuZ3VhZ2UsbD1lLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlfHx0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU7aWYoYyYmImNpbW9kZSI9PT1jLnRvTG93ZXJDYXNlKCkpe2lmKGwpe3ZhciBmPWUubnNTZXBhcmF0b3J8fHRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjtyZXR1cm4gdStmK2F9cmV0dXJuIGF9dmFyIHA9dGhpcy5yZXNvbHZlKHQsZSksaD1wJiZwLnJlcyxkPXAmJnAudXNlZEtleXx8YSxnPXAmJnAuZXhhY3RVc2VkS2V5fHxhLHY9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShoKSx5PVsiW29iamVjdCBOdW1iZXJdIiwiW29iamVjdCBGdW5jdGlvbl0iLCJbb2JqZWN0IFJlZ0V4cF0iXSxtPXZvaWQgMCE9PWUuam9pbkFycmF5cz9lLmpvaW5BcnJheXM6dGhpcy5vcHRpb25zLmpvaW5BcnJheXMsYj0hdGhpcy5pMThuRm9ybWF0fHx0aGlzLmkxOG5Gb3JtYXQuaGFuZGxlQXNPYmplY3QseD0ic3RyaW5nIiE9dHlwZW9mIGgmJiJib29sZWFuIiE9dHlwZW9mIGgmJiJudW1iZXIiIT10eXBlb2YgaDtpZihiJiZoJiZ4JiZ5LmluZGV4T2Yodik8MCYmKCJzdHJpbmciIT10eXBlb2YgbXx8IltvYmplY3QgQXJyYXldIiE9PXYpKXtpZighZS5yZXR1cm5PYmplY3RzJiYhdGhpcy5vcHRpb25zLnJldHVybk9iamVjdHMpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImFjY2Vzc2luZyBhbiBvYmplY3QgLSBidXQgcmV0dXJuT2JqZWN0cyBvcHRpb25zIGlzIG5vdCBlbmFibGVkISIpLHRoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXI/dGhpcy5vcHRpb25zLnJldHVybmVkT2JqZWN0SGFuZGxlcihkLGgsZSk6ImtleSAnIi5jb25jYXQoYSwiICgiKS5jb25jYXQodGhpcy5sYW5ndWFnZSwiKScgcmV0dXJuZWQgYW4gb2JqZWN0IGluc3RlYWQgb2Ygc3RyaW5nLiIpO2lmKG8pe3ZhciB3PSJbb2JqZWN0IEFycmF5XSI9PT12LGs9dz9bXTp7fSxTPXc/ZzpkO2Zvcih2YXIgRSBpbiBoKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoLEUpKXt2YXIgVD0iIi5jb25jYXQoUykuY29uY2F0KG8pLmNvbmNhdChFKTtrW0VdPXRoaXMudHJhbnNsYXRlKFQsVHQoe30sZSx7am9pbkFycmF5czohMSxuczpzfSkpLGtbRV09PT1UJiYoa1tFXT1oW0VdKX1oPWt9fWVsc2UgaWYoYiYmInN0cmluZyI9PXR5cGVvZiBtJiYiW29iamVjdCBBcnJheV0iPT09dikoaD1oLmpvaW4obSkpJiYoaD10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKGgsdCxlLG4pKTtlbHNle3ZhciBqPSExLEE9ITE7aWYoIXRoaXMuaXNWYWxpZExvb2t1cChoKSYmdm9pZCAwIT09ZS5kZWZhdWx0VmFsdWUpe2lmKGo9ITAsdm9pZCAwIT09ZS5jb3VudCl7dmFyIE89dGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgoYyxlLmNvdW50KTtoPWVbImRlZmF1bHRWYWx1ZSIuY29uY2F0KE8pXX1ofHwoaD1lLmRlZmF1bHRWYWx1ZSl9dGhpcy5pc1ZhbGlkTG9va3VwKGgpfHwoQT0hMCxoPWEpO3ZhciBDPWUuZGVmYXVsdFZhbHVlJiZlLmRlZmF1bHRWYWx1ZSE9PWgmJnRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO2lmKEF8fGp8fEMpe2lmKHRoaXMubG9nZ2VyLmxvZyhDPyJ1cGRhdGVLZXkiOiJtaXNzaW5nS2V5IixjLHUsYSxDP2UuZGVmYXVsdFZhbHVlOmgpLG8pe3ZhciBMPXRoaXMucmVzb2x2ZShhLFR0KHt9LGUse2tleVNlcGFyYXRvcjohMX0pKTtMJiZMLnJlcyYmdGhpcy5sb2dnZXIud2FybigiU2VlbXMgdGhlIGxvYWRlZCB0cmFuc2xhdGlvbnMgd2VyZSBpbiBmbGF0IEpTT04gZm9ybWF0IGluc3RlYWQgb2YgbmVzdGVkLiBFaXRoZXIgc2V0IGtleVNlcGFyYXRvcjogZmFsc2Ugb24gaW5pdCBvciBtYWtlIHN1cmUgeW91ciB0cmFuc2xhdGlvbnMgYXJlIHB1Ymxpc2hlZCBpbiBuZXN0ZWQgZm9ybWF0LiIpfXZhciBSPVtdLFA9dGhpcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGUubG5nfHx0aGlzLmxhbmd1YWdlKTtpZigiZmFsbGJhY2siPT09dGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nVG8mJlAmJlBbMF0pZm9yKHZhciBOPTA7TjxQLmxlbmd0aDtOKyspUi5wdXNoKFBbTl0pO2Vsc2UiYWxsIj09PXRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvP1I9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShlLmxuZ3x8dGhpcy5sYW5ndWFnZSk6Ui5wdXNoKGUubG5nfHx0aGlzLmxhbmd1YWdlKTt2YXIgST1mdW5jdGlvbih0LG4pe3Iub3B0aW9ucy5taXNzaW5nS2V5SGFuZGxlcj9yLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXIodCx1LG4sQz9lLmRlZmF1bHRWYWx1ZTpoLEMsZSk6ci5iYWNrZW5kQ29ubmVjdG9yJiZyLmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcmJnIuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyh0LHUsbixDP2UuZGVmYXVsdFZhbHVlOmgsQyxlKSxyLmVtaXQoIm1pc3NpbmdLZXkiLHQsdSxuLGgpfTtpZih0aGlzLm9wdGlvbnMuc2F2ZU1pc3Npbmcpe3ZhciBEPXZvaWQgMCE9PWUuY291bnQmJiJzdHJpbmciIT10eXBlb2YgZS5jb3VudDt0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzJiZEP1IuZm9yRWFjaChmdW5jdGlvbih0KXtyLnBsdXJhbFJlc29sdmVyLmdldFBsdXJhbEZvcm1zT2ZLZXkodCxhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBJKFt0XSxlKX0pfSk6SShSLGEpfX1oPXRoaXMuZXh0ZW5kVHJhbnNsYXRpb24oaCx0LGUscCxuKSxBJiZoPT09YSYmdGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvTWlzc2luZ0tleSYmKGg9IiIuY29uY2F0KHUsIjoiKS5jb25jYXQoYSkpLEEmJnRoaXMub3B0aW9ucy5wYXJzZU1pc3NpbmdLZXlIYW5kbGVyJiYoaD10aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcihoKSl9cmV0dXJuIGh9fSx7a2V5OiJleHRlbmRUcmFuc2xhdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT10aGlzO2lmKHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LnBhcnNlKXQ9dGhpcy5pMThuRm9ybWF0LnBhcnNlKHQsbixyLnVzZWRMbmcsci51c2VkTlMsci51c2VkS2V5LHtyZXNvbHZlZDpyfSk7ZWxzZSBpZighbi5za2lwSW50ZXJwb2xhdGlvbil7bi5pbnRlcnBvbGF0aW9uJiZ0aGlzLmludGVycG9sYXRvci5pbml0KFR0KHt9LG4se2ludGVycG9sYXRpb246VHQoe30sdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24sbi5pbnRlcnBvbGF0aW9uKX0pKTt2YXIgYSxzPW4uaW50ZXJwb2xhdGlvbiYmbi5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlc3x8dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzO2lmKHMpe3ZhciB1PXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7YT11JiZ1Lmxlbmd0aH12YXIgYz1uLnJlcGxhY2UmJiJzdHJpbmciIT10eXBlb2Ygbi5yZXBsYWNlP24ucmVwbGFjZTpuO2lmKHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMmJihjPVR0KHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMsYykpLHQ9dGhpcy5pbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUodCxjLG4ubG5nfHx0aGlzLmxhbmd1YWdlLG4pLHMpe3ZhciBsPXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7YTwobCYmbC5sZW5ndGgpJiYobi5uZXN0PSExKX0hMSE9PW4ubmVzdCYmKHQ9dGhpcy5pbnRlcnBvbGF0b3IubmVzdCh0LGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkodCksYT0wO2E8dDthKyspclthXT1hcmd1bWVudHNbYV07cmV0dXJuIG8mJm9bMF09PT1yWzBdJiYhbi5jb250ZXh0PyhpLmxvZ2dlci53YXJuKCJJdCBzZWVtcyB5b3UgYXJlIG5lc3RpbmcgcmVjdXJzaXZlbHkga2V5OiAiLmNvbmNhdChyWzBdLCIgaW4ga2V5OiAiKS5jb25jYXQoZVswXSkpLG51bGwpOmkudHJhbnNsYXRlLmFwcGx5KGksci5jb25jYXQoW2VdKSl9LG4pKSxuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCl9dmFyIGY9bi5wb3N0UHJvY2Vzc3x8dGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzLHA9InN0cmluZyI9PXR5cGVvZiBmP1tmXTpmO3JldHVybiBudWxsIT10JiZwJiZwLmxlbmd0aCYmITEhPT1uLmFwcGx5UG9zdFByb2Nlc3NvciYmKHQ9S3QuaGFuZGxlKHAsdCxlLHRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzUGFzc1Jlc29sdmVkP1R0KHtpMThuUmVzb2x2ZWQ6cn0sbik6bix0aGlzKSksdH19LHtrZXk6InJlc29sdmUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYT10aGlzLHM9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSx0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoIWEuaXNWYWxpZExvb2t1cChlKSl7dmFyIHU9YS5leHRyYWN0RnJvbUtleSh0LHMpLGM9dS5rZXk7bj1jO3ZhciBsPXUubmFtZXNwYWNlczthLm9wdGlvbnMuZmFsbGJhY2tOUyYmKGw9bC5jb25jYXQoYS5vcHRpb25zLmZhbGxiYWNrTlMpKTt2YXIgZj12b2lkIDAhPT1zLmNvdW50JiYic3RyaW5nIiE9dHlwZW9mIHMuY291bnQscD12b2lkIDAhPT1zLmNvbnRleHQmJiJzdHJpbmciPT10eXBlb2Ygcy5jb250ZXh0JiYiIiE9PXMuY29udGV4dCxoPXMubG5ncz9zLmxuZ3M6YS5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShzLmxuZ3x8YS5sYW5ndWFnZSxzLmZhbGxiYWNrTG5nKTtsLmZvckVhY2goZnVuY3Rpb24odCl7YS5pc1ZhbGlkTG9va3VwKGUpfHwoaT10LCFYdFsiIi5jb25jYXQoaFswXSwiLSIpLmNvbmNhdCh0KV0mJmEudXRpbHMmJmEudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlJiYhYS51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UoaSkmJihYdFsiIi5jb25jYXQoaFswXSwiLSIpLmNvbmNhdCh0KV09ITAsYS5sb2dnZXIud2Fybigna2V5ICInLmNvbmNhdChuLCciIGZvciBsYW5ndWFnZXMgIicpLmNvbmNhdChoLmpvaW4oIiwgIiksJyIgd29uXCd0IGdldCByZXNvbHZlZCBhcyBuYW1lc3BhY2UgIicpLmNvbmNhdChpLCciIHdhcyBub3QgeWV0IGxvYWRlZCcpLCJUaGlzIG1lYW5zIHNvbWV0aGluZyBJUyBXUk9ORyBpbiB5b3VyIHNldHVwLiBZb3UgYWNjZXNzIHRoZSB0IGZ1bmN0aW9uIGJlZm9yZSBpMThuZXh0LmluaXQgLyBpMThuZXh0LmxvYWROYW1lc3BhY2UgLyBpMThuZXh0LmNoYW5nZUxhbmd1YWdlIHdhcyBkb25lLiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgb3IgUHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBhY2Nlc3NpbmcgaXQhISEiKSksaC5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lmKCFhLmlzVmFsaWRMb29rdXAoZSkpe289bjt2YXIgaSx1LGw9YyxoPVtsXTtpZihhLmkxOG5Gb3JtYXQmJmEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKWEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKGgsYyxuLHQscyk7ZWxzZSBmJiYoaT1hLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeChuLHMuY291bnQpKSxmJiZwJiZoLnB1c2gobCtpKSxwJiZoLnB1c2gobCs9IiIuY29uY2F0KGEub3B0aW9ucy5jb250ZXh0U2VwYXJhdG9yKS5jb25jYXQocy5jb250ZXh0KSksZiYmaC5wdXNoKGwrPWkpO2Zvcig7dT1oLnBvcCgpOylhLmlzVmFsaWRMb29rdXAoZSl8fChyPXUsZT1hLmdldFJlc291cmNlKG4sdCx1LHMpKX19KSl9KX19KSx7cmVzOmUsdXNlZEtleTpuLGV4YWN0VXNlZEtleTpyLHVzZWRMbmc6byx1c2VkTlM6aX19fSx7a2V5OiJpc1ZhbGlkTG9va3VwIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4hKHZvaWQgMD09PXR8fCF0aGlzLm9wdGlvbnMucmV0dXJuTnVsbCYmbnVsbD09PXR8fCF0aGlzLm9wdGlvbnMucmV0dXJuRW1wdHlTdHJpbmcmJiIiPT09dCl9fSx7a2V5OiJnZXRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTtyZXR1cm4gdGhpcy5pMThuRm9ybWF0JiZ0aGlzLmkxOG5Gb3JtYXQuZ2V0UmVzb3VyY2U/dGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlKHQsZSxuLHIpOnRoaXMucmVzb3VyY2VTdG9yZS5nZXRSZXNvdXJjZSh0LGUsbixyKX19XSksZX0oKTtmdW5jdGlvbiBRdCh0KXtyZXR1cm4gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfXZhciBadD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7anQodGhpcyx0KSx0aGlzLm9wdGlvbnM9ZSx0aGlzLndoaXRlbGlzdD10aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5nc3x8ITEsdGhpcy5zdXBwb3J0ZWRMbmdzPXRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHwhMSx0aGlzLmxvZ2dlcj1EdC5jcmVhdGUoImxhbmd1YWdlVXRpbHMiKX1yZXR1cm4gT3QodCxbe2tleToiZ2V0U2NyaXB0UGFydEZyb21Db2RlIix2YWx1ZTpmdW5jdGlvbih0KXtpZighdHx8dC5pbmRleE9mKCItIik8MClyZXR1cm4gbnVsbDt2YXIgZT10LnNwbGl0KCItIik7cmV0dXJuIDI9PT1lLmxlbmd0aD9udWxsOihlLnBvcCgpLCJ4Ij09PWVbZS5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKT9udWxsOnRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGUuam9pbigiLSIpKSl9fSx7a2V5OiJnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIHQ7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlWzBdKX19LHtrZXk6ImZvcm1hdExhbmd1YWdlQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiZ0LmluZGV4T2YoIi0iKT4tMSl7dmFyIGU9WyJoYW5zIiwiaGFudCIsImxhdG4iLCJjeXJsIiwiY2FucyIsIm1vbmciLCJhcmFiIl0sbj10LnNwbGl0KCItIik7cmV0dXJuIHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc/bj1uLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50b0xvd2VyQ2FzZSgpfSk6Mj09PW4ubGVuZ3RoPyhuWzBdPW5bMF0udG9Mb3dlckNhc2UoKSxuWzFdPW5bMV0udG9VcHBlckNhc2UoKSxlLmluZGV4T2YoblsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKG5bMV09UXQoblsxXS50b0xvd2VyQ2FzZSgpKSkpOjM9PT1uLmxlbmd0aCYmKG5bMF09blswXS50b0xvd2VyQ2FzZSgpLDI9PT1uWzFdLmxlbmd0aCYmKG5bMV09blsxXS50b1VwcGVyQ2FzZSgpKSwic2duIiE9PW5bMF0mJjI9PT1uWzJdLmxlbmd0aCYmKG5bMl09blsyXS50b1VwcGVyQ2FzZSgpKSxlLmluZGV4T2YoblsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKG5bMV09UXQoblsxXS50b0xvd2VyQ2FzZSgpKSksZS5pbmRleE9mKG5bMl0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzJdPVF0KG5bMl0udG9Mb3dlckNhc2UoKSkpKSxuLmpvaW4oIi0iKX1yZXR1cm4gdGhpcy5vcHRpb25zLmNsZWFuQ29kZXx8dGhpcy5vcHRpb25zLmxvd2VyQ2FzZUxuZz90LnRvTG93ZXJDYXNlKCk6dH19LHtrZXk6ImlzV2hpdGVsaXN0ZWQiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvZ2dlci5kZXByZWNhdGUoImxhbmd1YWdlVXRpbHMuaXNXaGl0ZWxpc3RlZCIsJ2Z1bmN0aW9uICJpc1doaXRlbGlzdGVkIiB3aWxsIGJlIHJlbmFtZWQgdG8gImlzU3VwcG9ydGVkQ29kZSIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSBpdFwncyB1c2FnZSBhc2FwLicpLHRoaXMuaXNTdXBwb3J0ZWRDb2RlKHQpfX0se2tleToiaXNTdXBwb3J0ZWRDb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4oImxhbmd1YWdlT25seSI9PT10aGlzLm9wdGlvbnMubG9hZHx8dGhpcy5vcHRpb25zLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncykmJih0PXRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCkpLCF0aGlzLnN1cHBvcnRlZExuZ3N8fCF0aGlzLnN1cHBvcnRlZExuZ3MubGVuZ3RofHx0aGlzLnN1cHBvcnRlZExuZ3MuaW5kZXhPZih0KT4tMX19LHtrZXk6ImdldEJlc3RNYXRjaEZyb21Db2RlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzO3JldHVybiB0Pyh0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoIWUpe3ZhciByPW4uZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpO24ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzJiYhbi5pc1N1cHBvcnRlZENvZGUocil8fChlPXIpfX0pLCFlJiZ0aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncyYmdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCFlKXt2YXIgcj1uLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpO2lmKG4uaXNTdXBwb3J0ZWRDb2RlKHIpKXJldHVybiBlPXI7ZT1uLm9wdGlvbnMuc3VwcG9ydGVkTG5ncy5maW5kKGZ1bmN0aW9uKHQpe2lmKDA9PT10LmluZGV4T2YocikpcmV0dXJuIHR9KX19KSxlfHwoZT10aGlzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKVswXSksZSk6bnVsbH19LHtrZXk6ImdldEZhbGxiYWNrQ29kZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuW107aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQoZSkpLCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSwiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseSh0KSlyZXR1cm4gdDtpZighZSlyZXR1cm4gdC5kZWZhdWx0fHxbXTt2YXIgbj10W2VdO3JldHVybiBufHwobj10W3RoaXMuZ2V0U2NyaXB0UGFydEZyb21Db2RlKGUpXSksbnx8KG49dFt0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlKV0pLG58fChuPXRbdGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShlKV0pLG58fChuPXQuZGVmYXVsdCksbnx8W119fSx7a2V5OiJ0b1Jlc29sdmVIaWVyYXJjaHkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPXRoaXMuZ2V0RmFsbGJhY2tDb2RlcyhlfHx0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmd8fFtdLHQpLG89W10saT1mdW5jdGlvbih0KXt0JiYobi5pc1N1cHBvcnRlZENvZGUodCk/by5wdXNoKHQpOm4ubG9nZ2VyLndhcm4oInJlamVjdGluZyBsYW5ndWFnZSBjb2RlIG5vdCBmb3VuZCBpbiBzdXBwb3J0ZWRMbmdzOiAiLmNvbmNhdCh0KSkpfTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJnQuaW5kZXhPZigiLSIpPi0xPygibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiZpKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSwibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiYiY3VycmVudE9ubHkiIT09dGhpcy5vcHRpb25zLmxvYWQmJmkodGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUodCkpLCJjdXJyZW50T25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmaSh0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKSk6InN0cmluZyI9PXR5cGVvZiB0JiZpKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSxyLmZvckVhY2goZnVuY3Rpb24odCl7by5pbmRleE9mKHQpPDAmJmkobi5mb3JtYXRMYW5ndWFnZUNvZGUodCkpfSksb319XSksdH0oKSx0ZT1be2xuZ3M6WyJhY2giLCJhayIsImFtIiwiYXJuIiwiYnIiLCJmaWwiLCJndW4iLCJsbiIsIm1mZSIsIm1nIiwibWkiLCJvYyIsInB0IiwicHQtQlIiLCJ0ZyIsInRpIiwidHIiLCJ1eiIsIndhIl0sbnI6WzEsMl0sZmM6MX0se2xuZ3M6WyJhZiIsImFuIiwiYXN0IiwiYXoiLCJiZyIsImJuIiwiY2EiLCJkYSIsImRlIiwiZGV2IiwiZWwiLCJlbiIsImVvIiwiZXMiLCJldCIsImV1IiwiZmkiLCJmbyIsImZ1ciIsImZ5IiwiZ2wiLCJndSIsImhhIiwiaGkiLCJodSIsImh5IiwiaWEiLCJpdCIsImtuIiwia3UiLCJsYiIsIm1haSIsIm1sIiwibW4iLCJtciIsIm5haCIsIm5hcCIsIm5iIiwibmUiLCJubCIsIm5uIiwibm8iLCJuc28iLCJwYSIsInBhcCIsInBtcyIsInBzIiwicHQtUFQiLCJybSIsInNjbyIsInNlIiwic2kiLCJzbyIsInNvbiIsInNxIiwic3YiLCJzdyIsInRhIiwidGUiLCJ0ayIsInVyIiwieW8iXSxucjpbMSwyXSxmYzoyfSx7bG5nczpbImF5IiwiYm8iLCJjZ2ciLCJmYSIsImh0IiwiaWQiLCJqYSIsImpibyIsImthIiwia2siLCJrbSIsImtvIiwia3kiLCJsbyIsIm1zIiwic2FoIiwic3UiLCJ0aCIsInR0IiwidWciLCJ2aSIsIndvIiwiemgiXSxucjpbMV0sZmM6M30se2xuZ3M6WyJiZSIsImJzIiwiY25yIiwiZHoiLCJociIsInJ1Iiwic3IiLCJ1ayJdLG5yOlsxLDIsNV0sZmM6NH0se2xuZ3M6WyJhciJdLG5yOlswLDEsMiwzLDExLDEwMF0sZmM6NX0se2xuZ3M6WyJjcyIsInNrIl0sbnI6WzEsMiw1XSxmYzo2fSx7bG5nczpbImNzYiIsInBsIl0sbnI6WzEsMiw1XSxmYzo3fSx7bG5nczpbImN5Il0sbnI6WzEsMiwzLDhdLGZjOjh9LHtsbmdzOlsiZnIiXSxucjpbMSwyXSxmYzo5fSx7bG5nczpbImdhIl0sbnI6WzEsMiwzLDcsMTFdLGZjOjEwfSx7bG5nczpbImdkIl0sbnI6WzEsMiwzLDIwXSxmYzoxMX0se2xuZ3M6WyJpcyJdLG5yOlsxLDJdLGZjOjEyfSx7bG5nczpbImp2Il0sbnI6WzAsMV0sZmM6MTN9LHtsbmdzOlsia3ciXSxucjpbMSwyLDMsNF0sZmM6MTR9LHtsbmdzOlsibHQiXSxucjpbMSwyLDEwXSxmYzoxNX0se2xuZ3M6WyJsdiJdLG5yOlsxLDIsMF0sZmM6MTZ9LHtsbmdzOlsibWsiXSxucjpbMSwyXSxmYzoxN30se2xuZ3M6WyJtbmsiXSxucjpbMCwxLDJdLGZjOjE4fSx7bG5nczpbIm10Il0sbnI6WzEsMiwxMSwyMF0sZmM6MTl9LHtsbmdzOlsib3IiXSxucjpbMiwxXSxmYzoyfSx7bG5nczpbInJvIl0sbnI6WzEsMiwyMF0sZmM6MjB9LHtsbmdzOlsic2wiXSxucjpbNSwxLDIsM10sZmM6MjF9LHtsbmdzOlsiaGUiLCJpdyJdLG5yOlsxLDIsMjAsMjFdLGZjOjIyfV0sZWU9ezE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PjEpfSwyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMSE9dCl9LDM6ZnVuY3Rpb24odCl7cmV0dXJuIDB9LDQ6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwPT0xJiZ0JTEwMCE9MTE/MDp0JTEwPj0yJiZ0JTEwPD00JiYodCUxMDA8MTB8fHQlMTAwPj0yMCk/MToyKX0sNTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDA9PXQ/MDoxPT10PzE6Mj09dD8yOnQlMTAwPj0zJiZ0JTEwMDw9MTA/Mzp0JTEwMD49MTE/NDo1KX0sNjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDp0Pj0yJiZ0PD00PzE6Mil9LDc6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6dCUxMD49MiYmdCUxMDw9NCYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDg6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOjghPXQmJjExIT10PzI6Myl9LDk6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0Pj0yKX0sMTA6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOnQ8Nz8yOnQ8MTE/Mzo0KX0sMTE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10fHwxMT09dD8wOjI9PXR8fDEyPT10PzE6dD4yJiZ0PDIwPzI6Myl9LDEyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMCE9MXx8dCUxMDA9PTExKX0sMTM6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwIT09dCl9LDE0OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjI9PXQ/MTozPT10PzI6Myl9LDE1OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6dCUxMD49MiYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDE2OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6MCE9PXQ/MToyKX0sMTc6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10fHx0JTEwPT0xJiZ0JTEwMCE9MTE/MDoxKX0sMTg6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwPT10PzA6MT09dD8xOjIpfSwxOTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDowPT10fHx0JTEwMD4xJiZ0JTEwMDwxMT8xOnQlMTAwPjEwJiZ0JTEwMDwyMD8yOjMpfSwyMDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDowPT10fHx0JTEwMD4wJiZ0JTEwMDwyMD8xOjIpfSwyMTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTAwPT0xPzE6dCUxMDA9PTI/Mjp0JTEwMD09M3x8dCUxMDA9PTQ/MzowKX0sMjI6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOih0PDB8fHQ+MTApJiZ0JTEwPT0wPzI6Myl9fTt2YXIgbmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2p0KHRoaXMsdCksdGhpcy5sYW5ndWFnZVV0aWxzPWUsdGhpcy5vcHRpb25zPXIsdGhpcy5sb2dnZXI9RHQuY3JlYXRlKCJwbHVyYWxSZXNvbHZlciIpLHRoaXMucnVsZXM9KG49e30sdGUuZm9yRWFjaChmdW5jdGlvbih0KXt0LmxuZ3MuZm9yRWFjaChmdW5jdGlvbihlKXtuW2VdPXtudW1iZXJzOnQubnIscGx1cmFsczplZVt0LmZjXX19KX0pLG4pfXJldHVybiBPdCh0LFt7a2V5OiJhZGRSdWxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMucnVsZXNbdF09ZX19LHtrZXk6ImdldFJ1bGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJ1bGVzW3RdfHx0aGlzLnJ1bGVzW3RoaXMubGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KV19fSx7a2V5OiJuZWVkc1BsdXJhbCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRSdWxlKHQpO3JldHVybiBlJiZlLm51bWJlcnMubGVuZ3RoPjF9fSx7a2V5OiJnZXRQbHVyYWxGb3Jtc09mS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1bXSxvPXRoaXMuZ2V0UnVsZSh0KTtyZXR1cm4gbz8oby5udW1iZXJzLmZvckVhY2goZnVuY3Rpb24obyl7dmFyIGk9bi5nZXRTdWZmaXgodCxvKTtyLnB1c2goIiIuY29uY2F0KGUpLmNvbmNhdChpKSl9KSxyKTpyfX0se2tleToiZ2V0U3VmZml4Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLmdldFJ1bGUodCk7aWYocil7dmFyIG89ci5ub0Ficz9yLnBsdXJhbHMoZSk6ci5wbHVyYWxzKE1hdGguYWJzKGUpKSxpPXIubnVtYmVyc1tvXTt0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXgmJjI9PT1yLm51bWJlcnMubGVuZ3RoJiYxPT09ci5udW1iZXJzWzBdJiYoMj09PWk/aT0icGx1cmFsIjoxPT09aSYmKGk9IiIpKTt2YXIgYT1mdW5jdGlvbigpe3JldHVybiBuLm9wdGlvbnMucHJlcGVuZCYmaS50b1N0cmluZygpP24ub3B0aW9ucy5wcmVwZW5kK2kudG9TdHJpbmcoKTppLnRvU3RyaW5nKCl9O3JldHVybiJ2MSI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/MT09PWk/IiI6Im51bWJlciI9PXR5cGVvZiBpPyJfcGx1cmFsXyIuY29uY2F0KGkudG9TdHJpbmcoKSk6YSgpOiJ2MiI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/YSgpOnRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmMj09PXIubnVtYmVycy5sZW5ndGgmJjE9PT1yLm51bWJlcnNbMF0/YSgpOnRoaXMub3B0aW9ucy5wcmVwZW5kJiZvLnRvU3RyaW5nKCk/dGhpcy5vcHRpb25zLnByZXBlbmQrby50b1N0cmluZygpOm8udG9TdHJpbmcoKX1yZXR1cm4gdGhpcy5sb2dnZXIud2Fybigibm8gcGx1cmFsIHJ1bGUgZm91bmQgZm9yOiAiLmNvbmNhdCh0KSksIiJ9fV0pLHR9KCkscmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O2p0KHRoaXMsdCksdGhpcy5sb2dnZXI9RHQuY3JlYXRlKCJpbnRlcnBvbGF0b3IiKSx0aGlzLm9wdGlvbnM9ZSx0aGlzLmZvcm1hdD1lLmludGVycG9sYXRpb24mJmUuaW50ZXJwb2xhdGlvbi5mb3JtYXR8fGZ1bmN0aW9uKHQpe3JldHVybiB0fSx0aGlzLmluaXQoZSl9cmV0dXJuIE90KHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3QuaW50ZXJwb2xhdGlvbnx8KHQuaW50ZXJwb2xhdGlvbj17ZXNjYXBlVmFsdWU6ITB9KTt2YXIgZT10LmludGVycG9sYXRpb247dGhpcy5lc2NhcGU9dm9pZCAwIT09ZS5lc2NhcGU/ZS5lc2NhcGU6WXQsdGhpcy5lc2NhcGVWYWx1ZT12b2lkIDA9PT1lLmVzY2FwZVZhbHVlfHxlLmVzY2FwZVZhbHVlLHRoaXMudXNlUmF3VmFsdWVUb0VzY2FwZT12b2lkIDAhPT1lLnVzZVJhd1ZhbHVlVG9Fc2NhcGUmJmUudXNlUmF3VmFsdWVUb0VzY2FwZSx0aGlzLnByZWZpeD1lLnByZWZpeD9XdChlLnByZWZpeCk6ZS5wcmVmaXhFc2NhcGVkfHwie3siLHRoaXMuc3VmZml4PWUuc3VmZml4P1d0KGUuc3VmZml4KTplLnN1ZmZpeEVzY2FwZWR8fCJ9fSIsdGhpcy5mb3JtYXRTZXBhcmF0b3I9ZS5mb3JtYXRTZXBhcmF0b3I/ZS5mb3JtYXRTZXBhcmF0b3I6ZS5mb3JtYXRTZXBhcmF0b3J8fCIsIix0aGlzLnVuZXNjYXBlUHJlZml4PWUudW5lc2NhcGVTdWZmaXg/IiI6ZS51bmVzY2FwZVByZWZpeHx8Ii0iLHRoaXMudW5lc2NhcGVTdWZmaXg9dGhpcy51bmVzY2FwZVByZWZpeD8iIjplLnVuZXNjYXBlU3VmZml4fHwiIix0aGlzLm5lc3RpbmdQcmVmaXg9ZS5uZXN0aW5nUHJlZml4P1d0KGUubmVzdGluZ1ByZWZpeCk6ZS5uZXN0aW5nUHJlZml4RXNjYXBlZHx8V3QoIiR0KCIpLHRoaXMubmVzdGluZ1N1ZmZpeD1lLm5lc3RpbmdTdWZmaXg/V3QoZS5uZXN0aW5nU3VmZml4KTplLm5lc3RpbmdTdWZmaXhFc2NhcGVkfHxXdCgiKSIpLHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I9ZS5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcj9lLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOmUubmVzdGluZ09wdGlvbnNTZXBhcmF0b3J8fCIsIix0aGlzLm1heFJlcGxhY2VzPWUubWF4UmVwbGFjZXM/ZS5tYXhSZXBsYWNlczoxZTMsdGhpcy5hbHdheXNGb3JtYXQ9dm9pZCAwIT09ZS5hbHdheXNGb3JtYXQmJmUuYWx3YXlzRm9ybWF0LHRoaXMucmVzZXRSZWdFeHAoKX19LHtrZXk6InJlc2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmdGhpcy5pbml0KHRoaXMub3B0aW9ucyl9fSx7a2V5OiJyZXNldFJlZ0V4cCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0iIi5jb25jYXQodGhpcy5wcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cD1uZXcgUmVnRXhwKHQsImciKTt2YXIgZT0iIi5jb25jYXQodGhpcy5wcmVmaXgpLmNvbmNhdCh0aGlzLnVuZXNjYXBlUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLnVuZXNjYXBlU3VmZml4KS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwVW5lc2NhcGU9bmV3IFJlZ0V4cChlLCJnIik7dmFyIG49IiIuY29uY2F0KHRoaXMubmVzdGluZ1ByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5uZXN0aW5nU3VmZml4KTt0aGlzLm5lc3RpbmdSZWdleHA9bmV3IFJlZ0V4cChuLCJnIil9fSx7a2V5OiJpbnRlcnBvbGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhLHM9dGhpcyx1PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24mJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXN8fHt9O2Z1bmN0aW9uIGModCl7cmV0dXJuIHQucmVwbGFjZSgvXCQvZywiJCQkJCIpfXZhciBsPWZ1bmN0aW9uKHQpe2lmKHQuaW5kZXhPZihzLmZvcm1hdFNlcGFyYXRvcik8MCl7dmFyIG89SHQoZSx1LHQpO3JldHVybiBzLmFsd2F5c0Zvcm1hdD9zLmZvcm1hdChvLHZvaWQgMCxuKTpvfXZhciBpPXQuc3BsaXQocy5mb3JtYXRTZXBhcmF0b3IpLGE9aS5zaGlmdCgpLnRyaW0oKSxjPWkuam9pbihzLmZvcm1hdFNlcGFyYXRvcikudHJpbSgpO3JldHVybiBzLmZvcm1hdChIdChlLHUsYSksYyxuLHIpfTt0aGlzLnJlc2V0UmVnRXhwKCk7dmFyIGY9ciYmci5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXJ8fHRoaXMub3B0aW9ucy5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIscD1yJiZyLmludGVycG9sYXRpb24mJnIuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXN8fHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcztyZXR1cm5be3JlZ2V4OnRoaXMucmVnZXhwVW5lc2NhcGUsc2FmZVZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBjKHQpfX0se3JlZ2V4OnRoaXMucmVnZXhwLHNhZmVWYWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gcy5lc2NhcGVWYWx1ZT9jKHMuZXNjYXBlKHQpKTpjKHQpfX1dLmZvckVhY2goZnVuY3Rpb24oZSl7Zm9yKGE9MDtvPWUucmVnZXguZXhlYyh0KTspe2lmKHZvaWQgMD09PShpPWwob1sxXS50cmltKCkpKSlpZigiZnVuY3Rpb24iPT10eXBlb2YgZil7dmFyIG49Zih0LG8scik7aT0ic3RyaW5nIj09dHlwZW9mIG4/bjoiIn1lbHNle2lmKHApe2k9b1swXTtjb250aW51ZX1zLmxvZ2dlci53YXJuKCJtaXNzZWQgdG8gcGFzcyBpbiB2YXJpYWJsZSAiLmNvbmNhdChvWzFdLCIgZm9yIGludGVycG9sYXRpbmcgIikuY29uY2F0KHQpKSxpPSIifWVsc2Uic3RyaW5nIj09dHlwZW9mIGl8fHMudXNlUmF3VmFsdWVUb0VzY2FwZXx8KGk9VXQoaSkpO2lmKHQ9dC5yZXBsYWNlKG9bMF0sZS5zYWZlVmFsdWUoaSkpLGUucmVnZXgubGFzdEluZGV4PTAsKythPj1zLm1heFJlcGxhY2VzKWJyZWFrfX0pLHR9fSx7a2V5OiJuZXN0Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbz10aGlzLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGE9VHQoe30saSk7ZnVuY3Rpb24gcyh0LGUpe3ZhciBuPXRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I7aWYodC5pbmRleE9mKG4pPDApcmV0dXJuIHQ7dmFyIHI9dC5zcGxpdChuZXcgUmVnRXhwKCIiLmNvbmNhdChuLCJbIF0qeyIpKSksbz0ieyIuY29uY2F0KHJbMV0pO3Q9clswXSxvPShvPXRoaXMuaW50ZXJwb2xhdGUobyxhKSkucmVwbGFjZSgvJy9nLCciJyk7dHJ5e2E9SlNPTi5wYXJzZShvKSxlJiYoYT1UdCh7fSxlLGEpKX1jYXRjaChlKXtyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiZmFpbGVkIHBhcnNpbmcgb3B0aW9ucyBzdHJpbmcgaW4gbmVzdGluZyBmb3Iga2V5ICIuY29uY2F0KHQpLGUpLCIiLmNvbmNhdCh0KS5jb25jYXQobikuY29uY2F0KG8pfXJldHVybiBkZWxldGUgYS5kZWZhdWx0VmFsdWUsdH1mb3IoYS5hcHBseVBvc3RQcm9jZXNzb3I9ITEsZGVsZXRlIGEuZGVmYXVsdFZhbHVlO249dGhpcy5uZXN0aW5nUmVnZXhwLmV4ZWModCk7KXt2YXIgdT1bXSxjPSExO2lmKG5bMF0uaW5jbHVkZXModGhpcy5mb3JtYXRTZXBhcmF0b3IpJiYhL3suKn0vLnRlc3QoblsxXSkpe3ZhciBsPW5bMV0uc3BsaXQodGhpcy5mb3JtYXRTZXBhcmF0b3IpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCl9KTtuWzFdPWwuc2hpZnQoKSx1PWwsYz0hMH1pZigocj1lKHMuY2FsbCh0aGlzLG5bMV0udHJpbSgpLGEpLGEpKSYmblswXT09PXQmJiJzdHJpbmciIT10eXBlb2YgcilyZXR1cm4gcjsic3RyaW5nIiE9dHlwZW9mIHImJihyPVV0KHIpKSxyfHwodGhpcy5sb2dnZXIud2FybigibWlzc2VkIHRvIHJlc29sdmUgIi5jb25jYXQoblsxXSwiIGZvciBuZXN0aW5nICIpLmNvbmNhdCh0KSkscj0iIiksYyYmKHI9dS5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gby5mb3JtYXQodCxlLGkubG5nLGkpfSxyLnRyaW0oKSkpLHQ9dC5yZXBsYWNlKG5bMF0sciksdGhpcy5yZWdleHAubGFzdEluZGV4PTB9cmV0dXJuIHR9fV0pLHR9KCk7dmFyIG9lPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxuLHIpe3ZhciBvLGk9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9O3JldHVybiBqdCh0aGlzLGUpLG89THQodGhpcyxSdChlKS5jYWxsKHRoaXMpKSxWdCYmX3QuY2FsbChDdChvKSksby5iYWNrZW5kPXQsby5zdG9yZT1uLG8uc2VydmljZXM9cixvLmxhbmd1YWdlVXRpbHM9ci5sYW5ndWFnZVV0aWxzLG8ub3B0aW9ucz1pLG8ubG9nZ2VyPUR0LmNyZWF0ZSgiYmFja2VuZENvbm5lY3RvciIpLG8uc3RhdGU9e30sby5xdWV1ZT1bXSxvLmJhY2tlbmQmJm8uYmFja2VuZC5pbml0JiZvLmJhY2tlbmQuaW5pdChyLGkuYmFja2VuZCxpKSxvfXJldHVybiBOdChlLF90KSxPdChlLFt7a2V5OiJxdWV1ZUxvYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPXRoaXMsaT1bXSxhPVtdLHM9W10sdT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciByPSEwO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgcz0iIi5jb25jYXQodCwifCIpLmNvbmNhdChlKTshbi5yZWxvYWQmJm8uc3RvcmUuaGFzUmVzb3VyY2VCdW5kbGUodCxlKT9vLnN0YXRlW3NdPTI6by5zdGF0ZVtzXTwwfHwoMT09PW8uc3RhdGVbc10/YS5pbmRleE9mKHMpPDAmJmEucHVzaChzKTooby5zdGF0ZVtzXT0xLHI9ITEsYS5pbmRleE9mKHMpPDAmJmEucHVzaChzKSxpLmluZGV4T2Yocyk8MCYmaS5wdXNoKHMpLHUuaW5kZXhPZihlKTwwJiZ1LnB1c2goZSkpKX0pLHJ8fHMucHVzaCh0KX0pLChpLmxlbmd0aHx8YS5sZW5ndGgpJiZ0aGlzLnF1ZXVlLnB1c2goe3BlbmRpbmc6YSxsb2FkZWQ6e30sZXJyb3JzOltdLGNhbGxiYWNrOnJ9KSx7dG9Mb2FkOmkscGVuZGluZzphLHRvTG9hZExhbmd1YWdlczpzLHRvTG9hZE5hbWVzcGFjZXM6dX19fSx7a2V5OiJsb2FkZWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LnNwbGl0KCJ8Iiksbz1yWzBdLGk9clsxXTtlJiZ0aGlzLmVtaXQoImZhaWxlZExvYWRpbmciLG8saSxlKSxuJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlQnVuZGxlKG8saSxuKSx0aGlzLnN0YXRlW3RdPWU/LTE6Mjt2YXIgYT17fTt0aGlzLnF1ZXVlLmZvckVhY2goZnVuY3Rpb24obil7IWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPUJ0KHQsZSxPYmplY3QpLGk9by5vYmosYT1vLms7aVthXT1pW2FdfHxbXSxyJiYoaVthXT1pW2FdLmNvbmNhdChuKSkscnx8aVthXS5wdXNoKG4pfShuLmxvYWRlZCxbb10saSksZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5pbmRleE9mKGUpOy0xIT09bjspdC5zcGxpY2UobiwxKSxuPXQuaW5kZXhPZihlKX0obi5wZW5kaW5nLHQpLGUmJm4uZXJyb3JzLnB1c2goZSksMCE9PW4ucGVuZGluZy5sZW5ndGh8fG4uZG9uZXx8KE9iamVjdC5rZXlzKG4ubG9hZGVkKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2FbdF18fChhW3RdPVtdKSxuLmxvYWRlZFt0XS5sZW5ndGgmJm4ubG9hZGVkW3RdLmZvckVhY2goZnVuY3Rpb24oZSl7YVt0XS5pbmRleE9mKGUpPDAmJmFbdF0ucHVzaChlKX0pfSksbi5kb25lPSEwLG4uZXJyb3JzLmxlbmd0aD9uLmNhbGxiYWNrKG4uZXJyb3JzKTpuLmNhbGxiYWNrKCkpfSksdGhpcy5lbWl0KCJsb2FkZWQiLGEpLHRoaXMucXVldWU9dGhpcy5xdWV1ZS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIXQuZG9uZX0pfX0se2tleToicmVhZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106MCxpPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTozNTAsYT1hcmd1bWVudHMubGVuZ3RoPjU/YXJndW1lbnRzWzVdOnZvaWQgMDtyZXR1cm4gdC5sZW5ndGg/dGhpcy5iYWNrZW5kW25dKHQsZSxmdW5jdGlvbihzLHUpe3MmJnUmJm88NT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5yZWFkLmNhbGwocix0LGUsbixvKzEsMippLGEpfSxpKTphKHMsdSl9KTphKG51bGwse30pfX0se2tleToicHJlcGFyZUxvYWRpbmciLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fSxvPWFyZ3VtZW50cy5sZW5ndGg+Mz9hcmd1bWVudHNbM106dm9pZCAwO2lmKCF0aGlzLmJhY2tlbmQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oIk5vIGJhY2tlbmQgd2FzIGFkZGVkIHZpYSBpMThuZXh0LnVzZS4gV2lsbCBub3QgbG9hZCByZXNvdXJjZXMuIiksbyYmbygpOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeSh0KSksInN0cmluZyI9PXR5cGVvZiBlJiYoZT1bZV0pO3ZhciBpPXRoaXMucXVldWVMb2FkKHQsZSxyLG8pO2lmKCFpLnRvTG9hZC5sZW5ndGgpcmV0dXJuIGkucGVuZGluZy5sZW5ndGh8fG8oKSxudWxsO2kudG9Mb2FkLmZvckVhY2goZnVuY3Rpb24odCl7bi5sb2FkT25lKHQpfSl9fSx7a2V5OiJsb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dGhpcy5wcmVwYXJlTG9hZGluZyh0LGUse30sbil9fSx7a2V5OiJyZWxvYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt0aGlzLnByZXBhcmVMb2FkaW5nKHQsZSx7cmVsb2FkOiEwfSxuKX19LHtrZXk6ImxvYWRPbmUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06IiIscj10LnNwbGl0KCJ8Iiksbz1yWzBdLGk9clsxXTt0aGlzLnJlYWQobyxpLCJyZWFkIix2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKHIsYSl7ciYmZS5sb2dnZXIud2FybigiIi5jb25jYXQobiwibG9hZGluZyBuYW1lc3BhY2UgIikuY29uY2F0KGksIiBmb3IgbGFuZ3VhZ2UgIikuY29uY2F0KG8sIiBmYWlsZWQiKSxyKSwhciYmYSYmZS5sb2dnZXIubG9nKCIiLmNvbmNhdChuLCJsb2FkZWQgbmFtZXNwYWNlICIpLmNvbmNhdChpLCIgZm9yIGxhbmd1YWdlICIpLmNvbmNhdChvKSxhKSxlLmxvYWRlZCh0LHIsYSl9KX19LHtrZXk6InNhdmVNaXNzaW5nIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XTp7fTt0aGlzLnNlcnZpY2VzLnV0aWxzJiZ0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSYmIXRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKGUpP3RoaXMubG9nZ2VyLndhcm4oJ2RpZCBub3Qgc2F2ZSBrZXkgIicuY29uY2F0KG4sJyIgYXMgdGhlIG5hbWVzcGFjZSAiJykuY29uY2F0KGUsJyIgd2FzIG5vdCB5ZXQgbG9hZGVkJyksIlRoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhISIpOm51bGwhPW4mJiIiIT09biYmKHRoaXMuYmFja2VuZCYmdGhpcy5iYWNrZW5kLmNyZWF0ZSYmdGhpcy5iYWNrZW5kLmNyZWF0ZSh0LGUsbixyLG51bGwsVHQoe30saSx7aXNVcGRhdGU6b30pKSx0JiZ0WzBdJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlKHRbMF0sZSxuLHIpKX19XSksZX0oKTtmdW5jdGlvbiBpZSgpe3JldHVybntkZWJ1ZzohMSxpbml0SW1tZWRpYXRlOiEwLG5zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6WyJ0cmFuc2xhdGlvbiJdLGZhbGxiYWNrTG5nOlsiZGV2Il0sZmFsbGJhY2tOUzohMSx3aGl0ZWxpc3Q6ITEsbm9uRXhwbGljaXRXaGl0ZWxpc3Q6ITEsc3VwcG9ydGVkTG5nczohMSxub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6ITEsbG9hZDoiYWxsIixwcmVsb2FkOiExLHNpbXBsaWZ5UGx1cmFsU3VmZml4OiEwLGtleVNlcGFyYXRvcjoiLiIsbnNTZXBhcmF0b3I6IjoiLHBsdXJhbFNlcGFyYXRvcjoiXyIsY29udGV4dFNlcGFyYXRvcjoiXyIscGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6ITEsc2F2ZU1pc3Npbmc6ITEsdXBkYXRlTWlzc2luZzohMSxzYXZlTWlzc2luZ1RvOiJmYWxsYmFjayIsc2F2ZU1pc3NpbmdQbHVyYWxzOiEwLG1pc3NpbmdLZXlIYW5kbGVyOiExLG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjohMSxwb3N0UHJvY2VzczohMSxwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDohMSxyZXR1cm5OdWxsOiEwLHJldHVybkVtcHR5U3RyaW5nOiEwLHJldHVybk9iamVjdHM6ITEsam9pbkFycmF5czohMSxyZXR1cm5lZE9iamVjdEhhbmRsZXI6ITEscGFyc2VNaXNzaW5nS2V5SGFuZGxlcjohMSxhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6ITEsYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6ITEsb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGU9e307aWYoIm9iamVjdCI9PT1TdCh0WzFdKSYmKGU9dFsxXSksInN0cmluZyI9PXR5cGVvZiB0WzFdJiYoZS5kZWZhdWx0VmFsdWU9dFsxXSksInN0cmluZyI9PXR5cGVvZiB0WzJdJiYoZS50RGVzY3JpcHRpb249dFsyXSksIm9iamVjdCI9PT1TdCh0WzJdKXx8Im9iamVjdCI9PT1TdCh0WzNdKSl7dmFyIG49dFszXXx8dFsyXTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09blt0XX0pfXJldHVybiBlfSxpbnRlcnBvbGF0aW9uOntlc2NhcGVWYWx1ZTohMCxmb3JtYXQ6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHR9LHByZWZpeDoie3siLHN1ZmZpeDoifX0iLGZvcm1hdFNlcGFyYXRvcjoiLCIsdW5lc2NhcGVQcmVmaXg6Ii0iLG5lc3RpbmdQcmVmaXg6IiR0KCIsbmVzdGluZ1N1ZmZpeDoiKSIsbmVzdGluZ09wdGlvbnNTZXBhcmF0b3I6IiwiLG1heFJlcGxhY2VzOjFlMyxza2lwT25WYXJpYWJsZXM6ITF9fX1mdW5jdGlvbiBhZSh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQubnMmJih0Lm5zPVt0Lm5zXSksInN0cmluZyI9PXR5cGVvZiB0LmZhbGxiYWNrTG5nJiYodC5mYWxsYmFja0xuZz1bdC5mYWxsYmFja0xuZ10pLCJzdHJpbmciPT10eXBlb2YgdC5mYWxsYmFja05TJiYodC5mYWxsYmFja05TPVt0LmZhbGxiYWNrTlNdKSx0LndoaXRlbGlzdCYmKHQud2hpdGVsaXN0JiZ0LndoaXRlbGlzdC5pbmRleE9mKCJjaW1vZGUiKTwwJiYodC53aGl0ZWxpc3Q9dC53aGl0ZWxpc3QuY29uY2F0KFsiY2ltb2RlIl0pKSx0LnN1cHBvcnRlZExuZ3M9dC53aGl0ZWxpc3QpLHQubm9uRXhwbGljaXRXaGl0ZWxpc3QmJih0Lm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncz10Lm5vbkV4cGxpY2l0V2hpdGVsaXN0KSx0LnN1cHBvcnRlZExuZ3MmJnQuc3VwcG9ydGVkTG5ncy5pbmRleE9mKCJjaW1vZGUiKTwwJiYodC5zdXBwb3J0ZWRMbmdzPXQuc3VwcG9ydGVkTG5ncy5jb25jYXQoWyJjaW1vZGUiXSkpLHR9ZnVuY3Rpb24gc2UoKXt9dmFyIHVlPW5ldyhmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIHQsbj1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30scj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtpZihqdCh0aGlzLGUpLHQ9THQodGhpcyxSdChlKS5jYWxsKHRoaXMpKSxWdCYmX3QuY2FsbChDdCh0KSksdC5vcHRpb25zPWFlKG4pLHQuc2VydmljZXM9e30sdC5sb2dnZXI9RHQsdC5tb2R1bGVzPXtleHRlcm5hbDpbXX0sciYmIXQuaXNJbml0aWFsaXplZCYmIW4uaXNDbG9uZSl7aWYoIXQub3B0aW9ucy5pbml0SW1tZWRpYXRlKXJldHVybiB0LmluaXQobixyKSxMdCh0LEN0KHQpKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5pbml0KG4scil9LDApfXJldHVybiB0fXJldHVybiBOdChlLF90KSxPdChlLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sbj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtmdW5jdGlvbiByKHQpe3JldHVybiB0PyJmdW5jdGlvbiI9PXR5cGVvZiB0P25ldyB0OnQ6bnVsbH1pZigiZnVuY3Rpb24iPT10eXBlb2YgZSYmKG49ZSxlPXt9KSxlLndoaXRlbGlzdCYmIWUuc3VwcG9ydGVkTG5ncyYmdGhpcy5sb2dnZXIuZGVwcmVjYXRlKCJ3aGl0ZWxpc3QiLCdvcHRpb24gIndoaXRlbGlzdCIgd2lsbCBiZSByZW5hbWVkIHRvICJzdXBwb3J0ZWRMbmdzIiBpbiB0aGUgbmV4dCBtYWpvciAtIHBsZWFzZSBtYWtlIHN1cmUgdG8gcmVuYW1lIHRoaXMgb3B0aW9uIGFzYXAuJyksZS5ub25FeHBsaWNpdFdoaXRlbGlzdCYmIWUubm9uRXhwbGljaXRTdXBwb3J0ZWRMbmdzJiZ0aGlzLmxvZ2dlci5kZXByZWNhdGUoIndoaXRlbGlzdCIsJ29wdGlvbnMgIm5vbkV4cGxpY2l0V2hpdGVsaXN0IiB3aWxsIGJlIHJlbmFtZWQgdG8gIm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncyIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSB0aGlzIG9wdGlvbiBhc2FwLicpLHRoaXMub3B0aW9ucz1UdCh7fSxpZSgpLHRoaXMub3B0aW9ucyxhZShlKSksdGhpcy5mb3JtYXQ9dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0LG58fChuPXNlKSwhdGhpcy5vcHRpb25zLmlzQ2xvbmUpe3RoaXMubW9kdWxlcy5sb2dnZXI/RHQuaW5pdChyKHRoaXMubW9kdWxlcy5sb2dnZXIpLHRoaXMub3B0aW9ucyk6RHQuaW5pdChudWxsLHRoaXMub3B0aW9ucyk7dmFyIG89bmV3IFp0KHRoaXMub3B0aW9ucyk7dGhpcy5zdG9yZT1uZXcgR3QodGhpcy5vcHRpb25zLnJlc291cmNlcyx0aGlzLm9wdGlvbnMpO3ZhciBpPXRoaXMuc2VydmljZXM7aS5sb2dnZXI9RHQsaS5yZXNvdXJjZVN0b3JlPXRoaXMuc3RvcmUsaS5sYW5ndWFnZVV0aWxzPW8saS5wbHVyYWxSZXNvbHZlcj1uZXcgbmUobyx7cHJlcGVuZDp0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLGNvbXBhdGliaWxpdHlKU09OOnRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTixzaW1wbGlmeVBsdXJhbFN1ZmZpeDp0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXh9KSxpLmludGVycG9sYXRvcj1uZXcgcmUodGhpcy5vcHRpb25zKSxpLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6dGhpcy5oYXNMb2FkZWROYW1lc3BhY2UuYmluZCh0aGlzKX0saS5iYWNrZW5kQ29ubmVjdG9yPW5ldyBvZShyKHRoaXMubW9kdWxlcy5iYWNrZW5kKSxpLnJlc291cmNlU3RvcmUsaSx0aGlzLm9wdGlvbnMpLGkuYmFja2VuZENvbm5lY3Rvci5vbigiKiIsZnVuY3Rpb24oZSl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobj4xP24tMTowKSxvPTE7bzxuO28rKylyW28tMV09YXJndW1lbnRzW29dO3QuZW1pdC5hcHBseSh0LFtlXS5jb25jYXQocikpfSksdGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3ImJihpLmxhbmd1YWdlRGV0ZWN0b3I9cih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3RvciksaS5sYW5ndWFnZURldGVjdG9yLmluaXQoaSx0aGlzLm9wdGlvbnMuZGV0ZWN0aW9uLHRoaXMub3B0aW9ucykpLHRoaXMubW9kdWxlcy5pMThuRm9ybWF0JiYoaS5pMThuRm9ybWF0PXIodGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQpLGkuaTE4bkZvcm1hdC5pbml0JiZpLmkxOG5Gb3JtYXQuaW5pdCh0aGlzKSksdGhpcy50cmFuc2xhdG9yPW5ldyBKdCh0aGlzLnNlcnZpY2VzLHRoaXMub3B0aW9ucyksdGhpcy50cmFuc2xhdG9yLm9uKCIqIixmdW5jdGlvbihlKXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLG89MTtvPG47bysrKXJbby0xXT1hcmd1bWVudHNbb107dC5lbWl0LmFwcGx5KHQsW2VdLmNvbmNhdChyKSl9KSx0aGlzLm1vZHVsZXMuZXh0ZXJuYWwuZm9yRWFjaChmdW5jdGlvbihlKXtlLmluaXQmJmUuaW5pdCh0KX0pfXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8dGhpcy5vcHRpb25zLmxuZ3x8dGhpcy5sb2dnZXIud2FybigiaW5pdDogbm8gbGFuZ3VhZ2VEZXRlY3RvciBpcyB1c2VkIGFuZCBubyBsbmcgaXMgZGVmaW5lZCIpO3ZhciBhPVsiZ2V0UmVzb3VyY2UiLCJoYXNSZXNvdXJjZUJ1bmRsZSIsImdldFJlc291cmNlQnVuZGxlIiwiZ2V0RGF0YUJ5TGFuZ3VhZ2UiXTthLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT1mdW5jdGlvbigpe3ZhciBuO3JldHVybihuPXQuc3RvcmUpW2VdLmFwcGx5KG4sYXJndW1lbnRzKX19KTt2YXIgcz1bImFkZFJlc291cmNlIiwiYWRkUmVzb3VyY2VzIiwiYWRkUmVzb3VyY2VCdW5kbGUiLCJyZW1vdmVSZXNvdXJjZUJ1bmRsZSJdO3MuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWZ1bmN0aW9uKCl7dmFyIG47cmV0dXJuKG49dC5zdG9yZSlbZV0uYXBwbHkobixhcmd1bWVudHMpLHR9fSk7dmFyIHU9TXQoKSxjPWZ1bmN0aW9uKCl7dC5jaGFuZ2VMYW5ndWFnZSh0Lm9wdGlvbnMubG5nLGZ1bmN0aW9uKGUscil7dC5pc0luaXRpYWxpemVkPSEwLHQub3B0aW9ucy5pc0Nsb25lfHx0LmxvZ2dlci5sb2coImluaXRpYWxpemVkIix0Lm9wdGlvbnMpLHQuZW1pdCgiaW5pdGlhbGl6ZWQiLHQub3B0aW9ucyksdS5yZXNvbHZlKHIpLG4oZSxyKX0pfTtyZXR1cm4gdGhpcy5vcHRpb25zLnJlc291cmNlc3x8IXRoaXMub3B0aW9ucy5pbml0SW1tZWRpYXRlP2MoKTpzZXRUaW1lb3V0KGMsMCksdX19LHtrZXk6ImxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06c2Uscj1uLG89InN0cmluZyI9PXR5cGVvZiB0P3Q6dGhpcy5sYW5ndWFnZTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHI9dCksIXRoaXMub3B0aW9ucy5yZXNvdXJjZXN8fHRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlcyl7aWYobyYmImNpbW9kZSI9PT1vLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHIoKTt2YXIgaT1bXSxhPWZ1bmN0aW9uKHQpe3QmJmUuc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkodCkuZm9yRWFjaChmdW5jdGlvbih0KXtpLmluZGV4T2YodCk8MCYmaS5wdXNoKHQpfSl9O2lmKG8pYShvKTtlbHNle3ZhciBzPXRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7cy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBhKHQpfSl9dGhpcy5vcHRpb25zLnByZWxvYWQmJnRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGEodCl9KSx0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IubG9hZChpLHRoaXMub3B0aW9ucy5ucyxyKX1lbHNlIHIobnVsbCl9fSx7a2V5OiJyZWxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1NdCgpO3JldHVybiB0fHwodD10aGlzLmxhbmd1YWdlcyksZXx8KGU9dGhpcy5vcHRpb25zLm5zKSxufHwobj1zZSksdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnJlbG9hZCh0LGUsZnVuY3Rpb24odCl7ci5yZXNvbHZlKCksbih0KX0pLHJ9fSx7a2V5OiJ1c2UiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGFuIHVuZGVmaW5lZCBtb2R1bGUhIFBsZWFzZSBjaGVjayB0aGUgb2JqZWN0IHlvdSBhcmUgcGFzc2luZyB0byBpMThuZXh0LnVzZSgpIik7aWYoIXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoIllvdSBhcmUgcGFzc2luZyBhIHdyb25nIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCkiKTtyZXR1cm4iYmFja2VuZCI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMuYmFja2VuZD10KSwoImxvZ2dlciI9PT10LnR5cGV8fHQubG9nJiZ0Lndhcm4mJnQuZXJyb3IpJiYodGhpcy5tb2R1bGVzLmxvZ2dlcj10KSwibGFuZ3VhZ2VEZXRlY3RvciI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3Rvcj10KSwiaTE4bkZvcm1hdCI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdD10KSwicG9zdFByb2Nlc3NvciI9PT10LnR5cGUmJkt0LmFkZFBvc3RQcm9jZXNzb3IodCksIjNyZFBhcnR5Ij09PXQudHlwZSYmdGhpcy5tb2R1bGVzLmV4dGVybmFsLnB1c2godCksdGhpc319LHtrZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7dGhpcy5pc0xhbmd1YWdlQ2hhbmdpbmdUbz10O3ZhciByPU10KCk7dGhpcy5lbWl0KCJsYW5ndWFnZUNoYW5naW5nIix0KTt2YXIgbz1mdW5jdGlvbih0KXt2YXIgbz0ic3RyaW5nIj09dHlwZW9mIHQ/dDpuLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0QmVzdE1hdGNoRnJvbUNvZGVzKHQpO28mJihuLmxhbmd1YWdlfHwobi5sYW5ndWFnZT1vLG4ubGFuZ3VhZ2VzPW4uc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobykpLG4udHJhbnNsYXRvci5sYW5ndWFnZXx8bi50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKG8pLG4uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmbi5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmNhY2hlVXNlckxhbmd1YWdlKG8pKSxuLmxvYWRSZXNvdXJjZXMobyxmdW5jdGlvbih0KXshZnVuY3Rpb24odCxvKXtvPyhuLmxhbmd1YWdlPW8sbi5sYW5ndWFnZXM9bi5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShvKSxuLnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2Uobyksbi5pc0xhbmd1YWdlQ2hhbmdpbmdUbz12b2lkIDAsbi5lbWl0KCJsYW5ndWFnZUNoYW5nZWQiLG8pLG4ubG9nZ2VyLmxvZygibGFuZ3VhZ2VDaGFuZ2VkIixvKSk6bi5pc0xhbmd1YWdlQ2hhbmdpbmdUbz12b2lkIDAsci5yZXNvbHZlKGZ1bmN0aW9uKCl7cmV0dXJuIG4udC5hcHBseShuLGFyZ3VtZW50cyl9KSxlJiZlKHQsZnVuY3Rpb24oKXtyZXR1cm4gbi50LmFwcGx5KG4sYXJndW1lbnRzKX0pfSh0LG8pfSl9O3JldHVybiB0fHwhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yfHx0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuYXN5bmM/IXQmJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jP3RoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3Qobyk6byh0KTpvKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoKSkscn19LHtrZXk6ImdldEZpeGVkVCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9ZnVuY3Rpb24gdChlLHIpe3ZhciBvO2lmKCJvYmplY3QiIT09U3Qocikpe2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KGk+Mj9pLTI6MCkscz0yO3M8aTtzKyspYVtzLTJdPWFyZ3VtZW50c1tzXTtvPW4ub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihbZSxyXS5jb25jYXQoYSkpfWVsc2Ugbz1UdCh7fSxyKTtyZXR1cm4gby5sbmc9by5sbmd8fHQubG5nLG8ubG5ncz1vLmxuZ3N8fHQubG5ncyxvLm5zPW8ubnN8fHQubnMsbi50KGUsbyl9O3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9yLmxuZz10OnIubG5ncz10LHIubnM9ZSxyfX0se2tleToidCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYodD10aGlzLnRyYW5zbGF0b3IpLnRyYW5zbGF0ZS5hcHBseSh0LGFyZ3VtZW50cyl9fSx7a2V5OiJleGlzdHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMudHJhbnNsYXRvciYmKHQ9dGhpcy50cmFuc2xhdG9yKS5leGlzdHMuYXBwbHkodCxhcmd1bWVudHMpfX0se2tleToic2V0RGVmYXVsdE5hbWVzcGFjZSIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLmRlZmF1bHROUz10fX0se2tleToiaGFzTG9hZGVkTmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCF0aGlzLmlzSW5pdGlhbGl6ZWQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bmV4dCB3YXMgbm90IGluaXRpYWxpemVkIix0aGlzLmxhbmd1YWdlcyksITE7aWYoIXRoaXMubGFuZ3VhZ2VzfHwhdGhpcy5sYW5ndWFnZXMubGVuZ3RoKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG4ubGFuZ3VhZ2VzIHdlcmUgdW5kZWZpbmVkIG9yIGVtcHR5Iix0aGlzLmxhbmd1YWdlcyksITE7dmFyIHI9dGhpcy5sYW5ndWFnZXNbMF0sbz0hIXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGk9dGhpcy5sYW5ndWFnZXNbdGhpcy5sYW5ndWFnZXMubGVuZ3RoLTFdO2lmKCJjaW1vZGUiPT09ci50b0xvd2VyQ2FzZSgpKXJldHVybiEwO3ZhciBhPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnN0YXRlWyIiLmNvbmNhdCh0LCJ8IikuY29uY2F0KG4pXTtyZXR1cm4tMT09PXJ8fDI9PT1yfTtpZihuLnByZWNoZWNrKXt2YXIgcz1uLnByZWNoZWNrKHRoaXMsYSk7aWYodm9pZCAwIT09cylyZXR1cm4gc31yZXR1cm4hIXRoaXMuaGFzUmVzb3VyY2VCdW5kbGUocix0KXx8KCF0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IuYmFja2VuZHx8ISghYShyLHQpfHxvJiYhYShpLHQpKSl9fSx7a2V5OiJsb2FkTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9TXQoKTtyZXR1cm4gdGhpcy5vcHRpb25zLm5zPygic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe24ub3B0aW9ucy5ucy5pbmRleE9mKHQpPDAmJm4ub3B0aW9ucy5ucy5wdXNoKHQpfSksdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uKHQpe3IucmVzb2x2ZSgpLGUmJmUodCl9KSxyKTooZSYmZSgpLFByb21pc2UucmVzb2x2ZSgpKX19LHtrZXk6ImxvYWRMYW5ndWFnZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49TXQoKTsic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSk7dmFyIHI9dGhpcy5vcHRpb25zLnByZWxvYWR8fFtdLG89dC5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHIuaW5kZXhPZih0KTwwfSk7cmV0dXJuIG8ubGVuZ3RoPyh0aGlzLm9wdGlvbnMucHJlbG9hZD1yLmNvbmNhdChvKSx0aGlzLmxvYWRSZXNvdXJjZXMoZnVuY3Rpb24odCl7bi5yZXNvbHZlKCksZSYmZSh0KX0pLG4pOihlJiZlKCksUHJvbWlzZS5yZXNvbHZlKCkpfX0se2tleToiZGlyIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0fHwodD10aGlzLmxhbmd1YWdlcyYmdGhpcy5sYW5ndWFnZXMubGVuZ3RoPjA/dGhpcy5sYW5ndWFnZXNbMF06dGhpcy5sYW5ndWFnZSksIXQpcmV0dXJuInJ0bCI7cmV0dXJuWyJhciIsInNodSIsInNxciIsInNzaCIsInhhYSIsInloZCIsInl1ZCIsImFhbyIsImFiaCIsImFidiIsImFjbSIsImFjcSIsImFjdyIsImFjeCIsImFjeSIsImFkZiIsImFkcyIsImFlYiIsImFlYyIsImFmYiIsImFqcCIsImFwYyIsImFwZCIsImFyYiIsImFycSIsImFycyIsImFyeSIsImFyeiIsImF1eiIsImF2bCIsImF5aCIsImF5bCIsImF5biIsImF5cCIsImJieiIsInBnYSIsImhlIiwiaXciLCJwcyIsInBidCIsInBidSIsInBzdCIsInBycCIsInByZCIsInVnIiwidXIiLCJ5ZGQiLCJ5ZHMiLCJ5aWgiLCJqaSIsInlpIiwiaGJvIiwibWVuIiwieG1uIiwiZmEiLCJqcHIiLCJwZW8iLCJwZXMiLCJwcnMiLCJkdiIsInNhbSJdLmluZGV4T2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKT49MD8icnRsIjoibHRyIn19LHtrZXk6ImNyZWF0ZUluc3RhbmNlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwO3JldHVybiBuZXcgZSh0LG4pfX0se2tleToiY2xvbmVJbnN0YW5jZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnNlLG89VHQoe30sdGhpcy5vcHRpb25zLG4se2lzQ2xvbmU6ITB9KSxpPW5ldyBlKG8pLGE9WyJzdG9yZSIsInNlcnZpY2VzIiwibGFuZ3VhZ2UiXTtyZXR1cm4gYS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lbZV09dFtlXX0pLGkuc2VydmljZXM9VHQoe30sdGhpcy5zZXJ2aWNlcyksaS5zZXJ2aWNlcy51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOmkuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQoaSl9LGkudHJhbnNsYXRvcj1uZXcgSnQoaS5zZXJ2aWNlcyxpLm9wdGlvbnMpLGkudHJhbnNsYXRvci5vbigiKiIsZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZT4xP2UtMTowKSxyPTE7cjxlO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2kuZW1pdC5hcHBseShpLFt0XS5jb25jYXQobikpfSksaS5pbml0KG8sciksaS50cmFuc2xhdG9yLm9wdGlvbnM9aS5vcHRpb25zLGkudHJhbnNsYXRvci5iYWNrZW5kQ29ubmVjdG9yLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6aS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChpKX0saX19XSksZX0oKSksY2U9bigxMzMpLGxlPW4ubihjZSk7ZnVuY3Rpb24gZmUodCxlLG4pe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fWZ1bmN0aW9uIHBlKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e30scj1PYmplY3Qua2V5cyhuKTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKHI9ci5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxyLmZvckVhY2goZnVuY3Rpb24oZSl7ZmUodCxlLG5bZV0pfSl9cmV0dXJuIHR9ZnVuY3Rpb24gaGUodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiBkZSh0LGUsbil7dmFyIHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxpPWFyZ3VtZW50cyxhPWZ1bmN0aW9uKCl7cj1udWxsLG58fHQuYXBwbHkobyxpKX0scz1uJiYhcjtjbGVhclRpbWVvdXQocikscj1zZXRUaW1lb3V0KGEsZSkscyYmdC5hcHBseShvLGkpfX1mdW5jdGlvbiBnZSh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mb3IodmFyIG89InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7by5sZW5ndGg+MTspe2lmKCF0KXJldHVybnt9O3ZhciBpPXIoby5zaGlmdCgpKTshdFtpXSYmbiYmKHRbaV09bmV3IG4pLHQ9dFtpXX1yZXR1cm4gdD97b2JqOnQsazpyKG8uc2hpZnQoKSl9Ont9fWZ1bmN0aW9uIHZlKHQsZSxuKXt2YXIgcj1nZSh0LGUsT2JqZWN0KTtyLm9ialtyLmtdPW59ZnVuY3Rpb24geWUodCxlKXt2YXIgbj1nZSh0LGUpLHI9bi5vYmosbz1uLms7aWYocilyZXR1cm4gcltvXX12YXIgbWU9bmV3IFJlZ0V4cCgie3soLis/KX19IiwiZyIpO2Z1bmN0aW9uIGJlKHQsZSxuKXt2YXIgcixvLGk7Zm9yKDtyPW1lLmV4ZWModCk7KSJzdHJpbmciIT10eXBlb2Yobz1yWzFdLnRyaW0oKSkmJihvPW51bGw9PShpPW8pPyIiOiIiK2kpLG98fChvPSIiKSxvPW8ucmVwbGFjZSgvXCQvZywiJCQkJCIpLHQ9dC5yZXBsYWNlKHJbMF0sZVtvXXx8byksbWUubGFzdEluZGV4PTA7cmV0dXJuIHR9ZnVuY3Rpb24geGUodCxlLG4scixvKXt0cnl7dmFyIGk9bmV3KFhNTEh0dHBSZXF1ZXN0fHxBY3RpdmVYT2JqZWN0KSgiTVNYTUwyLlhNTEhUVFAuMy4wIik7aS5vcGVuKHI/IlBPU1QiOiJHRVQiLHQsMSksZS5jcm9zc0RvbWFpbnx8aS5zZXRSZXF1ZXN0SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwiWE1MSHR0cFJlcXVlc3QiKSxlLmF1dGhvcml6ZSYmZS5hcGlLZXkmJmkuc2V0UmVxdWVzdEhlYWRlcigiQXV0aG9yaXphdGlvbiIsZS5hcGlLZXkpLChyfHxlLnNldENvbnRlbnRUeXBlSlNPTikmJmkuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24vanNvbiIpLGkub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aS5yZWFkeVN0YXRlPjMmJm4mJm4oaS5yZXNwb25zZVRleHQsaSl9LGkuc2VuZChKU09OLnN0cmluZ2lmeShyKSl9Y2F0Y2godCl7d2luZG93LmNvbnNvbGUmJmNvbnNvbGUubG9nKHQpfX12YXIgd2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbixyKXshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyx0KSxlJiZlLnByb2plY3RJZD90aGlzLmluaXQobnVsbCxlLHt9LG4pOnRoaXMuaW5pdChudWxsLG4se30sciksdGhpcy50eXBlPSJiYWNrZW5kIn12YXIgZSxuLHI7cmV0dXJuIGU9dCwobj1be2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxyPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwLG89YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDA7dGhpcy5vcHRpb25zPXBlKHt9LHtsb2FkUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLHByaXZhdGVQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vcHJpdmF0ZS97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319IixwdWxsUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3B1bGwve3twcm9qZWN0SWR9fS97e3ZlcnNpb259fS97e2xuZ319L3t7bnN9fSIsZ2V0TGFuZ3VhZ2VzUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL2xhbmd1YWdlcy97e3Byb2plY3RJZH19IixhZGRQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vbWlzc2luZy97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319Iix1cGRhdGVQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vdXBkYXRlL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLHJlZmVyZW5jZUxuZzoiZW4iLGNyb3NzRG9tYWluOiEwLHNldENvbnRlbnRUeXBlSlNPTjohMSx2ZXJzaW9uOiJsYXRlc3QiLHB1bGw6ITEscHJpdmF0ZTohMSx3aGl0ZWxpc3RUaHJlc2hvbGQ6LjksZmFpbExvYWRpbmdPbkVtcHR5SlNPTjohMSxhbGxvd2VkQWRkT3JVcGRhdGVIb3N0czpbImxvY2FsaG9zdCJdfSx0aGlzLm9wdGlvbnMsbiksdGhpcy5zZXJ2aWNlcz10LHRoaXMub3B0aW9ucy5wdWxsJiZjb25zb2xlLndhcm4oImRlcHJlY2F0ZWQ6IHB1bGwgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBhbmQgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggbG9jaXplIHByaXZhdGUgdmVyc2lvbnMiKTt2YXIgaT13aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtpPyh0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkPXRoaXMub3B0aW9ucy5hbGxvd2VkQWRkT3JVcGRhdGVIb3N0cy5pbmRleE9mKGkpPi0xLHIuc2F2ZU1pc3NpbmcmJiF0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkJiZ0JiZ0LmxvZ2dlciYmdC5sb2dnZXIud2FybignbG9jaXplLWJhY2tlbmQ6IHdpbGwgbm90IHNhdmUgbWlzc2luZ3MgYmVjYXVzZSB0aGUgaG9zdCAiJy5jb25jYXQoaSwnIiB3YXMgbm90IGluIHRoZSBsaXN0IG9mIGFsbG93ZWRBZGRPclVwZGF0ZUhvc3RzOiAnKS5jb25jYXQodGhpcy5vcHRpb25zLmFsbG93ZWRBZGRPclVwZGF0ZUhvc3RzLmpvaW4oIiwgIiksIiAobWF0Y2hlcyBuZWVkIHRvIGJlIGV4YWN0KS4iKSkpOnRoaXMuaXNBZGRPclVwZGF0ZUFsbG93ZWQ9ITAsImZ1bmN0aW9uIj09dHlwZW9mIG8mJnRoaXMuZ2V0T3B0aW9ucyhmdW5jdGlvbih0LHIpe2lmKHQpcmV0dXJuIG8odCk7ZS5vcHRpb25zLnJlZmVyZW5jZUxuZz1uLnJlZmVyZW5jZUxuZ3x8ci5yZWZlcmVuY2VMbmd8fGUub3B0aW9ucy5yZWZlcmVuY2VMbmcsbyhudWxsLHIpfSksdGhpcy5xdWV1ZWRXcml0ZXM9e30sdGhpcy5kZWJvdW5jZWRQcm9jZXNzPWRlKHRoaXMucHJvY2VzcywxZTQpfX0se2tleToiZ2V0TGFuZ3VhZ2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1iZSh0aGlzLm9wdGlvbnMuZ2V0TGFuZ3VhZ2VzUGF0aCx7cHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWR9KTt0aGlzLmxvYWRVcmwoZSx7fSx0KX19LHtrZXk6ImdldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5nZXRMYW5ndWFnZXMoZnVuY3Rpb24obixyKXtpZihuKXJldHVybiB0KG4pO3ZhciBvPU9iamVjdC5rZXlzKHIpO2lmKCFvLmxlbmd0aClyZXR1cm4gdChuZXcgRXJyb3IoIndhcyB1bmFibGUgdG8gbG9hZCBsYW5ndWFnZXMgdmlhIEFQSSIpKTt2YXIgaT1vLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiByW2VdLmlzUmVmZXJlbmNlTGFuZ3VhZ2UmJih0PWUpLHR9LCIiKSxhPW8ucmVkdWNlKGZ1bmN0aW9uKHQsbil7dmFyIG89cltuXTtyZXR1cm4gby50cmFuc2xhdGVkW2Uub3B0aW9ucy52ZXJzaW9uXSYmby50cmFuc2xhdGVkW2Uub3B0aW9ucy52ZXJzaW9uXT49ZS5vcHRpb25zLndoaXRlbGlzdFRocmVzaG9sZCYmdC5wdXNoKG4pLHR9LFtdKSxzPW8ucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaW5kZXhPZigiLSIpPi0xfHx0fSwhMSk7dChudWxsLHtmYWxsYmFja0xuZzppLHJlZmVyZW5jZUxuZzppLHdoaXRlbGlzdDphLGxvYWQ6cz8iYWxsIjoibGFuZ3VhZ2VPbmx5In0pfSl9fSx7a2V5OiJyZWFkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHIsbz17fTt0aGlzLm9wdGlvbnMucHJpdmF0ZT8ocj1iZSh0aGlzLm9wdGlvbnMucHJpdmF0ZVBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLG89e2F1dGhvcml6ZTohMH0pOnRoaXMub3B0aW9ucy5wdWxsPyhyPWJlKHRoaXMub3B0aW9ucy5wdWxsUGF0aCx7bG5nOnQsbnM6ZSxwcm9qZWN0SWQ6dGhpcy5vcHRpb25zLnByb2plY3RJZCx2ZXJzaW9uOnRoaXMub3B0aW9ucy52ZXJzaW9ufSksbz17YXV0aG9yaXplOiEwfSk6cj1iZSh0aGlzLm9wdGlvbnMubG9hZFBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLHRoaXMubG9hZFVybChyLG8sbil9fSx7a2V5OiJsb2FkVXJsIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpczt4ZSh0LHBlKHt9LHRoaXMub3B0aW9ucyxlKSxmdW5jdGlvbihlLG8pe2lmKG8uc3RhdHVzPj01MDAmJm8uc3RhdHVzPDYwMClyZXR1cm4gbigiZmFpbGVkIGxvYWRpbmcgIit0LCEwKTtpZihvLnN0YXR1cz49NDAwJiZvLnN0YXR1czw1MDApcmV0dXJuIG4oImZhaWxlZCBsb2FkaW5nICIrdCwhMSk7dmFyIGksYTt0cnl7aT1KU09OLnBhcnNlKGUpfWNhdGNoKGUpe2E9ImZhaWxlZCBwYXJzaW5nICIrdCsiIHRvIGpzb24ifXJldHVybiBhP24oYSwhMSk6ci5vcHRpb25zLmZhaWxMb2FkaW5nT25FbXB0eUpTT04mJiFPYmplY3Qua2V5cyhpKS5sZW5ndGg/bigibG9hZGVkIHJlc3VsdCBlbXB0eSBmb3IgIit0LCExKTp2b2lkIG4obnVsbCxpKX0pfX0se2tleToiY3JlYXRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8saSl7dmFyIGE9dGhpcztpZihvfHwobz1mdW5jdGlvbigpe30pLCF0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkKXJldHVybiBvKCJob3N0IGlzIG5vdCBhbGxvd2VkIHRvIGNyZWF0ZSBrZXkuIik7InN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0PT09YS5vcHRpb25zLnJlZmVyZW5jZUxuZ30pLmxlbmd0aDwxJiZ0aGlzLnNlcnZpY2VzJiZ0aGlzLnNlcnZpY2VzLmxvZ2dlciYmdGhpcy5zZXJ2aWNlcy5sb2dnZXIud2FybignbG9jaXplLWJhY2tlbmQ6IHdpbGwgbm90IHNhdmUgbWlzc2luZ3MgYmVjYXVzZSB0aGUgcmVmZXJlbmNlIGxhbmd1YWdlICInLmNvbmNhdCh0aGlzLm9wdGlvbnMucmVmZXJlbmNlTG5nLCciIHdhcyBub3QgaW4gdGhlIGxpc3Qgb2YgdG8gc2F2ZSBsYW5ndWFnZXM6ICcpLmNvbmNhdCh0LmpvaW4oIiwgIiksIiAob3BlbiB5b3VyIHNpdGUgaW4gdGhlIHJlZmVyZW5jZSBsYW5ndWFnZSB0byBzYXZlIG1pc3NpbmdzKS4iKSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Q9PT1hLm9wdGlvbnMucmVmZXJlbmNlTG5nJiZhLnF1ZXVlLmNhbGwoYSxhLm9wdGlvbnMucmVmZXJlbmNlTG5nLGUsbixyLG8saSl9KX19LHtrZXk6InVwZGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvLGkpe3ZhciBhPXRoaXM7aWYob3x8KG89ZnVuY3Rpb24oKXt9KSwhdGhpcy5pc0FkZE9yVXBkYXRlQWxsb3dlZClyZXR1cm4gbygiaG9zdCBpcyBub3QgYWxsb3dlZCB0byB1cGRhdGUga2V5LiIpO2l8fChpPXt9KSwic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksaS5pc1VwZGF0ZT0hMCx0LmZvckVhY2goZnVuY3Rpb24odCl7dD09PWEub3B0aW9ucy5yZWZlcmVuY2VMbmcmJmEucXVldWUuY2FsbChhLGEub3B0aW9ucy5yZWZlcmVuY2VMbmcsZSxuLHIsbyxpKX0pfX0se2tleToid3JpdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZigheWUodGhpcy5xdWV1ZWRXcml0ZXMsWyJsb2NrcyIsdCxlXSkpe3ZhciByPWJlKHRoaXMub3B0aW9ucy5hZGRQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxvPWJlKHRoaXMub3B0aW9ucy51cGRhdGVQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxpPXllKHRoaXMucXVldWVkV3JpdGVzLFt0LGVdKTtpZih2ZSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSxbXSksaS5sZW5ndGgpe3ZlKHRoaXMucXVldWVkV3JpdGVzLFsibG9ja3MiLHQsZV0sITApO3ZhciBhPSExLHM9ITEsdT17fSxjPXt9O2kuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT10Lm9wdGlvbnMmJnQub3B0aW9ucy50RGVzY3JpcHRpb24/e3ZhbHVlOnQuZmFsbGJhY2tWYWx1ZXx8IiIsY29udGV4dDp7dGV4dDp0Lm9wdGlvbnMudERlc2NyaXB0aW9ufX06dC5mYWxsYmFja1ZhbHVlfHwiIjt0Lm9wdGlvbnMmJnQub3B0aW9ucy5pc1VwZGF0ZT8oc3x8KHM9ITApLGNbdC5rZXldPWUpOihhfHwoYT0hMCksdVt0LmtleV09ZSl9KTt2YXIgbD0wO2EmJmwrKyxzJiZsKys7dmFyIGY9ZnVuY3Rpb24oKXstLWx8fCh2ZShuLnF1ZXVlZFdyaXRlcyxbImxvY2tzIix0LGVdLCExKSxpLmZvckVhY2goZnVuY3Rpb24odCl7dC5jYWxsYmFjayYmdC5jYWxsYmFjaygpfSksbi5kZWJvdW5jZWRQcm9jZXNzKHQsZSkpfTtsfHxmKCksYSYmeGUocixwZSh7fSx7YXV0aG9yaXplOiEwfSx0aGlzLm9wdGlvbnMpLGZ1bmN0aW9uKHQsZSl7ZigpfSx1KSxzJiZ4ZShvLHBlKHt9LHthdXRob3JpemU6ITB9LHRoaXMub3B0aW9ucyksZnVuY3Rpb24odCxlKXtmKCl9LGMpfX19fSx7a2V5OiJwcm9jZXNzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7T2JqZWN0LmtleXModGhpcy5xdWV1ZWRXcml0ZXMpLmZvckVhY2goZnVuY3Rpb24oZSl7ImxvY2tzIiE9PWUmJk9iamVjdC5rZXlzKHQucXVldWVkV3JpdGVzW2VdKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3QucXVldWVkV3JpdGVzW2VdW25dLmxlbmd0aCYmdC53cml0ZShlLG4pfSl9KX19LHtrZXk6InF1ZXVlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8saSl7IWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPWdlKHQsZSxPYmplY3QpLGk9by5vYmosYT1vLms7aVthXT1pW2FdfHxbXSxyJiYoaVthXT1pW2FdLmNvbmNhdChuKSkscnx8aVthXS5wdXNoKG4pfSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSx7a2V5Om4sZmFsbGJhY2tWYWx1ZTpyfHwiIixjYWxsYmFjazpvLG9wdGlvbnM6aX0pLHRoaXMuZGVib3VuY2VkUHJvY2VzcygpfX1dKSYmaGUoZS5wcm90b3R5cGUsbiksciYmaGUoZSxyKSx0fSgpO3dlLnR5cGU9ImJhY2tlbmQiO3ZhciBrZT13ZSxTZT1uKDQzKTtmdW5jdGlvbiBFZSgpe3JldHVybihFZT14dCgpKHZ0LmEubWFyayhmdW5jdGlvbiB0KGUpe3JldHVybiB2dC5hLndyYXAoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLG5ldyBrdC5hKGZ1bmN0aW9uKHQpe3VlLmNoYW5nZUxhbmd1YWdlKGUsZnVuY3Rpb24oKXt0KHZvaWQgMCl9KX0pKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19LHQpfSkpKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gVGUoKXt2YXIgdDtyZXR1cm4gbXQoKSh0PXVlLnQpLmNhbGwodCx1ZSl9dmFyIGplPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBrdC5hKGZ1bmN0aW9uKHQsZSl7dWUudXNlKG5ldyBsZS5hKG51bGwse29yZGVyOlsibmF2aWdhdG9yIl19KSkudXNlKGtlKS5pbml0KHtmYWxsYmFja0xuZzoiZW4iLG5zOlsiZGVmYXVsdCJdLGRlZmF1bHROUzoiZGVmYXVsdCIsYmFja2VuZDp7cHJvamVjdElkOlNlLmxvY2l6ZS5wcm9kdWN0SWQsdmVyc2lvbjpTZS5sb2NpemUudmVyc2lvbixhcGlLZXk6U2UubG9jaXplLmFwaUtleSxyZWZlcmVuY2VMbmc6ImVuIn19LGZ1bmN0aW9uKG4scil7cmV0dXJuIG4/ZShuKTp0KHIpfSl9KX0sY2hhbmdlTGFuZ3VhZ2U6ZnVuY3Rpb24odCl7cmV0dXJuIEVlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZ2V0TGFuZ3VhZ2U6ZnVuY3Rpb24oKXtyZXR1cm4gdWUubGFuZ3VhZ2V9LGdldFQ6VGV9LEFlPW4oODMpLE9lPW4ubihBZSksQ2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPWUuZGF0YTtwKCkodGhpcyx0KSx0aGlzLmRhdGE9bn1yZXR1cm4gZCgpKHQsbnVsbCxbe2tleToiY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj0xO3I8ZS5sZW5ndGg7cis9MSl7Zm9yKHZhciBvPXt9LGk9MDtpPHQubGVuZ3RoO2krPTEpb1t0W2ldXT1lW3JdW2ldO24ucHVzaChvKX1yZXR1cm4gbn19LHtrZXk6InNwbGl0Q291bnRyaWVzIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdD8iIj09PXR8fCIsIj09PXQ/W106dC5zcGxpdCgiLCIpOltdfX0se2tleToibm9ybWFsaXplUmF3RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj0wLG89VygpKHQpO3I8by5sZW5ndGg7cisrKXt2YXIgaSxhPXRbb1tyXV07YS5zaGlmdCgpLG49dSgpKGk9W10pLmNhbGwoaSxPZSgpKG4pLE9lKCkoYSkpfXJldHVybiBuLnVuc2hpZnQoZSkse2RhdGE6bn19fV0pLHR9KCk7ZnVuY3Rpb24gTGUodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFvLmEpcmV0dXJuITE7aWYoby5hLnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKCkoRGF0ZSxbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1rKCkodCk7aWYoZSl7dmFyIGk9aygpKHRoaXMpLmNvbnN0cnVjdG9yO249bygpKHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4geCgpKHRoaXMsbil9fXZhciBSZT17YnlVcmw6e25hbWU6ImJ5VXJsIixjb2x1bW5zOlsidXJsIiwiY291bnRyaWVzIl19LGJ5SXRlbU5hbWU6e25hbWU6ImJ5SXRlbU5hbWUiLGNvbHVtbnM6WyJpdGVtTmFtZSIsImNvdW50cmllcyJdfSxieUl0ZW1Db2RlOntuYW1lOiJieUl0ZW1Db2RlIixjb2x1bW5zOlsiaXRlbUNvZGUiLCJjb3VudHJpZXMiXX0sYnlDYXRlZ29yeTp7bmFtZToiYnlDYXRlZ29yeSIsY29sdW1uczpbImNhdGVnb3J5IiwiY291bnRyaWVzIl19LGJ5SXRlbURlc2NyaXB0aW9uOntuYW1lOiJieUl0ZW1EZXNjcmlwdGlvbiIsY29sdW1uczpbInRleHQiLCJjb3VudHJpZXMiXX19LFBlPWZ1bmN0aW9uKHQpe20oKShuLHQpO3ZhciBlPUxlKG4pO2Z1bmN0aW9uIG4odCl7dmFyIHI7cmV0dXJuIHAoKSh0aGlzLG4pLChyPWUuY2FsbCh0aGlzLHQpKS5kYXRhPXQuZGF0YSxyLnNoZWV0VHlwZT10LnNoZWV0VHlwZXx8UmUscn1yZXR1cm4gZCgpKG4sW3trZXk6ImJ5VXJsIix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieVVybClyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieVVybDtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9Q2UuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBsKCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57dXJsOmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXtpZighdGhpcy5zaGVldFR5cGUuYnlJdGVtTmFtZSlyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieUl0ZW1OYW1lO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1DZS5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIGwoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybntpdGVtTmFtZTplW3QuY29sdW1uc1swXV0sY291bnRyaWVzOkNlLnNwbGl0Q291bnRyaWVzKG4pLGlzQWxsOiJBTEwiPT09bn19KX19LHtrZXk6ImJ5SXRlbUNvZGUiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbUNvZGUpcmV0dXJuW107dmFyIHQ9dGhpcy5zaGVldFR5cGUuYnlJdGVtQ29kZTtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9Q2UuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBsKCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57aXRlbUNvZGU6ZVt0LmNvbHVtbnNbMF1dLGNvdW50cmllczpDZS5zcGxpdENvdW50cmllcyhuKSxpc0FsbDoiQUxMIj09PW59fSl9fSx7a2V5OiJieUNhdGVnb3J5Iix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieUNhdGVnb3J5KXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5Q2F0ZWdvcnk7aWYoIXRoaXMuZGF0YVt0Lm5hbWVdKXJldHVybltdO3ZhciBlPUNlLmNvbnZlcnRHb29nbGVTcHJlYWRzaGVldEFwaVJhd0RhdGEodC5jb2x1bW5zLHRoaXMuZGF0YVt0Lm5hbWVdKTtyZXR1cm4gbCgpKGUpLmNhbGwoZSxmdW5jdGlvbihlKXt2YXIgbj1lW3QuY29sdW1uc1sxXV07cmV0dXJue2NhdGVnb3J5OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtRGVzY3JpcHRpb24iLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uKXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1DZS5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIGwoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybnt0ZXh0OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiZXhlY3V0ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZXhjbHVzaW9uOntieVVybDp0aGlzLmJ5VXJsKCksYnlJdGVtTmFtZTp0aGlzLmJ5SXRlbU5hbWUoKSxieUl0ZW1Db2RlOnRoaXMuYnlJdGVtQ29kZSgpLGJ5Q2F0ZWdvcnk6dGhpcy5ieUNhdGVnb3J5KCksYnlJdGVtRGVzY3JpcHRpb246dGhpcy5ieUl0ZW1EZXNjcmlwdGlvbigpfX19fV0pLG59KENlKSxOZT1uKDYzKSxJZT1uLm4oTmUpLERlPW4oODQpO2Z1bmN0aW9uIF9lKHQsZSl7dmFyIG47aWYodm9pZCAwPT09VS5hfHxudWxsPT1fKCkodCkpe2lmKEkoKSh0KXx8KG49ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBNZSh0LGUpO3ZhciByPUgoKShuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkuY2FsbChuLDgsLTEpOyJPYmplY3QiPT09ciYmdC5jb25zdHJ1Y3RvciYmKHI9dC5jb25zdHJ1Y3Rvci5uYW1lKTtpZigiTWFwIj09PXJ8fCJTZXQiPT09cilyZXR1cm4gcSgpKHQpO2lmKCJBcmd1bWVudHMiPT09cnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QocikpcmV0dXJuIE1lKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxvPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpvLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjpvfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGksYT0hMCxzPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1QKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYT10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtzPSEwLGk9dH0sZjpmdW5jdGlvbigpe3RyeXthfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKHMpdGhyb3cgaX19fX1mdW5jdGlvbiBNZSh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIFVlKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhby5hKXJldHVybiExO2lmKG8uYS5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobygpKERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9aygpKHQpO2lmKGUpe3ZhciBpPWsoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPW8oKShyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHgoKSh0aGlzLG4pfX12YXIgQmU9ZnVuY3Rpb24odCl7bSgpKG4sdCk7dmFyIGU9VWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBwKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gZCgpKG4sW3trZXk6ImV4Y2x1ZGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxyKXt2YXIgbyxpLGEscz0hMSxjPXRoaXMubG9jYXRpb24uY291bnRyeSxsPV9lKHQpO3RyeXtmb3IobC5zKCk7IShvPWwubigpKS5kb25lOyl7dmFyIGY9by52YWx1ZTtpZihyKGYpKXtzPW4ubWF0Y2hDb3VudHJ5KGYsYyk7YnJlYWt9fX1jYXRjaCh0KXtsLmUodCl9ZmluYWxseXtsLmYoKX1yZXR1cm4gcz8oYXQuYS5kZWJ1Zyh1KCkoaT0iRVhDTFVERUQgQlkgU1BSRUFEU0hFRVQ6ICIuY29uY2F0KGUsIiwgIikpLmNhbGwoaSxjKSkse2NvZGU6IkVYQ0xVREVEX0JZX0JMQUNLTElTVCIsbWVzc2FnZTp1KCkoYT0iIi5jb25jYXQoZSwiLCAiKSkuY2FsbChhLGMsIiDjgavoqbLlvZPjgZfjgZ/jgZ/jgoHpmaTlpJYiKSxwYXJhbXM6e3ZhbHVlOmUsY291bnRyeTpjfX0pOkRlLmF9fV0sW3trZXk6Im1hdGNoQ291bnRyeSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4hKCF0LmlzQWxsJiYwIT09dC5jb3VudHJpZXMubGVuZ3RoKXx8SWUoKShuPXQuY291bnRyaWVzKS5jYWxsKG4sZSl9fV0pLG59KERlLmIpO2Z1bmN0aW9uIHFlKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhby5hKXJldHVybiExO2lmKG8uYS5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobygpKERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9aygpKHQpO2lmKGUpe3ZhciBpPWsoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPW8oKShyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHgoKSh0aGlzLG4pfX12YXIgRmU9d2luZG93LnppZ3phZyxIZT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJidG4tbmF2IikubGVuZ3RoPjAsemU9L1wvaXRlbVwvXGQrLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtkdC5vbkNoYW5nZXNSZWFkeShmdW5jdGlvbih0KXsvdG93ZXJcLmpwXC8vLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiYoSGU/KHplJiYoZHQub3ZlcnJpZGVDbGlja0V2ZW50KHQsIi5pdGVtLWluZm8tbWFpbiAubWFpbi1jYXJ0aW4tYnRuLCAjRmxvYXRpbmdDYXJ0SW4gLm1haW4tY2FydGluLWJ0biIsZnVuY3Rpb24oKXtGZS5wYWdlVG8oIml0ZW0iKX0pLHQoJ1tpZCo9IlJlbGF0aW9uR3JvdXBJdGVtc18iXScpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwiLmNhcnRpbi1idG4ucmVsZWFzZWQtYnRuIixmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG4scj10KGUudGFyZ2V0KTtpZihyLmNsb3Nlc3QoIi5yZWxhdGlvbi1ncm91cC1pdGVtLXJvdyIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShuPXIuY2xvc2VzdCgiLnJlbGF0aW9uLWdyb3VwLWl0ZW0tcm93IikpLmNhbGwobiwiLml0ZW0taW5mby1ibG9jayA+IGEiKS5hdHRyKCJocmVmIil8fCIifX0pKSxkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwnYVtocmVmJD0iL2VjL1Nob3BwaW5nQmFnL0l0ZW1MaXN0Il0nLGZ1bmN0aW9uKCl7RmUucGFnZVRvKCJjYXJ0Iil9KSx0KCIuYm94LnNlY3Rpb24sIC50ZXh0LWhvbGRlciIpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwnYVtocmVmKj0iYWN0aW9uPWNhcnRpbiJdJyxmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG49dChlLnRhcmdldCk7aWYobi5jbG9zZXN0KCIuZXZlbi1pdGVtIikubGVuZ3RoPjApe3ZhciByPW4uY2xvc2VzdCgiLmV2ZW4taXRlbSIpO0UoKShyKS5jYWxsKHIsIi5zdWItdGl0bGUiKS5sZW5ndGg+MD93aW5kb3cubG9jYXRpb24uaHJlZj1FKCkocikuY2FsbChyLCIuc3ViLXRpdGxlID4gYSIpLmF0dHIoImhyZWYiKXx8IiI6RSgpKHIpLmNhbGwociwiLndyYXBwLXRleHQiKS5sZW5ndGg+MCYmKHdpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShyKS5jYWxsKHIsIi53cmFwcC10ZXh0IGE6Zmlyc3Qtb2YtdHlwZSIpLmF0dHIoImhyZWYiKXx8IiIpfX19KSk6KHplJiYoZHQub3ZlcnJpZGVDbGlja0V2ZW50KHQsIi5wcmljZS1pbmZvLW1haW4gLmNhcnRpbi1hcmVhLW5vd29uc2FsZSwgLnByaWNlLWluZm8tbWFpbiAuY2FydGluLWFyZWEtcmVzZXJ2ZSIsZnVuY3Rpb24oKXtGZS5wYWdlVG8oIml0ZW0iKX0pLHQoJ1tpZCo9IlJlbGF0aW9uR3JvdXBJdGVtc18iXScpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwiLmNhcnRpbi1idG4ucmVsZWFzZWQtYnRuIixmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG4scj10KGUudGFyZ2V0KTtpZihyLmNsb3Nlc3QoIi5yZWxhdGlvbi1ncm91cC1pdGVtLXJvdyIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShuPXIuY2xvc2VzdCgiLml0ZW0tYmxvY2siKSkuY2FsbChuLCIuaXRlbS1pbmZvLWJsb2NrID4gYSIpLmF0dHIoImhyZWYiKXx8IiJ9fSkpLGR0Lm92ZXJyaWRlQ2xpY2tFdmVudCh0LCdhW2hyZWYkPSIvZWMvU2hvcHBpbmdCYWcvSXRlbUxpc3QiXScsZnVuY3Rpb24oKXtGZS5wYWdlVG8oImNhcnQiKX0pLHQoIi50b3BNb2R1bGVCb3gsIC5hcnRpc3RNYWluT25lQ29sdW1uLCAuc2VhcmNoTGlzdFRhYmxlIikubGVuZ3RoPjAmJmR0Lm92ZXJyaWRlQ2xpY2tFdmVudCh0LCdhW2hyZWYqPSJhY3Rpb249Y2FydGluIl0nLGZ1bmN0aW9uKGUpe2lmKGUudGFyZ2V0KXt2YXIgbixyPXQoZS50YXJnZXQpO2lmKHIuY2xvc2VzdCgiLmZlYXR1cmVJdGVtQ2FydFdyYXAwMSIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShuPXIuY2xvc2VzdCgiLmZlYXR1cmVJdGVtQ2FydFdyYXAwMSIpKS5jYWxsKG4sIi5uYW1lOmZpcnN0LW9mLXR5cGUgPiBhIikuYXR0cigiaHJlZiIpfHwiIjtlbHNlIGlmKHIuY2xvc2VzdCgiLmFydGlzdFNlY3Rpb25MaW5lMDEiKS5sZW5ndGg+MCl7dmFyIG87d2luZG93LmxvY2F0aW9uLmhyZWY9RSgpKG89ci5jbG9zZXN0KCJsaSIpKS5jYWxsKG8sIi50aXRsZSA+IGEiKS5hdHRyKCJocmVmIil8fCIifWVsc2UgaWYoci5jbG9zZXN0KCIuaW5NZGwtZmVhdHVyZUl0ZW1DZWxsLCAuZGlzY29ncmFwaHlMaW5ldXBUYWJsZTAxIikubGVuZ3RoPjApe3ZhciBpO3dpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShpPXIuY2xvc2VzdCgiLmluTWRsLWZlYXR1cmVJdGVtQ2VsbCwgLmRpc2NvZ3JhcGh5TGluZXVwVGFibGUwMSIpKS5jYWxsKGksIi50aXRsZSA+IGEiKS5hdHRyKCJocmVmIil8fCIifWVsc2UgaWYoci5jbG9zZXN0KCIuZmVhdHVyZUl0ZW1PdGhlckxpc3QwMSIpLmxlbmd0aD4wKXt2YXIgYTt3aW5kb3cubG9jYXRpb24uaHJlZj1FKCkoYT1yLmNsb3Nlc3QoImxpIikpLmNhbGwoYSwiLmltZyA+IHAgPiBhIikuYXR0cigiaHJlZiIpfHwiIn1lbHNlIGlmKHIuY2xvc2VzdCgiLmluTWRsLWF0Y2xJdGVtUm93IikubGVuZ3RoPjApe3ZhciBzO3dpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShzPXIuY2xvc2VzdCgibGkiKSkuY2FsbChzLCIudGl0bGUgPiBhIikuYXR0cigiaHJlZiIpfHwiIn19fSx7ZGlzYWJsZVBvaW50ZXJFdmVudDohMH0pKSl9KTt2YXIgV2U9ZnVuY3Rpb24odCl7bSgpKG4sdCk7dmFyIGU9cWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBwKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gZCgpKG4sW3trZXk6ImdldEl0ZW0iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZSxyPXRoaXMsbz12KCkoaygpKG4ucHJvdG90eXBlKSwiZ2V0SXRlbSIsdGhpcykuY2FsbCh0aGlzKTtIZT9vLmltYWdlcz1sKCkodD10aGlzLiQoIiNqYWNrZXRQaG90b1N3aXBlciAubWFpbi1qYWNrZXQgaW1nIikuZ2V0KCkpLmNhbGwodCxmdW5jdGlvbih0KXtyZXR1cm4gci4kKHQpLmF0dHIoInNyYyIpfHwiIn0pOm8uaW1hZ2VzPWwoKShlPXRoaXMuJCgiI21haW4taW1hZ2UiKS5nZXQoKSkuY2FsbChlLGZ1bmN0aW9uKHQpe3JldHVybiByLiQodCkuYXR0cigic3JjIil8fCIifSk7cmV0dXJuIG99fSx7a2V5OiJnZXRJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IiI7cmV0dXJuIHRoaXMuJCgiI1ByaXZpbGVnZUFyZWEiKS5sZW5ndGg+MD90KyLvvIjnibnlhbjjgYLjgorvvIkiOnR9fSx7a2V5OiJnZXRJdGVtUHJpY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjAsZT10LG49dGhpcy4kKCIuc2FsZS1wcmljZS12YWx1ZSIpLHI9dGhpcy4kKCIubXVsdGlidXktcHJpY2UtbGFiZWwiKS50ZXh0KCk7cmV0dXJuIG4ubGVuZ3RoPjAmJigv44G+44Go44KB44Gm44Kq44OV5L6h5qC8Ly50ZXN0KHIpfHwoZT1BKG4udGV4dCgpKSkpLGV9fSx7a2V5OiJnZXRQdXJjaGFzYWJsZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIDAhPT10aGlzLiQoJy5jYXJ0aW4tYXJlYS1ub3dvbnNhbGVbb25jbGljayo9IkNhcnRJbiJdLCAuY2FydGluLWFyZWEtcmVzZXJ2ZVtvbmNsaWNrKj0iQ2FydEluIl0nKS5sZW5ndGh8fChhdC5hLmRlYnVnKCLjgqvjg7zjg4jjg5zjgr/jg7PjgYznhKHjgYTjgZ/jgoHjgIHos7zlhaXkuI3lj68iKSwhMSl9fV0pLG59KEcpLCRlPWZ1bmN0aW9uKHQpe20oKShuLHQpO3ZhciBlPXFlKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gcCgpKHRoaXMsbiksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIG59KFdlKSxZZT1mdW5jdGlvbih0KXttKCkobix0KTt2YXIgZT1xZShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIHAoKSh0aGlzLG4pLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBufShXZSksVmU9ZnVuY3Rpb24odCl7bSgpKG4sdCk7dmFyIGU9cWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBwKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gbn0oQmUpO0ZlLmRpc2NvdmVyeShmdW5jdGlvbih0KXt2YXIgZT10LmNhbGxiYWNrLG49dC5sb2NhdGlvbjshZnVuY3Rpb24odCxlKXt2YXIgbj13aW5kb3cuemlnemFnO24mJm4udXRpbHMuZmV0Y2hIdG1sKHQsZSl9KGZ1bmN0aW9uKHQpe3RyeXtpZighemUpcmV0dXJuIGUoKTt2YXIgcixvPW5ldyBQZSh7ZGF0YTpGZS5zaG9wRGF0YXx8e319KS5leGVjdXRlKCk7aWYoSGUpe3I9bmV3ICRlKHskOnQsbmFtZToiLml0ZW0tamFja2V0LXRpdGxlIC5wcm9kdWN0LXRpdGxlIixwcmljZToiLml0ZW0taW5mbyAucHJpY2UtdmFsdWUifSkuZXhlY3V0ZSgpfWVsc2V7cj1uZXcgWWUoeyQ6dCxuYW1lOiIuaXRlbS1pbmZvIC5wcm9kdWN0LXRpdGxlIixwcmljZToiLnByaWNlLWluZm8tbWFpbiAucHJpY2UtdmFsdWUifSkuZXhlY3V0ZSgpfXZhciBpPW5ldyBWZSh7bG9jYXRpb246bixzY3JhcGVyUmVzdWx0OnIsZGF0YTpvLmV4Y2x1c2lvbn0pLmV4ZWN1dGUoKTtyZXR1cm4gZShudWxsLHtpdGVtOnIuaXRlbSxza3VSb3dzOnIuc2t1Um93cyxleGNsdXNpb246aX0pfWNhdGNoKHQpe3JldHVybiBlKHQpfX0pfSk7dmFyIEdlPW5ldyBEYXRlKCJUaHUgTWFyIDQgMjAyMSAwMDowMDowMCBHTVQrMDgwMCIpLEtlPW5ldyBEYXRlKCJXZWQgTWFyIDE3IDIwMjEgMjM6NTk6NTkgR01UKzA4MDAiKSxYZT1uZXcgRGF0ZSxKZT1Cb29sZWFuKEZlLmxvY2F0aW9uJiYiQ04iPT09RmUubG9jYXRpb24uY291bnRyeSk7aWYoWGUuZ2V0VGltZSgpPj1HZS5nZXRUaW1lKCkmJlhlLmdldFRpbWUoKTw9S2UuZ2V0VGltZSgpJiZKZSl7aWYoRmUubm90aWNlTW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG49VGUoKTtyZXR1cm57anVtYm90cm9uOntodG1sOnUoKSh0PXUoKShlPSJcbiAgPGRpdiBzdHlsZT0nbWFyZ2luOiA2cHggMCAwICFpbXBvcnRhbnQ7Jz5cbiAgPGRpdj5cbiAgPHNwYW4gc3R5bGU9J21hcmdpbjogMzRweCAwIDAgIWltcG9ydGFudDsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsnPjxpbWcgc3JjPSdodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL3Rvd2VyX2pwL25vdGljZU1vZGFsX2xvZ28ucG5nJyBhbHQ9J1dvcmxkU2hvcHBpbmfDl1RPV0VSIFJFQ09SRFMnIHN0eWxlPSdtYXgtd2lkdGg6IDQwMHB4ICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Jz48L3NwYW4+XG4gIDxoMSBzdHlsZT0nZm9udC1zaXplOiAyLjlyZW0gIWltcG9ydGFudDsnPiIuY29uY2F0KG4oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDEiKSwiPC9oMT5cbiAgPGgyIHN0eWxlPSdmb250LXNpemU6IDEuNHJlbSAhaW1wb3J0YW50Oyc+IikpLmNhbGwoZSxuKCJjb21tb24ubm90aWNlTW9kYWwuanVtYm90cm9uLmgyIiksIjwvaDI+XG4gIDxpbWcgc3JjPSdodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL2NvbW1vbi9hbGlwYXlfY2FtcGFpZ25fMjAyMTAzMDQucG5nJyBzdHlsZT0nd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgbWF4LXdpZHRoOiA1MDBweCAhaW1wb3J0YW50Oyc+XG4gIDxhIHN0eWxlPSd0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7JyBocmVmPSdodHRwczovL3Rvd2VyLmpwL3NpdGUvaG93dG8vZm9yaW50ZXJuYXRpb25hbGN1c3RvbWVyJz5cbiAgPHNwYW4gc3R5bGU9J2Rpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgICBmb250LXNpemU6IDEuNnJlbSAhaW1wb3J0YW50O1xuICAgICAgbWFyZ2luOiAxcmVtIGF1dG8gIWltcG9ydGFudDtcbiAgICAgIHBhZGRpbmc6IDFyZW0gIWltcG9ydGFudDtcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkICFpbXBvcnRhbnQ7XG4gICAgICBtYXgtd2lkdGg6IDUwMHB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXI6IHNvbGlkICNmZmNhMDAgIWltcG9ydGFudDtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmNhMDAgIWltcG9ydGFudDtcbiAgICAgIGNvbG9yOiAjMDAwMDAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LG4oInRvd2VyX2pwLm5vdGljZU1vZGFsLmp1bWJvdHJvbi50ZXh0IiksIjwvc3Bhbj5cbiAgPC9hPlxuICA8L2Rpdj5cbiAgPC9kaXY+XG4gICIpfX19KSx6ZSlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuaXRlbS1pbmZvLW1haW4gLnN0b2NrLXN0YXR1cyIpLmxlbmd0aD4wJiYi44GK5Y+W44KK5a+E44GbIj09PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pdGVtLWluZm8tbWFpbiAuc3RvY2stc3RhdHVzIilbMF0udGV4dENvbnRlbnQ/RmUuaXRlbU1vZGFsKGZ1bmN0aW9uKCl7dmFyIHQsZT1UZSgpO3JldHVybntib3R0b206e2h0bWw6dSgpKHQ9IlxuICA8ZGl2IHN0eWxlPSdtYXJnaW46IC0xMHB4IDAgLThweCAhaW1wb3J0YW50Oyc+XG4gIDxwIHN0eWxlPSdjb2xvcjogcmVkICFpbXBvcnRhbnQ7XG4gICAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkICFpbXBvcnRhbnQ7XG4gICAgICBsaW5lLWhlaWdodDogMSAhaW1wb3J0YW50O1xuICAgICAgbWFyZ2luOiAwLjRlbSAwICFpbXBvcnRhbnQ7Jz4iLmNvbmNhdChlKCJ0b3dlcl9qcC5pdGVtLmJvdHRvbS50aXRsZSIpLCI8L3A+XG4gIDxwIHN0eWxlPSdmb250LXNpemU6IDExcHggIWltcG9ydGFudDtcbiAgICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZSAhaW1wb3J0YW50O1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMiAhaW1wb3J0YW50O1xuICAgICAgcGFkZGluZy1ib3R0b206IDAuMmVtICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LGUoInRvd2VyX2pwLml0ZW0uYm90dG9tLnRleHQiKSwiPC9wPlxuICA8L2Rpdj5cbiAgPGltZyBzcmM9J2h0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvY29tbW9uL2FsaXBheV9jYW1wYWlnbl8yMDIxMDMwNC5wbmcnIHN0eWxlPSd3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBtYXJnaW4tYm90dG9tOiAtMTVweCAhaW1wb3J0YW50Oyc+XG4gICIpfX19KTpGZS5pdGVtTW9kYWwoZnVuY3Rpb24oKXtyZXR1cm57Ym90dG9tOntodG1sOiJcbiAgICAgIDxpbWcgc3JjPSdodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL2NvbW1vbi9hbGlwYXlfY2FtcGFpZ25fMjAyMTAzMDQucG5nJyBzdHlsZT0nd2lkdGg6IDEwMCUgIWltcG9ydGFudDsnPlxuICAgICAgIn19fSk7RmUubGF1bmNoKGZ1bmN0aW9uKCl7dmFyIHQ9IXNlc3Npb25TdG9yYWdlLmdldEl0ZW0oIlNUT1JBR0VfS0VZX3JhZ3RhZ19qcCIpO3JldHVybiBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCJTVE9SQUdFX0tFWV9yYWd0YWdfanAiLGEoKSghMCkpLHQ/Im5vdGljZSI6bnVsbH0pfWVsc2V7aWYoRmUubm90aWNlTW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG49VGUoKTtyZXR1cm57anVtYm90cm9uOntodG1sOnUoKSh0PXUoKShlPSJcbjxkaXYgc3R5bGU9J21hcmdpbjogNnB4IDAgMCAhaW1wb3J0YW50Oyc+XG48ZGl2PlxuPHNwYW4gc3R5bGU9J21hcmdpbjogMzRweCAwIDAgIWltcG9ydGFudDsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsnPjxpbWcgc3JjPSdodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL3Rvd2VyX2pwL25vdGljZU1vZGFsX2xvZ28ucG5nJyBhbHQ9J1dvcmxkU2hvcHBpbmfDl1RPV0VSIFJFQ09SRFMnIHN0eWxlPSdtYXgtd2lkdGg6IDQwMHB4ICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Jz48L3NwYW4+XG48aDEgc3R5bGU9J2ZvbnQtc2l6ZTogMi45cmVtICFpbXBvcnRhbnQ7Jz4iLmNvbmNhdChuKCJjb21tb24ubm90aWNlTW9kYWwuanVtYm90cm9uLmgxIiksIjwvaDE+XG48aDIgc3R5bGU9J2ZvbnQtc2l6ZTogMS40cmVtICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbChlLG4oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDIiKSwiPC9oMj5cbjxhIHN0eWxlPSd0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7JyBocmVmPSdodHRwczovL3Rvd2VyLmpwL3NpdGUvaG93dG8vZm9yaW50ZXJuYXRpb25hbGN1c3RvbWVyJz5cbjxzcGFuIHN0eWxlPSdkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogMS42cmVtICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luOiAxcmVtIGF1dG8gIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiAxcmVtICFpbXBvcnRhbnQ7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICBtYXgtd2lkdGg6IDUwMHB4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiBzb2xpZCAjZmZjYTAwICFpbXBvcnRhbnQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiAjMDAwMDAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LG4oInRvd2VyX2pwLm5vdGljZU1vZGFsLmp1bWJvdHJvbi50ZXh0IiksIjwvc3Bhbj5cbjwvYT5cbjwvZGl2PlxuPC9kaXY+XG4iKX19fSksRmUuY2FydE1vZGFsKGZ1bmN0aW9uKCl7dmFyIHQsZSxuLHI9VGUoKTtyZXR1cm57Ym90dG9tOntodG1sOnUoKSh0PXUoKShlPXUoKShuPSJcbjxkaXYgc3R5bGU9J2xpbmUtaGVpZ2h0OiAxLjMgIWltcG9ydGFudDsnPlxuPHAgc3R5bGU9J2NvbG9yOiByZWQgIWltcG9ydGFudDtmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7bWFyZ2luOiAwICFpbXBvcnRhbnQ7Jz4iLmNvbmNhdChyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS50ZXh0MS5hbGVydCIpLCI8L3A+XG48dWwgc3R5bGU9J21hcmdpbjogMC40ZW0gMCAhaW1wb3J0YW50Oyc+XG48bGkgc3R5bGU9J2ZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDtwYWRkaW5nOiAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbChuLHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLmxpbmUxIiksIjwvbGk+XG48bGkgc3R5bGU9J2ZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDtwYWRkaW5nOiAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbChlLHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLmxpbmUyIiksIjwvbGk+XG48L3VsPlxuPHAgc3R5bGU9J2NvbG9yOiByZWQgIWltcG9ydGFudDtmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7bWFyZ2luOiAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLnRleHQyLmFsZXJ0IiksIiA8L3A+XG48L2Rpdj5cbiIpfX19KSx6ZSlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuaXRlbS1pbmZvLW1haW4gLnN0b2NrLXN0YXR1cyIpLmxlbmd0aD4wJiYi44GK5Y+W44KK5a+E44GbIj09PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pdGVtLWluZm8tbWFpbiAuc3RvY2stc3RhdHVzIilbMF0udGV4dENvbnRlbnQmJkZlLml0ZW1Nb2RhbChmdW5jdGlvbigpe3ZhciB0LGU9VGUoKTtyZXR1cm57Ym90dG9tOntodG1sOnUoKSh0PSJcbjxkaXY+XG48cCBzdHlsZT0nY29sb3I6IHJlZCAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkICFpbXBvcnRhbnQ7XG4gICAgbGluZS1oZWlnaHQ6IDEgIWltcG9ydGFudDtcbiAgICBtYXJnaW46IDAuNGVtIDAgIWltcG9ydGFudDsnPiIuY29uY2F0KGUoInRvd2VyX2pwLml0ZW0uYm90dG9tLnRpdGxlIiksIjwvcD5cbjxwIHN0eWxlPSdmb250LXNpemU6IDExcHggIWltcG9ydGFudDtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLWxpbmUgIWltcG9ydGFudDtcbiAgICBsaW5lLWhlaWdodDogMS4yICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDAuMmVtICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LGUoInRvd2VyX2pwLml0ZW0uYm90dG9tLnRleHQiKSwiPC9wPlxuPC9kaXY+XG4iKX19fSl9L3Rvd2Vyc2hpYnV5YVwuanBcL2twb3AvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpPyhGZS5sYXVuY2goZnVuY3Rpb24oKXtyZXR1cm4iYmFubmVyLWhpZGRlbiJ9KSxGZS5iYW5uZXIoZnVuY3Rpb24oKXtyZXR1cm57aGlkZGVuOntodG1sOidcbjxhIGhyZWY9Imh0dHBzOi8vYml0Lmx5LzJZVWxLVGQiPlxuPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogIzY0NjU2NyAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDRweCA0cHggMCAhaW1wb3J0YW50O1xuICAgIHRleHQtYWxpZ246IGNlbnRlciAhaW1wb3J0YW50O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50O1xuICAgIGJvdHRvbTogMCAhaW1wb3J0YW50O1xuICAgIHJpZ2h0OiAxMHB4ICFpbXBvcnRhbnQ7XG4gICAgbGVmdDogYXV0byAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwcHggMTBweCAwIDAgIWltcG9ydGFudDsiPlxuICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgd2lkdGg6IDUwcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiA2cHggN3B4IDVweCA3cHggIWltcG9ydGFudDtcbiAgICBib3JkZXItcmFkaXVzOiA2cHggNnB4IDAgMCAhaW1wb3J0YW50OyI+XG4gICAgPGltZyBzcmM9Imh0dHBzOi8vY2hlY2tvdXQtc3RhdGljLndvcmxkc2hvcHBpbmcuanAvaW1hZ2VzL2NvbW1vbi9iYW5uZXJfaGlkZGVuX2ljb25fZW4uc3ZnIiBhbHQ9Ikdsb2JhbCBTaGlwcGluZyIgc3R5bGU9IndpZHRoOiA1MnB4ICFpbXBvcnRhbnQ7Ij5cbiAgICA8L3NwYW4+XG48L2Rpdj5cbjwvYT5cbid9fX0pKTovKHRvd2Vyc2hpYnV5YVwuanApLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKSYmKEZlLmxhdW5jaChmdW5jdGlvbigpe3JldHVybiJiYW5uZXItaGlkZGVuIn0pLEZlLmJhbm5lcihmdW5jdGlvbigpe3JldHVybntoaWRkZW46e2h0bWw6J1xuPGEgaHJlZj0iaHR0cHM6Ly9iaXQubHkvM2dMdTR1QSI+XG48ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiAjNjQ2NTY3ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNHB4IDRweCAwICFpbXBvcnRhbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7XG4gICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gICAgYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgcmlnaHQ6IDEwcHggIWltcG9ydGFudDtcbiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogMTBweCAxMHB4IDAgMCAhaW1wb3J0YW50OyI+XG4gICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDZweCA3cHggNXB4IDdweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICA8aW1nIHNyYz0iaHR0cHM6Ly9jaGVja291dC1zdGF0aWMud29ybGRzaG9wcGluZy5qcC9pbWFnZXMvY29tbW9uL2Jhbm5lcl9oaWRkZW5faWNvbl9lbi5zdmciIGFsdD0iR2xvYmFsIFNoaXBwaW5nIiBzdHlsZT0id2lkdGg6IDUycHggIWltcG9ydGFudDsiPlxuICAgIDwvc3Bhbj5cbjwvZGl2PlxuPC9hPlxuJ319fSkpLC8obWlraWtpXC50b2t5b1wuanBcLykvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiYoRmUubGF1bmNoKGZ1bmN0aW9uKCl7cmV0dXJuImJhbm5lci1oaWRkZW4ifSksRmUuYmFubmVyKGZ1bmN0aW9uKCl7cmV0dXJue2hpZGRlbjp7aHRtbDonXG48YSBocmVmPSJodHRwczovL2JpdC5seS8zMUlOejJMIj5cbjxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICM2NDY1NjcgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiA0cHggNHB4ICFpbXBvcnRhbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7XG4gICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gICAgYm90dG9tOiAxMzBweCAhaW1wb3J0YW50O1xuICAgIHJpZ2h0OiAtMjNweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwcHggMCAwIDEwcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwICFpbXBvcnRhbnQ7Ij5cbiAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogd2hpdGUgIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIHdpZHRoOiA1MHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNnB4IDIwcHggNnB4IDdweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDZweCAwIDAgNnB4ICFpbXBvcnRhbnQ7Ij5cbiAgICA8aW1nIHNyYz0iaHR0cHM6Ly9jaGVja291dC1zdGF0aWMud29ybGRzaG9wcGluZy5qcC9pbWFnZXMvY29tbW9uL2Jhbm5lcl9oaWRkZW5faWNvbl9lbi5zdmciIGFsdD0iR2xvYmFsIFNoaXBwaW5nIiBzdHlsZT0id2lkdGg6IDUycHggIWltcG9ydGFudDsgYm9yZGVyLXJhZGl1czogNnB4IDAgMCA2cHggIWltcG9ydGFudDsiPlxuICAgIDwvc3Bhbj5cbjwvZGl2PlxuPC9hPlxuJ319fSkpLC8odG93ZXJcLmpwXC98dG93ZXJzaGlidXlhXC5qcFwvfG1pa2lraVwudG9reW9cLmpwXC8pLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKSYmamUuaW5pdGlhbGl6ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gRmUucnVuKCl9KX1dKTt9
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
13.32.21.90
, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- server-13-32-21-90.fra56.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- ca3d163bab055381827226140568f3bef7eaac187cebd76878e0b63e9e442356
|
GET
H2
|
200
|
default
Show response
api.locize.io/60ff8224-bbcc-4802-8d59-c8983deae8d0/production/en/
|
11 KB
3 KB
|
206ms
147ms
|
XHR
application/json |
13.32.21.90
AMAZON-02
|
|
General
- Full URL
- https://api.locize.io/60ff8224-bbcc-4802-8d59-c8983deae8d0/production/en/default
- Requested by
- Host: text
URL: data:text/javascript;base64,ZnVuY3Rpb24gb25Mb2FkWmlnWmFnKCl7IWZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4ocil7aWYoZVtyXSlyZXR1cm4gZVtyXS5leHBvcnRzO3ZhciBvPWVbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9bi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxyKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiYib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImZSYmInN0cmluZyIhPXR5cGVvZiB0KWZvcih2YXIgbyBpbiB0KW4uZChyLG8sZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxvKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsImEiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPSIvIixuKG4ucz0zMDIpfShbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDQpLG89big0NCkuZixpPW4oODcpLGE9bigxKSxzPW4oMzEpLHU9bigxNyksYz1uKDE0KSxsPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUsbixyKXtpZih0aGlzIGluc3RhbmNlb2YgdCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGUsbil9cmV0dXJuIG5ldyB0KGUsbixyKX1yZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3JldHVybiBlLnByb3RvdHlwZT10LnByb3RvdHlwZSxlfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbixmLHAsaCxkLGcsdix5LG09dC50YXJnZXQsYj10Lmdsb2JhbCx4PXQuc3RhdCx3PXQucHJvdG8saz1iP3I6eD9yW21dOihyW21dfHx7fSkucHJvdG90eXBlLFM9Yj9hOmFbbV18fChhW21dPXt9KSxFPVMucHJvdG90eXBlO2ZvcihwIGluIGUpbj0haShiP3A6bSsoeD8iLiI6IiMiKStwLHQuZm9yY2VkKSYmayYmYyhrLHApLGQ9U1twXSxuJiYoZz10Lm5vVGFyZ2V0R2V0Pyh5PW8oayxwKSkmJnkudmFsdWU6a1twXSksaD1uJiZnP2c6ZVtwXSxuJiZ0eXBlb2YgZD09dHlwZW9mIGh8fCh2PXQuYmluZCYmbj9zKGgscik6dC53cmFwJiZuP2woaCk6dyYmImZ1bmN0aW9uIj09dHlwZW9mIGg/cyhGdW5jdGlvbi5jYWxsLGgpOmgsKHQuc2hhbXx8aCYmaC5zaGFtfHxkJiZkLnNoYW0pJiZ1KHYsInNoYW0iLCEwKSxTW3BdPXYsdyYmKGMoYSxmPW0rIlByb3RvdHlwZSIpfHx1KGEsZix7fSksYVtmXVtwXT1oLHQucmVhbCYmRSYmIUVbcF0mJnUoRSxwLGgpKSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCksbz1uKDU4KSxpPW4oNzApLGE9big5NCkscz1yLlN5bWJvbCx1PW8oIndrcyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdVt0XXx8KHVbdF09YSYmc1t0XXx8KGE/czppKSgiU3ltYm9sLiIrdCkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSksbz1uKDE0KSxpPW4oNzUpLGE9bigyMykuZjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9ci5TeW1ib2x8fChyLlN5bWJvbD17fSk7byhlLHQpfHxhKGUsdCx7dmFsdWU6aS5mKHQpfSl9fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKGUpe3ZhciBuPSJvYmplY3QiLHI9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuTWF0aD09TWF0aCYmdH07dC5leHBvcnRzPXIodHlwZW9mIGdsb2JhbFRoaXM9PW4mJmdsb2JhbFRoaXMpfHxyKHR5cGVvZiB3aW5kb3c9PW4mJndpbmRvdyl8fHIodHlwZW9mIHNlbGY9PW4mJnNlbGYpfHxyKHR5cGVvZiBlPT1uJiZlKXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKX0pLmNhbGwodGhpcyxuKDg1KSl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4hIXQoKX1jYXRjaCh0KXtyZXR1cm4hMH19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ/bnVsbCE9PXQ6ImZ1bmN0aW9uIj09dHlwZW9mIHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDEzNil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNDMpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjA5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFyKHQpKXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYW4gb2JqZWN0Iik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNTApO2Z1bmN0aW9uIG8odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLHIodCxvLmtleSxvKX19dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZSYmbyh0LnByb3RvdHlwZSxlKSxuJiZvKHQsbiksdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSl7dmFyIG49e30uaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uY2FsbCh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTYzKSxvPW4oOTYpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQuZXhwb3J0cz1pPW8/cjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fHIodCl9LGkoZSl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMyksbz1uKDIzKSxpPW4oMzApO3QuZXhwb3J0cz1yP2Z1bmN0aW9uKHQsZSxuKXtyZXR1cm4gby5mKHQsZSxpKDEsbikpfTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRbZV09bix0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByW3QrIlByb3RvdHlwZSJdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTcxKSxvPW4oMTc1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1yKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmbyh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE0Nil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY1KSxvPW4oNDUpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcihvKHQpKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYSBmdW5jdGlvbiIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTMpLG89big4NiksaT1uKDExKSxhPW4oNTQpLHM9T2JqZWN0LmRlZmluZVByb3BlcnR5O2UuZj1yP3M6ZnVuY3Rpb24odCxlLG4pe2lmKGkodCksZT1hKGUsITApLGkobiksbyl0cnl7cmV0dXJuIHModCxlLG4pfWNhdGNoKHQpe31pZigiZ2V0ImluIG58fCJzZXQiaW4gbil0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuInZhbHVlImluIG4mJih0W2VdPW4udmFsdWUpLHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0NSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qocih0KSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNjEpLG89bi5uKHIpO2Z1bmN0aW9uIGkodCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzLmRlYnVnTG9nZ2VyKCkobygpKHQpKX1lLmE9e2RlYnVnOmksZXJyb3I6ZnVuY3Rpb24odCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzJiZlLnV0aWxzLmVycm9yTG9nZ2VyJiZlLnV0aWxzLmVycm9yTG9nZ2VyKCkodCksaSh0KX19fSxmdW5jdGlvbih0LGUpe3ZhciBuPXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbi5jYWxsKHQpLnNsaWNlKDgsLTEpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ITB9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzKS5mLG89bigxNyksaT1uKDE0KSxhPW4oMTgzKSxzPW4oMikoInRvU3RyaW5nVGFnIiksdT1hIT09e30udG9TdHJpbmc7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLGMpe2lmKHQpe3ZhciBsPW4/dDp0LnByb3RvdHlwZTtpKGwscyl8fHIobCxzLHtjb25maWd1cmFibGU6ITAsdmFsdWU6ZX0pLGMmJnUmJm8obCwidG9TdHJpbmciLGEpfX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPXt9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybntlbnVtZXJhYmxlOiEoMSZ0KSxjb25maWd1cmFibGU6ISgyJnQpLHdyaXRhYmxlOiEoNCZ0KSx2YWx1ZTplfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe2lmKHIodCksdm9pZCAwPT09ZSlyZXR1cm4gdDtzd2l0Y2gobil7Y2FzZSAwOnJldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmNhbGwoZSl9O2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQuY2FsbChlLG4pfTtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKG4scil7cmV0dXJuIHQuY2FsbChlLG4scil9O2Nhc2UgMzpyZXR1cm4gZnVuY3Rpb24obixyLG8pe3JldHVybiB0LmNhbGwoZSxuLHIsbyl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KGUsYXJndW1lbnRzKX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSxvPW4oNCksaT1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OnZvaWQgMH07dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9pKHJbdF0pfHxpKG9bdF0pOnJbdF0mJnJbdF1bZV18fG9bdF0mJm9bdF1bZV19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2OCksbz1NYXRoLm1pbjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MD9vKHIodCksOTAwNzE5OTI1NDc0MDk5MSk6MH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxODApLmNoYXJBdCxvPW4oNDkpLGk9big5OCksYT1vLnNldCxzPW8uZ2V0dGVyRm9yKCJTdHJpbmcgSXRlcmF0b3IiKTtpKFN0cmluZywiU3RyaW5nIixmdW5jdGlvbih0KXthKHRoaXMse3R5cGU6IlN0cmluZyBJdGVyYXRvciIsc3RyaW5nOlN0cmluZyh0KSxpbmRleDowfSl9LGZ1bmN0aW9uKCl7dmFyIHQsZT1zKHRoaXMpLG49ZS5zdHJpbmcsbz1lLmluZGV4O3JldHVybiBvPj1uLmxlbmd0aD97dmFsdWU6dm9pZCAwLGRvbmU6ITB9Oih0PXIobixvKSxlLmluZGV4Kz10Lmxlbmd0aCx7dmFsdWU6dCxkb25lOiExfSl9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTcpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixvKXtvJiZvLmVudW1lcmFibGU/dFtlXT1uOnIodCxlLG4pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTc2KSxvPW4oMjA4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4hZXx8Im9iamVjdCIhPT1yKGUpJiYiZnVuY3Rpb24iIT10eXBlb2YgZT9vKHQpOmV9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjIyKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIyMyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjUpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjI2KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIyNyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMzApfSxmdW5jdGlvbih0KXt0LmV4cG9ydHM9SlNPTi5wYXJzZSgneyJsb2NpemUiOnsicHJvZHVjdElkIjoiNjBmZjgyMjQtYmJjYy00ODAyLThkNTktYzg5ODNkZWFlOGQwIiwiYXBpS2V5IjoiNzM5NmU3NzgtMDkwMy00ZTdlLTgyODItZTY3MTU4NThiYjhjIiwidmVyc2lvbiI6InByb2R1Y3Rpb24ifSwiaW50ZWdyYXRpb25zIjp7ImNvbG9ybWVBcHAiOnsiYXBpIjp7InByb2R1Y3QiOiJodHRwczovL2NvbG9ybWUud29ybGRzaG9wcGluZy5qcC92MS9wcm9kdWN0In19LCJzaG9waWZ5QXBwIjp7ImFwaSI6eyJwcm9kdWN0IjoiaHR0cHM6Ly9hcHAtcy53b3JsZHNob3BwaW5nLmpwL3YxL3Byb2R1Y3QifX19LCJsYW1iZGEiOnsiY3JlYXRlIjoic2hvcC1kYXRhLXByb2QtY3JlYXRlIiwiY2xlYXIiOiJzaG9wLWRhdGEtcHJvZC1jbGVhciJ9LCJzZmRjIjp7ImNvbm5lY3Rpb25TZXR0aW5nc1BhdGgiOiIvc2ZkYy9wcm9kL2FwaSJ9LCJkZWJ1Z0hvc3RzIjpbInNob3AtZGFzaGJvYXJkLndvcmxkc2hvcHBpbmcuYml6Iiwic2hvcC1kYXNoYm9hcmQtZGV2Lndvcmxkc2hvcHBpbmcuYml6Iiwic2hvcC1kYXNoYm9hcmQtbG9jYWwud29ybGRzaG9wcGluZy5iaXoiXX0nKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTMpLG89big2NCksaT1uKDMwKSxhPW4oMjEpLHM9big1NCksdT1uKDE0KSxjPW4oODYpLGw9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtlLmY9cj9sOmZ1bmN0aW9uKHQsZSl7aWYodD1hKHQpLGU9cyhlLCEwKSxjKXRyeXtyZXR1cm4gbCh0LGUpfWNhdGNoKHQpe31pZih1KHQsZSkpcmV0dXJuIGkoIW8uZi5jYWxsKHQsZSksdFtlXSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihudWxsPT10KXRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIit0KTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxvPW4oMTM5KSxpPW4oNjkpLGE9big1Nikscz1uKDkwKSx1PW4oNjYpLGM9big1NykoIklFX1BST1RPIiksbD1mdW5jdGlvbigpe30sZj1mdW5jdGlvbigpe3ZhciB0LGU9dSgiaWZyYW1lIiksbj1pLmxlbmd0aDtmb3IoZS5zdHlsZS5kaXNwbGF5PSJub25lIixzLmFwcGVuZENoaWxkKGUpLGUuc3JjPVN0cmluZygiamF2YXNjcmlwdDoiKSwodD1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpLm9wZW4oKSx0LndyaXRlKCI8c2NyaXB0PmRvY3VtZW50LkY9T2JqZWN0PFwvc2NyaXB0PiIpLHQuY2xvc2UoKSxmPXQuRjtuLS07KWRlbGV0ZSBmLnByb3RvdHlwZVtpW25dXTtyZXR1cm4gZigpfTt0LmV4cG9ydHM9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gbnVsbCE9PXQ/KGwucHJvdG90eXBlPXIodCksbj1uZXcgbCxsLnByb3RvdHlwZT1udWxsLG5bY109dCk6bj1mKCksdm9pZCAwPT09ZT9uOm8obixlKX0sYVtjXT0hMH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjYpO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iQXJyYXkiPT1yKHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQpLG89bigyNCksaT1uKDU3KSxhPW4oOTUpLHM9aSgiSUVfUFJPVE8iKSx1PU9iamVjdC5wcm90b3R5cGU7dC5leHBvcnRzPWE/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0PW8odCkscih0LHMpP3Rbc106ImZ1bmN0aW9uIj09dHlwZW9mIHQuY29uc3RydWN0b3ImJnQgaW5zdGFuY2VvZiB0LmNvbnN0cnVjdG9yP3QuY29uc3RydWN0b3IucHJvdG90eXBlOnQgaW5zdGFuY2VvZiBPYmplY3Q/dTpudWxsfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhPW4oMTgxKSxzPW4oNCksdT1uKDYpLGM9bigxNyksbD1uKDE0KSxmPW4oNTcpLHA9big1NiksaD1zLldlYWtNYXA7aWYoYSl7dmFyIGQ9bmV3IGgsZz1kLmdldCx2PWQuaGFzLHk9ZC5zZXQ7cj1mdW5jdGlvbih0LGUpe3JldHVybiB5LmNhbGwoZCx0LGUpLGV9LG89ZnVuY3Rpb24odCl7cmV0dXJuIGcuY2FsbChkLHQpfHx7fX0saT1mdW5jdGlvbih0KXtyZXR1cm4gdi5jYWxsKGQsdCl9fWVsc2V7dmFyIG09Zigic3RhdGUiKTtwW21dPSEwLHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYyh0LG0sZSksZX0sbz1mdW5jdGlvbih0KXtyZXR1cm4gbCh0LG0pP3RbbV06e319LGk9ZnVuY3Rpb24odCl7cmV0dXJuIGwodCxtKX19dC5leHBvcnRzPXtzZXQ6cixnZXQ6byxoYXM6aSxlbmZvcmNlOmZ1bmN0aW9uKHQpe3JldHVybiBpKHQpP28odCk6cih0LHt9KX0sZ2V0dGVyRm9yOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbjtpZighdShlKXx8KG49byhlKSkudHlwZSE9PXQpdGhyb3cgVHlwZUVycm9yKCJJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICIrdCsiIHJlcXVpcmVkIik7cmV0dXJuIG59fX19LGZ1bmN0aW9uKHQsZSxuKXtuKDEwMSk7dmFyIHI9bigxODQpLG89big0KSxpPW4oMTcpLGE9bigyOSkscz1uKDIpKCJ0b1N0cmluZ1RhZyIpO2Zvcih2YXIgdSBpbiByKXt2YXIgYz1vW3VdLGw9YyYmYy5wcm90b3R5cGU7bCYmIWxbc10mJmkobCxzLHUpLGFbdV09YS5BcnJheX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDc2KSxvPW4oMjkpLGk9bigyKSgiaXRlcmF0b3IiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYobnVsbCE9dClyZXR1cm4gdFtpXXx8dFsiQEBpdGVyYXRvciJdfHxvW3IodCldfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIyKSxvPWZ1bmN0aW9uKHQpe3ZhciBlLG47dGhpcy5wcm9taXNlPW5ldyB0KGZ1bmN0aW9uKHQscil7aWYodm9pZCAwIT09ZXx8dm9pZCAwIT09bil0aHJvdyBUeXBlRXJyb3IoIkJhZCBQcm9taXNlIGNvbnN0cnVjdG9yIik7ZT10LG49cn0pLHRoaXMucmVzb2x2ZT1yKGUpLHRoaXMucmVqZWN0PXIobil9O3QuZXhwb3J0cy5mPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbyh0KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighcih0KSlyZXR1cm4gdDt2YXIgbixvO2lmKGUmJiJmdW5jdGlvbiI9PXR5cGVvZihuPXQudG9TdHJpbmcpJiYhcihvPW4uY2FsbCh0KSkpcmV0dXJuIG87aWYoImZ1bmN0aW9uIj09dHlwZW9mKG49dC52YWx1ZU9mKSYmIXIobz1uLmNhbGwodCkpKXJldHVybiBvO2lmKCFlJiYiZnVuY3Rpb24iPT10eXBlb2Yobj10LnRvU3RyaW5nKSYmIXIobz1uLmNhbGwodCkpKXJldHVybiBvO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big4OCksbz1uKDY5KTt0LmV4cG9ydHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3JldHVybiByKHQsbyl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTgpLG89big3MCksaT1yKCJrZXlzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpW3RdfHwoaVt0XT1vKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpLG89bigxNDApLGk9bigyNyksYT1yWyJfX2NvcmUtanNfc2hhcmVkX18iXXx8bygiX19jb3JlLWpzX3NoYXJlZF9fIix7fSk7KHQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBhW3RdfHwoYVt0XT12b2lkIDAhPT1lP2U6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjoiMy4yLjAiLG1vZGU6aT8icHVyZSI6Imdsb2JhbCIsY29weXJpZ2h0OiLCqSAyMDE5IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpIn0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDExMiksaT1uKDMzKSxhPW4oMzEpLHM9big1MSksdT1uKDExMSksYz1mdW5jdGlvbih0LGUpe3RoaXMuc3RvcHBlZD10LHRoaXMucmVzdWx0PWV9Oyh0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbCxmKXt2YXIgcCxoLGQsZyx2LHksbT1hKGUsbixsPzI6MSk7aWYoZilwPXQ7ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2YoaD1zKHQpKSl0aHJvdyBUeXBlRXJyb3IoIlRhcmdldCBpcyBub3QgaXRlcmFibGUiKTtpZihvKGgpKXtmb3IoZD0wLGc9aSh0Lmxlbmd0aCk7Zz5kO2QrKylpZigodj1sP20ocih5PXRbZF0pWzBdLHlbMV0pOm0odFtkXSkpJiZ2IGluc3RhbmNlb2YgYylyZXR1cm4gdjtyZXR1cm4gbmV3IGMoITEpfXA9aC5jYWxsKHQpfWZvcig7ISh5PXAubmV4dCgpKS5kb25lOylpZigodj11KHAsbSx5LnZhbHVlLGwpKSYmdiBpbnN0YW5jZW9mIGMpcmV0dXJuIHY7cmV0dXJuIG5ldyBjKCExKX0pLnN0b3A9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBjKCEwLHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybntlcnJvcjohMSx2YWx1ZTp0KCl9fWNhdGNoKHQpe3JldHVybntlcnJvcjohMCx2YWx1ZTp0fX19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQxKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzMyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyODUpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixpPW8mJiFyLmNhbGwoezE6Mn0sMSk7ZS5mPWk/ZnVuY3Rpb24odCl7dmFyIGU9byh0aGlzLHQpO3JldHVybiEhZSYmZS5lbnVtZXJhYmxlfTpyfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KSxvPW4oMjYpLGk9IiIuc3BsaXQ7dC5leHBvcnRzPXIoZnVuY3Rpb24oKXtyZXR1cm4hT2JqZWN0KCJ6IikucHJvcGVydHlJc0VudW1lcmFibGUoMCl9KT9mdW5jdGlvbih0KXtyZXR1cm4iU3RyaW5nIj09byh0KT9pLmNhbGwodCwiIik6T2JqZWN0KHQpfTpPYmplY3R9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpLG89big2KSxpPXIuZG9jdW1lbnQsYT1vKGkpJiZvKGkuY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhP2kuY3JlYXRlRWxlbWVudCh0KTp7fX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxKSxvPW4oMzMpLGk9big4OSksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLGEpe3ZhciBzLHU9cihlKSxjPW8odS5sZW5ndGgpLGw9aShhLGMpO2lmKHQmJm4hPW4pe2Zvcig7Yz5sOylpZigocz11W2wrK10pIT1zKXJldHVybiEwfWVsc2UgZm9yKDtjPmw7bCsrKWlmKCh0fHxsIGluIHUpJiZ1W2xdPT09bilyZXR1cm4gdHx8bHx8MDtyZXR1cm4hdCYmLTF9fTt0LmV4cG9ydHM9e2luY2x1ZGVzOmEoITApLGluZGV4T2Y6YSghMSl9fSxmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguY2VpbCxyPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA/cjpuKSh0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl19LGZ1bmN0aW9uKHQsZSl7dmFyIG49MCxyPU1hdGgucmFuZG9tKCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJTeW1ib2woIitTdHJpbmcodm9pZCAwPT09dD8iIjp0KSsiKV8iKygrK24rcikudG9TdHJpbmcoMzYpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDU0KSxvPW4oMjMpLGk9bigzMCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgYT1yKGUpO2EgaW4gdD9vLmYodCxhLGkoMCxuKSk6dFthXT1ufX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDIpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiFyKGZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuKGUuY29uc3RydWN0b3I9e30pW29dPWZ1bmN0aW9uKCl7cmV0dXJue2ZvbzoxfX0sMSE9PWVbdF0oQm9vbGVhbikuZm9vfSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMSksbz1uKDY1KSxpPW4oMjQpLGE9bigzMykscz1uKDkzKSx1PVtdLnB1c2gsYz1mdW5jdGlvbih0KXt2YXIgZT0xPT10LG49Mj09dCxjPTM9PXQsbD00PT10LGY9Nj09dCxwPTU9PXR8fGY7cmV0dXJuIGZ1bmN0aW9uKGgsZCxnLHYpe2Zvcih2YXIgeSxtLGI9aShoKSx4PW8oYiksdz1yKGQsZywzKSxrPWEoeC5sZW5ndGgpLFM9MCxFPXZ8fHMsVD1lP0UoaCxrKTpuP0UoaCwwKTp2b2lkIDA7az5TO1MrKylpZigocHx8UyBpbiB4KSYmKG09dyh5PXhbU10sUyxiKSx0KSlpZihlKVRbU109bTtlbHNlIGlmKG0pc3dpdGNoKHQpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIHk7Y2FzZSA2OnJldHVybiBTO2Nhc2UgMjp1LmNhbGwoVCx5KX1lbHNlIGlmKGwpcmV0dXJuITE7cmV0dXJuIGY/LTE6Y3x8bD9sOlR9fTt0LmV4cG9ydHM9e2ZvckVhY2g6YygwKSxtYXA6YygxKSxmaWx0ZXI6YygyKSxzb21lOmMoMyksZXZlcnk6Yyg0KSxmaW5kOmMoNSksZmluZEluZGV4OmMoNil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDE3MCk7dC5leHBvcnRzPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8KCJfX3Byb3RvX18iaW57fT9mdW5jdGlvbigpe3ZhciB0LGU9ITEsbj17fTt0cnl7KHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCJfX3Byb3RvX18iKS5zZXQpLmNhbGwobixbXSksZT1uIGluc3RhbmNlb2YgQXJyYXl9Y2F0Y2godCl7fXJldHVybiBmdW5jdGlvbihuLGkpe3JldHVybiByKG4pLG8oaSksZT90LmNhbGwobixpKTpuLl9fcHJvdG9fXz1pLG59fSgpOnZvaWQgMCl9LGZ1bmN0aW9uKHQsZSxuKXtlLmY9bigyKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjYpLG89bigyKSgidG9TdHJpbmdUYWciKSxpPSJBcmd1bWVudHMiPT1yKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlLG4sYTtyZXR1cm4gdm9pZCAwPT09dD8iVW5kZWZpbmVkIjpudWxsPT09dD8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihuPWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiB0W2VdfWNhdGNoKHQpe319KGU9T2JqZWN0KHQpLG8pKT9uOmk/cihlKToiT2JqZWN0Ij09KGE9cihlKSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNhbGxlZT8iQXJndW1lbnRzIjphfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz0iXHRcblx2XGZcciDCoOGagOKAgOKAgeKAguKAg+KAhOKAheKAhuKAh+KAiOKAieKAiuKAr+KBn+OAgFx1MjAyOFx1MjAyOVx1ZmVmZiJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMyKTt0LmV4cG9ydHM9cigibmF2aWdhdG9yIiwidXNlckFnZW50Iil8fCIifSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjE4KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0Nyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNjMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNzMpLG89bigyNzYpLGk9bigyODEpLGE9bigyODQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KXx8byh0KXx8aSh0KXx8YSgpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24odCl7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KSxuLmQoZSwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gUH0pO3ZhciByPW4oMzcpLG89bi5uKHIpLGk9bigzOCksYT1uLm4oaSkscz1uKDM5KSx1PW4ubihzKSxjPW4oNDApLGw9bi5uKGMpLGY9big0MSkscD1uLm4oZiksaD1uKDQyKSxkPW4ubihoKSxnPW4oMTM0KSx2PW4ubihnKSx5PW4oNjMpLG09bi5uKHkpLGI9bigxNikseD1uLm4oYiksdz1uKDcpLGs9bi5uKHcpLFM9bigxMiksRT1uLm4oUyksVD1uKDEzNSksaj1uLm4oVCksQT1uKDI1KSxPPW4oNDMpO2Z1bmN0aW9uIEModCxlKXt2YXIgbjtpZih2b2lkIDA9PT1sLmF8fG51bGw9PXUoKSh0KSl7aWYoYSgpKHQpfHwobj1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKCF0KXJldHVybjtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIEwodCxlKTt2YXIgcj1kKCkobj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTsiT2JqZWN0Ij09PXImJnQuY29uc3RydWN0b3ImJihyPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1yfHwiU2V0Ij09PXIpcmV0dXJuIHAoKSh0KTtpZigiQXJndW1lbnRzIj09PXJ8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKXJldHVybiBMKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxpPWZ1bmN0aW9uKCl7fTtyZXR1cm57czppLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjppfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIHMsYz0hMCxmPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1vKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYz10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtmPSEwLHM9dH0sZjpmdW5jdGlvbigpe3RyeXtjfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKGYpdGhyb3cgc319fX1mdW5jdGlvbiBMKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9dmFyIFI9e2NvZGU6Ik5PTkUifSxQPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt2YXIgbj10aGlzLHI9dC5zY3JhcGVyUmVzdWx0LG89dC5sb2NhdGlvbixpPXQuZGF0YTtrKCkodGhpcyxlKSx0aGlzLmV4Y2x1ZGVCeVNjcmFwZXJFcnJvcj1mdW5jdGlvbigpe3ZhciB0PW4uc2NyYXBlclJlc3VsdDtyZXR1cm4gdC5lcnJvcj97Y29kZToiRVJST1IiLG1lc3NhZ2U6ImV4Y2x1ZGVCeVNjcmFwZXJFcnJvcjogIi5jb25jYXQodC5lcnJvcil9OnQuaXRlbT8odC5za3VSb3dzfHwodC5za3VSb3dzPVtdKSxSKTp7Y29kZToiRVJST1IiLG1lc3NhZ2U6ImV4Y2x1ZGVCeVNjcmFwZXJFcnJvcjogbm8gaXRlbSJ9fSx0aGlzLmV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIG4uc2NyYXBlclJlc3VsdC5wdXJjaGFzYWJsZT9SOntjb2RlOiJOT1RfUFVSQ0hBU0FCTEUiLG1lc3NhZ2U6ImV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlIn19LHRoaXMuZXhjbHVkZUJ5U2t1WmVybz1mdW5jdGlvbigpe3JldHVybiBuLnNjcmFwZXJSZXN1bHQuc2t1Um93cyYmMD09PW4uc2NyYXBlclJlc3VsdC5za3VSb3dzLmxlbmd0aD97Y29kZToiTk9UX1BVUkNIQVNBQkxFIixtZXNzYWdlOiJleGNsdWRlQnlTa3VaZXJvIn06Un0sdGhpcy5leGNsdWRlQnlVcmw9ZnVuY3Rpb24oKXtpZigwPT09bi5ieVVybC5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9ZS53aW5kb3dMb2NhdGlvbkhyZWY7cmV0dXJuIG4uZXhjbHVkZShuLmJ5VXJsLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIl4iLmNvbmNhdChqKCkoeCgpKG49ZS51cmwpLmNhbGwobikpKSkudGVzdCh0KX0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1OYW1lPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtTmFtZS5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLm5hbWV8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1OYW1lLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIl4iLmNvbmNhdCh4KCkobj1lLml0ZW1OYW1lKS5jYWxsKG4pKSkudGVzdCh0KX0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1Db2RlPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtQ29kZS5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLmNvZGV8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1Db2RlLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIHgoKShuPWUuaXRlbUNvZGUpLmNhbGwobik9PT10fSl9LHRoaXMuZXhjbHVkZUJ5Q2F0ZWdvcnk9ZnVuY3Rpb24oKXtpZigwPT09bi5ieUNhdGVnb3J5Lmxlbmd0aClyZXR1cm4gUjt2YXIgdD1uLnNjcmFwZXJSZXN1bHQuaXRlbSYmbi5zY3JhcGVyUmVzdWx0Lml0ZW0uY2F0ZWdvcnl8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUNhdGVnb3J5LHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIHgoKShuPWUuY2F0ZWdvcnkpLmNhbGwobik9PT10fSl9LHRoaXMuZXhjbHVkZUJ5SXRlbURlc2NyaXB0aW9uPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtRGVzY3JpcHRpb24ubGVuZ3RoKXJldHVybiBSO3ZhciB0PW4uc2NyYXBlclJlc3VsdC5pdGVtJiZuLnNjcmFwZXJSZXN1bHQuaXRlbS5kZXNjcmlwdGlvbnx8IiI7cmV0dXJuIG4uZXhjbHVkZShuLmJ5SXRlbURlc2NyaXB0aW9uLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIiIuY29uY2F0KHgoKShuPWUudGV4dCkuY2FsbChuKSkpLnRlc3QodCl9KX0sdGhpcy5leGVjdXRlPWZ1bmN0aW9uKCl7dmFyIHQ9ITEsZT1bXSxyPW4uZXhjbHVkZUJ5U2NyYXBlckVycm9yKCk7aWYoIk5PTkUiIT09ci5jb2RlKXJldHVybntpc0V4Y2x1ZGVkOiEwLHJlYXNvbnM6W3JdfTsiTk9ORSIhPT0ocj1uLmV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlKCkpLmNvZGUmJih0PSEwLGUucHVzaChyKSk7dmFyIG8saT1DKG4uY29uZmlndXJlRXhjbHVzaW9uTWV0aG9kcyhbbi5leGNsdWRlQnlVcmwsbi5leGNsdWRlQnlJdGVtTmFtZSxuLmV4Y2x1ZGVCeUl0ZW1Db2RlLG4uZXhjbHVkZUJ5Q2F0ZWdvcnksbi5leGNsdWRlQnlJdGVtRGVzY3JpcHRpb25dKSk7dHJ5e2ZvcihpLnMoKTshKG89aS5uKCkpLmRvbmU7KXt2YXIgYT0oMCxvLnZhbHVlKSgpO2lmKCJOT05FIiE9PWEuY29kZSYmKHQ9ITAsZS5wdXNoKGEpKSwiRVJST1IiPT09YS5jb2RlKWJyZWFrfX1jYXRjaCh0KXtpLmUodCl9ZmluYWxseXtpLmYoKX1yZXR1cm57aXNFeGNsdWRlZDp0LHJlYXNvbnM6ZX19LHRoaXMuc2NyYXBlclJlc3VsdD1yLHRoaXMubG9jYXRpb249byx0aGlzLmRhdGE9aSx0aGlzLmJ5VXJsPWkuYnlVcmwsdGhpcy5ieUl0ZW1OYW1lPWkuYnlJdGVtTmFtZSx0aGlzLmJ5SXRlbUNvZGU9aS5ieUl0ZW1Db2RlLHRoaXMuYnlDYXRlZ29yeT1pLmJ5Q2F0ZWdvcnksdGhpcy5ieUl0ZW1EZXNjcmlwdGlvbj1pLmJ5SXRlbURlc2NyaXB0aW9ufXJldHVybiBFKCkoZSxbe2tleToiY29uZmlndXJlRXhjbHVzaW9uTWV0aG9kcyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSx7a2V5OiJleGNsdWRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFJ9fV0sW3trZXk6IndpbmRvd0xvY2F0aW9uSHJlZiIsZ2V0OmZ1bmN0aW9uKCl7dmFyIGUsbj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUscj13aW5kb3cubG9jYXRpb24uaHJlZjtpZihtKCkoZT1PLmRlYnVnSG9zdHMpLmNhbGwoZSxuKSl7dmFyIG89bmV3IHYuYSh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoInp6dXJsIik7aWYobyl0cnl7cj10LmZyb20obywiYmFzZTY0IikudG9TdHJpbmcoInV0Zi04Iil9Y2F0Y2godCl7QS5hLmVycm9yKHQpfX1yZXR1cm4gcn19XSksZX0oKX0pLmNhbGwodGhpcyxuKDI5NCkuQnVmZmVyKX0sZnVuY3Rpb24odCxlKXt2YXIgbjtuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e249bnx8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2godCl7Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJihuPXdpbmRvdyl9dC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKSxvPW4oNSksaT1uKDY2KTt0LmV4cG9ydHM9IXImJiFvKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eShpKCJkaXYiKSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz0vI3xcLnByb3RvdHlwZVwuLyxpPWZ1bmN0aW9uKHQsZSl7dmFyIG49c1thKHQpXTtyZXR1cm4gbj09Y3x8biE9dSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBlP3IoZSk6ISFlKX0sYT1pLm5vcm1hbGl6ZT1mdW5jdGlvbih0KXtyZXR1cm4gU3RyaW5nKHQpLnJlcGxhY2UobywiLiIpLnRvTG93ZXJDYXNlKCl9LHM9aS5kYXRhPXt9LHU9aS5OQVRJVkU9Ik4iLGM9aS5QT0xZRklMTD0iUCI7dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0KSxvPW4oMjEpLGk9big2NykuaW5kZXhPZixhPW4oNTYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLHM9byh0KSx1PTAsYz1bXTtmb3IobiBpbiBzKSFyKGEsbikmJnIocyxuKSYmYy5wdXNoKG4pO2Zvcig7ZS5sZW5ndGg+dTspcihzLG49ZVt1KytdKSYmKH5pKGMsbil8fGMucHVzaChuKSk7cmV0dXJuIGN9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2OCksbz1NYXRoLm1heCxpPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXIodCk7cmV0dXJuIG48MD9vKG4rZSwwKTppKG4sZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMik7dC5leHBvcnRzPXIoImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50Iil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1uKDYpLGk9W10uc2xpY2UsYT17fSxzPWZ1bmN0aW9uKHQsZSxuKXtpZighKGUgaW4gYSkpe2Zvcih2YXIgcj1bXSxvPTA7bzxlO28rKylyW29dPSJhWyIrbysiXSI7YVtlXT1GdW5jdGlvbigiQyxhIiwicmV0dXJuIG5ldyBDKCIrci5qb2luKCIsIikrIikiKX1yZXR1cm4gYVtlXSh0LG4pfTt0LmV4cG9ydHM9RnVuY3Rpb24uYmluZHx8ZnVuY3Rpb24odCl7dmFyIGU9cih0aGlzKSxuPWkuY2FsbChhcmd1bWVudHMsMSksYT1mdW5jdGlvbigpe3ZhciByPW4uY29uY2F0KGkuY2FsbChhcmd1bWVudHMpKTtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGE/cyhlLHIubGVuZ3RoLHIpOmUuYXBwbHkodCxyKX07cmV0dXJuIG8oZS5wcm90b3R5cGUpJiYoYS5wcm90b3R5cGU9ZS5wcm90b3R5cGUpLGF9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDUpLGk9big0NyksYT1uKDYpLHM9bigyNCksdT1uKDMzKSxjPW4oNzEpLGw9big5MyksZj1uKDcyKSxwPW4oMikoImlzQ29uY2F0U3ByZWFkYWJsZSIpLGg9IW8oZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdFtwXT0hMSx0LmNvbmNhdCgpWzBdIT09dH0pLGQ9ZigiY29uY2F0IiksZz1mdW5jdGlvbih0KXtpZighYSh0KSlyZXR1cm4hMTt2YXIgZT10W3BdO3JldHVybiB2b2lkIDAhPT1lPyEhZTppKHQpfTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWh8fCFkfSx7Y29uY2F0OmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYT1zKHRoaXMpLGY9bChhLDApLHA9MDtmb3IoZT0tMSxyPWFyZ3VtZW50cy5sZW5ndGg7ZTxyO2UrKylpZihpPS0xPT09ZT9hOmFyZ3VtZW50c1tlXSxnKGkpKXtpZihwKyhvPXUoaS5sZW5ndGgpKT45MDA3MTk5MjU0NzQwOTkxKXRocm93IFR5cGVFcnJvcigiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7Zm9yKG49MDtuPG87bisrLHArKyluIGluIGkmJmMoZixwLGlbbl0pfWVsc2V7aWYocD49OTAwNzE5OTI1NDc0MDk5MSl0aHJvdyBUeXBlRXJyb3IoIk1heGltdW0gYWxsb3dlZCBpbmRleCBleGNlZWRlZCIpO2MoZixwKyssaSl9cmV0dXJuIGYubGVuZ3RoPXAsZn19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNiksbz1uKDQ3KSxpPW4oMikoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gbyh0KSYmKCJmdW5jdGlvbiIhPXR5cGVvZihuPXQuY29uc3RydWN0b3IpfHxuIT09QXJyYXkmJiFvKG4ucHJvdG90eXBlKT9yKG4pJiZudWxsPT09KG49bltpXSkmJihuPXZvaWQgMCk6bj12b2lkIDApLG5ldyh2b2lkIDA9PT1uP0FycmF5Om4pKDA9PT1lPzA6ZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTt0LmV4cG9ydHM9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhcihmdW5jdGlvbigpe3JldHVybiFTdHJpbmcoU3ltYm9sKCkpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPW51bGwsT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyB0KSE9PXQucHJvdG90eXBlfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjcpfSxmdW5jdGlvbih0LGUsbil7bigzKSgiaXRlcmF0b3IiKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big5OSksaT1uKDQ4KSxhPW4oNzQpLHM9bigyOCksdT1uKDE3KSxjPW4oMzUpLGw9bigyKSxmPW4oMjcpLHA9bigyOSksaD1uKDEwMCksZD1oLkl0ZXJhdG9yUHJvdG90eXBlLGc9aC5CVUdHWV9TQUZBUklfSVRFUkFUT1JTLHY9bCgiaXRlcmF0b3IiKSx5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixsLGgsbSxiKXtvKG4sZSxsKTt2YXIgeCx3LGssUz1mdW5jdGlvbih0KXtpZih0PT09aCYmTylyZXR1cm4gTztpZighZyYmdCBpbiBqKXJldHVybiBqW3RdO3N3aXRjaCh0KXtjYXNlImtleXMiOmNhc2UidmFsdWVzIjpjYXNlImVudHJpZXMiOnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyl9fSxFPWUrIiBJdGVyYXRvciIsVD0hMSxqPXQucHJvdG90eXBlLEE9alt2XXx8alsiQEBpdGVyYXRvciJdfHxoJiZqW2hdLE89IWcmJkF8fFMoaCksQz0iQXJyYXkiPT1lJiZqLmVudHJpZXN8fEE7aWYoQyYmKHg9aShDLmNhbGwobmV3IHQpKSxkIT09T2JqZWN0LnByb3RvdHlwZSYmeC5uZXh0JiYoZnx8aSh4KT09PWR8fChhP2EoeCxkKToiZnVuY3Rpb24iIT10eXBlb2YgeFt2XSYmdSh4LHYseSkpLHMoeCxFLCEwLCEwKSxmJiYocFtFXT15KSkpLCJ2YWx1ZXMiPT1oJiZBJiYidmFsdWVzIiE9PUEubmFtZSYmKFQ9ITAsTz1mdW5jdGlvbigpe3JldHVybiBBLmNhbGwodGhpcyl9KSxmJiYhYnx8alt2XT09PU98fHUoaix2LE8pLHBbZV09TyxoKWlmKHc9e3ZhbHVlczpTKCJ2YWx1ZXMiKSxrZXlzOm0/TzpTKCJrZXlzIiksZW50cmllczpTKCJlbnRyaWVzIil9LGIpZm9yKGsgaW4gdykhZyYmIVQmJmsgaW4ganx8YyhqLGssd1trXSk7ZWxzZSByKHt0YXJnZXQ6ZSxwcm90bzohMCxmb3JjZWQ6Z3x8VH0sdyk7cmV0dXJuIHd9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTAwKS5JdGVyYXRvclByb3RvdHlwZSxvPW4oNDYpLGk9bigzMCksYT1uKDI4KSxzPW4oMjkpLHU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgYz1lKyIgSXRlcmF0b3IiO3JldHVybiB0LnByb3RvdHlwZT1vKHIse25leHQ6aSgxLG4pfSksYSh0LGMsITEsITApLHNbY109dSx0fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvLGksYT1uKDQ4KSxzPW4oMTcpLHU9bigxNCksYz1uKDIpLGw9bigyNyksZj1jKCJpdGVyYXRvciIpLHA9ITE7W10ua2V5cyYmKCJuZXh0ImluKGk9W10ua2V5cygpKT8obz1hKGEoaSkpKSE9PU9iamVjdC5wcm90b3R5cGUmJihyPW8pOnA9ITApLG51bGw9PXImJihyPXt9KSxsfHx1KHIsZil8fHMocixmLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSx0LmV4cG9ydHM9e0l0ZXJhdG9yUHJvdG90eXBlOnIsQlVHR1lfU0FGQVJJX0lURVJBVE9SUzpwfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIxKSxvPW4oNzcpLGk9bigyOSksYT1uKDQ5KSxzPW4oOTgpLHU9YS5zZXQsYz1hLmdldHRlckZvcigiQXJyYXkgSXRlcmF0b3IiKTt0LmV4cG9ydHM9cyhBcnJheSwiQXJyYXkiLGZ1bmN0aW9uKHQsZSl7dSh0aGlzLHt0eXBlOiJBcnJheSBJdGVyYXRvciIsdGFyZ2V0OnIodCksaW5kZXg6MCxraW5kOmV9KX0sZnVuY3Rpb24oKXt2YXIgdD1jKHRoaXMpLGU9dC50YXJnZXQsbj10LmtpbmQscj10LmluZGV4Kys7cmV0dXJuIWV8fHI+PWUubGVuZ3RoPyh0LnRhcmdldD12b2lkIDAse3ZhbHVlOnZvaWQgMCxkb25lOiEwfSk6ImtleXMiPT1uP3t2YWx1ZTpyLGRvbmU6ITF9OiJ2YWx1ZXMiPT1uP3t2YWx1ZTplW3JdLGRvbmU6ITF9Ont2YWx1ZTpbcixlW3JdXSxkb25lOiExfX0sInZhbHVlcyIpLGkuQXJndW1lbnRzPWkuQXJyYXksbygia2V5cyIpLG8oInZhbHVlcyIpLG8oImVudHJpZXMiKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE4NSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDkyKSxuKDEwNCksbigxODYpLG4oMTg4KSxuKDE4OSksbigxOTApLG4oMTkxKSxuKDk3KSxuKDE5MiksbigxOTMpLG4oMTk0KSxuKDE5NSksbigxOTYpLG4oMTk3KSxuKDE5OCksbigxOTkpLG4oMjAwKSxuKDIwMSksbigyMDIpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuU3ltYm9sfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oODgpLG89big2OSkuY29uY2F0KCJsZW5ndGgiLCJwcm90b3R5cGUiKTtlLmY9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXN8fGZ1bmN0aW9uKHQpe3JldHVybiByKHQsbyl9fSxmdW5jdGlvbih0LGUpe2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0NSksbz0iWyIrbig3OCkrIl0iLGk9UmVnRXhwKCJeIitvK28rIioiKSxhPVJlZ0V4cChvK28rIiokIikscz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49U3RyaW5nKHIoZSkpO3JldHVybiAxJnQmJihuPW4ucmVwbGFjZShpLCIiKSksMiZ0JiYobj1uLnJlcGxhY2UoYSwiIikpLG59fTt0LmV4cG9ydHM9e3N0YXJ0OnMoMSksZW5kOnMoMiksdHJpbTpzKDMpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTEpLG89big1MSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW8odCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgVHlwZUVycm9yKFN0cmluZyh0KSsiIGlzIG5vdCBpdGVyYWJsZSIpO3JldHVybiByKGUuY2FsbCh0KSl9fSxmdW5jdGlvbih0LGUsbil7bigyMjQpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuQXJyYXkuaXNBcnJheX0sZnVuY3Rpb24odCxlLG4pe24oMzQpLG4oMjI4KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLkFycmF5LmZyb219LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbyl7dHJ5e3JldHVybiBvP2UocihuKVswXSxuWzFdKTplKG4pfWNhdGNoKGUpe3ZhciBpPXQucmV0dXJuO3Rocm93IHZvaWQgMCE9PWkmJnIoaS5jYWxsKHQpKSxlfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIpLG89bigyOSksaT1yKCJpdGVyYXRvciIpLGE9QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dCYmKG8uQXJyYXk9PT10fHxhW2ldPT09dCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyKSgiaXRlcmF0b3IiKSxvPSExO3RyeXt2YXIgaT0wLGE9e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTohIWkrK319LHJldHVybjpmdW5jdGlvbigpe289ITB9fTthW3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LEFycmF5LmZyb20oYSxmdW5jdGlvbigpe3Rocm93IDJ9KX1jYXRjaCh0KXt9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoIWUmJiFvKXJldHVybiExO3ZhciBuPSExO3RyeXt2YXIgaT17fTtpW3JdPWZ1bmN0aW9uKCl7cmV0dXJue25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTpuPSEwfX19fSx0KGkpfWNhdGNoKHQpe31yZXR1cm4gbn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzMSksbz1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2xpY2U7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLnNsaWNlP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big0KSxpPW4oNzkpLGE9W10uc2xpY2Uscz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjIsbz1yP2EuY2FsbChhcmd1bWVudHMsMik6dm9pZCAwO3JldHVybiB0KHI/ZnVuY3Rpb24oKXsoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpGdW5jdGlvbihlKSkuYXBwbHkodGhpcyxvKX06ZSxuKX19O3Ioe2dsb2JhbDohMCxiaW5kOiEwLGZvcmNlZDovTVNJRSAuXC4vLnRlc3QoaSl9LHtzZXRUaW1lb3V0OnMoby5zZXRUaW1lb3V0KSxzZXRJbnRlcnZhbDpzKG8uc2V0SW50ZXJ2YWwpfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDEwNCksbigzNCksbig1MCksbigyNTQpLG4oMTIzKSxuKDI1OCk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5Qcm9taXNlfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KTt0LmV4cG9ydHM9ci5Qcm9taXNlfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzNSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIG8gaW4gZSluJiZuLnVuc2FmZSYmdFtvXT90W29dPWVbb106cih0LG8sZVtvXSxuKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBUeXBlRXJyb3IoIkluY29ycmVjdCAiKyhuP24rIiAiOiIiKSsiaW52b2NhdGlvbiIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTEpLG89bigyMiksaT1uKDIpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG4sYT1yKHQpLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT1hfHxudWxsPT0obj1yKGEpW2ldKT9lOm8obil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGE9big0KSxzPW4oNSksdT1uKDI2KSxjPW4oMzEpLGw9big5MCksZj1uKDY2KSxwPWEubG9jYXRpb24saD1hLnNldEltbWVkaWF0ZSxkPWEuY2xlYXJJbW1lZGlhdGUsZz1hLnByb2Nlc3Msdj1hLk1lc3NhZ2VDaGFubmVsLHk9YS5EaXNwYXRjaCxtPTAsYj17fSx4PWZ1bmN0aW9uKHQpe2lmKGIuaGFzT3duUHJvcGVydHkodCkpe3ZhciBlPWJbdF07ZGVsZXRlIGJbdF0sZSgpfX0sdz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt4KHQpfX0saz1mdW5jdGlvbih0KXt4KHQuZGF0YSl9LFM9ZnVuY3Rpb24odCl7YS5wb3N0TWVzc2FnZSh0KyIiLHAucHJvdG9jb2wrIi8vIitwLmhvc3QpfTtoJiZkfHwoaD1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0xO2FyZ3VtZW50cy5sZW5ndGg+bjspZS5wdXNoKGFyZ3VtZW50c1tuKytdKTtyZXR1cm4gYlsrK21dPWZ1bmN0aW9uKCl7KCJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RnVuY3Rpb24odCkpLmFwcGx5KHZvaWQgMCxlKX0scihtKSxtfSxkPWZ1bmN0aW9uKHQpe2RlbGV0ZSBiW3RdfSwicHJvY2VzcyI9PXUoZyk/cj1mdW5jdGlvbih0KXtnLm5leHRUaWNrKHcodCkpfTp5JiZ5Lm5vdz9yPWZ1bmN0aW9uKHQpe3kubm93KHcodCkpfTp2PyhpPShvPW5ldyB2KS5wb3J0MixvLnBvcnQxLm9ubWVzc2FnZT1rLHI9YyhpLnBvc3RNZXNzYWdlLGksMSkpOiFhLmFkZEV2ZW50TGlzdGVuZXJ8fCJmdW5jdGlvbiIhPXR5cGVvZiBwb3N0TWVzc2FnZXx8YS5pbXBvcnRTY3JpcHRzfHxzKFMpP3I9Im9ucmVhZHlzdGF0ZWNoYW5nZSJpbiBmKCJzY3JpcHQiKT9mdW5jdGlvbih0KXtsLmFwcGVuZENoaWxkKGYoInNjcmlwdCIpKS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtsLnJlbW92ZUNoaWxkKHRoaXMpLHgodCl9fTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHcodCksMCl9OihyPVMsYS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixrLCExKSkpLHQuZXhwb3J0cz17c2V0OmgsY2xlYXI6ZH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxvPW4oNiksaT1uKDUyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihyKHQpLG8oZSkmJmUuY29uc3RydWN0b3I9PT10KXJldHVybiBlO3ZhciBuPWkuZih0KTtyZXR1cm4oMCxuLnJlc29sdmUpKGUpLG4ucHJvbWlzZX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMjIpLGk9big1MiksYT1uKDYwKSxzPW4oNTkpO3Ioe3RhcmdldDoiUHJvbWlzZSIsc3RhdDohMH0se2FsbFNldHRsZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWkuZihlKSxyPW4ucmVzb2x2ZSx1PW4ucmVqZWN0LGM9YShmdW5jdGlvbigpe3ZhciBuPW8oZS5yZXNvbHZlKSxpPVtdLGE9MCx1PTE7cyh0LGZ1bmN0aW9uKHQpe3ZhciBvPWErKyxzPSExO2kucHVzaCh2b2lkIDApLHUrKyxuLmNhbGwoZSx0KS50aGVuKGZ1bmN0aW9uKHQpe3N8fChzPSEwLGlbb109e3N0YXR1czoiZnVsZmlsbGVkIix2YWx1ZTp0fSwtLXV8fHIoaSkpfSxmdW5jdGlvbih0KXtzfHwocz0hMCxpW29dPXtzdGF0dXM6InJlamVjdGVkIixyZWFzb246dH0sLS11fHxyKGkpKX0pfSksLS11fHxyKGkpfSk7cmV0dXJuIGMuZXJyb3ImJnUoYy52YWx1ZSksbi5wcm9taXNlfX0pfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI3Nyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1NCksbz1uKDE1OCksaT1uKDE2Mik7ZnVuY3Rpb24gYShlLG4scyl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBSZWZsZWN0JiZvP3QuZXhwb3J0cz1hPW86dC5leHBvcnRzPWE9ZnVuY3Rpb24odCxlLG4pe3ZhciBvPWkodCxlKTtpZihvKXt2YXIgYT1yKG8sZSk7cmV0dXJuIGEuZ2V0P2EuZ2V0LmNhbGwobik6YS52YWx1ZX19LGEoZSxuLHN8fGUpfXQuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjM2KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByOwovKiEKICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My40LjEKICogaHR0cHM6Ly9qcXVlcnkuY29tLwogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vCiAqCiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIERhdGU6IDIwMTktMDUtMDFUMjE6MDRaCiAqLwovKiEKICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My40LjEKICogaHR0cHM6Ly9qcXVlcnkuY29tLwogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vCiAqCiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIERhdGU6IDIwMTktMDUtMDFUMjE6MDRaCiAqLwohZnVuY3Rpb24oZSxuKXsidXNlIHN0cmljdCI7Im9iamVjdCI9PXR5cGVvZiB0LmV4cG9ydHM/dC5leHBvcnRzPWUuZG9jdW1lbnQ/bihlLCEwKTpmdW5jdGlvbih0KXtpZighdC5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gbih0KX06bihlKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24obixvKXsidXNlIHN0cmljdCI7dmFyIGk9W10sYT1uLmRvY3VtZW50LHM9T2JqZWN0LmdldFByb3RvdHlwZU9mLHU9aS5zbGljZSxjPWkuY29uY2F0LGw9aS5wdXNoLGY9aS5pbmRleE9mLHA9e30saD1wLnRvU3RyaW5nLGQ9cC5oYXNPd25Qcm9wZXJ0eSxnPWQudG9TdHJpbmcsdj1nLmNhbGwoT2JqZWN0KSx5PXt9LG09ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJiJudW1iZXIiIT10eXBlb2YgdC5ub2RlVHlwZX0sYj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmdD09PXQud2luZG93fSx4PXt0eXBlOiEwLHNyYzohMCxub25jZTohMCxub01vZHVsZTohMH07ZnVuY3Rpb24gdyh0LGUsbil7dmFyIHIsbyxpPShuPW58fGEpLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2lmKGkudGV4dD10LGUpZm9yKHIgaW4geCkobz1lW3JdfHxlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUocikpJiZpLnNldEF0dHJpYnV0ZShyLG8pO24uaGVhZC5hcHBlbmRDaGlsZChpKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGkpfWZ1bmN0aW9uIGsodCl7cmV0dXJuIG51bGw9PXQ/dCsiIjoib2JqZWN0Ij09dHlwZW9mIHR8fCJmdW5jdGlvbiI9PXR5cGVvZiB0P3BbaC5jYWxsKHQpXXx8Im9iamVjdCI6dHlwZW9mIHR9dmFyIFM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IFMuZm4uaW5pdCh0LGUpfSxFPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZztmdW5jdGlvbiBUKHQpe3ZhciBlPSEhdCYmImxlbmd0aCJpbiB0JiZ0Lmxlbmd0aCxuPWsodCk7cmV0dXJuIW0odCkmJiFiKHQpJiYoImFycmF5Ij09PW58fDA9PT1lfHwibnVtYmVyIj09dHlwZW9mIGUmJmU+MCYmZS0xIGluIHQpfVMuZm49Uy5wcm90b3R5cGU9e2pxdWVyeToiMy40LjEiLGNvbnN0cnVjdG9yOlMsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiB1LmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD91LmNhbGwodGhpcyk6dDwwP3RoaXNbdCt0aGlzLmxlbmd0aF06dGhpc1t0XX0scHVzaFN0YWNrOmZ1bmN0aW9uKHQpe3ZhciBlPVMubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLHQpO3JldHVybiBlLnByZXZPYmplY3Q9dGhpcyxlfSxlYWNoOmZ1bmN0aW9uKHQpe3JldHVybiBTLmVhY2godGhpcyx0KX0sbWFwOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhTLm1hcCh0aGlzLGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuY2FsbChlLG4sZSl9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sZW5ndGgsbj0rdCsodDwwP2U6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4+PTAmJm48ZT9bdGhpc1tuXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6bCxzb3J0Omkuc29ydCxzcGxpY2U6aS5zcGxpY2V9LFMuZXh0ZW5kPVMuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHIsbyxpLGE9YXJndW1lbnRzWzBdfHx7fSxzPTEsdT1hcmd1bWVudHMubGVuZ3RoLGM9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGEmJihjPWEsYT1hcmd1bWVudHNbc118fHt9LHMrKyksIm9iamVjdCI9PXR5cGVvZiBhfHxtKGEpfHwoYT17fSkscz09PXUmJihhPXRoaXMscy0tKTtzPHU7cysrKWlmKG51bGwhPSh0PWFyZ3VtZW50c1tzXSkpZm9yKGUgaW4gdClyPXRbZV0sIl9fcHJvdG9fXyIhPT1lJiZhIT09ciYmKGMmJnImJihTLmlzUGxhaW5PYmplY3Qocil8fChvPUFycmF5LmlzQXJyYXkocikpKT8obj1hW2VdLGk9byYmIUFycmF5LmlzQXJyYXkobik/W106b3x8Uy5pc1BsYWluT2JqZWN0KG4pP246e30sbz0hMSxhW2VdPVMuZXh0ZW5kKGMsaSxyKSk6dm9pZCAwIT09ciYmKGFbZV09cikpO3JldHVybiBhfSxTLmV4dGVuZCh7ZXhwYW5kbzoialF1ZXJ5IisoIjMuNC4xIitNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcih0KX0sbm9vcDpmdW5jdGlvbigpe30saXNQbGFpbk9iamVjdDpmdW5jdGlvbih0KXt2YXIgZSxuO3JldHVybiEoIXR8fCJbb2JqZWN0IE9iamVjdF0iIT09aC5jYWxsKHQpKSYmKCEoZT1zKHQpKXx8ImZ1bmN0aW9uIj09dHlwZW9mKG49ZC5jYWxsKGUsImNvbnN0cnVjdG9yIikmJmUuY29uc3RydWN0b3IpJiZnLmNhbGwobik9PT12KX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbih0KXt2YXIgZTtmb3IoZSBpbiB0KXJldHVybiExO3JldHVybiEwfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKHQsZSl7dyh0LHtub25jZTplJiZlLm5vbmNlfSl9LGVhY2g6ZnVuY3Rpb24odCxlKXt2YXIgbixyPTA7aWYoVCh0KSlmb3Iobj10Lmxlbmd0aDtyPG4mJiExIT09ZS5jYWxsKHRbcl0scix0W3JdKTtyKyspO2Vsc2UgZm9yKHIgaW4gdClpZighMT09PWUuY2FsbCh0W3JdLHIsdFtyXSkpYnJlYWs7cmV0dXJuIHR9LHRyaW06ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/IiI6KHQrIiIpLnJlcGxhY2UoRSwiIil9LG1ha2VBcnJheTpmdW5jdGlvbih0LGUpe3ZhciBuPWV8fFtdO3JldHVybiBudWxsIT10JiYoVChPYmplY3QodCkpP1MubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIHQ/W3RdOnQpOmwuY2FsbChuLHQpKSxufSxpbkFycmF5OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbD09ZT8tMTpmLmNhbGwoZSx0LG4pfSxtZXJnZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0rZS5sZW5ndGgscj0wLG89dC5sZW5ndGg7cjxuO3IrKyl0W28rK109ZVtyXTtyZXR1cm4gdC5sZW5ndGg9byx0fSxncmVwOmZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9W10sbz0wLGk9dC5sZW5ndGgsYT0hbjtvPGk7bysrKSFlKHRbb10sbykhPT1hJiZyLnB1c2godFtvXSk7cmV0dXJuIHJ9LG1hcDpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpPTAsYT1bXTtpZihUKHQpKWZvcihyPXQubGVuZ3RoO2k8cjtpKyspbnVsbCE9KG89ZSh0W2ldLGksbikpJiZhLnB1c2gobyk7ZWxzZSBmb3IoaSBpbiB0KW51bGwhPShvPWUodFtpXSxpLG4pKSYmYS5wdXNoKG8pO3JldHVybiBjLmFwcGx5KFtdLGEpfSxndWlkOjEsc3VwcG9ydDp5fSksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKFMuZm5bU3ltYm9sLml0ZXJhdG9yXT1pW1N5bWJvbC5pdGVyYXRvcl0pLFMuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24odCxlKXtwWyJbb2JqZWN0ICIrZSsiXSJdPWUudG9Mb3dlckNhc2UoKX0pO3ZhciBqPQovKiEKICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMy40CiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pzLmZvdW5kYXRpb24vCiAqCiAqIERhdGU6IDIwMTktMDQtMDgKICovCmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYSxzLHUsYyxsLGYscCxoLGQsZyx2LHksbSxiLHg9InNpenpsZSIrMSpuZXcgRGF0ZSx3PXQuZG9jdW1lbnQsaz0wLFM9MCxFPXV0KCksVD11dCgpLGo9dXQoKSxBPXV0KCksTz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZSYmKGY9ITApLDB9LEM9e30uaGFzT3duUHJvcGVydHksTD1bXSxSPUwucG9wLFA9TC5wdXNoLE49TC5wdXNoLEk9TC5zbGljZSxEPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKWlmKHRbbl09PT1lKXJldHVybiBuO3JldHVybi0xfSxfPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTT0iW1xceDIwXFx0XFxyXFxuXFxmXSIsVT0iKD86XFxcXC58W1xcdy1dfFteXDAtXFx4YTBdKSsiLEI9IlxcWyIrTSsiKigiK1UrIikoPzoiK00rIiooWypeJHwhfl0/PSkiK00rIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitVKyIpKXwpIitNKyIqXFxdIixxPSI6KCIrVSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrQisiKSopfC4qKVxcKXwpIixGPW5ldyBSZWdFeHAoTSsiKyIsImciKSxIPW5ldyBSZWdFeHAoIl4iK00rIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTSsiKyQiLCJnIiksej1uZXcgUmVnRXhwKCJeIitNKyIqLCIrTSsiKiIpLFc9bmV3IFJlZ0V4cCgiXiIrTSsiKihbPit+XXwiK00rIikiK00rIioiKSwkPW5ldyBSZWdFeHAoTSsifD4iKSxZPW5ldyBSZWdFeHAocSksVj1uZXcgUmVnRXhwKCJeIitVKyIkIiksRz17SUQ6bmV3IFJlZ0V4cCgiXiMoIitVKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK1UrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK1UrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitCKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrcSksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitNKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitNKyIqKD86KFsrLV18KSIrTSsiKihcXGQrKXwpKSIrTSsiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrXysiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK00rIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrTSsiKigoPzotXFxkKT9cXGQqKSIrTSsiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sSz0vSFRNTCQvaSxYPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksSj0vXmhcZCQvaSxRPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxaPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sdHQ9L1srfl0vLGV0PW5ldyBSZWdFeHAoIlxcXFwoW1xcZGEtZl17MSw2fSIrTSsiP3woIitNKyIpfC4pIiwiaWciKSxudD1mdW5jdGlvbih0LGUsbil7dmFyIHI9IjB4IitlLTY1NTM2O3JldHVybiByIT1yfHxuP2U6cjwwP1N0cmluZy5mcm9tQ2hhckNvZGUocis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShyPj4xMHw1NTI5NiwxMDIzJnJ8NTYzMjApfSxydD0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxvdD1mdW5jdGlvbih0LGUpe3JldHVybiBlPyJcMCI9PT10PyLvv70iOnQuc2xpY2UoMCwtMSkrIlxcIit0LmNoYXJDb2RlQXQodC5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK3R9LGl0PWZ1bmN0aW9uKCl7cCgpfSxhdD14dChmdW5jdGlvbih0KXtyZXR1cm4hMD09PXQuZGlzYWJsZWQmJiJmaWVsZHNldCI9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTt0cnl7Ti5hcHBseShMPUkuY2FsbCh3LmNoaWxkTm9kZXMpLHcuY2hpbGROb2RlcyksTFt3LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaCh0KXtOPXthcHBseTpMLmxlbmd0aD9mdW5jdGlvbih0LGUpe1AuYXBwbHkodCxJLmNhbGwoZSkpfTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aCxyPTA7dFtuKytdPWVbcisrXTspO3QubGVuZ3RoPW4tMX19fWZ1bmN0aW9uIHN0KHQsZSxyLG8pe3ZhciBpLHMsYyxsLGYsZCx5LG09ZSYmZS5vd25lckRvY3VtZW50LGs9ZT9lLm5vZGVUeXBlOjk7aWYocj1yfHxbXSwic3RyaW5nIiE9dHlwZW9mIHR8fCF0fHwxIT09ayYmOSE9PWsmJjExIT09aylyZXR1cm4gcjtpZighbyYmKChlP2Uub3duZXJEb2N1bWVudHx8ZTp3KSE9PWgmJnAoZSksZT1lfHxoLGcpKXtpZigxMSE9PWsmJihmPVouZXhlYyh0KSkpaWYoaT1mWzFdKXtpZig5PT09ayl7aWYoIShjPWUuZ2V0RWxlbWVudEJ5SWQoaSkpKXJldHVybiByO2lmKGMuaWQ9PT1pKXJldHVybiByLnB1c2goYykscn1lbHNlIGlmKG0mJihjPW0uZ2V0RWxlbWVudEJ5SWQoaSkpJiZiKGUsYykmJmMuaWQ9PT1pKXJldHVybiByLnB1c2goYykscn1lbHNle2lmKGZbMl0pcmV0dXJuIE4uYXBwbHkocixlLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpKSxyO2lmKChpPWZbM10pJiZuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gTi5hcHBseShyLGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShpKSkscn1pZihuLnFzYSYmIUFbdCsiICJdJiYoIXZ8fCF2LnRlc3QodCkpJiYoMSE9PWt8fCJvYmplY3QiIT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSl7aWYoeT10LG09ZSwxPT09ayYmJC50ZXN0KHQpKXtmb3IoKGw9ZS5nZXRBdHRyaWJ1dGUoImlkIikpP2w9bC5yZXBsYWNlKHJ0LG90KTplLnNldEF0dHJpYnV0ZSgiaWQiLGw9eCkscz0oZD1hKHQpKS5sZW5ndGg7cy0tOylkW3NdPSIjIitsKyIgIitidChkW3NdKTt5PWQuam9pbigiLCIpLG09dHQudGVzdCh0KSYmeXQoZS5wYXJlbnROb2RlKXx8ZX10cnl7cmV0dXJuIE4uYXBwbHkocixtLnF1ZXJ5U2VsZWN0b3JBbGwoeSkpLHJ9Y2F0Y2goZSl7QSh0LCEwKX1maW5hbGx5e2w9PT14JiZlLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiB1KHQucmVwbGFjZShILCIkMSIpLGUscixvKX1mdW5jdGlvbiB1dCgpe3ZhciB0PVtdO3JldHVybiBmdW5jdGlvbiBlKG4sbyl7cmV0dXJuIHQucHVzaChuKyIgIik+ci5jYWNoZUxlbmd0aCYmZGVsZXRlIGVbdC5zaGlmdCgpXSxlW24rIiAiXT1vfX1mdW5jdGlvbiBjdCh0KXtyZXR1cm4gdFt4XT0hMCx0fWZ1bmN0aW9uIGx0KHQpe3ZhciBlPWguY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTt0cnl7cmV0dXJuISF0KGUpfWNhdGNoKHQpe3JldHVybiExfWZpbmFsbHl7ZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSksZT1udWxsfX1mdW5jdGlvbiBmdCh0LGUpe2Zvcih2YXIgbj10LnNwbGl0KCJ8Iiksbz1uLmxlbmd0aDtvLS07KXIuYXR0ckhhbmRsZVtuW29dXT1lfWZ1bmN0aW9uIHB0KHQsZSl7dmFyIG49ZSYmdCxyPW4mJjE9PT10Lm5vZGVUeXBlJiYxPT09ZS5ub2RlVHlwZSYmdC5zb3VyY2VJbmRleC1lLnNvdXJjZUluZGV4O2lmKHIpcmV0dXJuIHI7aWYobilmb3IoO249bi5uZXh0U2libGluZzspaWYobj09PWUpcmV0dXJuLTE7cmV0dXJuIHQ/MTotMX1mdW5jdGlvbiBodCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmZS50eXBlPT09dH19ZnVuY3Rpb24gZHQodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PW58fCJidXR0b24iPT09bikmJmUudHlwZT09PXR9fWZ1bmN0aW9uIGd0KHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iZm9ybSJpbiBlP2UucGFyZW50Tm9kZSYmITE9PT1lLmRpc2FibGVkPyJsYWJlbCJpbiBlPyJsYWJlbCJpbiBlLnBhcmVudE5vZGU/ZS5wYXJlbnROb2RlLmRpc2FibGVkPT09dDplLmRpc2FibGVkPT09dDplLmlzRGlzYWJsZWQ9PT10fHxlLmlzRGlzYWJsZWQhPT0hdCYmYXQoZSk9PT10OmUuZGlzYWJsZWQ9PT10OiJsYWJlbCJpbiBlJiZlLmRpc2FibGVkPT09dH19ZnVuY3Rpb24gdnQodCl7cmV0dXJuIGN0KGZ1bmN0aW9uKGUpe3JldHVybiBlPStlLGN0KGZ1bmN0aW9uKG4scil7Zm9yKHZhciBvLGk9dChbXSxuLmxlbmd0aCxlKSxhPWkubGVuZ3RoO2EtLTspbltvPWlbYV1dJiYobltvXT0hKHJbb109bltvXSkpfSl9KX1mdW5jdGlvbiB5dCh0KXtyZXR1cm4gdCYmdm9pZCAwIT09dC5nZXRFbGVtZW50c0J5VGFnTmFtZSYmdH1mb3IoZSBpbiBuPXN0LnN1cHBvcnQ9e30saT1zdC5pc1hNTD1mdW5jdGlvbih0KXt2YXIgZT10Lm5hbWVzcGFjZVVSSSxuPSh0Lm93bmVyRG9jdW1lbnR8fHQpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4hSy50ZXN0KGV8fG4mJm4ubm9kZU5hbWV8fCJIVE1MIil9LHA9c3Quc2V0RG9jdW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGUsbyxhPXQ/dC5vd25lckRvY3VtZW50fHx0Onc7cmV0dXJuIGEhPT1oJiY5PT09YS5ub2RlVHlwZSYmYS5kb2N1bWVudEVsZW1lbnQ/KGQ9KGg9YSkuZG9jdW1lbnRFbGVtZW50LGc9IWkoaCksdyE9PWgmJihvPWguZGVmYXVsdFZpZXcpJiZvLnRvcCE9PW8mJihvLmFkZEV2ZW50TGlzdGVuZXI/by5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGl0LCExKTpvLmF0dGFjaEV2ZW50JiZvLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsaXQpKSxuLmF0dHJpYnV0ZXM9bHQoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NOYW1lPSJpIiwhdC5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksbi5nZXRFbGVtZW50c0J5VGFnTmFtZT1sdChmdW5jdGlvbih0KXtyZXR1cm4gdC5hcHBlbmRDaGlsZChoLmNyZWF0ZUNvbW1lbnQoIiIpKSwhdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1RLnRlc3QoaC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxuLmdldEJ5SWQ9bHQoZnVuY3Rpb24odCl7cmV0dXJuIGQuYXBwZW5kQ2hpbGQodCkuaWQ9eCwhaC5nZXRFbGVtZW50c0J5TmFtZXx8IWguZ2V0RWxlbWVudHNCeU5hbWUoeCkubGVuZ3RofSksbi5nZXRCeUlkPyhyLmZpbHRlci5JRD1mdW5jdGlvbih0KXt2YXIgZT10LnJlcGxhY2UoZXQsbnQpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoImlkIik9PT1lfX0sci5maW5kLklEPWZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09ZS5nZXRFbGVtZW50QnlJZCYmZyl7dmFyIG49ZS5nZXRFbGVtZW50QnlJZCh0KTtyZXR1cm4gbj9bbl06W119fSk6KHIuZmlsdGVyLklEPWZ1bmN0aW9uKHQpe3ZhciBlPXQucmVwbGFjZShldCxudCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXZvaWQgMCE9PXQuZ2V0QXR0cmlidXRlTm9kZSYmdC5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBuJiZuLnZhbHVlPT09ZX19LHIuZmluZC5JRD1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PWUuZ2V0RWxlbWVudEJ5SWQmJmcpe3ZhciBuLHIsbyxpPWUuZ2V0RWxlbWVudEJ5SWQodCk7aWYoaSl7aWYoKG49aS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PXQpcmV0dXJuW2ldO2ZvcihvPWUuZ2V0RWxlbWVudHNCeU5hbWUodCkscj0wO2k9b1tyKytdOylpZigobj1pLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09dClyZXR1cm5baV19cmV0dXJuW119fSksci5maW5kLlRBRz1uLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWUuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KTpuLnFzYT9lLnF1ZXJ5U2VsZWN0b3JBbGwodCk6dm9pZCAwfTpmdW5jdGlvbih0LGUpe3ZhciBuLHI9W10sbz0wLGk9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KTtpZigiKiI9PT10KXtmb3IoO249aVtvKytdOykxPT09bi5ub2RlVHlwZSYmci5wdXNoKG4pO3JldHVybiByfXJldHVybiBpfSxyLmZpbmQuQ0xBU1M9bi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PWUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZylyZXR1cm4gZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHQpfSx5PVtdLHY9W10sKG4ucXNhPVEudGVzdChoLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKGx0KGZ1bmN0aW9uKHQpe2QuYXBwZW5kQ2hpbGQodCkuaW5uZXJIVE1MPSI8YSBpZD0nIit4KyInPjwvYT48c2VsZWN0IGlkPSciK3grIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsdC5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmdi5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLHQucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8di5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK18rIikiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49Iit4KyItXSIpLmxlbmd0aHx8di5wdXNoKCJ+PSIpLHQucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHYucHVzaCgiOmNoZWNrZWQiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoImEjIit4KyIrKiIpLmxlbmd0aHx8di5wdXNoKCIuIy4rWyt+XSIpfSksbHQoZnVuY3Rpb24odCl7dC5pbm5lckhUTUw9IjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7dmFyIGU9aC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Uuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksdC5hcHBlbmRDaGlsZChlKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmdi5wdXNoKCJuYW1lIitNKyIqWypeJHwhfl0/PSIpLDIhPT10LnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksZC5hcHBlbmRDaGlsZCh0KS5kaXNhYmxlZD0hMCwyIT09dC5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGgmJnYucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSx2LnB1c2goIiwuKjoiKX0pKSwobi5tYXRjaGVzU2VsZWN0b3I9US50ZXN0KG09ZC5tYXRjaGVzfHxkLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8ZC5tb3pNYXRjaGVzU2VsZWN0b3J8fGQub01hdGNoZXNTZWxlY3Rvcnx8ZC5tc01hdGNoZXNTZWxlY3RvcikpJiZsdChmdW5jdGlvbih0KXtuLmRpc2Nvbm5lY3RlZE1hdGNoPW0uY2FsbCh0LCIqIiksbS5jYWxsKHQsIltzIT0nJ106eCIpLHkucHVzaCgiIT0iLHEpfSksdj12Lmxlbmd0aCYmbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSkseT15Lmxlbmd0aCYmbmV3IFJlZ0V4cCh5LmpvaW4oInwiKSksZT1RLnRlc3QoZC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiksYj1lfHxRLnRlc3QoZC5jb250YWlucyk/ZnVuY3Rpb24odCxlKXt2YXIgbj05PT09dC5ub2RlVHlwZT90LmRvY3VtZW50RWxlbWVudDp0LHI9ZSYmZS5wYXJlbnROb2RlO3JldHVybiB0PT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24odCxlKXtpZihlKWZvcig7ZT1lLnBhcmVudE5vZGU7KWlmKGU9PT10KXJldHVybiEwO3JldHVybiExfSxPPWU/ZnVuY3Rpb24odCxlKXtpZih0PT09ZSlyZXR1cm4gZj0hMCwwO3ZhciByPSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiByfHwoMSYocj0odC5vd25lckRvY3VtZW50fHx0KT09PShlLm93bmVyRG9jdW1lbnR8fGUpP3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZSk6MSl8fCFuLnNvcnREZXRhY2hlZCYmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KT09PXI/dD09PWh8fHQub3duZXJEb2N1bWVudD09PXcmJmIodyx0KT8tMTplPT09aHx8ZS5vd25lckRvY3VtZW50PT09dyYmYih3LGUpPzE6bD9EKGwsdCktRChsLGUpOjA6NCZyPy0xOjEpfTpmdW5jdGlvbih0LGUpe2lmKHQ9PT1lKXJldHVybiBmPSEwLDA7dmFyIG4scj0wLG89dC5wYXJlbnROb2RlLGk9ZS5wYXJlbnROb2RlLGE9W3RdLHM9W2VdO2lmKCFvfHwhaSlyZXR1cm4gdD09PWg/LTE6ZT09PWg/MTpvPy0xOmk/MTpsP0QobCx0KS1EKGwsZSk6MDtpZihvPT09aSlyZXR1cm4gcHQodCxlKTtmb3Iobj10O249bi5wYXJlbnROb2RlOylhLnVuc2hpZnQobik7Zm9yKG49ZTtuPW4ucGFyZW50Tm9kZTspcy51bnNoaWZ0KG4pO2Zvcig7YVtyXT09PXNbcl07KXIrKztyZXR1cm4gcj9wdChhW3JdLHNbcl0pOmFbcl09PT13Py0xOnNbcl09PT13PzE6MH0saCk6aH0sc3QubWF0Y2hlcz1mdW5jdGlvbih0LGUpe3JldHVybiBzdCh0LG51bGwsbnVsbCxlKX0sc3QubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKHQsZSl7aWYoKHQub3duZXJEb2N1bWVudHx8dCkhPT1oJiZwKHQpLG4ubWF0Y2hlc1NlbGVjdG9yJiZnJiYhQVtlKyIgIl0mJigheXx8IXkudGVzdChlKSkmJighdnx8IXYudGVzdChlKSkpdHJ5e3ZhciByPW0uY2FsbCh0LGUpO2lmKHJ8fG4uZGlzY29ubmVjdGVkTWF0Y2h8fHQuZG9jdW1lbnQmJjExIT09dC5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gcn1jYXRjaCh0KXtBKGUsITApfXJldHVybiBzdChlLGgsbnVsbCxbdF0pLmxlbmd0aD4wfSxzdC5jb250YWlucz1mdW5jdGlvbih0LGUpe3JldHVybih0Lm93bmVyRG9jdW1lbnR8fHQpIT09aCYmcCh0KSxiKHQsZSl9LHN0LmF0dHI9ZnVuY3Rpb24odCxlKXsodC5vd25lckRvY3VtZW50fHx0KSE9PWgmJnAodCk7dmFyIG89ci5hdHRySGFuZGxlW2UudG9Mb3dlckNhc2UoKV0saT1vJiZDLmNhbGwoci5hdHRySGFuZGxlLGUudG9Mb3dlckNhc2UoKSk/byh0LGUsIWcpOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09aT9pOm4uYXR0cmlidXRlc3x8IWc/dC5nZXRBdHRyaWJ1dGUoZSk6KGk9dC5nZXRBdHRyaWJ1dGVOb2RlKGUpKSYmaS5zcGVjaWZpZWQ/aS52YWx1ZTpudWxsfSxzdC5lc2NhcGU9ZnVuY3Rpb24odCl7cmV0dXJuKHQrIiIpLnJlcGxhY2UocnQsb3QpfSxzdC5lcnJvcj1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrdCl9LHN0LnVuaXF1ZVNvcnQ9ZnVuY3Rpb24odCl7dmFyIGUscj1bXSxvPTAsaT0wO2lmKGY9IW4uZGV0ZWN0RHVwbGljYXRlcyxsPSFuLnNvcnRTdGFibGUmJnQuc2xpY2UoMCksdC5zb3J0KE8pLGYpe2Zvcig7ZT10W2krK107KWU9PT10W2ldJiYobz1yLnB1c2goaSkpO2Zvcig7by0tOyl0LnNwbGljZShyW29dLDEpfXJldHVybiBsPW51bGwsdH0sbz1zdC5nZXRUZXh0PWZ1bmN0aW9uKHQpe3ZhciBlLG49IiIscj0wLGk9dC5ub2RlVHlwZTtpZihpKXtpZigxPT09aXx8OT09PWl8fDExPT09aSl7aWYoInN0cmluZyI9PXR5cGVvZiB0LnRleHRDb250ZW50KXJldHVybiB0LnRleHRDb250ZW50O2Zvcih0PXQuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZyluKz1vKHQpfWVsc2UgaWYoMz09PWl8fDQ9PT1pKXJldHVybiB0Lm5vZGVWYWx1ZX1lbHNlIGZvcig7ZT10W3IrK107KW4rPW8oZSk7cmV0dXJuIG59LChyPXN0LnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmN0LG1hdGNoOkcsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKHQpe3JldHVybiB0WzFdPXRbMV0ucmVwbGFjZShldCxudCksdFszXT0odFszXXx8dFs0XXx8dFs1XXx8IiIpLnJlcGxhY2UoZXQsbnQpLCJ+PSI9PT10WzJdJiYodFszXT0iICIrdFszXSsiICIpLHQuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRbMV09dFsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09dFsxXS5zbGljZSgwLDMpPyh0WzNdfHxzdC5lcnJvcih0WzBdKSx0WzRdPSsodFs0XT90WzVdKyh0WzZdfHwxKToyKigiZXZlbiI9PT10WzNdfHwib2RkIj09PXRbM10pKSx0WzVdPSsodFs3XSt0WzhdfHwib2RkIj09PXRbM10pKTp0WzNdJiZzdC5lcnJvcih0WzBdKSx0fSxQU0VVRE86ZnVuY3Rpb24odCl7dmFyIGUsbj0hdFs2XSYmdFsyXTtyZXR1cm4gRy5DSElMRC50ZXN0KHRbMF0pP251bGw6KHRbM10/dFsyXT10WzRdfHx0WzVdfHwiIjpuJiZZLnRlc3QobikmJihlPWEobiwhMCkpJiYoZT1uLmluZGV4T2YoIikiLG4ubGVuZ3RoLWUpLW4ubGVuZ3RoKSYmKHRbMF09dFswXS5zbGljZSgwLGUpLHRbMl09bi5zbGljZSgwLGUpKSx0LnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKGV0LG50KS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PXQ/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24odCl7cmV0dXJuIHQubm9kZU5hbWUmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWV9fSxDTEFTUzpmdW5jdGlvbih0KXt2YXIgZT1FW3QrIiAiXTtyZXR1cm4gZXx8KGU9bmV3IFJlZ0V4cCgiKF58IitNKyIpIit0KyIoIitNKyJ8JCkiKSkmJkUodCxmdW5jdGlvbih0KXtyZXR1cm4gZS50ZXN0KCJzdHJpbmciPT10eXBlb2YgdC5jbGFzc05hbWUmJnQuY2xhc3NOYW1lfHx2b2lkIDAhPT10LmdldEF0dHJpYnV0ZSYmdC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIG89c3QuYXR0cihyLHQpO3JldHVybiBudWxsPT1vPyIhPSI9PT1lOiFlfHwobys9IiIsIj0iPT09ZT9vPT09bjoiIT0iPT09ZT9vIT09bjoiXj0iPT09ZT9uJiYwPT09by5pbmRleE9mKG4pOiIqPSI9PT1lP24mJm8uaW5kZXhPZihuKT4tMToiJD0iPT09ZT9uJiZvLnNsaWNlKC1uLmxlbmd0aCk9PT1uOiJ+PSI9PT1lPygiICIrby5yZXBsYWNlKEYsIiAiKSsiICIpLmluZGV4T2Yobik+LTE6Inw9Ij09PWUmJihvPT09bnx8by5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bisiLSIpKX19LENISUxEOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGk9Im50aCIhPT10LnNsaWNlKDAsMyksYT0ibGFzdCIhPT10LnNsaWNlKC00KSxzPSJvZi10eXBlIj09PWU7cmV0dXJuIDE9PT1yJiYwPT09bz9mdW5jdGlvbih0KXtyZXR1cm4hIXQucGFyZW50Tm9kZX06ZnVuY3Rpb24oZSxuLHUpe3ZhciBjLGwsZixwLGgsZCxnPWkhPT1hPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIsdj1lLnBhcmVudE5vZGUseT1zJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbT0hdSYmIXMsYj0hMTtpZih2KXtpZihpKXtmb3IoO2c7KXtmb3IocD1lO3A9cFtnXTspaWYocz9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT15OjE9PT1wLm5vZGVUeXBlKXJldHVybiExO2Q9Zz0ib25seSI9PT10JiYhZCYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihkPVthP3YuZmlyc3RDaGlsZDp2Lmxhc3RDaGlsZF0sYSYmbSl7Zm9yKGI9KGg9KGM9KGw9KGY9KHA9dilbeF18fChwW3hdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbdF18fFtdKVswXT09PWsmJmNbMV0pJiZjWzJdLHA9aCYmdi5jaGlsZE5vZGVzW2hdO3A9KytoJiZwJiZwW2ddfHwoYj1oPTApfHxkLnBvcCgpOylpZigxPT09cC5ub2RlVHlwZSYmKytiJiZwPT09ZSl7bFt0XT1bayxoLGJdO2JyZWFrfX1lbHNlIGlmKG0mJihiPWg9KGM9KGw9KGY9KHA9ZSlbeF18fChwW3hdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbdF18fFtdKVswXT09PWsmJmNbMV0pLCExPT09Yilmb3IoOyhwPSsraCYmcCYmcFtnXXx8KGI9aD0wKXx8ZC5wb3AoKSkmJigocz9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT15OjEhPT1wLm5vZGVUeXBlKXx8ISsrYnx8KG0mJigobD0oZj1wW3hdfHwocFt4XT17fSkpW3AudW5pcXVlSURdfHwoZltwLnVuaXF1ZUlEXT17fSkpW3RdPVtrLGJdKSxwIT09ZSkpOyk7cmV0dXJuKGItPW8pPT09cnx8YiVyPT0wJiZiL3I+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKHQsZSl7dmFyIG4sbz1yLnBzZXVkb3NbdF18fHIuc2V0RmlsdGVyc1t0LnRvTG93ZXJDYXNlKCldfHxzdC5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK3QpO3JldHVybiBvW3hdP28oZSk6by5sZW5ndGg+MT8obj1bdCx0LCIiLGVdLHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSh0LnRvTG93ZXJDYXNlKCkpP2N0KGZ1bmN0aW9uKHQsbil7Zm9yKHZhciByLGk9byh0LGUpLGE9aS5sZW5ndGg7YS0tOyl0W3I9RCh0LGlbYV0pXT0hKG5bcl09aVthXSl9KTpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsbil9KTpvfX0scHNldWRvczp7bm90OmN0KGZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49W10scj1zKHQucmVwbGFjZShILCIkMSIpKTtyZXR1cm4gclt4XT9jdChmdW5jdGlvbih0LGUsbixvKXtmb3IodmFyIGksYT1yKHQsbnVsbCxvLFtdKSxzPXQubGVuZ3RoO3MtLTspKGk9YVtzXSkmJih0W3NdPSEoZVtzXT1pKSl9KTpmdW5jdGlvbih0LG8saSl7cmV0dXJuIGVbMF09dCxyKGUsbnVsbCxpLG4pLGVbMF09bnVsbCwhbi5wb3AoKX19KSxoYXM6Y3QoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBzdCh0LGUpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmN0KGZ1bmN0aW9uKHQpe3JldHVybiB0PXQucmVwbGFjZShldCxudCksZnVuY3Rpb24oZSl7cmV0dXJuKGUudGV4dENvbnRlbnR8fG8oZSkpLmluZGV4T2YodCk+LTF9fSksbGFuZzpjdChmdW5jdGlvbih0KXtyZXR1cm4gVi50ZXN0KHR8fCIiKXx8c3QuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrdCksdD10LnJlcGxhY2UoZXQsbnQpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oZSl7dmFyIG47ZG97aWYobj1nP2UubGFuZzplLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8ZS5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4obj1uLnRvTG93ZXJDYXNlKCkpPT09dHx8MD09PW4uaW5kZXhPZih0KyItIil9d2hpbGUoKGU9ZS5wYXJlbnROb2RlKSYmMT09PWUubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihlKXt2YXIgbj10LmxvY2F0aW9uJiZ0LmxvY2F0aW9uLmhhc2g7cmV0dXJuIG4mJm4uc2xpY2UoMSk9PT1lLmlkfSxyb290OmZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZH0sZm9jdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1oLmFjdGl2ZUVsZW1lbnQmJighaC5oYXNGb2N1c3x8aC5oYXNGb2N1cygpKSYmISEodC50eXBlfHx0LmhyZWZ8fH50LnRhYkluZGV4KX0sZW5hYmxlZDpndCghMSksZGlzYWJsZWQ6Z3QoITApLGNoZWNrZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1lJiYhIXQuY2hlY2tlZHx8Im9wdGlvbiI9PT1lJiYhIXQuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKHQpe3JldHVybiB0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LCEwPT09dC5zZWxlY3RlZH0sZW1wdHk6ZnVuY3Rpb24odCl7Zm9yKHQ9dC5maXJzdENoaWxkO3Q7dD10Lm5leHRTaWJsaW5nKWlmKHQubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKHQpe3JldHVybiFyLnBzZXVkb3MuZW1wdHkodCl9LGhlYWRlcjpmdW5jdGlvbih0KXtyZXR1cm4gSi50ZXN0KHQubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbih0KXtyZXR1cm4gWC50ZXN0KHQubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24odCl7dmFyIGU9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1lJiYiYnV0dG9uIj09PXQudHlwZXx8ImJ1dHRvbiI9PT1lfSx0ZXh0OmZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiJpbnB1dCI9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PXQudHlwZSYmKG51bGw9PShlPXQuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT1lLnRvTG93ZXJDYXNlKCkpfSxmaXJzdDp2dChmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6dnQoZnVuY3Rpb24odCxlKXtyZXR1cm5bZS0xXX0pLGVxOnZ0KGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm5bbjwwP24rZTpuXX0pLGV2ZW46dnQoZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPGU7bis9Mil0LnB1c2gobik7cmV0dXJuIHR9KSxvZGQ6dnQoZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MTtuPGU7bis9Mil0LnB1c2gobik7cmV0dXJuIHR9KSxsdDp2dChmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW48MD9uK2U6bj5lP2U6bjstLXI+PTA7KXQucHVzaChyKTtyZXR1cm4gdH0pLGd0OnZ0KGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bjwwP24rZTpuOysrcjxlOyl0LnB1c2gocik7cmV0dXJuIHR9KX19KS5wc2V1ZG9zLm50aD1yLnBzZXVkb3MuZXEse3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KXIucHNldWRvc1tlXT1odChlKTtmb3IoZSBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KXIucHNldWRvc1tlXT1kdChlKTtmdW5jdGlvbiBtdCgpe31mdW5jdGlvbiBidCh0KXtmb3IodmFyIGU9MCxuPXQubGVuZ3RoLHI9IiI7ZTxuO2UrKylyKz10W2VdLnZhbHVlO3JldHVybiByfWZ1bmN0aW9uIHh0KHQsZSxuKXt2YXIgcj1lLmRpcixvPWUubmV4dCxpPW98fHIsYT1uJiYicGFyZW50Tm9kZSI9PT1pLHM9UysrO3JldHVybiBlLmZpcnN0P2Z1bmN0aW9uKGUsbixvKXtmb3IoO2U9ZVtyXTspaWYoMT09PWUubm9kZVR5cGV8fGEpcmV0dXJuIHQoZSxuLG8pO3JldHVybiExfTpmdW5jdGlvbihlLG4sdSl7dmFyIGMsbCxmLHA9W2ssc107aWYodSl7Zm9yKDtlPWVbcl07KWlmKCgxPT09ZS5ub2RlVHlwZXx8YSkmJnQoZSxuLHUpKXJldHVybiEwfWVsc2UgZm9yKDtlPWVbcl07KWlmKDE9PT1lLm5vZGVUeXBlfHxhKWlmKGw9KGY9ZVt4XXx8KGVbeF09e30pKVtlLnVuaXF1ZUlEXXx8KGZbZS51bmlxdWVJRF09e30pLG8mJm89PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpZT1lW3JdfHxlO2Vsc2V7aWYoKGM9bFtpXSkmJmNbMF09PT1rJiZjWzFdPT09cylyZXR1cm4gcFsyXT1jWzJdO2lmKGxbaV09cCxwWzJdPXQoZSxuLHUpKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiB3dCh0KXtyZXR1cm4gdC5sZW5ndGg+MT9mdW5jdGlvbihlLG4scil7Zm9yKHZhciBvPXQubGVuZ3RoO28tLTspaWYoIXRbb10oZSxuLHIpKXJldHVybiExO3JldHVybiEwfTp0WzBdfWZ1bmN0aW9uIGt0KHQsZSxuLHIsbyl7Zm9yKHZhciBpLGE9W10scz0wLHU9dC5sZW5ndGgsYz1udWxsIT1lO3M8dTtzKyspKGk9dFtzXSkmJihuJiYhbihpLHIsbyl8fChhLnB1c2goaSksYyYmZS5wdXNoKHMpKSk7cmV0dXJuIGF9ZnVuY3Rpb24gU3QodCxlLG4scixvLGkpe3JldHVybiByJiYhclt4XSYmKHI9U3QocikpLG8mJiFvW3hdJiYobz1TdChvLGkpKSxjdChmdW5jdGlvbihpLGEscyx1KXt2YXIgYyxsLGYscD1bXSxoPVtdLGQ9YS5sZW5ndGgsZz1pfHxmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTAsbz1lLmxlbmd0aDtyPG87cisrKXN0KHQsZVtyXSxuKTtyZXR1cm4gbn0oZXx8IioiLHMubm9kZVR5cGU/W3NdOnMsW10pLHY9IXR8fCFpJiZlP2c6a3QoZyxwLHQscyx1KSx5PW4/b3x8KGk/dDpkfHxyKT9bXTphOnY7aWYobiYmbih2LHkscyx1KSxyKWZvcihjPWt0KHksaCkscihjLFtdLHMsdSksbD1jLmxlbmd0aDtsLS07KShmPWNbbF0pJiYoeVtoW2xdXT0hKHZbaFtsXV09ZikpO2lmKGkpe2lmKG98fHQpe2lmKG8pe2ZvcihjPVtdLGw9eS5sZW5ndGg7bC0tOykoZj15W2xdKSYmYy5wdXNoKHZbbF09Zik7byhudWxsLHk9W10sYyx1KX1mb3IobD15Lmxlbmd0aDtsLS07KShmPXlbbF0pJiYoYz1vP0QoaSxmKTpwW2xdKT4tMSYmKGlbY109IShhW2NdPWYpKX19ZWxzZSB5PWt0KHk9PT1hP3kuc3BsaWNlKGQseS5sZW5ndGgpOnkpLG8/byhudWxsLGEseSx1KTpOLmFwcGx5KGEseSl9KX1mdW5jdGlvbiBFdCh0KXtmb3IodmFyIGUsbixvLGk9dC5sZW5ndGgsYT1yLnJlbGF0aXZlW3RbMF0udHlwZV0scz1hfHxyLnJlbGF0aXZlWyIgIl0sdT1hPzE6MCxsPXh0KGZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZX0scywhMCksZj14dChmdW5jdGlvbih0KXtyZXR1cm4gRChlLHQpPi0xfSxzLCEwKSxwPVtmdW5jdGlvbih0LG4scil7dmFyIG89IWEmJihyfHxuIT09Yyl8fCgoZT1uKS5ub2RlVHlwZT9sKHQsbixyKTpmKHQsbixyKSk7cmV0dXJuIGU9bnVsbCxvfV07dTxpO3UrKylpZihuPXIucmVsYXRpdmVbdFt1XS50eXBlXSlwPVt4dCh3dChwKSxuKV07ZWxzZXtpZigobj1yLmZpbHRlclt0W3VdLnR5cGVdLmFwcGx5KG51bGwsdFt1XS5tYXRjaGVzKSlbeF0pe2ZvcihvPSsrdTtvPGkmJiFyLnJlbGF0aXZlW3Rbb10udHlwZV07bysrKTtyZXR1cm4gU3QodT4xJiZ3dChwKSx1PjEmJmJ0KHQuc2xpY2UoMCx1LTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09dFt1LTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoSCwiJDEiKSxuLHU8byYmRXQodC5zbGljZSh1LG8pKSxvPGkmJkV0KHQ9dC5zbGljZShvKSksbzxpJiZidCh0KSl9cC5wdXNoKG4pfXJldHVybiB3dChwKX1yZXR1cm4gbXQucHJvdG90eXBlPXIuZmlsdGVycz1yLnBzZXVkb3Msci5zZXRGaWx0ZXJzPW5ldyBtdCxhPXN0LnRva2VuaXplPWZ1bmN0aW9uKHQsZSl7dmFyIG4sbyxpLGEscyx1LGMsbD1UW3QrIiAiXTtpZihsKXJldHVybiBlPzA6bC5zbGljZSgwKTtmb3Iocz10LHU9W10sYz1yLnByZUZpbHRlcjtzOyl7Zm9yKGEgaW4gbiYmIShvPXouZXhlYyhzKSl8fChvJiYocz1zLnNsaWNlKG9bMF0ubGVuZ3RoKXx8cyksdS5wdXNoKGk9W10pKSxuPSExLChvPVcuZXhlYyhzKSkmJihuPW8uc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpvWzBdLnJlcGxhY2UoSCwiICIpfSkscz1zLnNsaWNlKG4ubGVuZ3RoKSksci5maWx0ZXIpIShvPUdbYV0uZXhlYyhzKSl8fGNbYV0mJiEobz1jW2FdKG8pKXx8KG49by5zaGlmdCgpLGkucHVzaCh7dmFsdWU6bix0eXBlOmEsbWF0Y2hlczpvfSkscz1zLnNsaWNlKG4ubGVuZ3RoKSk7aWYoIW4pYnJlYWt9cmV0dXJuIGU/cy5sZW5ndGg6cz9zdC5lcnJvcih0KTpUKHQsdSkuc2xpY2UoMCl9LHM9c3QuY29tcGlsZT1mdW5jdGlvbih0LGUpe3ZhciBuLG89W10saT1bXSxzPWpbdCsiICJdO2lmKCFzKXtmb3IoZXx8KGU9YSh0KSksbj1lLmxlbmd0aDtuLS07KShzPUV0KGVbbl0pKVt4XT9vLnB1c2gocyk6aS5wdXNoKHMpOyhzPWoodCxmdW5jdGlvbih0LGUpe3ZhciBuPWUubGVuZ3RoPjAsbz10Lmxlbmd0aD4wLGk9ZnVuY3Rpb24oaSxhLHMsdSxsKXt2YXIgZixkLHYseT0wLG09IjAiLGI9aSYmW10seD1bXSx3PWMsUz1pfHxvJiZyLmZpbmQuVEFHKCIqIixsKSxFPWsrPW51bGw9PXc/MTpNYXRoLnJhbmRvbSgpfHwuMSxUPVMubGVuZ3RoO2ZvcihsJiYoYz1hPT09aHx8YXx8bCk7bSE9PVQmJm51bGwhPShmPVNbbV0pO20rKyl7aWYobyYmZil7Zm9yKGQ9MCxhfHxmLm93bmVyRG9jdW1lbnQ9PT1ofHwocChmKSxzPSFnKTt2PXRbZCsrXTspaWYodihmLGF8fGgscykpe3UucHVzaChmKTticmVha31sJiYoaz1FKX1uJiYoKGY9IXYmJmYpJiZ5LS0saSYmYi5wdXNoKGYpKX1pZih5Kz1tLG4mJm0hPT15KXtmb3IoZD0wO3Y9ZVtkKytdOyl2KGIseCxhLHMpO2lmKGkpe2lmKHk+MClmb3IoO20tLTspYlttXXx8eFttXXx8KHhbbV09Ui5jYWxsKHUpKTt4PWt0KHgpfU4uYXBwbHkodSx4KSxsJiYhaSYmeC5sZW5ndGg+MCYmeStlLmxlbmd0aD4xJiZzdC51bmlxdWVTb3J0KHUpfXJldHVybiBsJiYoaz1FLGM9dyksYn07cmV0dXJuIG4/Y3QoaSk6aX0oaSxvKSkpLnNlbGVjdG9yPXR9cmV0dXJuIHN9LHU9c3Quc2VsZWN0PWZ1bmN0aW9uKHQsZSxuLG8pe3ZhciBpLHUsYyxsLGYscD0iZnVuY3Rpb24iPT10eXBlb2YgdCYmdCxoPSFvJiZhKHQ9cC5zZWxlY3Rvcnx8dCk7aWYobj1ufHxbXSwxPT09aC5sZW5ndGgpe2lmKCh1PWhbMF09aFswXS5zbGljZSgwKSkubGVuZ3RoPjImJiJJRCI9PT0oYz11WzBdKS50eXBlJiY5PT09ZS5ub2RlVHlwZSYmZyYmci5yZWxhdGl2ZVt1WzFdLnR5cGVdKXtpZighKGU9KHIuZmluZC5JRChjLm1hdGNoZXNbMF0ucmVwbGFjZShldCxudCksZSl8fFtdKVswXSkpcmV0dXJuIG47cCYmKGU9ZS5wYXJlbnROb2RlKSx0PXQuc2xpY2UodS5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9Zm9yKGk9Ry5uZWVkc0NvbnRleHQudGVzdCh0KT8wOnUubGVuZ3RoO2ktLSYmKGM9dVtpXSwhci5yZWxhdGl2ZVtsPWMudHlwZV0pOylpZigoZj1yLmZpbmRbbF0pJiYobz1mKGMubWF0Y2hlc1swXS5yZXBsYWNlKGV0LG50KSx0dC50ZXN0KHVbMF0udHlwZSkmJnl0KGUucGFyZW50Tm9kZSl8fGUpKSl7aWYodS5zcGxpY2UoaSwxKSwhKHQ9by5sZW5ndGgmJmJ0KHUpKSlyZXR1cm4gTi5hcHBseShuLG8pLG47YnJlYWt9fXJldHVybihwfHxzKHQsaCkpKG8sZSwhZyxuLCFlfHx0dC50ZXN0KHQpJiZ5dChlLnBhcmVudE5vZGUpfHxlKSxufSxuLnNvcnRTdGFibGU9eC5zcGxpdCgiIikuc29ydChPKS5qb2luKCIiKT09PXgsbi5kZXRlY3REdXBsaWNhdGVzPSEhZixwKCksbi5zb3J0RGV0YWNoZWQ9bHQoZnVuY3Rpb24odCl7cmV0dXJuIDEmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihoLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0IikpfSksbHQoZnVuY3Rpb24odCl7cmV0dXJuIHQuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT10LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8ZnQoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKHQsZSxuKXtpZighbilyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoZSwidHlwZSI9PT1lLnRvTG93ZXJDYXNlKCk/MToyKX0pLG4uYXR0cmlidXRlcyYmbHQoZnVuY3Rpb24odCl7cmV0dXJuIHQuaW5uZXJIVE1MPSI8aW5wdXQvPiIsdC5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PXQuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8ZnQoInZhbHVlIixmdW5jdGlvbih0LGUsbil7aWYoIW4mJiJpbnB1dCI9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHQuZGVmYXVsdFZhbHVlfSksbHQoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGZ0KF8sZnVuY3Rpb24odCxlLG4pe3ZhciByO2lmKCFuKXJldHVybiEwPT09dFtlXT9lLnRvTG93ZXJDYXNlKCk6KHI9dC5nZXRBdHRyaWJ1dGVOb2RlKGUpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSksc3R9KG4pO1MuZmluZD1qLFMuZXhwcj1qLnNlbGVjdG9ycyxTLmV4cHJbIjoiXT1TLmV4cHIucHNldWRvcyxTLnVuaXF1ZVNvcnQ9Uy51bmlxdWU9ai51bmlxdWVTb3J0LFMudGV4dD1qLmdldFRleHQsUy5pc1hNTERvYz1qLmlzWE1MLFMuY29udGFpbnM9ai5jb250YWlucyxTLmVzY2FwZVNlbGVjdG9yPWouZXNjYXBlO3ZhciBBPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9W10sbz12b2lkIDAhPT1uOyh0PXRbZV0pJiY5IT09dC5ub2RlVHlwZTspaWYoMT09PXQubm9kZVR5cGUpe2lmKG8mJlModCkuaXMobikpYnJlYWs7ci5wdXNoKHQpfXJldHVybiByfSxPPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdO3Q7dD10Lm5leHRTaWJsaW5nKTE9PT10Lm5vZGVUeXBlJiZ0IT09ZSYmbi5wdXNoKHQpO3JldHVybiBufSxDPVMuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7ZnVuY3Rpb24gTCh0LGUpe3JldHVybiB0Lm5vZGVOYW1lJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1lLnRvTG93ZXJDYXNlKCl9dmFyIFI9L148KFthLXpdW15cL1wwPjpceDIwXHRcclxuXGZdKilbXHgyMFx0XHJcblxmXSpcLz8+KD86PFwvXDE+fCkkL2k7ZnVuY3Rpb24gUCh0LGUsbil7cmV0dXJuIG0oZSk/Uy5ncmVwKHQsZnVuY3Rpb24odCxyKXtyZXR1cm4hIWUuY2FsbCh0LHIsdCkhPT1ufSk6ZS5ub2RlVHlwZT9TLmdyZXAodCxmdW5jdGlvbih0KXtyZXR1cm4gdD09PWUhPT1ufSk6InN0cmluZyIhPXR5cGVvZiBlP1MuZ3JlcCh0LGZ1bmN0aW9uKHQpe3JldHVybiBmLmNhbGwoZSx0KT4tMSE9PW59KTpTLmZpbHRlcihlLHQsbil9Uy5maWx0ZXI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWVbMF07cmV0dXJuIG4mJih0PSI6bm90KCIrdCsiKSIpLDE9PT1lLmxlbmd0aCYmMT09PXIubm9kZVR5cGU/Uy5maW5kLm1hdGNoZXNTZWxlY3RvcihyLHQpP1tyXTpbXTpTLmZpbmQubWF0Y2hlcyh0LFMuZ3JlcChlLGZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5ub2RlVHlwZX0pKX0sUy5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24odCl7dmFyIGUsbixyPXRoaXMubGVuZ3RoLG89dGhpcztpZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIHRoaXMucHVzaFN0YWNrKFModCkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGU9MDtlPHI7ZSsrKWlmKFMuY29udGFpbnMob1tlXSx0aGlzKSlyZXR1cm4hMH0pKTtmb3Iobj10aGlzLnB1c2hTdGFjayhbXSksZT0wO2U8cjtlKyspUy5maW5kKHQsb1tlXSxuKTtyZXR1cm4gcj4xP1MudW5pcXVlU29ydChuKTpufSxmaWx0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFAodGhpcyx0fHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFAodGhpcyx0fHxbXSwhMCkpfSxpczpmdW5jdGlvbih0KXtyZXR1cm4hIVAodGhpcywic3RyaW5nIj09dHlwZW9mIHQmJkMudGVzdCh0KT9TKHQpOnR8fFtdLCExKS5sZW5ndGh9fSk7dmFyIE4sST0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSspKSQvOyhTLmZuLmluaXQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByLG87aWYoIXQpcmV0dXJuIHRoaXM7aWYobj1ufHxOLCJzdHJpbmciPT10eXBlb2YgdCl7aWYoIShyPSI8Ij09PXRbMF0mJiI+Ij09PXRbdC5sZW5ndGgtMV0mJnQubGVuZ3RoPj0zP1tudWxsLHQsbnVsbF06SS5leGVjKHQpKXx8IXJbMV0mJmUpcmV0dXJuIWV8fGUuanF1ZXJ5PyhlfHxuKS5maW5kKHQpOnRoaXMuY29uc3RydWN0b3IoZSkuZmluZCh0KTtpZihyWzFdKXtpZihlPWUgaW5zdGFuY2VvZiBTP2VbMF06ZSxTLm1lcmdlKHRoaXMsUy5wYXJzZUhUTUwoclsxXSxlJiZlLm5vZGVUeXBlP2Uub3duZXJEb2N1bWVudHx8ZTphLCEwKSksUi50ZXN0KHJbMV0pJiZTLmlzUGxhaW5PYmplY3QoZSkpZm9yKHIgaW4gZSltKHRoaXNbcl0pP3RoaXNbcl0oZVtyXSk6dGhpcy5hdHRyKHIsZVtyXSk7cmV0dXJuIHRoaXN9cmV0dXJuKG89YS5nZXRFbGVtZW50QnlJZChyWzJdKSkmJih0aGlzWzBdPW8sdGhpcy5sZW5ndGg9MSksdGhpc31yZXR1cm4gdC5ub2RlVHlwZT8odGhpc1swXT10LHRoaXMubGVuZ3RoPTEsdGhpcyk6bSh0KT92b2lkIDAhPT1uLnJlYWR5P24ucmVhZHkodCk6dChTKTpTLm1ha2VBcnJheSh0LHRoaXMpfSkucHJvdG90eXBlPVMuZm4sTj1TKGEpO3ZhciBEPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLF89e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07ZnVuY3Rpb24gTSh0LGUpe2Zvcig7KHQ9dFtlXSkmJjEhPT10Lm5vZGVUeXBlOyk7cmV0dXJuIHR9Uy5mbi5leHRlbmQoe2hhczpmdW5jdGlvbih0KXt2YXIgZT1TKHQsdGhpcyksbj1lLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PG47dCsrKWlmKFMuY29udGFpbnModGhpcyxlW3RdKSlyZXR1cm4hMH0pfSxjbG9zZXN0OmZ1bmN0aW9uKHQsZSl7dmFyIG4scj0wLG89dGhpcy5sZW5ndGgsaT1bXSxhPSJzdHJpbmciIT10eXBlb2YgdCYmUyh0KTtpZighQy50ZXN0KHQpKWZvcig7cjxvO3IrKylmb3Iobj10aGlzW3JdO24mJm4hPT1lO249bi5wYXJlbnROb2RlKWlmKG4ubm9kZVR5cGU8MTEmJihhP2EuaW5kZXgobik+LTE6MT09PW4ubm9kZVR5cGUmJlMuZmluZC5tYXRjaGVzU2VsZWN0b3Iobix0KSkpe2kucHVzaChuKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soaS5sZW5ndGg+MT9TLnVuaXF1ZVNvcnQoaSk6aSl9LGluZGV4OmZ1bmN0aW9uKHQpe3JldHVybiB0PyJzdHJpbmciPT10eXBlb2YgdD9mLmNhbGwoUyh0KSx0aGlzWzBdKTpmLmNhbGwodGhpcyx0LmpxdWVyeT90WzBdOnQpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMudW5pcXVlU29ydChTLm1lcmdlKHRoaXMuZ2V0KCksUyh0LGUpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFkZChudWxsPT10P3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKHQpKX19KSxTLmVhY2goe3BhcmVudDpmdW5jdGlvbih0KXt2YXIgZT10LnBhcmVudE5vZGU7cmV0dXJuIGUmJjExIT09ZS5ub2RlVHlwZT9lOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24odCl7cmV0dXJuIEEodCwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBBKHQsInBhcmVudE5vZGUiLG4pfSxuZXh0OmZ1bmN0aW9uKHQpe3JldHVybiBNKHQsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24odCl7cmV0dXJuIE0odCwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIEEodCwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbih0KXtyZXR1cm4gQSh0LCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gQSh0LCJuZXh0U2libGluZyIsbil9LHByZXZVbnRpbDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIEEodCwicHJldmlvdXNTaWJsaW5nIixuKX0sc2libGluZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIE8oKHQucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsdCl9LGNoaWxkcmVuOmZ1bmN0aW9uKHQpe3JldHVybiBPKHQuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10LmNvbnRlbnREb2N1bWVudD90LmNvbnRlbnREb2N1bWVudDooTCh0LCJ0ZW1wbGF0ZSIpJiYodD10LmNvbnRlbnR8fHQpLFMubWVyZ2UoW10sdC5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbih0LGUpe1MuZm5bdF09ZnVuY3Rpb24obixyKXt2YXIgbz1TLm1hcCh0aGlzLGUsbik7cmV0dXJuIlVudGlsIiE9PXQuc2xpY2UoLTUpJiYocj1uKSxyJiYic3RyaW5nIj09dHlwZW9mIHImJihvPVMuZmlsdGVyKHIsbykpLHRoaXMubGVuZ3RoPjEmJihfW3RdfHxTLnVuaXF1ZVNvcnQobyksRC50ZXN0KHQpJiZvLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2sobyl9fSk7dmFyIFU9L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiBCKHQpe3JldHVybiB0fWZ1bmN0aW9uIHEodCl7dGhyb3cgdH1mdW5jdGlvbiBGKHQsZSxuLHIpe3ZhciBvO3RyeXt0JiZtKG89dC5wcm9taXNlKT9vLmNhbGwodCkuZG9uZShlKS5mYWlsKG4pOnQmJm0obz10LnRoZW4pP28uY2FsbCh0LGUsbik6ZS5hcHBseSh2b2lkIDAsW3RdLnNsaWNlKHIpKX1jYXRjaCh0KXtuLmFwcGx5KHZvaWQgMCxbdF0pfX1TLkNhbGxiYWNrcz1mdW5jdGlvbih0KXt0PSJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gUy5lYWNoKHQubWF0Y2goVSl8fFtdLGZ1bmN0aW9uKHQsbil7ZVtuXT0hMH0pLGV9KHQpOlMuZXh0ZW5kKHt9LHQpO3ZhciBlLG4scixvLGk9W10sYT1bXSxzPS0xLHU9ZnVuY3Rpb24oKXtmb3Iobz1vfHx0Lm9uY2Uscj1lPSEwO2EubGVuZ3RoO3M9LTEpZm9yKG49YS5zaGlmdCgpOysrczxpLmxlbmd0aDspITE9PT1pW3NdLmFwcGx5KG5bMF0sblsxXSkmJnQuc3RvcE9uRmFsc2UmJihzPWkubGVuZ3RoLG49ITEpO3QubWVtb3J5fHwobj0hMSksZT0hMSxvJiYoaT1uP1tdOiIiKX0sYz17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIGkmJihuJiYhZSYmKHM9aS5sZW5ndGgtMSxhLnB1c2gobikpLGZ1bmN0aW9uIGUobil7Uy5lYWNoKG4sZnVuY3Rpb24obixyKXttKHIpP3QudW5pcXVlJiZjLmhhcyhyKXx8aS5wdXNoKHIpOnImJnIubGVuZ3RoJiYic3RyaW5nIiE9PWsocikmJmUocil9KX0oYXJndW1lbnRzKSxuJiYhZSYmdSgpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gUy5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbjsobj1TLmluQXJyYXkoZSxpLG4pKT4tMTspaS5zcGxpY2UobiwxKSxuPD1zJiZzLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ/Uy5pbkFycmF5KHQsaSk+LTE6aS5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gaSYmKGk9W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gbz1hPVtdLGk9bj0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFpfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIG89YT1bXSxufHxlfHwoaT1uPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIW99LGZpcmVXaXRoOmZ1bmN0aW9uKHQsbil7cmV0dXJuIG98fChuPVt0LChuPW58fFtdKS5zbGljZT9uLnNsaWNlKCk6bl0sYS5wdXNoKG4pLGV8fHUoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBjLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhcn19O3JldHVybiBjfSxTLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24odCl7dmFyIGU9W1sibm90aWZ5IiwicHJvZ3Jlc3MiLFMuQ2FsbGJhY2tzKCJtZW1vcnkiKSxTLkNhbGxiYWNrcygibWVtb3J5IiksMl0sWyJyZXNvbHZlIiwiZG9uZSIsUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMCwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDEsInJlamVjdGVkIl1dLHI9InBlbmRpbmciLG89e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBpLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sY2F0Y2g6ZnVuY3Rpb24odCl7cmV0dXJuIG8udGhlbihudWxsLHQpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzO3JldHVybiBTLkRlZmVycmVkKGZ1bmN0aW9uKG4pe1MuZWFjaChlLGZ1bmN0aW9uKGUscil7dmFyIG89bSh0W3JbNF1dKSYmdFtyWzRdXTtpW3JbMV1dKGZ1bmN0aW9uKCl7dmFyIHQ9byYmby5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dCYmbSh0LnByb21pc2UpP3QucHJvbWlzZSgpLnByb2dyZXNzKG4ubm90aWZ5KS5kb25lKG4ucmVzb2x2ZSkuZmFpbChuLnJlamVjdCk6bltyWzBdKyJXaXRoIl0odGhpcyxvP1t0XTphcmd1bWVudHMpfSl9KSx0PW51bGx9KS5wcm9taXNlKCl9LHRoZW46ZnVuY3Rpb24odCxyLG8pe3ZhciBpPTA7ZnVuY3Rpb24gYSh0LGUscixvKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcz10aGlzLHU9YXJndW1lbnRzLGM9ZnVuY3Rpb24oKXt2YXIgbixjO2lmKCEodDxpKSl7aWYoKG49ci5hcHBseShzLHUpKT09PWUucHJvbWlzZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvbiIpO2M9biYmKCJvYmplY3QiPT10eXBlb2Ygbnx8ImZ1bmN0aW9uIj09dHlwZW9mIG4pJiZuLnRoZW4sbShjKT9vP2MuY2FsbChuLGEoaSxlLEIsbyksYShpLGUscSxvKSk6KGkrKyxjLmNhbGwobixhKGksZSxCLG8pLGEoaSxlLHEsbyksYShpLGUsQixlLm5vdGlmeVdpdGgpKSk6KHIhPT1CJiYocz12b2lkIDAsdT1bbl0pLChvfHxlLnJlc29sdmVXaXRoKShzLHUpKX19LGw9bz9jOmZ1bmN0aW9uKCl7dHJ5e2MoKX1jYXRjaChuKXtTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJlMuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhuLGwuc3RhY2tUcmFjZSksdCsxPj1pJiYociE9PXEmJihzPXZvaWQgMCx1PVtuXSksZS5yZWplY3RXaXRoKHMsdSkpfX07dD9sKCk6KFMuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYobC5zdGFja1RyYWNlPVMuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLG4uc2V0VGltZW91dChsKSl9fXJldHVybiBTLkRlZmVycmVkKGZ1bmN0aW9uKG4pe2VbMF1bM10uYWRkKGEoMCxuLG0obyk/bzpCLG4ubm90aWZ5V2l0aCkpLGVbMV1bM10uYWRkKGEoMCxuLG0odCk/dDpCKSksZVsyXVszXS5hZGQoYSgwLG4sbShyKT9yOnEpKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dD9TLmV4dGVuZCh0LG8pOm99fSxpPXt9O3JldHVybiBTLmVhY2goZSxmdW5jdGlvbih0LG4pe3ZhciBhPW5bMl0scz1uWzVdO29bblsxXV09YS5hZGQscyYmYS5hZGQoZnVuY3Rpb24oKXtyPXN9LGVbMy10XVsyXS5kaXNhYmxlLGVbMy10XVszXS5kaXNhYmxlLGVbMF1bMl0ubG9jayxlWzBdWzNdLmxvY2spLGEuYWRkKG5bM10uZmlyZSksaVtuWzBdXT1mdW5jdGlvbigpe3JldHVybiBpW25bMF0rIldpdGgiXSh0aGlzPT09aT92b2lkIDA6dGhpcyxhcmd1bWVudHMpLHRoaXN9LGlbblswXSsiV2l0aCJdPWEuZmlyZVdpdGh9KSxvLnByb21pc2UoaSksdCYmdC5jYWxsKGksaSksaX0sd2hlbjpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoLG49ZSxyPUFycmF5KG4pLG89dS5jYWxsKGFyZ3VtZW50cyksaT1TLkRlZmVycmVkKCksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7clt0XT10aGlzLG9bdF09YXJndW1lbnRzLmxlbmd0aD4xP3UuY2FsbChhcmd1bWVudHMpOm4sLS1lfHxpLnJlc29sdmVXaXRoKHIsbyl9fTtpZihlPD0xJiYoRih0LGkuZG9uZShhKG4pKS5yZXNvbHZlLGkucmVqZWN0LCFlKSwicGVuZGluZyI9PT1pLnN0YXRlKCl8fG0ob1tuXSYmb1tuXS50aGVuKSkpcmV0dXJuIGkudGhlbigpO2Zvcig7bi0tOylGKG9bbl0sYShuKSxpLnJlamVjdCk7cmV0dXJuIGkucHJvbWlzZSgpfX0pO3ZhciBIPS9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO1MuRGVmZXJyZWQuZXhjZXB0aW9uSG9vaz1mdW5jdGlvbih0LGUpe24uY29uc29sZSYmbi5jb25zb2xlLndhcm4mJnQmJkgudGVzdCh0Lm5hbWUpJiZuLmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIit0Lm1lc3NhZ2UsdC5zdGFjayxlKX0sUy5yZWFkeUV4Y2VwdGlvbj1mdW5jdGlvbih0KXtuLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyB0fSl9O3ZhciB6PVMuRGVmZXJyZWQoKTtmdW5jdGlvbiBXKCl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixXKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLFcpLFMucmVhZHkoKX1TLmZuLnJlYWR5PWZ1bmN0aW9uKHQpe3JldHVybiB6LnRoZW4odCkuY2F0Y2goZnVuY3Rpb24odCl7Uy5yZWFkeUV4Y2VwdGlvbih0KX0pLHRoaXN9LFMuZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKHQpeyghMD09PXQ/LS1TLnJlYWR5V2FpdDpTLmlzUmVhZHkpfHwoUy5pc1JlYWR5PSEwLCEwIT09dCYmLS1TLnJlYWR5V2FpdD4wfHx6LnJlc29sdmVXaXRoKGEsW1NdKSl9fSksUy5yZWFkeS50aGVuPXoudGhlbiwiY29tcGxldGUiPT09YS5yZWFkeVN0YXRlfHwibG9hZGluZyIhPT1hLnJlYWR5U3RhdGUmJiFhLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD9uLnNldFRpbWVvdXQoUy5yZWFkeSk6KGEuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsVyksbi5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixXKSk7dmFyICQ9ZnVuY3Rpb24odCxlLG4scixvLGksYSl7dmFyIHM9MCx1PXQubGVuZ3RoLGM9bnVsbD09bjtpZigib2JqZWN0Ij09PWsobikpZm9yKHMgaW4gbz0hMCxuKSQodCxlLHMsbltzXSwhMCxpLGEpO2Vsc2UgaWYodm9pZCAwIT09ciYmKG89ITAsbShyKXx8KGE9ITApLGMmJihhPyhlLmNhbGwodCxyKSxlPW51bGwpOihjPWUsZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGMuY2FsbChTKHQpLG4pfSkpLGUpKWZvcig7czx1O3MrKyllKHRbc10sbixhP3I6ci5jYWxsKHRbc10scyxlKHRbc10sbikpKTtyZXR1cm4gbz90OmM/ZS5jYWxsKHQpOnU/ZSh0WzBdLG4pOml9LFk9L14tbXMtLyxWPS8tKFthLXpdKS9nO2Z1bmN0aW9uIEcodCxlKXtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIEsodCl7cmV0dXJuIHQucmVwbGFjZShZLCJtcy0iKS5yZXBsYWNlKFYsRyl9dmFyIFg9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10Lm5vZGVUeXBlfHw5PT09dC5ub2RlVHlwZXx8ISt0Lm5vZGVUeXBlfTtmdW5jdGlvbiBKKCl7dGhpcy5leHBhbmRvPVMuZXhwYW5kbytKLnVpZCsrfUoudWlkPTEsSi5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKHQpe3ZhciBlPXRbdGhpcy5leHBhbmRvXTtyZXR1cm4gZXx8KGU9e30sWCh0KSYmKHQubm9kZVR5cGU/dFt0aGlzLmV4cGFuZG9dPWU6T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsdGhpcy5leHBhbmRvLHt2YWx1ZTplLGNvbmZpZ3VyYWJsZTohMH0pKSksZX0sc2V0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvPXRoaXMuY2FjaGUodCk7aWYoInN0cmluZyI9PXR5cGVvZiBlKW9bSyhlKV09bjtlbHNlIGZvcihyIGluIGUpb1tLKHIpXT1lW3JdO3JldHVybiBvfSxnZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLmNhY2hlKHQpOnRbdGhpcy5leHBhbmRvXSYmdFt0aGlzLmV4cGFuZG9dW0soZSldfSxhY2Nlc3M6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB2b2lkIDA9PT1lfHxlJiYic3RyaW5nIj09dHlwZW9mIGUmJnZvaWQgMD09PW4/dGhpcy5nZXQodCxlKToodGhpcy5zZXQodCxlLG4pLHZvaWQgMCE9PW4/bjplKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSl7dmFyIG4scj10W3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09cil7aWYodm9pZCAwIT09ZSl7bj0oZT1BcnJheS5pc0FycmF5KGUpP2UubWFwKEspOihlPUsoZSkpaW4gcj9bZV06ZS5tYXRjaChVKXx8W10pLmxlbmd0aDtmb3IoO24tLTspZGVsZXRlIHJbZVtuXV19KHZvaWQgMD09PWV8fFMuaXNFbXB0eU9iamVjdChyKSkmJih0Lm5vZGVUeXBlP3RbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIHRbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKHQpe3ZhciBlPXRbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09ZSYmIVMuaXNFbXB0eU9iamVjdChlKX19O3ZhciBRPW5ldyBKLFo9bmV3IEosdHQ9L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxldD0vW0EtWl0vZztmdW5jdGlvbiBudCh0LGUsbil7dmFyIHI7aWYodm9pZCAwPT09biYmMT09PXQubm9kZVR5cGUpaWYocj0iZGF0YS0iK2UucmVwbGFjZShldCwiLSQmIikudG9Mb3dlckNhc2UoKSwic3RyaW5nIj09dHlwZW9mKG49dC5nZXRBdHRyaWJ1dGUocikpKXt0cnl7bj1mdW5jdGlvbih0KXtyZXR1cm4idHJ1ZSI9PT10fHwiZmFsc2UiIT09dCYmKCJudWxsIj09PXQ/bnVsbDp0PT09K3QrIiI/K3Q6dHQudGVzdCh0KT9KU09OLnBhcnNlKHQpOnQpfShuKX1jYXRjaCh0KXt9Wi5zZXQodCxlLG4pfWVsc2Ugbj12b2lkIDA7cmV0dXJuIG59Uy5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24odCl7cmV0dXJuIFouaGFzRGF0YSh0KXx8US5oYXNEYXRhKHQpfSxkYXRhOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gWi5hY2Nlc3ModCxlLG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKHQsZSl7Wi5yZW1vdmUodCxlKX0sX2RhdGE6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBRLmFjY2Vzcyh0LGUsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKHQsZSl7US5yZW1vdmUodCxlKX19KSxTLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbyxpPXRoaXNbMF0sYT1pJiZpLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09dCl7aWYodGhpcy5sZW5ndGgmJihvPVouZ2V0KGkpLDE9PT1pLm5vZGVUeXBlJiYhUS5nZXQoaSwiaGFzRGF0YUF0dHJzIikpKXtmb3Iobj1hLmxlbmd0aDtuLS07KWFbbl0mJjA9PT0ocj1hW25dLm5hbWUpLmluZGV4T2YoImRhdGEtIikmJihyPUsoci5zbGljZSg1KSksbnQoaSxyLG9bcl0pKTtRLnNldChpLCJoYXNEYXRhQXR0cnMiLCEwKX1yZXR1cm4gb31yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Wi5zZXQodGhpcyx0KX0pOiQodGhpcyxmdW5jdGlvbihlKXt2YXIgbjtpZihpJiZ2b2lkIDA9PT1lKXJldHVybiB2b2lkIDAhPT0obj1aLmdldChpLHQpKT9uOnZvaWQgMCE9PShuPW50KGksdCkpP246dm9pZCAwO3RoaXMuZWFjaChmdW5jdGlvbigpe1ouc2V0KHRoaXMsdCxlKX0pfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtaLnJlbW92ZSh0aGlzLHQpfSl9fSksUy5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcjtpZih0KXJldHVybiBlPShlfHwiZngiKSsicXVldWUiLHI9US5nZXQodCxlKSxuJiYoIXJ8fEFycmF5LmlzQXJyYXkobik/cj1RLmFjY2Vzcyh0LGUsUy5tYWtlQXJyYXkobikpOnIucHVzaChuKSkscnx8W119LGRlcXVldWU6ZnVuY3Rpb24odCxlKXtlPWV8fCJmeCI7dmFyIG49Uy5xdWV1ZSh0LGUpLHI9bi5sZW5ndGgsbz1uLnNoaWZ0KCksaT1TLl9xdWV1ZUhvb2tzKHQsZSk7ImlucHJvZ3Jlc3MiPT09byYmKG89bi5zaGlmdCgpLHItLSksbyYmKCJmeCI9PT1lJiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgaS5zdG9wLG8uY2FsbCh0LGZ1bmN0aW9uKCl7Uy5kZXF1ZXVlKHQsZSl9LGkpKSwhciYmaSYmaS5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZSsicXVldWVIb29rcyI7cmV0dXJuIFEuZ2V0KHQsbil8fFEuYWNjZXNzKHQsbix7ZW1wdHk6Uy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7US5yZW1vdmUodCxbZSsicXVldWUiLG5dKX0pfSl9fSksUy5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJihlPXQsdD0iZngiLG4tLSksYXJndW1lbnRzLmxlbmd0aDxuP1MucXVldWUodGhpc1swXSx0KTp2b2lkIDA9PT1lP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49Uy5xdWV1ZSh0aGlzLHQsZSk7Uy5fcXVldWVIb29rcyh0aGlzLHQpLCJmeCI9PT10JiYiaW5wcm9ncmVzcyIhPT1uWzBdJiZTLmRlcXVldWUodGhpcyx0KX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmRlcXVldWUodGhpcyx0KX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnF1ZXVlKHR8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKHQsZSl7dmFyIG4scj0xLG89Uy5EZWZlcnJlZCgpLGk9dGhpcyxhPXRoaXMubGVuZ3RoLHM9ZnVuY3Rpb24oKXstLXJ8fG8ucmVzb2x2ZVdpdGgoaSxbaV0pfTtmb3IoInN0cmluZyIhPXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSx0PXR8fCJmeCI7YS0tOykobj1RLmdldChpW2FdLHQrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQocykpO3JldHVybiBzKCksby5wcm9taXNlKGUpfX0pO3ZhciBydD0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxvdD1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrcnQrIikoW2EteiVdKikkIiwiaSIpLGl0PVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sYXQ9YS5kb2N1bWVudEVsZW1lbnQsc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIFMuY29udGFpbnModC5vd25lckRvY3VtZW50LHQpfSx1dD17Y29tcG9zZWQ6ITB9O2F0LmdldFJvb3ROb2RlJiYoc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIFMuY29udGFpbnModC5vd25lckRvY3VtZW50LHQpfHx0LmdldFJvb3ROb2RlKHV0KT09PXQub3duZXJEb2N1bWVudH0pO3ZhciBjdD1mdW5jdGlvbih0LGUpe3JldHVybiJub25lIj09PSh0PWV8fHQpLnN0eWxlLmRpc3BsYXl8fCIiPT09dC5zdHlsZS5kaXNwbGF5JiZzdCh0KSYmIm5vbmUiPT09Uy5jc3ModCwiZGlzcGxheSIpfSxsdD1mdW5jdGlvbih0LGUsbixyKXt2YXIgbyxpLGE9e307Zm9yKGkgaW4gZSlhW2ldPXQuc3R5bGVbaV0sdC5zdHlsZVtpXT1lW2ldO2ZvcihpIGluIG89bi5hcHBseSh0LHJ8fFtdKSxlKXQuc3R5bGVbaV09YVtpXTtyZXR1cm4gb307ZnVuY3Rpb24gZnQodCxlLG4scil7dmFyIG8saSxhPTIwLHM9cj9mdW5jdGlvbigpe3JldHVybiByLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiBTLmNzcyh0LGUsIiIpfSx1PXMoKSxjPW4mJm5bM118fChTLmNzc051bWJlcltlXT8iIjoicHgiKSxsPXQubm9kZVR5cGUmJihTLmNzc051bWJlcltlXXx8InB4IiE9PWMmJit1KSYmb3QuZXhlYyhTLmNzcyh0LGUpKTtpZihsJiZsWzNdIT09Yyl7Zm9yKHUvPTIsYz1jfHxsWzNdLGw9K3V8fDE7YS0tOylTLnN0eWxlKHQsZSxsK2MpLCgxLWkpKigxLShpPXMoKS91fHwuNSkpPD0wJiYoYT0wKSxsLz1pO2wqPTIsUy5zdHlsZSh0LGUsbCtjKSxuPW58fFtdfXJldHVybiBuJiYobD0rbHx8K3V8fDAsbz1uWzFdP2wrKG5bMV0rMSkqblsyXTorblsyXSxyJiYoci51bml0PWMsci5zdGFydD1sLHIuZW5kPW8pKSxvfXZhciBwdD17fTtmdW5jdGlvbiBodCh0KXt2YXIgZSxuPXQub3duZXJEb2N1bWVudCxyPXQubm9kZU5hbWUsbz1wdFtyXTtyZXR1cm4gb3x8KGU9bi5ib2R5LmFwcGVuZENoaWxkKG4uY3JlYXRlRWxlbWVudChyKSksbz1TLmNzcyhlLCJkaXNwbGF5IiksZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLCJub25lIj09PW8mJihvPSJibG9jayIpLHB0W3JdPW8sbyl9ZnVuY3Rpb24gZHQodCxlKXtmb3IodmFyIG4scixvPVtdLGk9MCxhPXQubGVuZ3RoO2k8YTtpKyspKHI9dFtpXSkuc3R5bGUmJihuPXIuc3R5bGUuZGlzcGxheSxlPygibm9uZSI9PT1uJiYob1tpXT1RLmdldChyLCJkaXNwbGF5Iil8fG51bGwsb1tpXXx8KHIuc3R5bGUuZGlzcGxheT0iIikpLCIiPT09ci5zdHlsZS5kaXNwbGF5JiZjdChyKSYmKG9baV09aHQocikpKToibm9uZSIhPT1uJiYob1tpXT0ibm9uZSIsUS5zZXQociwiZGlzcGxheSIsbikpKTtmb3IoaT0wO2k8YTtpKyspbnVsbCE9b1tpXSYmKHRbaV0uc3R5bGUuZGlzcGxheT1vW2ldKTtyZXR1cm4gdH1TLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiBkdCh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBkdCh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHQ/dD90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtjdCh0aGlzKT9TKHRoaXMpLnNob3coKTpTKHRoaXMpLmhpZGUoKX0pfX0pO3ZhciBndD0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSx2dD0vPChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKikvaSx5dD0vXiR8Xm1vZHVsZSR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksbXQ9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtmdW5jdGlvbiBidCh0LGUpe3ZhciBuO3JldHVybiBuPXZvaWQgMCE9PXQuZ2V0RWxlbWVudHNCeVRhZ05hbWU/dC5nZXRFbGVtZW50c0J5VGFnTmFtZShlfHwiKiIpOnZvaWQgMCE9PXQucXVlcnlTZWxlY3RvckFsbD90LnF1ZXJ5U2VsZWN0b3JBbGwoZXx8IioiKTpbXSx2b2lkIDA9PT1lfHxlJiZMKHQsZSk/Uy5tZXJnZShbdF0sbik6bn1mdW5jdGlvbiB4dCh0LGUpe2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylRLnNldCh0W25dLCJnbG9iYWxFdmFsIiwhZXx8US5nZXQoZVtuXSwiZ2xvYmFsRXZhbCIpKX1tdC5vcHRncm91cD1tdC5vcHRpb24sbXQudGJvZHk9bXQudGZvb3Q9bXQuY29sZ3JvdXA9bXQuY2FwdGlvbj1tdC50aGVhZCxtdC50aD1tdC50ZDt2YXIgd3Qsa3QsU3Q9Lzx8JiM/XHcrOy87ZnVuY3Rpb24gRXQodCxlLG4scixvKXtmb3IodmFyIGksYSxzLHUsYyxsLGY9ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxoPTAsZD10Lmxlbmd0aDtoPGQ7aCsrKWlmKChpPXRbaF0pfHwwPT09aSlpZigib2JqZWN0Ij09PWsoaSkpUy5tZXJnZShwLGkubm9kZVR5cGU/W2ldOmkpO2Vsc2UgaWYoU3QudGVzdChpKSl7Zm9yKGE9YXx8Zi5hcHBlbmRDaGlsZChlLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxzPSh2dC5leGVjKGkpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLHU9bXRbc118fG10Ll9kZWZhdWx0LGEuaW5uZXJIVE1MPXVbMV0rUy5odG1sUHJlZmlsdGVyKGkpK3VbMl0sbD11WzBdO2wtLTspYT1hLmxhc3RDaGlsZDtTLm1lcmdlKHAsYS5jaGlsZE5vZGVzKSwoYT1mLmZpcnN0Q2hpbGQpLnRleHRDb250ZW50PSIifWVsc2UgcC5wdXNoKGUuY3JlYXRlVGV4dE5vZGUoaSkpO2ZvcihmLnRleHRDb250ZW50PSIiLGg9MDtpPXBbaCsrXTspaWYociYmUy5pbkFycmF5KGkscik+LTEpbyYmby5wdXNoKGkpO2Vsc2UgaWYoYz1zdChpKSxhPWJ0KGYuYXBwZW5kQ2hpbGQoaSksInNjcmlwdCIpLGMmJnh0KGEpLG4pZm9yKGw9MDtpPWFbbCsrXTspeXQudGVzdChpLnR5cGV8fCIiKSYmbi5wdXNoKGkpO3JldHVybiBmfXd0PWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudCgiZGl2IikpLChrdD1hLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksa3Quc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLGt0LnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSx3dC5hcHBlbmRDaGlsZChrdCkseS5jaGVja0Nsb25lPXd0LmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCx3dC5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLHkubm9DbG9uZUNoZWNrZWQ9ISF3dC5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWU7dmFyIFR0PS9ea2V5LyxqdD0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wKXxjbGljay8sQXQ9L14oW14uXSopKD86XC4oLispfCkvO2Z1bmN0aW9uIE90KCl7cmV0dXJuITB9ZnVuY3Rpb24gQ3QoKXtyZXR1cm4hMX1mdW5jdGlvbiBMdCh0LGUpe3JldHVybiB0PT09ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGEuYWN0aXZlRWxlbWVudH1jYXRjaCh0KXt9fSgpPT0oImZvY3VzIj09PWUpfWZ1bmN0aW9uIFJ0KHQsZSxuLHIsbyxpKXt2YXIgYSxzO2lmKCJvYmplY3QiPT10eXBlb2YgZSl7Zm9yKHMgaW4ic3RyaW5nIiE9dHlwZW9mIG4mJihyPXJ8fG4sbj12b2lkIDApLGUpUnQodCxzLG4scixlW3NdLGkpO3JldHVybiB0fWlmKG51bGw9PXImJm51bGw9PW8/KG89bixyPW49dm9pZCAwKTpudWxsPT1vJiYoInN0cmluZyI9PXR5cGVvZiBuPyhvPXIscj12b2lkIDApOihvPXIscj1uLG49dm9pZCAwKSksITE9PT1vKW89Q3Q7ZWxzZSBpZighbylyZXR1cm4gdDtyZXR1cm4gMT09PWkmJihhPW8sKG89ZnVuY3Rpb24odCl7cmV0dXJuIFMoKS5vZmYodCksYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KS5ndWlkPWEuZ3VpZHx8KGEuZ3VpZD1TLmd1aWQrKykpLHQuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQuYWRkKHRoaXMsZSxvLHIsbil9KX1mdW5jdGlvbiBQdCh0LGUsbil7bj8oUS5zZXQodCxlLCExKSxTLmV2ZW50LmFkZCh0LGUse25hbWVzcGFjZTohMSxoYW5kbGVyOmZ1bmN0aW9uKHQpe3ZhciByLG8saT1RLmdldCh0aGlzLGUpO2lmKDEmdC5pc1RyaWdnZXImJnRoaXNbZV0pe2lmKGkubGVuZ3RoKShTLmV2ZW50LnNwZWNpYWxbZV18fHt9KS5kZWxlZ2F0ZVR5cGUmJnQuc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZihpPXUuY2FsbChhcmd1bWVudHMpLFEuc2V0KHRoaXMsZSxpKSxyPW4odGhpcyxlKSx0aGlzW2VdKCksaSE9PShvPVEuZ2V0KHRoaXMsZSkpfHxyP1Euc2V0KHRoaXMsZSwhMSk6bz17fSxpIT09bylyZXR1cm4gdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0LnByZXZlbnREZWZhdWx0KCksby52YWx1ZX1lbHNlIGkubGVuZ3RoJiYoUS5zZXQodGhpcyxlLHt2YWx1ZTpTLmV2ZW50LnRyaWdnZXIoUy5leHRlbmQoaVswXSxTLkV2ZW50LnByb3RvdHlwZSksaS5zbGljZSgxKSx0aGlzKX0pLHQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfX0pKTp2b2lkIDA9PT1RLmdldCh0LGUpJiZTLmV2ZW50LmFkZCh0LGUsT3QpfVMuZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaSxhLHMsdSxjLGwsZixwLGgsZCxnLHY9US5nZXQodCk7aWYodilmb3Iobi5oYW5kbGVyJiYobj0oaT1uKS5oYW5kbGVyLG89aS5zZWxlY3RvciksbyYmUy5maW5kLm1hdGNoZXNTZWxlY3RvcihhdCxvKSxuLmd1aWR8fChuLmd1aWQ9Uy5ndWlkKyspLCh1PXYuZXZlbnRzKXx8KHU9di5ldmVudHM9e30pLChhPXYuaGFuZGxlKXx8KGE9di5oYW5kbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PVMmJlMuZXZlbnQudHJpZ2dlcmVkIT09ZS50eXBlP1MuZXZlbnQuZGlzcGF0Y2guYXBwbHkodCxhcmd1bWVudHMpOnZvaWQgMH0pLGM9KGU9KGV8fCIiKS5tYXRjaChVKXx8WyIiXSkubGVuZ3RoO2MtLTspaD1nPShzPUF0LmV4ZWMoZVtjXSl8fFtdKVsxXSxkPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksaCYmKGY9Uy5ldmVudC5zcGVjaWFsW2hdfHx7fSxoPShvP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxoLGY9Uy5ldmVudC5zcGVjaWFsW2hdfHx7fSxsPVMuZXh0ZW5kKHt0eXBlOmgsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOm8sbmVlZHNDb250ZXh0Om8mJlMuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChvKSxuYW1lc3BhY2U6ZC5qb2luKCIuIil9LGkpLChwPXVbaF0pfHwoKHA9dVtoXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKHQscixkLGEpfHx0LmFkZEV2ZW50TGlzdGVuZXImJnQuYWRkRXZlbnRMaXN0ZW5lcihoLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwodCxsKSxsLmhhbmRsZXIuZ3VpZHx8KGwuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLG8/cC5zcGxpY2UocC5kZWxlZ2F0ZUNvdW50KyssMCxsKTpwLnB1c2gobCksUy5ldmVudC5nbG9iYWxbaF09ITApfSxyZW1vdmU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaSxhLHMsdSxjLGwsZixwLGgsZCxnLHY9US5oYXNEYXRhKHQpJiZRLmdldCh0KTtpZih2JiYodT12LmV2ZW50cykpe2ZvcihjPShlPShlfHwiIikubWF0Y2goVSl8fFsiIl0pLmxlbmd0aDtjLS07KWlmKGg9Zz0ocz1BdC5leGVjKGVbY10pfHxbXSlbMV0sZD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGgpe2ZvcihmPVMuZXZlbnQuc3BlY2lhbFtoXXx8e30scD11W2g9KHI/Zi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGhdfHxbXSxzPXNbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK2Quam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksYT1pPXAubGVuZ3RoO2ktLTspbD1wW2ldLCFvJiZnIT09bC5vcmlnVHlwZXx8biYmbi5ndWlkIT09bC5ndWlkfHxzJiYhcy50ZXN0KGwubmFtZXNwYWNlKXx8ciYmciE9PWwuc2VsZWN0b3ImJigiKioiIT09cnx8IWwuc2VsZWN0b3IpfHwocC5zcGxpY2UoaSwxKSxsLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxmLnJlbW92ZSYmZi5yZW1vdmUuY2FsbCh0LGwpKTthJiYhcC5sZW5ndGgmJihmLnRlYXJkb3duJiYhMSE9PWYudGVhcmRvd24uY2FsbCh0LGQsdi5oYW5kbGUpfHxTLnJlbW92ZUV2ZW50KHQsaCx2LmhhbmRsZSksZGVsZXRlIHVbaF0pfWVsc2UgZm9yKGggaW4gdSlTLmV2ZW50LnJlbW92ZSh0LGgrZVtjXSxuLHIsITApO1MuaXNFbXB0eU9iamVjdCh1KSYmUS5yZW1vdmUodCwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhLHM9Uy5ldmVudC5maXgodCksdT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksYz0oUS5nZXQodGhpcywiZXZlbnRzIil8fHt9KVtzLnR5cGVdfHxbXSxsPVMuZXZlbnQuc3BlY2lhbFtzLnR5cGVdfHx7fTtmb3IodVswXT1zLGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXVbZV09YXJndW1lbnRzW2VdO2lmKHMuZGVsZWdhdGVUYXJnZXQ9dGhpcywhbC5wcmVEaXNwYXRjaHx8ITEhPT1sLnByZURpc3BhdGNoLmNhbGwodGhpcyxzKSl7Zm9yKGE9Uy5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMscyxjKSxlPTA7KG89YVtlKytdKSYmIXMuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTspZm9yKHMuY3VycmVudFRhcmdldD1vLmVsZW0sbj0wOyhpPW8uaGFuZGxlcnNbbisrXSkmJiFzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7KXMucm5hbWVzcGFjZSYmITEhPT1pLm5hbWVzcGFjZSYmIXMucm5hbWVzcGFjZS50ZXN0KGkubmFtZXNwYWNlKXx8KHMuaGFuZGxlT2JqPWkscy5kYXRhPWkuZGF0YSx2b2lkIDAhPT0ocj0oKFMuZXZlbnQuc3BlY2lhbFtpLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8aS5oYW5kbGVyKS5hcHBseShvLmVsZW0sdSkpJiYhMT09PShzLnJlc3VsdD1yKSYmKHMucHJldmVudERlZmF1bHQoKSxzLnN0b3BQcm9wYWdhdGlvbigpKSk7cmV0dXJuIGwucG9zdERpc3BhdGNoJiZsLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMscykscy5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbyxpLGEscz1bXSx1PWUuZGVsZWdhdGVDb3VudCxjPXQudGFyZ2V0O2lmKHUmJmMubm9kZVR5cGUmJiEoImNsaWNrIj09PXQudHlwZSYmdC5idXR0b24+PTEpKWZvcig7YyE9PXRoaXM7Yz1jLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWMubm9kZVR5cGUmJigiY2xpY2siIT09dC50eXBlfHwhMCE9PWMuZGlzYWJsZWQpKXtmb3IoaT1bXSxhPXt9LG49MDtuPHU7bisrKXZvaWQgMD09PWFbbz0ocj1lW25dKS5zZWxlY3RvcisiICJdJiYoYVtvXT1yLm5lZWRzQ29udGV4dD9TKG8sdGhpcykuaW5kZXgoYyk+LTE6Uy5maW5kKG8sdGhpcyxudWxsLFtjXSkubGVuZ3RoKSxhW29dJiZpLnB1c2gocik7aS5sZW5ndGgmJnMucHVzaCh7ZWxlbTpjLGhhbmRsZXJzOml9KX1yZXR1cm4gYz10aGlzLHU8ZS5sZW5ndGgmJnMucHVzaCh7ZWxlbTpjLGhhbmRsZXJzOmUuc2xpY2UodSl9KSxzfSxhZGRQcm9wOmZ1bmN0aW9uKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KFMuRXZlbnQucHJvdG90eXBlLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDptKGUpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiBlKHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbdF19LHNldDpmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSl9fSl9LGZpeDpmdW5jdGlvbih0KXtyZXR1cm4gdFtTLmV4cGFuZG9dP3Q6bmV3IFMuRXZlbnQodCl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxjbGljazp7c2V0dXA6ZnVuY3Rpb24odCl7dmFyIGU9dGhpc3x8dDtyZXR1cm4gZ3QudGVzdChlLnR5cGUpJiZlLmNsaWNrJiZMKGUsImlucHV0IikmJlB0KGUsImNsaWNrIixPdCksITF9LHRyaWdnZXI6ZnVuY3Rpb24odCl7dmFyIGU9dGhpc3x8dDtyZXR1cm4gZ3QudGVzdChlLnR5cGUpJiZlLmNsaWNrJiZMKGUsImlucHV0IikmJlB0KGUsImNsaWNrIiksITB9LF9kZWZhdWx0OmZ1bmN0aW9uKHQpe3ZhciBlPXQudGFyZ2V0O3JldHVybiBndC50ZXN0KGUudHlwZSkmJmUuY2xpY2smJkwoZSwiaW5wdXQiKSYmUS5nZXQoZSwiY2xpY2siKXx8TChlLCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbih0KXt2b2lkIDAhPT10LnJlc3VsdCYmdC5vcmlnaW5hbEV2ZW50JiYodC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPXQucmVzdWx0KX19fX0sUy5yZW1vdmVFdmVudD1mdW5jdGlvbih0LGUsbil7dC5yZW1vdmVFdmVudExpc3RlbmVyJiZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxuKX0sUy5FdmVudD1mdW5jdGlvbih0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFMuRXZlbnQpKXJldHVybiBuZXcgUy5FdmVudCh0LGUpO3QmJnQudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PXQsdGhpcy50eXBlPXQudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD10LmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PXQuZGVmYXVsdFByZXZlbnRlZCYmITE9PT10LnJldHVyblZhbHVlP090OkN0LHRoaXMudGFyZ2V0PXQudGFyZ2V0JiYzPT09dC50YXJnZXQubm9kZVR5cGU/dC50YXJnZXQucGFyZW50Tm9kZTp0LnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9dC5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD10LnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT10LGUmJlMuZXh0ZW5kKHRoaXMsZSksdGhpcy50aW1lU3RhbXA9dCYmdC50aW1lU3RhbXB8fERhdGUubm93KCksdGhpc1tTLmV4cGFuZG9dPSEwfSxTLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6Uy5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6Q3QsaXNQcm9wYWdhdGlvblN0b3BwZWQ6Q3QsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6Q3QsaXNTaW11bGF0ZWQ6ITEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9T3QsdCYmIXRoaXMuaXNTaW11bGF0ZWQmJnQucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9T3QsdCYmIXRoaXMuaXNTaW11bGF0ZWQmJnQuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPU90LHQmJiF0aGlzLmlzU2ltdWxhdGVkJiZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSxTLmVhY2goe2FsdEtleTohMCxidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY2hhbmdlZFRvdWNoZXM6ITAsY3RybEtleTohMCxkZXRhaWw6ITAsZXZlbnRQaGFzZTohMCxtZXRhS2V5OiEwLHBhZ2VYOiEwLHBhZ2VZOiEwLHNoaWZ0S2V5OiEwLHZpZXc6ITAsY2hhcjohMCxjb2RlOiEwLGNoYXJDb2RlOiEwLGtleTohMCxrZXlDb2RlOiEwLGJ1dHRvbjohMCxidXR0b25zOiEwLGNsaWVudFg6ITAsY2xpZW50WTohMCxvZmZzZXRYOiEwLG9mZnNldFk6ITAscG9pbnRlcklkOiEwLHBvaW50ZXJUeXBlOiEwLHNjcmVlblg6ITAsc2NyZWVuWTohMCx0YXJnZXRUb3VjaGVzOiEwLHRvRWxlbWVudDohMCx0b3VjaGVzOiEwLHdoaWNoOmZ1bmN0aW9uKHQpe3ZhciBlPXQuYnV0dG9uO3JldHVybiBudWxsPT10LndoaWNoJiZUdC50ZXN0KHQudHlwZSk/bnVsbCE9dC5jaGFyQ29kZT90LmNoYXJDb2RlOnQua2V5Q29kZTohdC53aGljaCYmdm9pZCAwIT09ZSYmanQudGVzdCh0LnR5cGUpPzEmZT8xOjImZT8zOjQmZT8yOjA6dC53aGljaH19LFMuZXZlbnQuYWRkUHJvcCksUy5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbih0LGUpe1MuZXZlbnQuc3BlY2lhbFt0XT17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gUHQodGhpcyx0LEx0KSwhMX0sdHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBQdCh0aGlzLHQpLCEwfSxkZWxlZ2F0ZVR5cGU6ZX19KSxTLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQiLHBvaW50ZXJlbnRlcjoicG9pbnRlcm92ZXIiLHBvaW50ZXJsZWF2ZToicG9pbnRlcm91dCJ9LGZ1bmN0aW9uKHQsZSl7Uy5ldmVudC5zcGVjaWFsW3RdPXtkZWxlZ2F0ZVR5cGU6ZSxiaW5kVHlwZTplLGhhbmRsZTpmdW5jdGlvbih0KXt2YXIgbixyPXRoaXMsbz10LnJlbGF0ZWRUYXJnZXQsaT10LmhhbmRsZU9iajtyZXR1cm4gbyYmKG89PT1yfHxTLmNvbnRhaW5zKHIsbykpfHwodC50eXBlPWkub3JpZ1R5cGUsbj1pLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQudHlwZT1lKSxufX19KSxTLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIFJ0KHRoaXMsdCxlLG4scil9LG9uZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gUnQodGhpcyx0LGUsbixyLDEpfSxvZmY6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG87aWYodCYmdC5wcmV2ZW50RGVmYXVsdCYmdC5oYW5kbGVPYmopcmV0dXJuIHI9dC5oYW5kbGVPYmosUyh0LmRlbGVnYXRlVGFyZ2V0KS5vZmYoci5uYW1lc3BhY2U/ci5vcmlnVHlwZSsiLiIrci5uYW1lc3BhY2U6ci5vcmlnVHlwZSxyLnNlbGVjdG9yLHIuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIHQpe2ZvcihvIGluIHQpdGhpcy5vZmYobyxlLHRbb10pO3JldHVybiB0aGlzfXJldHVybiExIT09ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGV8fChuPWUsZT12b2lkIDApLCExPT09biYmKG49Q3QpLHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQucmVtb3ZlKHRoaXMsdCxuLGUpfSl9fSk7dmFyIE50PS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKVtePl0qKVwvPi9naSxJdD0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxEdD0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxfdD0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2c7ZnVuY3Rpb24gTXQodCxlKXtyZXR1cm4gTCh0LCJ0YWJsZSIpJiZMKDExIT09ZS5ub2RlVHlwZT9lOmUuZmlyc3RDaGlsZCwidHIiKSYmUyh0KS5jaGlsZHJlbigidGJvZHkiKVswXXx8dH1mdW5jdGlvbiBVdCh0KXtyZXR1cm4gdC50eXBlPShudWxsIT09dC5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK3QudHlwZSx0fWZ1bmN0aW9uIEJ0KHQpe3JldHVybiJ0cnVlLyI9PT0odC50eXBlfHwiIikuc2xpY2UoMCw1KT90LnR5cGU9dC50eXBlLnNsaWNlKDUpOnQucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksdH1mdW5jdGlvbiBxdCh0LGUpe3ZhciBuLHIsbyxpLGEscyx1LGM7aWYoMT09PWUubm9kZVR5cGUpe2lmKFEuaGFzRGF0YSh0KSYmKGk9US5hY2Nlc3ModCksYT1RLnNldChlLGkpLGM9aS5ldmVudHMpKWZvcihvIGluIGRlbGV0ZSBhLmhhbmRsZSxhLmV2ZW50cz17fSxjKWZvcihuPTAscj1jW29dLmxlbmd0aDtuPHI7bisrKVMuZXZlbnQuYWRkKGUsbyxjW29dW25dKTtaLmhhc0RhdGEodCkmJihzPVouYWNjZXNzKHQpLHU9Uy5leHRlbmQoe30scyksWi5zZXQoZSx1KSl9fWZ1bmN0aW9uIEZ0KHQsZSl7dmFyIG49ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyJpbnB1dCI9PT1uJiZndC50ZXN0KHQudHlwZSk/ZS5jaGVja2VkPXQuY2hlY2tlZDoiaW5wdXQiIT09biYmInRleHRhcmVhIiE9PW58fChlLmRlZmF1bHRWYWx1ZT10LmRlZmF1bHRWYWx1ZSl9ZnVuY3Rpb24gSHQodCxlLG4scil7ZT1jLmFwcGx5KFtdLGUpO3ZhciBvLGksYSxzLHUsbCxmPTAscD10Lmxlbmd0aCxoPXAtMSxkPWVbMF0sZz1tKGQpO2lmKGd8fHA+MSYmInN0cmluZyI9PXR5cGVvZiBkJiYheS5jaGVja0Nsb25lJiZEdC50ZXN0KGQpKXJldHVybiB0LmVhY2goZnVuY3Rpb24obyl7dmFyIGk9dC5lcShvKTtnJiYoZVswXT1kLmNhbGwodGhpcyxvLGkuaHRtbCgpKSksSHQoaSxlLG4scil9KTtpZihwJiYoaT0obz1FdChlLHRbMF0ub3duZXJEb2N1bWVudCwhMSx0LHIpKS5maXJzdENoaWxkLDE9PT1vLmNoaWxkTm9kZXMubGVuZ3RoJiYobz1pKSxpfHxyKSl7Zm9yKHM9KGE9Uy5tYXAoYnQobywic2NyaXB0IiksVXQpKS5sZW5ndGg7ZjxwO2YrKyl1PW8sZiE9PWgmJih1PVMuY2xvbmUodSwhMCwhMCkscyYmUy5tZXJnZShhLGJ0KHUsInNjcmlwdCIpKSksbi5jYWxsKHRbZl0sdSxmKTtpZihzKWZvcihsPWFbYS5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxTLm1hcChhLEJ0KSxmPTA7ZjxzO2YrKyl1PWFbZl0seXQudGVzdCh1LnR5cGV8fCIiKSYmIVEuYWNjZXNzKHUsImdsb2JhbEV2YWwiKSYmUy5jb250YWlucyhsLHUpJiYodS5zcmMmJiJtb2R1bGUiIT09KHUudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk/Uy5fZXZhbFVybCYmIXUubm9Nb2R1bGUmJlMuX2V2YWxVcmwodS5zcmMse25vbmNlOnUubm9uY2V8fHUuZ2V0QXR0cmlidXRlKCJub25jZSIpfSk6dyh1LnRleHRDb250ZW50LnJlcGxhY2UoX3QsIiIpLHUsbCkpfXJldHVybiB0fWZ1bmN0aW9uIHp0KHQsZSxuKXtmb3IodmFyIHIsbz1lP1MuZmlsdGVyKGUsdCk6dCxpPTA7bnVsbCE9KHI9b1tpXSk7aSsrKW58fDEhPT1yLm5vZGVUeXBlfHxTLmNsZWFuRGF0YShidChyKSksci5wYXJlbnROb2RlJiYobiYmc3QocikmJnh0KGJ0KHIsInNjcmlwdCIpKSxyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpO3JldHVybiB0fVMuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoTnQsIjwkMT48LyQyPiIpfSxjbG9uZTpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGEscz10LmNsb25lTm9kZSghMCksdT1zdCh0KTtpZighKHkubm9DbG9uZUNoZWNrZWR8fDEhPT10Lm5vZGVUeXBlJiYxMSE9PXQubm9kZVR5cGV8fFMuaXNYTUxEb2ModCkpKWZvcihhPWJ0KHMpLHI9MCxvPShpPWJ0KHQpKS5sZW5ndGg7cjxvO3IrKylGdChpW3JdLGFbcl0pO2lmKGUpaWYobilmb3IoaT1pfHxidCh0KSxhPWF8fGJ0KHMpLHI9MCxvPWkubGVuZ3RoO3I8bztyKyspcXQoaVtyXSxhW3JdKTtlbHNlIHF0KHQscyk7cmV0dXJuKGE9YnQocywic2NyaXB0IikpLmxlbmd0aD4wJiZ4dChhLCF1JiZidCh0LCJzY3JpcHQiKSksc30sY2xlYW5EYXRhOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuLHIsbz1TLmV2ZW50LnNwZWNpYWwsaT0wO3ZvaWQgMCE9PShuPXRbaV0pO2krKylpZihYKG4pKXtpZihlPW5bUS5leHBhbmRvXSl7aWYoZS5ldmVudHMpZm9yKHIgaW4gZS5ldmVudHMpb1tyXT9TLmV2ZW50LnJlbW92ZShuLHIpOlMucmVtb3ZlRXZlbnQobixyLGUuaGFuZGxlKTtuW1EuZXhwYW5kb109dm9pZCAwfW5bWi5leHBhbmRvXSYmKG5bWi5leHBhbmRvXT12b2lkIDApfX19KSxTLmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKHQpe3JldHVybiB6dCh0aGlzLHQsITApfSxyZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHp0KHRoaXMsdCl9LHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuICQodGhpcyxmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dD9TLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9dCl9KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24odCl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fE10KHRoaXMsdCkuYXBwZW5kQ2hpbGQodCl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGU9TXQodGhpcyx0KTtlLmluc2VydEJlZm9yZSh0LGUuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodCx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodCx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgdCxlPTA7bnVsbCE9KHQ9dGhpc1tlXSk7ZSsrKTE9PT10Lm5vZGVUeXBlJiYoUy5jbGVhbkRhdGEoYnQodCwhMSkpLHQudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbih0LGUpe3JldHVybiB0PW51bGwhPXQmJnQsZT1udWxsPT1lP3Q6ZSx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBTLmNsb25lKHRoaXMsdCxlKX0pfSxodG1sOmZ1bmN0aW9uKHQpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24odCl7dmFyIGU9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09dCYmMT09PWUubm9kZVR5cGUpcmV0dXJuIGUuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgdCYmIUl0LnRlc3QodCkmJiFtdFsodnQuZXhlYyh0KXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe3Q9Uy5odG1sUHJlZmlsdGVyKHQpO3RyeXtmb3IoO248cjtuKyspMT09PShlPXRoaXNbbl18fHt9KS5ub2RlVHlwZSYmKFMuY2xlYW5EYXRhKGJ0KGUsITEpKSxlLmlubmVySFRNTD10KTtlPTB9Y2F0Y2godCl7fX1lJiZ0aGlzLmVtcHR5KCkuYXBwZW5kKHQpfSxudWxsLHQsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIEh0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMucGFyZW50Tm9kZTtTLmluQXJyYXkodGhpcyx0KTwwJiYoUy5jbGVhbkRhdGEoYnQodGhpcykpLG4mJm4ucmVwbGFjZUNoaWxkKGUsdGhpcykpfSx0KX19KSxTLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbih0LGUpe1MuZm5bdF09ZnVuY3Rpb24odCl7Zm9yKHZhciBuLHI9W10sbz1TKHQpLGk9by5sZW5ndGgtMSxhPTA7YTw9aTthKyspbj1hPT09aT90aGlzOnRoaXMuY2xvbmUoITApLFMob1thXSlbZV0obiksbC5hcHBseShyLG4uZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhyKX19KTt2YXIgV3Q9bmV3IFJlZ0V4cCgiXigiK3J0KyIpKD8hcHgpW2EteiVdKyQiLCJpIiksJHQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiBlJiZlLm9wZW5lcnx8KGU9biksZS5nZXRDb21wdXRlZFN0eWxlKHQpfSxZdD1uZXcgUmVnRXhwKGl0LmpvaW4oInwiKSwiaSIpO2Z1bmN0aW9uIFZ0KHQsZSxuKXt2YXIgcixvLGksYSxzPXQuc3R5bGU7cmV0dXJuKG49bnx8JHQodCkpJiYoIiIhPT0oYT1uLmdldFByb3BlcnR5VmFsdWUoZSl8fG5bZV0pfHxzdCh0KXx8KGE9Uy5zdHlsZSh0LGUpKSwheS5waXhlbEJveFN0eWxlcygpJiZXdC50ZXN0KGEpJiZZdC50ZXN0KGUpJiYocj1zLndpZHRoLG89cy5taW5XaWR0aCxpPXMubWF4V2lkdGgscy5taW5XaWR0aD1zLm1heFdpZHRoPXMud2lkdGg9YSxhPW4ud2lkdGgscy53aWR0aD1yLHMubWluV2lkdGg9byxzLm1heFdpZHRoPWkpKSx2b2lkIDAhPT1hP2ErIiI6YX1mdW5jdGlvbiBHdCh0LGUpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtpZighdCgpKXJldHVybih0aGlzLmdldD1lKS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZGVsZXRlIHRoaXMuZ2V0fX19IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2lmKGwpe2Muc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O21hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MCIsbC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo2MCU7dG9wOjElIixhdC5hcHBlbmRDaGlsZChjKS5hcHBlbmRDaGlsZChsKTt2YXIgdD1uLmdldENvbXB1dGVkU3R5bGUobCk7cj0iMSUiIT09dC50b3AsdT0xMj09PWUodC5tYXJnaW5MZWZ0KSxsLnN0eWxlLnJpZ2h0PSI2MCUiLHM9MzY9PT1lKHQucmlnaHQpLG89MzY9PT1lKHQud2lkdGgpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixpPTEyPT09ZShsLm9mZnNldFdpZHRoLzMpLGF0LnJlbW92ZUNoaWxkKGMpLGw9bnVsbH19ZnVuY3Rpb24gZSh0KXtyZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHQpKX12YXIgcixvLGkscyx1LGM9YS5jcmVhdGVFbGVtZW50KCJkaXYiKSxsPWEuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5zdHlsZSYmKGwuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixsLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIseS5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWwuc3R5bGUuYmFja2dyb3VuZENsaXAsUy5leHRlbmQoeSx7Ym94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLG99LHBpeGVsQm94U3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxzfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxyfSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHV9LHNjcm9sbGJveFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLGl9fSkpfSgpO3ZhciBLdD1bIldlYmtpdCIsIk1veiIsIm1zIl0sWHQ9YS5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZSxKdD17fTtmdW5jdGlvbiBRdCh0KXt2YXIgZT1TLmNzc1Byb3BzW3RdfHxKdFt0XTtyZXR1cm4gZXx8KHQgaW4gWHQ/dDpKdFt0XT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSksbj1LdC5sZW5ndGg7bi0tOylpZigodD1LdFtuXStlKWluIFh0KXJldHVybiB0fSh0KXx8dCl9dmFyIFp0PS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyx0ZT0vXi0tLyxlZT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sbmU9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9O2Z1bmN0aW9uIHJlKHQsZSxuKXt2YXIgcj1vdC5leGVjKGUpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHwicHgiKTplfWZ1bmN0aW9uIG9lKHQsZSxuLHIsbyxpKXt2YXIgYT0id2lkdGgiPT09ZT8xOjAscz0wLHU9MDtpZihuPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKSJtYXJnaW4iPT09biYmKHUrPVMuY3NzKHQsbitpdFthXSwhMCxvKSkscj8oImNvbnRlbnQiPT09biYmKHUtPVMuY3NzKHQsInBhZGRpbmciK2l0W2FdLCEwLG8pKSwibWFyZ2luIiE9PW4mJih1LT1TLmNzcyh0LCJib3JkZXIiK2l0W2FdKyJXaWR0aCIsITAsbykpKToodSs9Uy5jc3ModCwicGFkZGluZyIraXRbYV0sITAsbyksInBhZGRpbmciIT09bj91Kz1TLmNzcyh0LCJib3JkZXIiK2l0W2FdKyJXaWR0aCIsITAsbyk6cys9Uy5jc3ModCwiYm9yZGVyIitpdFthXSsiV2lkdGgiLCEwLG8pKTtyZXR1cm4hciYmaT49MCYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKHRbIm9mZnNldCIrZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSldLWktdS1zLS41KSl8fDApLHV9ZnVuY3Rpb24gaWUodCxlLG4pe3ZhciByPSR0KHQpLG89KCF5LmJveFNpemluZ1JlbGlhYmxlKCl8fG4pJiYiYm9yZGVyLWJveCI9PT1TLmNzcyh0LCJib3hTaXppbmciLCExLHIpLGk9byxhPVZ0KHQsZSxyKSxzPSJvZmZzZXQiK2VbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpO2lmKFd0LnRlc3QoYSkpe2lmKCFuKXJldHVybiBhO2E9ImF1dG8ifXJldHVybigheS5ib3hTaXppbmdSZWxpYWJsZSgpJiZvfHwiYXV0byI9PT1hfHwhcGFyc2VGbG9hdChhKSYmImlubGluZSI9PT1TLmNzcyh0LCJkaXNwbGF5IiwhMSxyKSkmJnQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJihvPSJib3JkZXItYm94Ij09PVMuY3NzKHQsImJveFNpemluZyIsITEsciksKGk9cyBpbiB0KSYmKGE9dFtzXSkpLChhPXBhcnNlRmxvYXQoYSl8fDApK29lKHQsZSxufHwobz8iYm9yZGVyIjoiY29udGVudCIpLGkscixhKSsicHgifWZ1bmN0aW9uIGFlKHQsZSxuLHIsbyl7cmV0dXJuIG5ldyBhZS5wcm90b3R5cGUuaW5pdCh0LGUsbixyLG8pfVMuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKHQsZSl7aWYoZSl7dmFyIG49VnQodCwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsZ3JpZEFyZWE6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TdGFydDohMCxncmlkUm93OiEwLGdyaWRSb3dFbmQ6ITAsZ3JpZFJvd1N0YXJ0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6e30sc3R5bGU6ZnVuY3Rpb24odCxlLG4scil7aWYodCYmMyE9PXQubm9kZVR5cGUmJjghPT10Lm5vZGVUeXBlJiZ0LnN0eWxlKXt2YXIgbyxpLGEscz1LKGUpLHU9dGUudGVzdChlKSxjPXQuc3R5bGU7aWYodXx8KGU9UXQocykpLGE9Uy5jc3NIb29rc1tlXXx8Uy5jc3NIb29rc1tzXSx2b2lkIDA9PT1uKXJldHVybiBhJiYiZ2V0ImluIGEmJnZvaWQgMCE9PShvPWEuZ2V0KHQsITEscikpP286Y1tlXTsic3RyaW5nIj09PShpPXR5cGVvZiBuKSYmKG89b3QuZXhlYyhuKSkmJm9bMV0mJihuPWZ0KHQsZSxvKSxpPSJudW1iZXIiKSxudWxsIT1uJiZuPT1uJiYoIm51bWJlciIhPT1pfHx1fHwobis9byYmb1szXXx8KFMuY3NzTnVtYmVyW3NdPyIiOiJweCIpKSx5LmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1ufHwwIT09ZS5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fChjW2VdPSJpbmhlcml0IiksYSYmInNldCJpbiBhJiZ2b2lkIDA9PT0obj1hLnNldCh0LG4scikpfHwodT9jLnNldFByb3BlcnR5KGUsbik6Y1tlXT1uKSl9fSxjc3M6ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhLHM9SyhlKTtyZXR1cm4gdGUudGVzdChlKXx8KGU9UXQocykpLChhPVMuY3NzSG9va3NbZV18fFMuY3NzSG9va3Nbc10pJiYiZ2V0ImluIGEmJihvPWEuZ2V0KHQsITAsbikpLHZvaWQgMD09PW8mJihvPVZ0KHQsZSxyKSksIm5vcm1hbCI9PT1vJiZlIGluIG5lJiYobz1uZVtlXSksIiI9PT1ufHxuPyhpPXBhcnNlRmxvYXQobyksITA9PT1ufHxpc0Zpbml0ZShpKT9pfHwwOm8pOm99fSksUy5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbih0LGUpe1MuY3NzSG9va3NbZV09e2dldDpmdW5jdGlvbih0LG4scil7aWYobilyZXR1cm4hWnQudGVzdChTLmNzcyh0LCJkaXNwbGF5IikpfHx0LmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiZ0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoP2llKHQsZSxyKTpsdCh0LGVlLGZ1bmN0aW9uKCl7cmV0dXJuIGllKHQsZSxyKX0pfSxzZXQ6ZnVuY3Rpb24odCxuLHIpe3ZhciBvLGk9JHQodCksYT0heS5zY3JvbGxib3hTaXplKCkmJiJhYnNvbHV0ZSI9PT1pLnBvc2l0aW9uLHM9KGF8fHIpJiYiYm9yZGVyLWJveCI9PT1TLmNzcyh0LCJib3hTaXppbmciLCExLGkpLHU9cj9vZSh0LGUscixzLGkpOjA7cmV0dXJuIHMmJmEmJih1LT1NYXRoLmNlaWwodFsib2Zmc2V0IitlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKV0tcGFyc2VGbG9hdChpW2VdKS1vZSh0LGUsImJvcmRlciIsITEsaSktLjUpKSx1JiYobz1vdC5leGVjKG4pKSYmInB4IiE9PShvWzNdfHwicHgiKSYmKHQuc3R5bGVbZV09bixuPVMuY3NzKHQsZSkpLHJlKDAsbix1KX19fSksUy5jc3NIb29rcy5tYXJnaW5MZWZ0PUd0KHkucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKHQsZSl7aWYoZSlyZXR1cm4ocGFyc2VGbG9hdChWdCh0LCJtYXJnaW5MZWZ0IikpfHx0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtbHQodCx7bWFyZ2luTGVmdDowfSxmdW5jdGlvbigpe3JldHVybiB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9KSkrInB4In0pLFMuZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKHQsZSl7Uy5jc3NIb29rc1t0K2VdPXtleHBhbmQ6ZnVuY3Rpb24obil7Zm9yKHZhciByPTAsbz17fSxpPSJzdHJpbmciPT10eXBlb2Ygbj9uLnNwbGl0KCIgIik6W25dO3I8NDtyKyspb1t0K2l0W3JdK2VdPWlbcl18fGlbci0yXXx8aVswXTtyZXR1cm4gb319LCJtYXJnaW4iIT09dCYmKFMuY3NzSG9va3NbdCtlXS5zZXQ9cmUpfSksUy5mbi5leHRlbmQoe2NzczpmdW5jdGlvbih0LGUpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saT17fSxhPTA7aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHI9JHQodCksbz1lLmxlbmd0aDthPG87YSsrKWlbZVthXV09Uy5jc3ModCxlW2FdLCExLHIpO3JldHVybiBpfXJldHVybiB2b2lkIDAhPT1uP1Muc3R5bGUodCxlLG4pOlMuY3NzKHQsZSl9LHQsZSxhcmd1bWVudHMubGVuZ3RoPjEpfX0pLFMuVHdlZW49YWUsYWUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjphZSxpbml0OmZ1bmN0aW9uKHQsZSxuLHIsbyxpKXt0aGlzLmVsZW09dCx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1vfHxTLmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9ZSx0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9cix0aGlzLnVuaXQ9aXx8KFMuY3NzTnVtYmVyW25dPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgdD1hZS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdCYmdC5nZXQ/dC5nZXQodGhpcyk6YWUucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKHQpe3ZhciBlLG49YWUucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz1lPVMuZWFzaW5nW3RoaXMuZWFzaW5nXSh0LHRoaXMub3B0aW9ucy5kdXJhdGlvbip0LDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPWU9dCx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqZSt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTphZS5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxhZS5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9YWUucHJvdG90eXBlLGFlLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gMSE9PXQuZWxlbS5ub2RlVHlwZXx8bnVsbCE9dC5lbGVtW3QucHJvcF0mJm51bGw9PXQuZWxlbS5zdHlsZVt0LnByb3BdP3QuZWxlbVt0LnByb3BdOihlPVMuY3NzKHQuZWxlbSx0LnByb3AsIiIpKSYmImF1dG8iIT09ZT9lOjB9LHNldDpmdW5jdGlvbih0KXtTLmZ4LnN0ZXBbdC5wcm9wXT9TLmZ4LnN0ZXBbdC5wcm9wXSh0KToxIT09dC5lbGVtLm5vZGVUeXBlfHwhUy5jc3NIb29rc1t0LnByb3BdJiZudWxsPT10LmVsZW0uc3R5bGVbUXQodC5wcm9wKV0/dC5lbGVtW3QucHJvcF09dC5ub3c6Uy5zdHlsZSh0LmVsZW0sdC5wcm9wLHQubm93K3QudW5pdCl9fX0sYWUucHJvcEhvb2tzLnNjcm9sbFRvcD1hZS5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKHQpe3QuZWxlbS5ub2RlVHlwZSYmdC5lbGVtLnBhcmVudE5vZGUmJih0LmVsZW1bdC5wcm9wXT10Lm5vdyl9fSxTLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxzd2luZzpmdW5jdGlvbih0KXtyZXR1cm4uNS1NYXRoLmNvcyh0Kk1hdGguUEkpLzJ9LF9kZWZhdWx0OiJzd2luZyJ9LFMuZng9YWUucHJvdG90eXBlLmluaXQsUy5meC5zdGVwPXt9O3ZhciBzZSx1ZSxjZT0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sbGU9L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBmZSgpe3VlJiYoITE9PT1hLmhpZGRlbiYmbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/bi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZmUpOm4uc2V0VGltZW91dChmZSxTLmZ4LmludGVydmFsKSxTLmZ4LnRpY2soKSl9ZnVuY3Rpb24gcGUoKXtyZXR1cm4gbi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2U9dm9pZCAwfSksc2U9RGF0ZS5ub3coKX1mdW5jdGlvbiBoZSh0LGUpe3ZhciBuLHI9MCxvPXtoZWlnaHQ6dH07Zm9yKGU9ZT8xOjA7cjw0O3IrPTItZSlvWyJtYXJnaW4iKyhuPWl0W3JdKV09b1sicGFkZGluZyIrbl09dDtyZXR1cm4gZSYmKG8ub3BhY2l0eT1vLndpZHRoPXQpLG99ZnVuY3Rpb24gZGUodCxlLG4pe2Zvcih2YXIgcixvPShnZS50d2VlbmVyc1tlXXx8W10pLmNvbmNhdChnZS50d2VlbmVyc1siKiJdKSxpPTAsYT1vLmxlbmd0aDtpPGE7aSsrKWlmKHI9b1tpXS5jYWxsKG4sZSx0KSlyZXR1cm4gcn1mdW5jdGlvbiBnZSh0LGUsbil7dmFyIHIsbyxpPTAsYT1nZS5wcmVmaWx0ZXJzLmxlbmd0aCxzPVMuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgdS5lbGVtfSksdT1mdW5jdGlvbigpe2lmKG8pcmV0dXJuITE7Zm9yKHZhciBlPXNlfHxwZSgpLG49TWF0aC5tYXgoMCxjLnN0YXJ0VGltZStjLmR1cmF0aW9uLWUpLHI9MS0obi9jLmR1cmF0aW9ufHwwKSxpPTAsYT1jLnR3ZWVucy5sZW5ndGg7aTxhO2krKyljLnR3ZWVuc1tpXS5ydW4ocik7cmV0dXJuIHMubm90aWZ5V2l0aCh0LFtjLHIsbl0pLHI8MSYmYT9uOihhfHxzLm5vdGlmeVdpdGgodCxbYywxLDBdKSxzLnJlc29sdmVXaXRoKHQsW2NdKSwhMSl9LGM9cy5wcm9taXNlKHtlbGVtOnQscHJvcHM6Uy5leHRlbmQoe30sZSksb3B0czpTLmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fSxlYXNpbmc6Uy5lYXNpbmcuX2RlZmF1bHR9LG4pLG9yaWdpbmFsUHJvcGVydGllczplLG9yaWdpbmFsT3B0aW9uczpuLHN0YXJ0VGltZTpzZXx8cGUoKSxkdXJhdGlvbjpuLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihlLG4pe3ZhciByPVMuVHdlZW4odCxjLm9wdHMsZSxuLGMub3B0cy5zcGVjaWFsRWFzaW5nW2VdfHxjLm9wdHMuZWFzaW5nKTtyZXR1cm4gYy50d2VlbnMucHVzaChyKSxyfSxzdG9wOmZ1bmN0aW9uKGUpe3ZhciBuPTAscj1lP2MudHdlZW5zLmxlbmd0aDowO2lmKG8pcmV0dXJuIHRoaXM7Zm9yKG89ITA7bjxyO24rKyljLnR3ZWVuc1tuXS5ydW4oMSk7cmV0dXJuIGU/KHMubm90aWZ5V2l0aCh0LFtjLDEsMF0pLHMucmVzb2x2ZVdpdGgodCxbYyxlXSkpOnMucmVqZWN0V2l0aCh0LFtjLGVdKSx0aGlzfX0pLGw9Yy5wcm9wcztmb3IoIWZ1bmN0aW9uKHQsZSl7dmFyIG4scixvLGksYTtmb3IobiBpbiB0KWlmKG89ZVtyPUsobildLGk9dFtuXSxBcnJheS5pc0FycmF5KGkpJiYobz1pWzFdLGk9dFtuXT1pWzBdKSxuIT09ciYmKHRbcl09aSxkZWxldGUgdFtuXSksKGE9Uy5jc3NIb29rc1tyXSkmJiJleHBhbmQiaW4gYSlmb3IobiBpbiBpPWEuZXhwYW5kKGkpLGRlbGV0ZSB0W3JdLGkpbiBpbiB0fHwodFtuXT1pW25dLGVbbl09byk7ZWxzZSBlW3JdPW99KGwsYy5vcHRzLnNwZWNpYWxFYXNpbmcpO2k8YTtpKyspaWYocj1nZS5wcmVmaWx0ZXJzW2ldLmNhbGwoYyx0LGwsYy5vcHRzKSlyZXR1cm4gbShyLnN0b3ApJiYoUy5fcXVldWVIb29rcyhjLmVsZW0sYy5vcHRzLnF1ZXVlKS5zdG9wPXIuc3RvcC5iaW5kKHIpKSxyO3JldHVybiBTLm1hcChsLGRlLGMpLG0oYy5vcHRzLnN0YXJ0KSYmYy5vcHRzLnN0YXJ0LmNhbGwodCxjKSxjLnByb2dyZXNzKGMub3B0cy5wcm9ncmVzcykuZG9uZShjLm9wdHMuZG9uZSxjLm9wdHMuY29tcGxldGUpLmZhaWwoYy5vcHRzLmZhaWwpLmFsd2F5cyhjLm9wdHMuYWx3YXlzKSxTLmZ4LnRpbWVyKFMuZXh0ZW5kKHUse2VsZW06dCxhbmltOmMscXVldWU6Yy5vcHRzLnF1ZXVlfSkpLGN9Uy5BbmltYXRpb249Uy5leHRlbmQoZ2Use3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jcmVhdGVUd2Vlbih0LGUpO3JldHVybiBmdChuLmVsZW0sdCxvdC5leGVjKGUpLG4pLG59XX0sdHdlZW5lcjpmdW5jdGlvbih0LGUpe20odCk/KGU9dCx0PVsiKiJdKTp0PXQubWF0Y2goVSk7Zm9yKHZhciBuLHI9MCxvPXQubGVuZ3RoO3I8bztyKyspbj10W3JdLGdlLnR3ZWVuZXJzW25dPWdlLnR3ZWVuZXJzW25dfHxbXSxnZS50d2VlbmVyc1tuXS51bnNoaWZ0KGUpfSxwcmVmaWx0ZXJzOltmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGEscyx1LGMsbCxmPSJ3aWR0aCJpbiBlfHwiaGVpZ2h0ImluIGUscD10aGlzLGg9e30sZD10LnN0eWxlLGc9dC5ub2RlVHlwZSYmY3QodCksdj1RLmdldCh0LCJmeHNob3ciKTtmb3IociBpbiBuLnF1ZXVlfHwobnVsbD09KGE9Uy5fcXVldWVIb29rcyh0LCJmeCIpKS51bnF1ZXVlZCYmKGEudW5xdWV1ZWQ9MCxzPWEuZW1wdHkuZmlyZSxhLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXthLnVucXVldWVkfHxzKCl9KSxhLnVucXVldWVkKysscC5hbHdheXMoZnVuY3Rpb24oKXtwLmFsd2F5cyhmdW5jdGlvbigpe2EudW5xdWV1ZWQtLSxTLnF1ZXVlKHQsImZ4IikubGVuZ3RofHxhLmVtcHR5LmZpcmUoKX0pfSkpLGUpaWYobz1lW3JdLGNlLnRlc3Qobykpe2lmKGRlbGV0ZSBlW3JdLGk9aXx8InRvZ2dsZSI9PT1vLG89PT0oZz8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09b3x8IXZ8fHZvaWQgMD09PXZbcl0pY29udGludWU7Zz0hMH1oW3JdPXYmJnZbcl18fFMuc3R5bGUodCxyKX1pZigodT0hUy5pc0VtcHR5T2JqZWN0KGUpKXx8IVMuaXNFbXB0eU9iamVjdChoKSlmb3IociBpbiBmJiYxPT09dC5ub2RlVHlwZSYmKG4ub3ZlcmZsb3c9W2Qub3ZlcmZsb3csZC5vdmVyZmxvd1gsZC5vdmVyZmxvd1ldLG51bGw9PShjPXYmJnYuZGlzcGxheSkmJihjPVEuZ2V0KHQsImRpc3BsYXkiKSksIm5vbmUiPT09KGw9Uy5jc3ModCwiZGlzcGxheSIpKSYmKGM/bD1jOihkdChbdF0sITApLGM9dC5zdHlsZS5kaXNwbGF5fHxjLGw9Uy5jc3ModCwiZGlzcGxheSIpLGR0KFt0XSkpKSwoImlubGluZSI9PT1sfHwiaW5saW5lLWJsb2NrIj09PWwmJm51bGwhPWMpJiYibm9uZSI9PT1TLmNzcyh0LCJmbG9hdCIpJiYodXx8KHAuZG9uZShmdW5jdGlvbigpe2QuZGlzcGxheT1jfSksbnVsbD09YyYmKGw9ZC5kaXNwbGF5LGM9Im5vbmUiPT09bD8iIjpsKSksZC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKGQub3ZlcmZsb3c9ImhpZGRlbiIscC5hbHdheXMoZnVuY3Rpb24oKXtkLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0sZC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxkLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpLHU9ITEsaCl1fHwodj8iaGlkZGVuImluIHYmJihnPXYuaGlkZGVuKTp2PVEuYWNjZXNzKHQsImZ4c2hvdyIse2Rpc3BsYXk6Y30pLGkmJih2LmhpZGRlbj0hZyksZyYmZHQoW3RdLCEwKSxwLmRvbmUoZnVuY3Rpb24oKXtmb3IociBpbiBnfHxkdChbdF0pLFEucmVtb3ZlKHQsImZ4c2hvdyIpLGgpUy5zdHlsZSh0LHIsaFtyXSl9KSksdT1kZShnP3Zbcl06MCxyLHApLHIgaW4gdnx8KHZbcl09dS5zdGFydCxnJiYodS5lbmQ9dS5zdGFydCx1LnN0YXJ0PTApKX1dLHByZWZpbHRlcjpmdW5jdGlvbih0LGUpe2U/Z2UucHJlZmlsdGVycy51bnNoaWZ0KHQpOmdlLnByZWZpbHRlcnMucHVzaCh0KX19KSxTLnNwZWVkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10JiYib2JqZWN0Ij09dHlwZW9mIHQ/Uy5leHRlbmQoe30sdCk6e2NvbXBsZXRlOm58fCFuJiZlfHxtKHQpJiZ0LGR1cmF0aW9uOnQsZWFzaW5nOm4mJmV8fGUmJiFtKGUpJiZlfTtyZXR1cm4gUy5meC5vZmY/ci5kdXJhdGlvbj0wOiJudW1iZXIiIT10eXBlb2Ygci5kdXJhdGlvbiYmKHIuZHVyYXRpb24gaW4gUy5meC5zcGVlZHM/ci5kdXJhdGlvbj1TLmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTpyLmR1cmF0aW9uPVMuZnguc3BlZWRzLl9kZWZhdWx0KSxudWxsIT1yLnF1ZXVlJiYhMCE9PXIucXVldWV8fChyLnF1ZXVlPSJmeCIpLHIub2xkPXIuY29tcGxldGUsci5jb21wbGV0ZT1mdW5jdGlvbigpe20oci5vbGQpJiZyLm9sZC5jYWxsKHRoaXMpLHIucXVldWUmJlMuZGVxdWV1ZSh0aGlzLHIucXVldWUpfSxyfSxTLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0aGlzLmZpbHRlcihjdCkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTplfSx0LG4scil9LGFuaW1hdGU6ZnVuY3Rpb24odCxlLG4scil7dmFyIG89Uy5pc0VtcHR5T2JqZWN0KHQpLGk9Uy5zcGVlZChlLG4sciksYT1mdW5jdGlvbigpe3ZhciBlPWdlKHRoaXMsUy5leHRlbmQoe30sdCksaSk7KG98fFEuZ2V0KHRoaXMsImZpbmlzaCIpKSYmZS5zdG9wKCEwKX07cmV0dXJuIGEuZmluaXNoPWEsb3x8ITE9PT1pLnF1ZXVlP3RoaXMuZWFjaChhKTp0aGlzLnF1ZXVlKGkucXVldWUsYSl9LHN0b3A6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc3RvcDtkZWxldGUgdC5zdG9wLGUobil9O3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmKG49ZSxlPXQsdD12b2lkIDApLGUmJiExIT09dCYmdGhpcy5xdWV1ZSh0fHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT0hMCxvPW51bGwhPXQmJnQrInF1ZXVlSG9va3MiLGk9Uy50aW1lcnMsYT1RLmdldCh0aGlzKTtpZihvKWFbb10mJmFbb10uc3RvcCYmcihhW29dKTtlbHNlIGZvcihvIGluIGEpYVtvXSYmYVtvXS5zdG9wJiZsZS50ZXN0KG8pJiZyKGFbb10pO2ZvcihvPWkubGVuZ3RoO28tLTspaVtvXS5lbGVtIT09dGhpc3x8bnVsbCE9dCYmaVtvXS5xdWV1ZSE9PXR8fChpW29dLmFuaW0uc3RvcChuKSxlPSExLGkuc3BsaWNlKG8sMSkpOyFlJiZufHxTLmRlcXVldWUodGhpcyx0KX0pfSxmaW5pc2g6ZnVuY3Rpb24odCl7cmV0dXJuITEhPT10JiYodD10fHwiZngiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSxuPVEuZ2V0KHRoaXMpLHI9blt0KyJxdWV1ZSJdLG89blt0KyJxdWV1ZUhvb2tzIl0saT1TLnRpbWVycyxhPXI/ci5sZW5ndGg6MDtmb3Iobi5maW5pc2g9ITAsUy5xdWV1ZSh0aGlzLHQsW10pLG8mJm8uc3RvcCYmby5zdG9wLmNhbGwodGhpcywhMCksZT1pLmxlbmd0aDtlLS07KWlbZV0uZWxlbT09PXRoaXMmJmlbZV0ucXVldWU9PT10JiYoaVtlXS5hbmltLnN0b3AoITApLGkuc3BsaWNlKGUsMSkpO2ZvcihlPTA7ZTxhO2UrKylyW2VdJiZyW2VdLmZpbmlzaCYmcltlXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgbi5maW5pc2h9KX19KSxTLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKHQsZSl7dmFyIG49Uy5mbltlXTtTLmZuW2VdPWZ1bmN0aW9uKHQscixvKXtyZXR1cm4gbnVsbD09dHx8ImJvb2xlYW4iPT10eXBlb2YgdD9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoaGUoZSwhMCksdCxyLG8pfX0pLFMuZWFjaCh7c2xpZGVEb3duOmhlKCJzaG93Iiksc2xpZGVVcDpoZSgiaGlkZSIpLHNsaWRlVG9nZ2xlOmhlKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKHQsZSl7Uy5mblt0XT1mdW5jdGlvbih0LG4scil7cmV0dXJuIHRoaXMuYW5pbWF0ZShlLHQsbixyKX19KSxTLnRpbWVycz1bXSxTLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgdCxlPTAsbj1TLnRpbWVycztmb3Ioc2U9RGF0ZS5ub3coKTtlPG4ubGVuZ3RoO2UrKykodD1uW2VdKSgpfHxuW2VdIT09dHx8bi5zcGxpY2UoZS0tLDEpO24ubGVuZ3RofHxTLmZ4LnN0b3AoKSxzZT12b2lkIDB9LFMuZngudGltZXI9ZnVuY3Rpb24odCl7Uy50aW1lcnMucHVzaCh0KSxTLmZ4LnN0YXJ0KCl9LFMuZnguaW50ZXJ2YWw9MTMsUy5meC5zdGFydD1mdW5jdGlvbigpe3VlfHwodWU9ITAsZmUoKSl9LFMuZnguc3RvcD1mdW5jdGlvbigpe3VlPW51bGx9LFMuZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LFMuZm4uZGVsYXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1TLmZ4JiZTLmZ4LnNwZWVkc1t0XXx8dCxlPWV8fCJmeCIsdGhpcy5xdWV1ZShlLGZ1bmN0aW9uKGUscil7dmFyIG89bi5zZXRUaW1lb3V0KGUsdCk7ci5zdG9wPWZ1bmN0aW9uKCl7bi5jbGVhclRpbWVvdXQobyl9fSl9LGZ1bmN0aW9uKCl7dmFyIHQ9YS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGU9YS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKS5hcHBlbmRDaGlsZChhLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTt0LnR5cGU9ImNoZWNrYm94Iix5LmNoZWNrT249IiIhPT10LnZhbHVlLHkub3B0U2VsZWN0ZWQ9ZS5zZWxlY3RlZCwodD1hLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnZhbHVlPSJ0Iix0LnR5cGU9InJhZGlvIix5LnJhZGlvVmFsdWU9InQiPT09dC52YWx1ZX0oKTt2YXIgdmUseWU9Uy5leHByLmF0dHJIYW5kbGU7Uy5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gJCh0aGlzLFMuYXR0cix0LGUsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5yZW1vdmVBdHRyKHRoaXMsdCl9KX19KSxTLmV4dGVuZCh7YXR0cjpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpPXQubm9kZVR5cGU7aWYoMyE9PWkmJjghPT1pJiYyIT09aSlyZXR1cm4gdm9pZCAwPT09dC5nZXRBdHRyaWJ1dGU/Uy5wcm9wKHQsZSxuKTooMT09PWkmJlMuaXNYTUxEb2ModCl8fChvPVMuYXR0ckhvb2tzW2UudG9Mb3dlckNhc2UoKV18fChTLmV4cHIubWF0Y2guYm9vbC50ZXN0KGUpP3ZlOnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCBTLnJlbW92ZUF0dHIodCxlKTpvJiYic2V0ImluIG8mJnZvaWQgMCE9PShyPW8uc2V0KHQsbixlKSk/cjoodC5zZXRBdHRyaWJ1dGUoZSxuKyIiKSxuKTpvJiYiZ2V0ImluIG8mJm51bGwhPT0ocj1vLmdldCh0LGUpKT9yOm51bGw9PShyPVMuZmluZC5hdHRyKHQsZSkpP3ZvaWQgMDpyKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24odCxlKXtpZigheS5yYWRpb1ZhbHVlJiYicmFkaW8iPT09ZSYmTCh0LCJpbnB1dCIpKXt2YXIgbj10LnZhbHVlO3JldHVybiB0LnNldEF0dHJpYnV0ZSgidHlwZSIsZSksbiYmKHQudmFsdWU9biksZX19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbih0LGUpe3ZhciBuLHI9MCxvPWUmJmUubWF0Y2goVSk7aWYobyYmMT09PXQubm9kZVR5cGUpZm9yKDtuPW9bcisrXTspdC5yZW1vdmVBdHRyaWJ1dGUobil9fSksdmU9e3NldDpmdW5jdGlvbih0LGUsbil7cmV0dXJuITE9PT1lP1MucmVtb3ZlQXR0cih0LG4pOnQuc2V0QXR0cmlidXRlKG4sbiksbn19LFMuZWFjaChTLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbih0LGUpe3ZhciBuPXllW2VdfHxTLmZpbmQuYXR0cjt5ZVtlXT1mdW5jdGlvbih0LGUscil7dmFyIG8saSxhPWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gcnx8KGk9eWVbYV0seWVbYV09byxvPW51bGwhPW4odCxlLHIpP2E6bnVsbCx5ZVthXT1pKSxvfX0pO3ZhciBtZT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLGJlPS9eKD86YXxhcmVhKSQvaTtmdW5jdGlvbiB4ZSh0KXtyZXR1cm4odC5tYXRjaChVKXx8W10pLmpvaW4oIiAiKX1mdW5jdGlvbiB3ZSh0KXtyZXR1cm4gdC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn1mdW5jdGlvbiBrZSh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90OiJzdHJpbmciPT10eXBlb2YgdCYmdC5tYXRjaChVKXx8W119Uy5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24odCxlKXtyZXR1cm4gJCh0aGlzLFMucHJvcCx0LGUsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbUy5wcm9wRml4W3RdfHx0XX0pfX0pLFMuZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGk9dC5ub2RlVHlwZTtpZigzIT09aSYmOCE9PWkmJjIhPT1pKXJldHVybiAxPT09aSYmUy5pc1hNTERvYyh0KXx8KGU9Uy5wcm9wRml4W2VdfHxlLG89Uy5wcm9wSG9va3NbZV0pLHZvaWQgMCE9PW4/byYmInNldCJpbiBvJiZ2b2lkIDAhPT0ocj1vLnNldCh0LG4sZSkpP3I6dFtlXT1uOm8mJiJnZXQiaW4gbyYmbnVsbCE9PShyPW8uZ2V0KHQsZSkpP3I6dFtlXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlPVMuZmluZC5hdHRyKHQsInRhYmluZGV4Iik7cmV0dXJuIGU/cGFyc2VJbnQoZSwxMCk6bWUudGVzdCh0Lm5vZGVOYW1lKXx8YmUudGVzdCh0Lm5vZGVOYW1lKSYmdC5ocmVmPzA6LTF9fX0scHJvcEZpeDp7Zm9yOiJodG1sRm9yIixjbGFzczoiY2xhc3NOYW1lIn19KSx5Lm9wdFNlbGVjdGVkfHwoUy5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbih0KXt2YXIgZT10LnBhcmVudE5vZGU7cmV0dXJuIGUmJmUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXQucGFyZW50Tm9kZTtlJiYoZS5zZWxlY3RlZEluZGV4LGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLFMuZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7Uy5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLFMuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGEscyx1PTA7aWYobSh0KSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykuYWRkQ2xhc3ModC5jYWxsKHRoaXMsZSx3ZSh0aGlzKSkpfSk7aWYoKGU9a2UodCkpLmxlbmd0aClmb3IoO249dGhpc1t1KytdOylpZihvPXdlKG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIit4ZShvKSsiICIpe2ZvcihhPTA7aT1lW2ErK107KXIuaW5kZXhPZigiICIraSsiICIpPDAmJihyKz1pKyIgIik7byE9PShzPXhlKHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLnJlbW92ZUNsYXNzKHQuY2FsbCh0aGlzLGUsd2UodGhpcykpKX0pO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmF0dHIoImNsYXNzIiwiIik7aWYoKGU9a2UodCkpLmxlbmd0aClmb3IoO249dGhpc1t1KytdOylpZihvPXdlKG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIit4ZShvKSsiICIpe2ZvcihhPTA7aT1lW2ErK107KWZvcig7ci5pbmRleE9mKCIgIitpKyIgIik+LTE7KXI9ci5yZXBsYWNlKCIgIitpKyIgIiwiICIpO28hPT0ocz14ZShyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKHQsZSl7dmFyIG49dHlwZW9mIHQscj0ic3RyaW5nIj09PW58fEFycmF5LmlzQXJyYXkodCk7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZSYmcj9lP3RoaXMuYWRkQ2xhc3ModCk6dGhpcy5yZW1vdmVDbGFzcyh0KTptKHQpP3RoaXMuZWFjaChmdW5jdGlvbihuKXtTKHRoaXMpLnRvZ2dsZUNsYXNzKHQuY2FsbCh0aGlzLG4sd2UodGhpcyksZSksZSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSxvLGksYTtpZihyKWZvcihvPTAsaT1TKHRoaXMpLGE9a2UodCk7ZT1hW28rK107KWkuaGFzQ2xhc3MoZSk/aS5yZW1vdmVDbGFzcyhlKTppLmFkZENsYXNzKGUpO2Vsc2Ugdm9pZCAwIT09dCYmImJvb2xlYW4iIT09bnx8KChlPXdlKHRoaXMpKSYmUS5zZXQodGhpcywiX19jbGFzc05hbWVfXyIsZSksdGhpcy5zZXRBdHRyaWJ1dGUmJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsZXx8ITE9PT10PyIiOlEuZ2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpKX0pfSxoYXNDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHI9MDtmb3IoZT0iICIrdCsiICI7bj10aGlzW3IrK107KWlmKDE9PT1uLm5vZGVUeXBlJiYoIiAiK3hlKHdlKG4pKSsiICIpLmluZGV4T2YoZSk+LTEpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIFNlPS9cci9nO1MuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG89dGhpc1swXTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1tKHQpLHRoaXMuZWFjaChmdW5jdGlvbihuKXt2YXIgbzsxPT09dGhpcy5ub2RlVHlwZSYmKG51bGw9PShvPXI/dC5jYWxsKHRoaXMsbixTKHRoaXMpLnZhbCgpKTp0KT9vPSIiOiJudW1iZXIiPT10eXBlb2Ygbz9vKz0iIjpBcnJheS5pc0FycmF5KG8pJiYobz1TLm1hcChvLGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOnQrIiJ9KSksKGU9Uy52YWxIb29rc1t0aGlzLnR5cGVdfHxTLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYic2V0ImluIGUmJnZvaWQgMCE9PWUuc2V0KHRoaXMsbywidmFsdWUiKXx8KHRoaXMudmFsdWU9bykpfSkpOm8/KGU9Uy52YWxIb29rc1tvLnR5cGVdfHxTLnZhbEhvb2tzW28ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYiZ2V0ImluIGUmJnZvaWQgMCE9PShuPWUuZ2V0KG8sInZhbHVlIikpP246InN0cmluZyI9PXR5cGVvZihuPW8udmFsdWUpP24ucmVwbGFjZShTZSwiIik6bnVsbD09bj8iIjpuOnZvaWQgMH19KSxTLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlPVMuZmluZC5hdHRyKHQsInZhbHVlIik7cmV0dXJuIG51bGwhPWU/ZTp4ZShTLnRleHQodCkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG89dC5vcHRpb25zLGk9dC5zZWxlY3RlZEluZGV4LGE9InNlbGVjdC1vbmUiPT09dC50eXBlLHM9YT9udWxsOltdLHU9YT9pKzE6by5sZW5ndGg7Zm9yKHI9aTwwP3U6YT9pOjA7cjx1O3IrKylpZigoKG49b1tyXSkuc2VsZWN0ZWR8fHI9PT1pKSYmIW4uZGlzYWJsZWQmJighbi5wYXJlbnROb2RlLmRpc2FibGVkfHwhTChuLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZihlPVMobikudmFsKCksYSlyZXR1cm4gZTtzLnB1c2goZSl9cmV0dXJuIHN9LHNldDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyLG89dC5vcHRpb25zLGk9Uy5tYWtlQXJyYXkoZSksYT1vLmxlbmd0aDthLS07KSgocj1vW2FdKS5zZWxlY3RlZD1TLmluQXJyYXkoUy52YWxIb29rcy5vcHRpb24uZ2V0KHIpLGkpPi0xKSYmKG49ITApO3JldHVybiBufHwodC5zZWxlY3RlZEluZGV4PS0xKSxpfX19fSksUy5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Uy52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKHQsZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gdC5jaGVja2VkPVMuaW5BcnJheShTKHQpLnZhbCgpLGUpPi0xfX0seS5jaGVja09ufHwoUy52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PT10LmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOnQudmFsdWV9KX0pLHkuZm9jdXNpbj0ib25mb2N1c2luImluIG47dmFyIEVlPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxUZT1mdW5jdGlvbih0KXt0LnN0b3BQcm9wYWdhdGlvbigpfTtTLmV4dGVuZChTLmV2ZW50LHt0cmlnZ2VyOmZ1bmN0aW9uKHQsZSxyLG8pe3ZhciBpLHMsdSxjLGwsZixwLGgsZz1bcnx8YV0sdj1kLmNhbGwodCwidHlwZSIpP3QudHlwZTp0LHk9ZC5jYWxsKHQsIm5hbWVzcGFjZSIpP3QubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYocz1oPXU9cj1yfHxhLDMhPT1yLm5vZGVUeXBlJiY4IT09ci5ub2RlVHlwZSYmIUVlLnRlc3QoditTLmV2ZW50LnRyaWdnZXJlZCkmJih2LmluZGV4T2YoIi4iKT4tMSYmKHk9di5zcGxpdCgiLiIpLHY9eS5zaGlmdCgpLHkuc29ydCgpKSxsPXYuaW5kZXhPZigiOiIpPDAmJiJvbiIrdiwodD10W1MuZXhwYW5kb10/dDpuZXcgUy5FdmVudCh2LCJvYmplY3QiPT10eXBlb2YgdCYmdCkpLmlzVHJpZ2dlcj1vPzI6Myx0Lm5hbWVzcGFjZT15LmpvaW4oIi4iKSx0LnJuYW1lc3BhY2U9dC5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIreS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLHQucmVzdWx0PXZvaWQgMCx0LnRhcmdldHx8KHQudGFyZ2V0PXIpLGU9bnVsbD09ZT9bdF06Uy5tYWtlQXJyYXkoZSxbdF0pLHA9Uy5ldmVudC5zcGVjaWFsW3ZdfHx7fSxvfHwhcC50cmlnZ2VyfHwhMSE9PXAudHJpZ2dlci5hcHBseShyLGUpKSl7aWYoIW8mJiFwLm5vQnViYmxlJiYhYihyKSl7Zm9yKGM9cC5kZWxlZ2F0ZVR5cGV8fHYsRWUudGVzdChjK3YpfHwocz1zLnBhcmVudE5vZGUpO3M7cz1zLnBhcmVudE5vZGUpZy5wdXNoKHMpLHU9czt1PT09KHIub3duZXJEb2N1bWVudHx8YSkmJmcucHVzaCh1LmRlZmF1bHRWaWV3fHx1LnBhcmVudFdpbmRvd3x8bil9Zm9yKGk9MDsocz1nW2krK10pJiYhdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpOyloPXMsdC50eXBlPWk+MT9jOnAuYmluZFR5cGV8fHYsKGY9KFEuZ2V0KHMsImV2ZW50cyIpfHx7fSlbdC50eXBlXSYmUS5nZXQocywiaGFuZGxlIikpJiZmLmFwcGx5KHMsZSksKGY9bCYmc1tsXSkmJmYuYXBwbHkmJlgocykmJih0LnJlc3VsdD1mLmFwcGx5KHMsZSksITE9PT10LnJlc3VsdCYmdC5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gdC50eXBlPXYsb3x8dC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8cC5fZGVmYXVsdCYmITEhPT1wLl9kZWZhdWx0LmFwcGx5KGcucG9wKCksZSl8fCFYKHIpfHxsJiZtKHJbdl0pJiYhYihyKSYmKCh1PXJbbF0pJiYocltsXT1udWxsKSxTLmV2ZW50LnRyaWdnZXJlZD12LHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmaC5hZGRFdmVudExpc3RlbmVyKHYsVGUpLHJbdl0oKSx0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmgucmVtb3ZlRXZlbnRMaXN0ZW5lcih2LFRlKSxTLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsdSYmKHJbbF09dSkpLHQucmVzdWx0fX0sc2ltdWxhdGU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPVMuZXh0ZW5kKG5ldyBTLkV2ZW50LG4se3R5cGU6dCxpc1NpbXVsYXRlZDohMH0pO1MuZXZlbnQudHJpZ2dlcihyLG51bGwsZSl9fSksUy5mbi5leHRlbmQoe3RyaWdnZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5ldmVudC50cmlnZ2VyKHQsZSx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXNbMF07aWYobilyZXR1cm4gUy5ldmVudC50cmlnZ2VyKHQsZSxuLCEwKX19KSx5LmZvY3VzaW58fFMuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24odCxlKXt2YXIgbj1mdW5jdGlvbih0KXtTLmV2ZW50LnNpbXVsYXRlKGUsdC50YXJnZXQsUy5ldmVudC5maXgodCkpfTtTLmV2ZW50LnNwZWNpYWxbZV09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLG89US5hY2Nlc3MocixlKTtvfHxyLmFkZEV2ZW50TGlzdGVuZXIodCxuLCEwKSxRLmFjY2VzcyhyLGUsKG98fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciByPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxvPVEuYWNjZXNzKHIsZSktMTtvP1EuYWNjZXNzKHIsZSxvKTooci5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMCksUS5yZW1vdmUocixlKSl9fX0pO3ZhciBqZT1uLmxvY2F0aW9uLEFlPURhdGUubm93KCksT2U9L1w/LztTLnBhcnNlWE1MPWZ1bmN0aW9uKHQpe3ZhciBlO2lmKCF0fHwic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIG51bGw7dHJ5e2U9KG5ldyBuLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsInRleHQveG1sIil9Y2F0Y2godCl7ZT12b2lkIDB9cmV0dXJuIGUmJiFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8Uy5lcnJvcigiSW52YWxpZCBYTUw6ICIrdCksZX07dmFyIENlPS9cW1xdJC8sTGU9L1xyP1xuL2csUmU9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLFBlPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBOZSh0LGUsbixyKXt2YXIgbztpZihBcnJheS5pc0FycmF5KGUpKVMuZWFjaChlLGZ1bmN0aW9uKGUsbyl7bnx8Q2UudGVzdCh0KT9yKHQsbyk6TmUodCsiWyIrKCJvYmplY3QiPT10eXBlb2YgbyYmbnVsbCE9bz9lOiIiKSsiXSIsbyxuLHIpfSk7ZWxzZSBpZihufHwib2JqZWN0IiE9PWsoZSkpcih0LGUpO2Vsc2UgZm9yKG8gaW4gZSlOZSh0KyJbIitvKyJdIixlW29dLG4scil9Uy5wYXJhbT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9W10sbz1mdW5jdGlvbih0LGUpe3ZhciBuPW0oZSk/ZSgpOmU7cltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KHQpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj8iIjpuKX07aWYobnVsbD09dClyZXR1cm4iIjtpZihBcnJheS5pc0FycmF5KHQpfHx0LmpxdWVyeSYmIVMuaXNQbGFpbk9iamVjdCh0KSlTLmVhY2godCxmdW5jdGlvbigpe28odGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IobiBpbiB0KU5lKG4sdFtuXSxlLG8pO3JldHVybiByLmpvaW4oIiYiKX0sUy5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBTLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIHQ9Uy5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIHQ/Uy5tYWtlQXJyYXkodCk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciB0PXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhUyh0aGlzKS5pcygiOmRpc2FibGVkIikmJlBlLnRlc3QodGhpcy5ub2RlTmFtZSkmJiFSZS50ZXN0KHQpJiYodGhpcy5jaGVja2VkfHwhZ3QudGVzdCh0KSl9KS5tYXAoZnVuY3Rpb24odCxlKXt2YXIgbj1TKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1uP251bGw6QXJyYXkuaXNBcnJheShuKT9TLm1hcChuLGZ1bmN0aW9uKHQpe3JldHVybntuYW1lOmUubmFtZSx2YWx1ZTp0LnJlcGxhY2UoTGUsIlxyXG4iKX19KTp7bmFtZTplLm5hbWUsdmFsdWU6bi5yZXBsYWNlKExlLCJcclxuIil9fSkuZ2V0KCl9fSk7dmFyIEllPS8lMjAvZyxEZT0vIy4qJC8sX2U9LyhbPyZdKV89W14mXSovLE1lPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKSQvZ20sVWU9L14oPzpHRVR8SEVBRCkkLyxCZT0vXlwvXC8vLHFlPXt9LEZlPXt9LEhlPSIqLyIuY29uY2F0KCIqIiksemU9YS5jcmVhdGVFbGVtZW50KCJhIik7ZnVuY3Rpb24gV2UodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7InN0cmluZyIhPXR5cGVvZiBlJiYobj1lLGU9IioiKTt2YXIgcixvPTAsaT1lLnRvTG93ZXJDYXNlKCkubWF0Y2goVSl8fFtdO2lmKG0obikpZm9yKDtyPWlbbysrXTspIisiPT09clswXT8ocj1yLnNsaWNlKDEpfHwiKiIsKHRbcl09dFtyXXx8W10pLnVuc2hpZnQobikpOih0W3JdPXRbcl18fFtdKS5wdXNoKG4pfX1mdW5jdGlvbiAkZSh0LGUsbixyKXt2YXIgbz17fSxpPXQ9PT1GZTtmdW5jdGlvbiBhKHMpe3ZhciB1O3JldHVybiBvW3NdPSEwLFMuZWFjaCh0W3NdfHxbXSxmdW5jdGlvbih0LHMpe3ZhciBjPXMoZSxuLHIpO3JldHVybiJzdHJpbmciIT10eXBlb2YgY3x8aXx8b1tjXT9pPyEodT1jKTp2b2lkIDA6KGUuZGF0YVR5cGVzLnVuc2hpZnQoYyksYShjKSwhMSl9KSx1fXJldHVybiBhKGUuZGF0YVR5cGVzWzBdKXx8IW9bIioiXSYmYSgiKiIpfWZ1bmN0aW9uIFllKHQsZSl7dmFyIG4scixvPVMuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiBlKXZvaWQgMCE9PWVbbl0mJigob1tuXT90OnJ8fChyPXt9KSlbbl09ZVtuXSk7cmV0dXJuIHImJlMuZXh0ZW5kKCEwLHQsciksdH16ZS5ocmVmPWplLmhyZWYsUy5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOmplLmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOi9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLnRlc3QoamUucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6SGUsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOlMucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbih0LGUpe3JldHVybiBlP1llKFllKHQsUy5hamF4U2V0dGluZ3MpLGUpOlllKFMuYWpheFNldHRpbmdzLHQpfSxhamF4UHJlZmlsdGVyOldlKHFlKSxhamF4VHJhbnNwb3J0OldlKEZlKSxhamF4OmZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSxlPWV8fHt9O3ZhciByLG8saSxzLHUsYyxsLGYscCxoLGQ9Uy5hamF4U2V0dXAoe30sZSksZz1kLmNvbnRleHR8fGQsdj1kLmNvbnRleHQmJihnLm5vZGVUeXBlfHxnLmpxdWVyeSk/UyhnKTpTLmV2ZW50LHk9Uy5EZWZlcnJlZCgpLG09Uy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksYj1kLnN0YXR1c0NvZGV8fHt9LHg9e30sdz17fSxrPSJjYW5jZWxlZCIsRT17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKHQpe3ZhciBlO2lmKGwpe2lmKCFzKWZvcihzPXt9O2U9TWUuZXhlYyhpKTspc1tlWzFdLnRvTG93ZXJDYXNlKCkrIiAiXT0oc1tlWzFdLnRvTG93ZXJDYXNlKCkrIiAiXXx8W10pLmNvbmNhdChlWzJdKTtlPXNbdC50b0xvd2VyQ2FzZSgpKyIgIl19cmV0dXJuIG51bGw9PWU/bnVsbDplLmpvaW4oIiwgIil9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBsP2k6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1sJiYodD13W3QudG9Mb3dlckNhc2UoKV09d1t0LnRvTG93ZXJDYXNlKCldfHx0LHhbdF09ZSksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09bCYmKGQubWltZVR5cGU9dCksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbih0KXt2YXIgZTtpZih0KWlmKGwpRS5hbHdheXModFtFLnN0YXR1c10pO2Vsc2UgZm9yKGUgaW4gdCliW2VdPVtiW2VdLHRbZV1dO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbih0KXt2YXIgZT10fHxrO3JldHVybiByJiZyLmFib3J0KGUpLFQoMCxlKSx0aGlzfX07aWYoeS5wcm9taXNlKEUpLGQudXJsPSgodHx8ZC51cmx8fGplLmhyZWYpKyIiKS5yZXBsYWNlKEJlLGplLnByb3RvY29sKyIvLyIpLGQudHlwZT1lLm1ldGhvZHx8ZS50eXBlfHxkLm1ldGhvZHx8ZC50eXBlLGQuZGF0YVR5cGVzPShkLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goVSl8fFsiIl0sbnVsbD09ZC5jcm9zc0RvbWFpbil7Yz1hLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7Yy5ocmVmPWQudXJsLGMuaHJlZj1jLmhyZWYsZC5jcm9zc0RvbWFpbj16ZS5wcm90b2NvbCsiLy8iK3plLmhvc3QhPWMucHJvdG9jb2wrIi8vIitjLmhvc3R9Y2F0Y2godCl7ZC5jcm9zc0RvbWFpbj0hMH19aWYoZC5kYXRhJiZkLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGQuZGF0YSYmKGQuZGF0YT1TLnBhcmFtKGQuZGF0YSxkLnRyYWRpdGlvbmFsKSksJGUocWUsZCxlLEUpLGwpcmV0dXJuIEU7Zm9yKHAgaW4oZj1TLmV2ZW50JiZkLmdsb2JhbCkmJjA9PVMuYWN0aXZlKysmJlMuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0IiksZC50eXBlPWQudHlwZS50b1VwcGVyQ2FzZSgpLGQuaGFzQ29udGVudD0hVWUudGVzdChkLnR5cGUpLG89ZC51cmwucmVwbGFjZShEZSwiIiksZC5oYXNDb250ZW50P2QuZGF0YSYmZC5wcm9jZXNzRGF0YSYmMD09PShkLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJihkLmRhdGE9ZC5kYXRhLnJlcGxhY2UoSWUsIisiKSk6KGg9ZC51cmwuc2xpY2Uoby5sZW5ndGgpLGQuZGF0YSYmKGQucHJvY2Vzc0RhdGF8fCJzdHJpbmciPT10eXBlb2YgZC5kYXRhKSYmKG8rPShPZS50ZXN0KG8pPyImIjoiPyIpK2QuZGF0YSxkZWxldGUgZC5kYXRhKSwhMT09PWQuY2FjaGUmJihvPW8ucmVwbGFjZShfZSwiJDEiKSxoPShPZS50ZXN0KG8pPyImIjoiPyIpKyJfPSIrQWUrKytoKSxkLnVybD1vK2gpLGQuaWZNb2RpZmllZCYmKFMubGFzdE1vZGlmaWVkW29dJiZFLnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixTLmxhc3RNb2RpZmllZFtvXSksUy5ldGFnW29dJiZFLnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLFMuZXRhZ1tvXSkpLChkLmRhdGEmJmQuaGFzQ29udGVudCYmITEhPT1kLmNvbnRlbnRUeXBlfHxlLmNvbnRlbnRUeXBlKSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGQuY29udGVudFR5cGUpLEUuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixkLmRhdGFUeXBlc1swXSYmZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXT9kLmFjY2VwdHNbZC5kYXRhVHlwZXNbMF1dKygiKiIhPT1kLmRhdGFUeXBlc1swXT8iLCAiK0hlKyI7IHE9MC4wMSI6IiIpOmQuYWNjZXB0c1siKiJdKSxkLmhlYWRlcnMpRS5zZXRSZXF1ZXN0SGVhZGVyKHAsZC5oZWFkZXJzW3BdKTtpZihkLmJlZm9yZVNlbmQmJighMT09PWQuYmVmb3JlU2VuZC5jYWxsKGcsRSxkKXx8bCkpcmV0dXJuIEUuYWJvcnQoKTtpZihrPSJhYm9ydCIsbS5hZGQoZC5jb21wbGV0ZSksRS5kb25lKGQuc3VjY2VzcyksRS5mYWlsKGQuZXJyb3IpLHI9JGUoRmUsZCxlLEUpKXtpZihFLnJlYWR5U3RhdGU9MSxmJiZ2LnRyaWdnZXIoImFqYXhTZW5kIixbRSxkXSksbClyZXR1cm4gRTtkLmFzeW5jJiZkLnRpbWVvdXQ+MCYmKHU9bi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7RS5hYm9ydCgidGltZW91dCIpfSxkLnRpbWVvdXQpKTt0cnl7bD0hMSxyLnNlbmQoeCxUKX1jYXRjaCh0KXtpZihsKXRocm93IHQ7VCgtMSx0KX19ZWxzZSBUKC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiBUKHQsZSxhLHMpe3ZhciBjLHAsaCx4LHcsaz1lO2x8fChsPSEwLHUmJm4uY2xlYXJUaW1lb3V0KHUpLHI9dm9pZCAwLGk9c3x8IiIsRS5yZWFkeVN0YXRlPXQ+MD80OjAsYz10Pj0yMDAmJnQ8MzAwfHwzMDQ9PT10LGEmJih4PWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHIsbyxpLGEscz10LmNvbnRlbnRzLHU9dC5kYXRhVHlwZXM7IioiPT09dVswXTspdS5zaGlmdCgpLHZvaWQgMD09PXImJihyPXQubWltZVR5cGV8fGUuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihyKWZvcihvIGluIHMpaWYoc1tvXSYmc1tvXS50ZXN0KHIpKXt1LnVuc2hpZnQobyk7YnJlYWt9aWYodVswXWluIG4paT11WzBdO2Vsc2V7Zm9yKG8gaW4gbil7aWYoIXVbMF18fHQuY29udmVydGVyc1tvKyIgIit1WzBdXSl7aT1vO2JyZWFrfWF8fChhPW8pfWk9aXx8YX1pZihpKXJldHVybiBpIT09dVswXSYmdS51bnNoaWZ0KGkpLG5baV19KGQsRSxhKSkseD1mdW5jdGlvbih0LGUsbixyKXt2YXIgbyxpLGEscyx1LGM9e30sbD10LmRhdGFUeXBlcy5zbGljZSgpO2lmKGxbMV0pZm9yKGEgaW4gdC5jb252ZXJ0ZXJzKWNbYS50b0xvd2VyQ2FzZSgpXT10LmNvbnZlcnRlcnNbYV07Zm9yKGk9bC5zaGlmdCgpO2k7KWlmKHQucmVzcG9uc2VGaWVsZHNbaV0mJihuW3QucmVzcG9uc2VGaWVsZHNbaV1dPWUpLCF1JiZyJiZ0LmRhdGFGaWx0ZXImJihlPXQuZGF0YUZpbHRlcihlLHQuZGF0YVR5cGUpKSx1PWksaT1sLnNoaWZ0KCkpaWYoIioiPT09aSlpPXU7ZWxzZSBpZigiKiIhPT11JiZ1IT09aSl7aWYoIShhPWNbdSsiICIraV18fGNbIiogIitpXSkpZm9yKG8gaW4gYylpZigocz1vLnNwbGl0KCIgIikpWzFdPT09aSYmKGE9Y1t1KyIgIitzWzBdXXx8Y1siKiAiK3NbMF1dKSl7ITA9PT1hP2E9Y1tvXTohMCE9PWNbb10mJihpPXNbMF0sbC51bnNoaWZ0KHNbMV0pKTticmVha31pZighMCE9PWEpaWYoYSYmdC50aHJvd3MpZT1hKGUpO2Vsc2UgdHJ5e2U9YShlKX1jYXRjaCh0KXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjphP3Q6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK3UrIiB0byAiK2l9fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6ZX19KGQseCxFLGMpLGM/KGQuaWZNb2RpZmllZCYmKCh3PUUuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSkmJihTLmxhc3RNb2RpZmllZFtvXT13KSwodz1FLmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIikpJiYoUy5ldGFnW29dPXcpKSwyMDQ9PT10fHwiSEVBRCI9PT1kLnR5cGU/az0ibm9jb250ZW50IjozMDQ9PT10P2s9Im5vdG1vZGlmaWVkIjooaz14LnN0YXRlLHA9eC5kYXRhLGM9IShoPXguZXJyb3IpKSk6KGg9aywhdCYma3x8KGs9ImVycm9yIix0PDAmJih0PTApKSksRS5zdGF0dXM9dCxFLnN0YXR1c1RleHQ9KGV8fGspKyIiLGM/eS5yZXNvbHZlV2l0aChnLFtwLGssRV0pOnkucmVqZWN0V2l0aChnLFtFLGssaF0pLEUuc3RhdHVzQ29kZShiKSxiPXZvaWQgMCxmJiZ2LnRyaWdnZXIoYz8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFtFLGQsYz9wOmhdKSxtLmZpcmVXaXRoKGcsW0Usa10pLGYmJih2LnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW0UsZF0pLC0tUy5hY3RpdmV8fFMuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiBFfSxnZXRKU09OOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUy5nZXQodCxlLG4sImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFMuZ2V0KHQsdm9pZCAwLGUsInNjcmlwdCIpfX0pLFMuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbih0LGUpe1NbZV09ZnVuY3Rpb24odCxuLHIsbyl7cmV0dXJuIG0obikmJihvPW98fHIscj1uLG49dm9pZCAwKSxTLmFqYXgoUy5leHRlbmQoe3VybDp0LHR5cGU6ZSxkYXRhVHlwZTpvLGRhdGE6bixzdWNjZXNzOnJ9LFMuaXNQbGFpbk9iamVjdCh0KSYmdCkpfX0pLFMuX2V2YWxVcmw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gUy5hamF4KHt1cmw6dCx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKCl7fX0sZGF0YUZpbHRlcjpmdW5jdGlvbih0KXtTLmdsb2JhbEV2YWwodCxlKX19KX0sUy5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIHRoaXNbMF0mJihtKHQpJiYodD10LmNhbGwodGhpc1swXSkpLGU9Uyh0LHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApLHRoaXNbMF0ucGFyZW50Tm9kZSYmZS5pbnNlcnRCZWZvcmUodGhpc1swXSksZS5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpczt0LmZpcnN0RWxlbWVudENoaWxkOyl0PXQuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIHR9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbih0KXtyZXR1cm4gbSh0KT90aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS53cmFwSW5uZXIodC5jYWxsKHRoaXMsZSkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9Uyh0aGlzKSxuPWUuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwodCk6ZS5hcHBlbmQodCl9KX0sd3JhcDpmdW5jdGlvbih0KXt2YXIgZT1tKHQpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24obil7Uyh0aGlzKS53cmFwQWxsKGU/dC5jYWxsKHRoaXMsbik6dCl9KX0sdW53cmFwOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnBhcmVudCh0KS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7Uyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSxTLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24odCl7cmV0dXJuIVMuZXhwci5wc2V1ZG9zLnZpc2libGUodCl9LFMuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24odCl7cmV0dXJuISEodC5vZmZzZXRXaWR0aHx8dC5vZmZzZXRIZWlnaHR8fHQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxTLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBuLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKHQpe319O3ZhciBWZT17MDoyMDAsMTIyMzoyMDR9LEdlPVMuYWpheFNldHRpbmdzLnhocigpO3kuY29ycz0hIUdlJiYid2l0aENyZWRlbnRpYWxzImluIEdlLHkuYWpheD1HZT0hIUdlLFMuYWpheFRyYW5zcG9ydChmdW5jdGlvbih0KXt2YXIgZSxyO2lmKHkuY29yc3x8R2UmJiF0LmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKG8saSl7dmFyIGEscz10LnhocigpO2lmKHMub3Blbih0LnR5cGUsdC51cmwsdC5hc3luYyx0LnVzZXJuYW1lLHQucGFzc3dvcmQpLHQueGhyRmllbGRzKWZvcihhIGluIHQueGhyRmllbGRzKXNbYV09dC54aHJGaWVsZHNbYV07Zm9yKGEgaW4gdC5taW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUodC5taW1lVHlwZSksdC5jcm9zc0RvbWFpbnx8b1siWC1SZXF1ZXN0ZWQtV2l0aCJdfHwob1siWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpLG8pcy5zZXRSZXF1ZXN0SGVhZGVyKGEsb1thXSk7ZT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtlJiYoZT1yPXMub25sb2FkPXMub25lcnJvcj1zLm9uYWJvcnQ9cy5vbnRpbWVvdXQ9cy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09dD9zLmFib3J0KCk6ImVycm9yIj09PXQ/Im51bWJlciIhPXR5cGVvZiBzLnN0YXR1cz9pKDAsImVycm9yIik6aShzLnN0YXR1cyxzLnN0YXR1c1RleHQpOmkoVmVbcy5zdGF0dXNdfHxzLnN0YXR1cyxzLnN0YXR1c1RleHQsInRleHQiIT09KHMucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIHMucmVzcG9uc2VUZXh0P3tiaW5hcnk6cy5yZXNwb25zZX06e3RleHQ6cy5yZXNwb25zZVRleHR9LHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHMub25sb2FkPWUoKSxyPXMub25lcnJvcj1zLm9udGltZW91dD1lKCJlcnJvciIpLHZvaWQgMCE9PXMub25hYm9ydD9zLm9uYWJvcnQ9cjpzLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1zLnJlYWR5U3RhdGUmJm4uc2V0VGltZW91dChmdW5jdGlvbigpe2UmJnIoKX0pfSxlPWUoImFib3J0Iik7dHJ5e3Muc2VuZCh0Lmhhc0NvbnRlbnQmJnQuZGF0YXx8bnVsbCl9Y2F0Y2godCl7aWYoZSl0aHJvdyB0fX0sYWJvcnQ6ZnVuY3Rpb24oKXtlJiZlKCl9fX0pLFMuYWpheFByZWZpbHRlcihmdW5jdGlvbih0KXt0LmNyb3NzRG9tYWluJiYodC5jb250ZW50cy5zY3JpcHQ9ITEpfSksUy5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24odCl7cmV0dXJuIFMuZ2xvYmFsRXZhbCh0KSx0fX19KSxTLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24odCl7dm9pZCAwPT09dC5jYWNoZSYmKHQuY2FjaGU9ITEpLHQuY3Jvc3NEb21haW4mJih0LnR5cGU9IkdFVCIpfSksUy5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKHQpe3ZhciBlLG47aWYodC5jcm9zc0RvbWFpbnx8dC5zY3JpcHRBdHRycylyZXR1cm57c2VuZDpmdW5jdGlvbihyLG8pe2U9UygiPHNjcmlwdD4iKS5hdHRyKHQuc2NyaXB0QXR0cnN8fHt9KS5wcm9wKHtjaGFyc2V0OnQuc2NyaXB0Q2hhcnNldCxzcmM6dC51cmx9KS5vbigibG9hZCBlcnJvciIsbj1mdW5jdGlvbih0KXtlLnJlbW92ZSgpLG49bnVsbCx0JiZvKCJlcnJvciI9PT10LnR5cGU/NDA0OjIwMCx0LnR5cGUpfSksYS5oZWFkLmFwcGVuZENoaWxkKGVbMF0pfSxhYm9ydDpmdW5jdGlvbigpe24mJm4oKX19fSk7dmFyIEtlLFhlPVtdLEplPS8oPSlcPyg/PSZ8JCl8XD9cPy87Uy5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciB0PVhlLnBvcCgpfHxTLmV4cGFuZG8rIl8iK0FlKys7cmV0dXJuIHRoaXNbdF09ITAsdH19KSxTLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKHQsZSxyKXt2YXIgbyxpLGEscz0hMSE9PXQuanNvbnAmJihKZS50ZXN0KHQudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIHQuZGF0YSYmMD09PSh0LmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJkplLnRlc3QodC5kYXRhKSYmImRhdGEiKTtpZihzfHwianNvbnAiPT09dC5kYXRhVHlwZXNbMF0pcmV0dXJuIG89dC5qc29ucENhbGxiYWNrPW0odC5qc29ucENhbGxiYWNrKT90Lmpzb25wQ2FsbGJhY2soKTp0Lmpzb25wQ2FsbGJhY2sscz90W3NdPXRbc10ucmVwbGFjZShKZSwiJDEiK28pOiExIT09dC5qc29ucCYmKHQudXJsKz0oT2UudGVzdCh0LnVybCk/IiYiOiI/IikrdC5qc29ucCsiPSIrbyksdC5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIGF8fFMuZXJyb3IobysiIHdhcyBub3QgY2FsbGVkIiksYVswXX0sdC5kYXRhVHlwZXNbMF09Impzb24iLGk9bltvXSxuW29dPWZ1bmN0aW9uKCl7YT1hcmd1bWVudHN9LHIuYWx3YXlzKGZ1bmN0aW9uKCl7dm9pZCAwPT09aT9TKG4pLnJlbW92ZVByb3Aobyk6bltvXT1pLHRbb10mJih0Lmpzb25wQ2FsbGJhY2s9ZS5qc29ucENhbGxiYWNrLFhlLnB1c2gobykpLGEmJm0oaSkmJmkoYVswXSksYT1pPXZvaWQgMH0pLCJzY3JpcHQifSkseS5jcmVhdGVIVE1MRG9jdW1lbnQ9KChLZT1hLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikuYm9keSkuaW5uZXJIVE1MPSI8Zm9ybT48L2Zvcm0+PGZvcm0+PC9mb3JtPiIsMj09PUtlLmNoaWxkTm9kZXMubGVuZ3RoKSxTLnBhcnNlSFRNTD1mdW5jdGlvbih0LGUsbil7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0P1tdOigiYm9vbGVhbiI9PXR5cGVvZiBlJiYobj1lLGU9ITEpLGV8fCh5LmNyZWF0ZUhUTUxEb2N1bWVudD8oKHI9KGU9YS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpKS5jcmVhdGVFbGVtZW50KCJiYXNlIikpLmhyZWY9YS5sb2NhdGlvbi5ocmVmLGUuaGVhZC5hcHBlbmRDaGlsZChyKSk6ZT1hKSxpPSFuJiZbXSwobz1SLmV4ZWModCkpP1tlLmNyZWF0ZUVsZW1lbnQob1sxXSldOihvPUV0KFt0XSxlLGkpLGkmJmkubGVuZ3RoJiZTKGkpLnJlbW92ZSgpLFMubWVyZ2UoW10sby5jaGlsZE5vZGVzKSkpO3ZhciByLG8saX0sUy5mbi5sb2FkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYT10aGlzLHM9dC5pbmRleE9mKCIgIik7cmV0dXJuIHM+LTEmJihyPXhlKHQuc2xpY2UocykpLHQ9dC5zbGljZSgwLHMpKSxtKGUpPyhuPWUsZT12b2lkIDApOmUmJiJvYmplY3QiPT10eXBlb2YgZSYmKG89IlBPU1QiKSxhLmxlbmd0aD4wJiZTLmFqYXgoe3VybDp0LHR5cGU6b3x8IkdFVCIsZGF0YVR5cGU6Imh0bWwiLGRhdGE6ZX0pLmRvbmUoZnVuY3Rpb24odCl7aT1hcmd1bWVudHMsYS5odG1sKHI/UygiPGRpdj4iKS5hcHBlbmQoUy5wYXJzZUhUTUwodCkpLmZpbmQocik6dCl9KS5hbHdheXMobiYmZnVuY3Rpb24odCxlKXthLmVhY2goZnVuY3Rpb24oKXtuLmFwcGx5KHRoaXMsaXx8W3QucmVzcG9uc2VUZXh0LGUsdF0pfSl9KSx0aGlzfSxTLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbih0LGUpe1MuZm5bZV09ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub24oZSx0KX19KSxTLmV4cHIucHNldWRvcy5hbmltYXRlZD1mdW5jdGlvbih0KXtyZXR1cm4gUy5ncmVwKFMudGltZXJzLGZ1bmN0aW9uKGUpe3JldHVybiB0PT09ZS5lbGVtfSkubGVuZ3RofSxTLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYSxzLHUsYz1TLmNzcyh0LCJwb3NpdGlvbiIpLGw9Uyh0KSxmPXt9OyJzdGF0aWMiPT09YyYmKHQuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikscz1sLm9mZnNldCgpLGk9Uy5jc3ModCwidG9wIiksdT1TLmNzcyh0LCJsZWZ0IiksKCJhYnNvbHV0ZSI9PT1jfHwiZml4ZWQiPT09YykmJihpK3UpLmluZGV4T2YoImF1dG8iKT4tMT8oYT0ocj1sLnBvc2l0aW9uKCkpLnRvcCxvPXIubGVmdCk6KGE9cGFyc2VGbG9hdChpKXx8MCxvPXBhcnNlRmxvYXQodSl8fDApLG0oZSkmJihlPWUuY2FsbCh0LG4sUy5leHRlbmQoe30scykpKSxudWxsIT1lLnRvcCYmKGYudG9wPWUudG9wLXMudG9wK2EpLG51bGwhPWUubGVmdCYmKGYubGVmdD1lLmxlZnQtcy5sZWZ0K28pLCJ1c2luZyJpbiBlP2UudXNpbmcuY2FsbCh0LGYpOmwuY3NzKGYpfX0sUy5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbih0KXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1Mub2Zmc2V0LnNldE9mZnNldCh0aGlzLHQsZSl9KTt2YXIgZSxuLHI9dGhpc1swXTtyZXR1cm4gcj9yLmdldENsaWVudFJlY3RzKCkubGVuZ3RoPyhlPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1yLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcse3RvcDplLnRvcCtuLnBhZ2VZT2Zmc2V0LGxlZnQ6ZS5sZWZ0K24ucGFnZVhPZmZzZXR9KTp7dG9wOjAsbGVmdDowfTp2b2lkIDB9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIHQsZSxuLHI9dGhpc1swXSxvPXt0b3A6MCxsZWZ0OjB9O2lmKCJmaXhlZCI9PT1TLmNzcyhyLCJwb3NpdGlvbiIpKWU9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle2ZvcihlPXRoaXMub2Zmc2V0KCksbj1yLm93bmVyRG9jdW1lbnQsdD1yLm9mZnNldFBhcmVudHx8bi5kb2N1bWVudEVsZW1lbnQ7dCYmKHQ9PT1uLmJvZHl8fHQ9PT1uLmRvY3VtZW50RWxlbWVudCkmJiJzdGF0aWMiPT09Uy5jc3ModCwicG9zaXRpb24iKTspdD10LnBhcmVudE5vZGU7dCYmdCE9PXImJjE9PT10Lm5vZGVUeXBlJiYoKG89Uyh0KS5vZmZzZXQoKSkudG9wKz1TLmNzcyh0LCJib3JkZXJUb3BXaWR0aCIsITApLG8ubGVmdCs9Uy5jc3ModCwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpfXJldHVybnt0b3A6ZS50b3Atby50b3AtUy5jc3MociwibWFyZ2luVG9wIiwhMCksbGVmdDplLmxlZnQtby5sZWZ0LVMuY3NzKHIsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5vZmZzZXRQYXJlbnQ7dCYmInN0YXRpYyI9PT1TLmNzcyh0LCJwb3NpdGlvbiIpOyl0PXQub2Zmc2V0UGFyZW50O3JldHVybiB0fHxhdH0pfX0pLFMuZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbih0LGUpe3ZhciBuPSJwYWdlWU9mZnNldCI9PT1lO1MuZm5bdF09ZnVuY3Rpb24ocil7cmV0dXJuICQodGhpcyxmdW5jdGlvbih0LHIsbyl7dmFyIGk7aWYoYih0KT9pPXQ6OT09PXQubm9kZVR5cGUmJihpPXQuZGVmYXVsdFZpZXcpLHZvaWQgMD09PW8pcmV0dXJuIGk/aVtlXTp0W3JdO2k/aS5zY3JvbGxUbyhuP2kucGFnZVhPZmZzZXQ6byxuP286aS5wYWdlWU9mZnNldCk6dFtyXT1vfSx0LHIsYXJndW1lbnRzLmxlbmd0aCl9fSksUy5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKHQsZSl7Uy5jc3NIb29rc1tlXT1HdCh5LnBpeGVsUG9zaXRpb24sZnVuY3Rpb24odCxuKXtpZihuKXJldHVybiBuPVZ0KHQsZSksV3QudGVzdChuKT9TKHQpLnBvc2l0aW9uKClbZV0rInB4IjpufSl9KSxTLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbih0LGUpe1MuZWFjaCh7cGFkZGluZzoiaW5uZXIiK3QsY29udGVudDplLCIiOiJvdXRlciIrdH0sZnVuY3Rpb24obixyKXtTLmZuW3JdPWZ1bmN0aW9uKG8saSl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aCYmKG58fCJib29sZWFuIiE9dHlwZW9mIG8pLHM9bnx8KCEwPT09b3x8ITA9PT1pPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUsbixvKXt2YXIgaTtyZXR1cm4gYihlKT8wPT09ci5pbmRleE9mKCJvdXRlciIpP2VbImlubmVyIit0XTplLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50Iit0XTo5PT09ZS5ub2RlVHlwZT8oaT1lLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChlLmJvZHlbInNjcm9sbCIrdF0saVsic2Nyb2xsIit0XSxlLmJvZHlbIm9mZnNldCIrdF0saVsib2Zmc2V0Iit0XSxpWyJjbGllbnQiK3RdKSk6dm9pZCAwPT09bz9TLmNzcyhlLG4scyk6Uy5zdHlsZShlLG4sbyxzKX0sZSxhP286dm9pZCAwLGEpfX0pfSksUy5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKHQsZSl7Uy5mbltlXT1mdW5jdGlvbih0LG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbihlLG51bGwsdCxuKTp0aGlzLnRyaWdnZXIoZSl9fSksUy5mbi5leHRlbmQoe2hvdmVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubW91c2VlbnRlcih0KS5tb3VzZWxlYXZlKGV8fHQpfX0pLFMuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5vbih0LG51bGwsZSxuKX0sdW5iaW5kOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMub2ZmKHQsbnVsbCxlKX0sZGVsZWdhdGU6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHRoaXMub24oZSx0LG4scil9LHVuZGVsZWdhdGU6ZnVuY3Rpb24odCxlLG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZih0LCIqKiIpOnRoaXMub2ZmKGUsdHx8IioqIixuKX19KSxTLnByb3h5PWZ1bmN0aW9uKHQsZSl7dmFyIG4scixvO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmKG49dFtlXSxlPXQsdD1uKSxtKHQpKXJldHVybiByPXUuY2FsbChhcmd1bWVudHMsMiksKG89ZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlfHx0aGlzLHIuY29uY2F0KHUuY2FsbChhcmd1bWVudHMpKSl9KS5ndWlkPXQuZ3VpZD10Lmd1aWR8fFMuZ3VpZCsrLG99LFMuaG9sZFJlYWR5PWZ1bmN0aW9uKHQpe3Q/Uy5yZWFkeVdhaXQrKzpTLnJlYWR5KCEwKX0sUy5pc0FycmF5PUFycmF5LmlzQXJyYXksUy5wYXJzZUpTT049SlNPTi5wYXJzZSxTLm5vZGVOYW1lPUwsUy5pc0Z1bmN0aW9uPW0sUy5pc1dpbmRvdz1iLFMuY2FtZWxDYXNlPUssUy50eXBlPWssUy5ub3c9RGF0ZS5ub3csUy5pc051bWVyaWM9ZnVuY3Rpb24odCl7dmFyIGU9Uy50eXBlKHQpO3JldHVybigibnVtYmVyIj09PWV8fCJzdHJpbmciPT09ZSkmJiFpc05hTih0LXBhcnNlRmxvYXQodCkpfSx2b2lkIDA9PT0ocj1mdW5jdGlvbigpe3JldHVybiBTfS5hcHBseShlLFtdKSl8fCh0LmV4cG9ydHM9cik7dmFyIFFlPW4ualF1ZXJ5LFplPW4uJDtyZXR1cm4gUy5ub0NvbmZsaWN0PWZ1bmN0aW9uKHQpe3JldHVybiBuLiQ9PT1TJiYobi4kPVplKSx0JiZuLmpRdWVyeT09PVMmJihuLmpRdWVyeT1RZSksU30sb3x8KG4ualF1ZXJ5PW4uJD1TKSxTfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDEpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQyKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0OCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI1Mik7ZnVuY3Rpb24gbyh0LGUsbixvLGksYSxzKXt0cnl7dmFyIHU9dFthXShzKSxjPXUudmFsdWV9Y2F0Y2godCl7cmV0dXJuIHZvaWQgbih0KX11LmRvbmU/ZShjKTpyLnJlc29sdmUoYykudGhlbihvLGkpfXQuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49YXJndW1lbnRzO3JldHVybiBuZXcgcihmdW5jdGlvbihyLGkpe3ZhciBhPXQuYXBwbHkoZSxuKTtmdW5jdGlvbiBzKHQpe28oYSxyLGkscyx1LCJuZXh0Iix0KX1mdW5jdGlvbiB1KHQpe28oYSxyLGkscyx1LCJ0aHJvdyIsdCl9cyh2b2lkIDApfSl9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjY0KS5kZWZhdWx0O3QuZXhwb3J0cz1yLHQuZXhwb3J0cy5kZWZhdWx0PXJ9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyOTgpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCJcXCQmIil9ci5wcm90bz1mdW5jdGlvbigpe3JldHVybiBSZWdFeHAuZXNjYXBlPXIscn0sdC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMzcpfSxmdW5jdGlvbih0LGUsbil7bigxMzgpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuUmVmbGVjdC5jb25zdHJ1Y3R9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigzMiksaT1uKDIyKSxhPW4oMTEpLHM9big2KSx1PW4oNDYpLGM9big5MSksbD1uKDUpLGY9bygiUmVmbGVjdCIsImNvbnN0cnVjdCIpLHA9bChmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIShmKGZ1bmN0aW9uKCl7fSxbXSx0KWluc3RhbmNlb2YgdCl9KSxoPSFsKGZ1bmN0aW9uKCl7ZihmdW5jdGlvbigpe30pfSksZD1wfHxoO3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMCxmb3JjZWQ6ZCxzaGFtOmR9LHtjb25zdHJ1Y3Q6ZnVuY3Rpb24odCxlKXtpKHQpLGEoZSk7dmFyIG49YXJndW1lbnRzLmxlbmd0aDwzP3Q6aShhcmd1bWVudHNbMl0pO2lmKGgmJiFwKXJldHVybiBmKHQsZSxuKTtpZih0PT1uKXtzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlWzBdKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSk7Y2FzZSAzOnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSk7Y2FzZSA0OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdKX12YXIgcj1bbnVsbF07cmV0dXJuIHIucHVzaC5hcHBseShyLGUpLG5ldyhjLmFwcGx5KHQscikpfXZhciBvPW4ucHJvdG90eXBlLGw9dShzKG8pP286T2JqZWN0LnByb3RvdHlwZSksZD1GdW5jdGlvbi5hcHBseS5jYWxsKHQsbCxlKTtyZXR1cm4gcyhkKT9kOmx9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKSxvPW4oMjMpLGk9bigxMSksYT1uKDU1KTt0LmV4cG9ydHM9cj9PYmplY3QuZGVmaW5lUHJvcGVydGllczpmdW5jdGlvbih0LGUpe2kodCk7Zm9yKHZhciBuLHI9YShlKSxzPXIubGVuZ3RoLHU9MDtzPnU7KW8uZih0LG49clt1KytdLGVbbl0pO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCksbz1uKDE3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt0cnl7byhyLHQsZSl9Y2F0Y2gobil7clt0XT1lfXJldHVybiBlfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE0Mil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEpLG89ci5KU09OfHwoci5KU09OPXtzdHJpbmdpZnk6SlNPTi5zdHJpbmdpZnl9KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG8uc3RyaW5naWZ5LmFwcGx5KG8sYXJndW1lbnRzKX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNDQpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDUpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmNvbmNhdDtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8uY29uY2F0P3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDkyKTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5jb25jYXR9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNDcpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDgpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10Lm1hcDtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8ubWFwP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDE0OSk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIkFycmF5IikubWFwfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDczKS5tYXA7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFuKDcyKSgibWFwIil9LHttYXA6ZnVuY3Rpb24odCl7cmV0dXJuIG8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE1MSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNTIpfSxmdW5jdGlvbih0LGUsbil7bigxNTMpO3ZhciByPW4oMSkuT2JqZWN0LG89dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gci5kZWZpbmVQcm9wZXJ0eSh0LGUsbil9O3IuZGVmaW5lUHJvcGVydHkuc2hhbSYmKG8uc2hhbT0hMCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigxMyk7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFvLHNoYW06IW99LHtkZWZpbmVQcm9wZXJ0eTpuKDIzKS5mfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNTUpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTU2KX0sZnVuY3Rpb24odCxlLG4pe24oMTU3KTt2YXIgcj1uKDEpLk9iamVjdCxvPXQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiByLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpfTtyLmdldE93blByb3BlcnR5RGVzY3JpcHRvci5zaGFtJiYoby5zaGFtPSEwKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDUpLGk9bigyMSksYT1uKDQ0KS5mLHM9bigxMyksdT1vKGZ1bmN0aW9uKCl7YSgxKX0pO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDohc3x8dSxzaGFtOiFzfSx7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGEoaSh0KSxlKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE1OSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjApfSxmdW5jdGlvbih0LGUsbil7bigxNjEpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuUmVmbGVjdC5nZXR9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big2KSxpPW4oMTEpLGE9bigxNCkscz1uKDQ0KSx1PW4oNDgpO3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMH0se2dldDpmdW5jdGlvbiB0KGUsbil7dmFyIHIsYyxsPWFyZ3VtZW50cy5sZW5ndGg8Mz9lOmFyZ3VtZW50c1syXTtyZXR1cm4gaShlKT09PWw/ZVtuXToocj1zLmYoZSxuKSk/YShyLCJ2YWx1ZSIpP3IudmFsdWU6dm9pZCAwPT09ci5nZXQ/dm9pZCAwOnIuZ2V0LmNhbGwobCk6byhjPXUoZSkpP3QoYyxuLGwpOnZvaWQgMH19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Zvcig7IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpJiZudWxsIT09KHQ9cih0KSk7KTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjQpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTY1KX0sZnVuY3Rpb24odCxlLG4pe24oMTY2KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLk9iamVjdC5nZXRQcm90b3R5cGVPZn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDUpLGk9bigyNCksYT1uKDQ4KSxzPW4oOTUpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpvKGZ1bmN0aW9uKCl7YSgxKX0pLHNoYW06IXN9LHtnZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gYShpKHQpKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE2OCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE2OSk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3Quc2V0UHJvdG90eXBlT2Z9LGZ1bmN0aW9uKHQsZSxuKXtuKDApKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMH0se3NldFByb3RvdHlwZU9mOm4oNzQpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighcih0KSYmbnVsbCE9PXQpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBzZXQgIitTdHJpbmcodCkrIiBhcyBhIHByb3RvdHlwZSIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE3Mil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzMpfSxmdW5jdGlvbih0LGUsbil7bigxNzQpO3ZhciByPW4oMSkuT2JqZWN0O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiByLmNyZWF0ZSh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe24oMCkoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLHNoYW06IW4oMTMpfSx7Y3JlYXRlOm4oNDYpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDk2KTtmdW5jdGlvbiBvKGUsbil7cmV0dXJuIHQuZXhwb3J0cz1vPXJ8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0sbyhlLG4pfXQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNzcpLG89bigxMDIpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQuZXhwb3J0cz1pPSJmdW5jdGlvbiI9PXR5cGVvZiBvJiYic3ltYm9sIj09dHlwZW9mIHI/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIG8mJnQuY29uc3RydWN0b3I9PT1vJiZ0IT09by5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LGkoZSl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzgpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTc5KX0sZnVuY3Rpb24odCxlLG4pe24oOTcpLG4oMzQpLG4oNTApO3ZhciByPW4oNzUpO3QuZXhwb3J0cz1yLmYoIml0ZXJhdG9yIil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY4KSxvPW4oNDUpLGk9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGksYSxzPVN0cmluZyhvKGUpKSx1PXIobiksYz1zLmxlbmd0aDtyZXR1cm4gdTwwfHx1Pj1jP3Q/IiI6dm9pZCAwOihpPXMuY2hhckNvZGVBdCh1KSk8NTUyOTZ8fGk+NTYzMTl8fHUrMT09PWN8fChhPXMuY2hhckNvZGVBdCh1KzEpKTw1NjMyMHx8YT41NzM0Mz90P3MuY2hhckF0KHUpOmk6dD9zLnNsaWNlKHUsdSsyKTphLTU2MzIwKyhpLTU1Mjk2PDwxMCkrNjU1MzZ9fTt0LmV4cG9ydHM9e2NvZGVBdDppKCExKSxjaGFyQXQ6aSghMCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KSxvPW4oMTgyKSxpPXIuV2Vha01hcDt0LmV4cG9ydHM9ImZ1bmN0aW9uIj09dHlwZW9mIGkmJi9uYXRpdmUgY29kZS8udGVzdChvLmNhbGwoaSkpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1OCk7dC5leHBvcnRzPXIoIm5hdGl2ZS1mdW5jdGlvbi10by1zdHJpbmciLEZ1bmN0aW9uLnRvU3RyaW5nKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDc2KSxvPXt9O29bbigyKSgidG9TdHJpbmdUYWciKV09InoiLHQuZXhwb3J0cz0iW29iamVjdCB6XSIhPT1TdHJpbmcobyk/ZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCAiK3IodGhpcykrIl0ifTpvLnRvU3RyaW5nfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17Q1NTUnVsZUxpc3Q6MCxDU1NTdHlsZURlY2xhcmF0aW9uOjAsQ1NTVmFsdWVMaXN0OjAsQ2xpZW50UmVjdExpc3Q6MCxET01SZWN0TGlzdDowLERPTVN0cmluZ0xpc3Q6MCxET01Ub2tlbkxpc3Q6MSxEYXRhVHJhbnNmZXJJdGVtTGlzdDowLEZpbGVMaXN0OjAsSFRNTEFsbENvbGxlY3Rpb246MCxIVE1MQ29sbGVjdGlvbjowLEhUTUxGb3JtRWxlbWVudDowLEhUTUxTZWxlY3RFbGVtZW50OjAsTWVkaWFMaXN0OjAsTWltZVR5cGVBcnJheTowLE5hbWVkTm9kZU1hcDowLE5vZGVMaXN0OjEsUGFpbnRSZXF1ZXN0TGlzdDowLFBsdWdpbjowLFBsdWdpbkFycmF5OjAsU1ZHTGVuZ3RoTGlzdDowLFNWR051bWJlckxpc3Q6MCxTVkdQYXRoU2VnTGlzdDowLFNWR1BvaW50TGlzdDowLFNWR1N0cmluZ0xpc3Q6MCxTVkdUcmFuc2Zvcm1MaXN0OjAsU291cmNlQnVmZmVyTGlzdDowLFN0eWxlU2hlZXRMaXN0OjAsVGV4dFRyYWNrQ3VlTGlzdDowLFRleHRUcmFja0xpc3Q6MCxUb3VjaExpc3Q6MH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMDMpLG4oMjAzKSxuKDIwNCksbigyMDUpLG4oMjA2KSxuKDIwNyl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNCksaT1uKDI3KSxhPW4oMTMpLHM9big5NCksdT1uKDUpLGM9bigxNCksbD1uKDQ3KSxmPW4oNikscD1uKDExKSxoPW4oMjQpLGQ9bigyMSksZz1uKDU0KSx2PW4oMzApLHk9big0NiksbT1uKDU1KSxiPW4oMTA1KSx4PW4oMTg3KSx3PW4oMTA2KSxrPW4oNDQpLFM9bigyMyksRT1uKDY0KSxUPW4oMTcpLGo9bigzNSksQT1uKDU4KSxPPW4oNTcpLEM9big1NiksTD1uKDcwKSxSPW4oMiksUD1uKDc1KSxOPW4oMyksST1uKDI4KSxEPW4oNDkpLF89big3MykuZm9yRWFjaCxNPU8oImhpZGRlbiIpLFU9UigidG9QcmltaXRpdmUiKSxCPUQuc2V0LHE9RC5nZXR0ZXJGb3IoIlN5bWJvbCIpLEY9T2JqZWN0LnByb3RvdHlwZSxIPW8uU3ltYm9sLHo9by5KU09OLFc9eiYmei5zdHJpbmdpZnksJD1rLmYsWT1TLmYsVj14LmYsRz1FLmYsSz1BKCJzeW1ib2xzIiksWD1BKCJvcC1zeW1ib2xzIiksSj1BKCJzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5IiksUT1BKCJzeW1ib2wtdG8tc3RyaW5nLXJlZ2lzdHJ5IiksWj1BKCJ3a3MiKSx0dD1vLlFPYmplY3QsZXQ9IXR0fHwhdHQucHJvdG90eXBlfHwhdHQucHJvdG90eXBlLmZpbmRDaGlsZCxudD1hJiZ1KGZ1bmN0aW9uKCl7cmV0dXJuIDchPXkoWSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiBZKHRoaXMsImEiLHt2YWx1ZTo3fSkuYX19KSkuYX0pP2Z1bmN0aW9uKHQsZSxuKXt2YXIgcj0kKEYsZSk7ciYmZGVsZXRlIEZbZV0sWSh0LGUsbiksciYmdCE9PUYmJlkoRixlLHIpfTpZLHJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49S1t0XT15KEgucHJvdG90eXBlKTtyZXR1cm4gQihuLHt0eXBlOiJTeW1ib2wiLHRhZzp0LGRlc2NyaXB0aW9uOmV9KSxhfHwobi5kZXNjcmlwdGlvbj1lKSxufSxvdD1zJiYic3ltYm9sIj09dHlwZW9mIEguaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHQpaW5zdGFuY2VvZiBIfSxpdD1mdW5jdGlvbih0LGUsbil7dD09PUYmJml0KFgsZSxuKSxwKHQpO3ZhciByPWcoZSwhMCk7cmV0dXJuIHAobiksYyhLLHIpPyhuLmVudW1lcmFibGU/KGModCxNKSYmdFtNXVtyXSYmKHRbTV1bcl09ITEpLG49eShuLHtlbnVtZXJhYmxlOnYoMCwhMSl9KSk6KGModCxNKXx8WSh0LE0sdigxLHt9KSksdFtNXVtyXT0hMCksbnQodCxyLG4pKTpZKHQscixuKX0sYXQ9ZnVuY3Rpb24odCxlKXtwKHQpO3ZhciBuPWQoZSkscj1tKG4pLmNvbmNhdChsdChuKSk7cmV0dXJuIF8ocixmdW5jdGlvbihlKXthJiYhc3QuY2FsbChuLGUpfHxpdCh0LGUsbltlXSl9KSx0fSxzdD1mdW5jdGlvbih0KXt2YXIgZT1nKHQsITApLG49Ry5jYWxsKHRoaXMsZSk7cmV0dXJuISh0aGlzPT09RiYmYyhLLGUpJiYhYyhYLGUpKSYmKCEobnx8IWModGhpcyxlKXx8IWMoSyxlKXx8Yyh0aGlzLE0pJiZ0aGlzW01dW2VdKXx8bil9LHV0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZCh0KSxyPWcoZSwhMCk7aWYobiE9PUZ8fCFjKEsscil8fGMoWCxyKSl7dmFyIG89JChuLHIpO3JldHVybiFvfHwhYyhLLHIpfHxjKG4sTSkmJm5bTV1bcl18fChvLmVudW1lcmFibGU9ITApLG99fSxjdD1mdW5jdGlvbih0KXt2YXIgZT1WKGQodCkpLG49W107cmV0dXJuIF8oZSxmdW5jdGlvbih0KXtjKEssdCl8fGMoQyx0KXx8bi5wdXNoKHQpfSksbn0sbHQ9ZnVuY3Rpb24odCl7dmFyIGU9dD09PUYsbj1WKGU/WDpkKHQpKSxyPVtdO3JldHVybiBfKG4sZnVuY3Rpb24odCl7IWMoSyx0KXx8ZSYmIWMoRix0KXx8ci5wdXNoKEtbdF0pfSkscn07c3x8KGooKEg9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgSCl0aHJvdyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9TdHJpbmcoYXJndW1lbnRzWzBdKTp2b2lkIDAsZT1MKHQpLG49ZnVuY3Rpb24odCl7dGhpcz09PUYmJm4uY2FsbChYLHQpLGModGhpcyxNKSYmYyh0aGlzW01dLGUpJiYodGhpc1tNXVtlXT0hMSksbnQodGhpcyxlLHYoMSx0KSl9O3JldHVybiBhJiZldCYmbnQoRixlLHtjb25maWd1cmFibGU6ITAsc2V0Om59KSxydChlLHQpfSkucHJvdG90eXBlLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4gcSh0aGlzKS50YWd9KSxFLmY9c3QsUy5mPWl0LGsuZj11dCxiLmY9eC5mPWN0LHcuZj1sdCxhJiYoWShILnByb3RvdHlwZSwiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHEodGhpcykuZGVzY3JpcHRpb259fSksaXx8aihGLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsc3Qse3Vuc2FmZTohMH0pKSxQLmY9ZnVuY3Rpb24odCl7cmV0dXJuIHJ0KFIodCksdCl9KSxyKHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6IXMsc2hhbTohc30se1N5bWJvbDpIfSksXyhtKFopLGZ1bmN0aW9uKHQpe04odCl9KSxyKHt0YXJnZXQ6IlN5bWJvbCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtmb3I6ZnVuY3Rpb24odCl7dmFyIGU9U3RyaW5nKHQpO2lmKGMoSixlKSlyZXR1cm4gSltlXTt2YXIgbj1IKGUpO3JldHVybiBKW2VdPW4sUVtuXT1lLG59LGtleUZvcjpmdW5jdGlvbih0KXtpZighb3QodCkpdGhyb3cgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBzeW1ib2wiKTtpZihjKFEsdCkpcmV0dXJuIFFbdF19LHVzZVNldHRlcjpmdW5jdGlvbigpe2V0PSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtldD0hMX19KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXMsc2hhbTohYX0se2NyZWF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP3kodCk6YXQoeSh0KSxlKX0sZGVmaW5lUHJvcGVydHk6aXQsZGVmaW5lUHJvcGVydGllczphdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6dXR9KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtnZXRPd25Qcm9wZXJ0eU5hbWVzOmN0LGdldE93blByb3BlcnR5U3ltYm9sczpsdH0pLHIoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDp1KGZ1bmN0aW9uKCl7dy5mKDEpfSl9LHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHcuZihoKHQpKX19KSx6JiZyKHt0YXJnZXQ6IkpTT04iLHN0YXQ6ITAsZm9yY2VkOiFzfHx1KGZ1bmN0aW9uKCl7dmFyIHQ9SCgpO3JldHVybiJbbnVsbF0iIT1XKFt0XSl8fCJ7fSIhPVcoe2E6dH0pfHwie30iIT1XKE9iamVjdCh0KSl9KX0se3N0cmluZ2lmeTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbixyPVt0XSxvPTE7YXJndW1lbnRzLmxlbmd0aD5vOylyLnB1c2goYXJndW1lbnRzW28rK10pO2lmKG49ZT1yWzFdLChmKGUpfHx2b2lkIDAhPT10KSYmIW90KHQpKXJldHVybiBsKGUpfHwoZT1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuJiYoZT1uLmNhbGwodGhpcyx0LGUpKSwhb3QoZSkpcmV0dXJuIGV9KSxyWzFdPWUsVy5hcHBseSh6LHIpfX0pLEgucHJvdG90eXBlW1VdfHxUKEgucHJvdG90eXBlLFUsSC5wcm90b3R5cGUudmFsdWVPZiksSShILCJTeW1ib2wiKSxDW01dPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMSksbz1uKDEwNSkuZixpPXt9LnRvU3RyaW5nLGE9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gYSYmIltvYmplY3QgV2luZG93XSI9PWkuY2FsbCh0KT9mdW5jdGlvbih0KXt0cnl7cmV0dXJuIG8odCl9Y2F0Y2godCl7cmV0dXJuIGEuc2xpY2UoKX19KHQpOm8ocih0KSl9fSxmdW5jdGlvbih0LGUsbil7bigzKSgiYXN5bmNJdGVyYXRvciIpfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4pe24oMykoImhhc0luc3RhbmNlIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJpc0NvbmNhdFNwcmVhZGFibGUiKX0sZnVuY3Rpb24odCxlLG4pe24oMykoIm1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJtYXRjaEFsbCIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgicmVwbGFjZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgic2VhcmNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJzcGVjaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJzcGxpdCIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgidG9QcmltaXRpdmUiKX0sZnVuY3Rpb24odCxlLG4pe24oMykoInRvU3RyaW5nVGFnIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJ1bnNjb3BhYmxlcyIpfSxmdW5jdGlvbih0LGUsbil7bigyOCkoTWF0aCwiTWF0aCIsITApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KTtuKDI4KShyLkpTT04sIkpTT04iLCEwKX0sZnVuY3Rpb24odCxlLG4pe24oMykoImFzeW5jRGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgiZGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgib2JzZXJ2YWJsZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgicGF0dGVybk1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJyZXBsYWNlQWxsIil9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMTEpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmZpbmQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLmZpbmQ/cjplfX0sZnVuY3Rpb24odCxlLG4pe24oMjEyKTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5maW5kfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDczKS5maW5kLGk9big3NyksYT0hMDsiZmluZCJpbltdJiZBcnJheSgxKS5maW5kKGZ1bmN0aW9uKCl7YT0hMX0pLHIoe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDphfSx7ZmluZDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLGkoImZpbmQiKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIxNCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxNSksbz1TdHJpbmcucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LnRyaW07cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHx0PT09b3x8dCBpbnN0YW5jZW9mIFN0cmluZyYmZT09PW8udHJpbT9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyMTYpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJTdHJpbmciKS50cmltfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDEwNykudHJpbTtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOm4oMjE3KSgidHJpbSIpfSx7dHJpbTpmdW5jdGlvbigpe3JldHVybiBvKHRoaXMpfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KSxvPW4oNzgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcihmdW5jdGlvbigpe3JldHVybiEhb1t0XSgpfHwi4oCLwoXhoI4iIT0i4oCLwoXhoI4iW3RdKCl8fG9bdF0ubmFtZSE9PXR9KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTkpfSxmdW5jdGlvbih0LGUsbil7bigyMjApO3ZhciByPW4oMSk7dC5leHBvcnRzPXIucGFyc2VJbnR9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigyMjEpO3Ioe2dsb2JhbDohMCxmb3JjZWQ6cGFyc2VJbnQhPW99LHtwYXJzZUludDpvfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpLG89bigxMDcpLnRyaW0saT1uKDc4KSxhPXIucGFyc2VJbnQscz0vXlsrLV0/MFtYeF0vLHU9OCE9PWEoaSsiMDgiKXx8MjIhPT1hKGkrIjB4MTYiKTt0LmV4cG9ydHM9dT9mdW5jdGlvbih0LGUpe3ZhciBuPW8oU3RyaW5nKHQpKTtyZXR1cm4gYShuLGU+Pj4wfHwocy50ZXN0KG4pPzE2OjEwKSl9OmF9LGZ1bmN0aW9uKHQsZSxuKXtuKDUwKSxuKDM0KSx0LmV4cG9ydHM9bigxMDgpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTA5KX0sZnVuY3Rpb24odCxlLG4pe24oMCkoe3RhcmdldDoiQXJyYXkiLHN0YXQ6ITB9LHtpc0FycmF5Om4oNDcpfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDUwKSxuKDM0KSx0LmV4cG9ydHM9big1MSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMDMpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTEwKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDIyOSk7cih7dGFyZ2V0OiJBcnJheSIsc3RhdDohMCxmb3JjZWQ6IW4oMTEzKShmdW5jdGlvbih0KXtBcnJheS5mcm9tKHQpfSl9LHtmcm9tOm99KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMxKSxvPW4oMjQpLGk9bigxMTEpLGE9bigxMTIpLHM9bigzMyksdT1uKDcxKSxjPW4oNTEpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZSxuLGwsZixwPW8odCksaD0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcz90aGlzOkFycmF5LGQ9YXJndW1lbnRzLmxlbmd0aCxnPWQ+MT9hcmd1bWVudHNbMV06dm9pZCAwLHY9dm9pZCAwIT09Zyx5PTAsbT1jKHApO2lmKHYmJihnPXIoZyxkPjI/YXJndW1lbnRzWzJdOnZvaWQgMCwyKSksbnVsbD09bXx8aD09QXJyYXkmJmEobSkpZm9yKG49bmV3IGgoZT1zKHAubGVuZ3RoKSk7ZT55O3krKyl1KG4seSx2P2cocFt5XSx5KTpwW3ldKTtlbHNlIGZvcihmPW0uY2FsbChwKSxuPW5ldyBoOyEobD1mLm5leHQoKSkuZG9uZTt5KyspdShuLHksdj9pKGYsZyxbbC52YWx1ZSx5XSwhMCk6bC52YWx1ZSk7cmV0dXJuIG4ubGVuZ3RoPXksbn19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTQpfSxmdW5jdGlvbih0LGUsbil7bigyMzIpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLnNsaWNlfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDYpLGk9big0NyksYT1uKDg5KSxzPW4oMzMpLHU9bigyMSksYz1uKDcxKSxsPW4oNzIpLGY9bigyKSgic3BlY2llcyIpLHA9W10uc2xpY2UsaD1NYXRoLm1heDtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWwoInNsaWNlIil9LHtzbGljZTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbCxkPXUodGhpcyksZz1zKGQubGVuZ3RoKSx2PWEodCxnKSx5PWEodm9pZCAwPT09ZT9nOmUsZyk7aWYoaShkKSYmKCJmdW5jdGlvbiIhPXR5cGVvZihuPWQuY29uc3RydWN0b3IpfHxuIT09QXJyYXkmJiFpKG4ucHJvdG90eXBlKT9vKG4pJiZudWxsPT09KG49bltmXSkmJihuPXZvaWQgMCk6bj12b2lkIDAsbj09PUFycmF5fHx2b2lkIDA9PT1uKSlyZXR1cm4gcC5jYWxsKGQsdix5KTtmb3Iocj1uZXcodm9pZCAwPT09bj9BcnJheTpuKShoKHktdiwwKSksbD0wO3Y8eTt2KyssbCsrKXYgaW4gZCYmYyhyLGwsZFt2XSk7cmV0dXJuIHIubGVuZ3RoPWwscn19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzNCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDIzNSk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3Qua2V5c30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDI0KSxpPW4oNTUpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpuKDUpKGZ1bmN0aW9uKCl7aSgxKX0pfSx7a2V5czpmdW5jdGlvbih0KXtyZXR1cm4gaShvKHQpKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzNyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzOCksbz1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5kZXhPZjtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8uaW5kZXhPZj9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyMzkpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLmluZGV4T2Z9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNjcpLmluZGV4T2YsaT1uKDI0MCksYT1bXS5pbmRleE9mLHM9ISFhJiYxL1sxXS5pbmRleE9mKDEsLTApPDAsdT1pKCJpbmRleE9mIik7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOnN8fHV9LHtpbmRleE9mOmZ1bmN0aW9uKHQpe3JldHVybiBzP2EuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwwOm8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPVtdW3RdO3JldHVybiFufHwhcihmdW5jdGlvbigpe24uY2FsbChudWxsLGV8fGZ1bmN0aW9uKCl7dGhyb3cgMX0sMSl9KX19LGZ1bmN0aW9uKHQsZSxuKXtuKDExNSksdC5leHBvcnRzPW4oMSkuc2V0VGltZW91dH0sZnVuY3Rpb24odCxlLG4pe24oMTE1KSx0LmV4cG9ydHM9bigxKS5zZXRJbnRlcnZhbH0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0NCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDI0NSk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3QuYXNzaWdufSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oMjQ2KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6T2JqZWN0LmFzc2lnbiE9PW99LHthc3NpZ246b30pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTMpLG89big1KSxpPW4oNTUpLGE9bigxMDYpLHM9big2NCksdT1uKDI0KSxjPW4oNjUpLGw9T2JqZWN0LmFzc2lnbjt0LmV4cG9ydHM9IWx8fG8oZnVuY3Rpb24oKXt2YXIgdD17fSxlPXt9LG49U3ltYm9sKCk7cmV0dXJuIHRbbl09NywiYWJjZGVmZ2hpamtsbW5vcHFyc3QiLnNwbGl0KCIiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09dH0pLDchPWwoe30sdClbbl18fCJhYmNkZWZnaGlqa2xtbm9wcXJzdCIhPWkobCh7fSxlKSkuam9pbigiIil9KT9mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj11KHQpLG89YXJndW1lbnRzLmxlbmd0aCxsPTEsZj1hLmYscD1zLmY7bz5sOylmb3IodmFyIGgsZD1jKGFyZ3VtZW50c1tsKytdKSxnPWY/aShkKS5jb25jYXQoZihkKSk6aShkKSx2PWcubGVuZ3RoLHk9MDt2Pnk7KWg9Z1t5KytdLHImJiFwLmNhbGwoZCxoKXx8KG5baF09ZFtoXSk7cmV0dXJuIG59Omx9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1mdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGUsbj1PYmplY3QucHJvdG90eXBlLHI9bi5oYXNPd25Qcm9wZXJ0eSxvPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2w/U3ltYm9sOnt9LGk9by5pdGVyYXRvcnx8IkBAaXRlcmF0b3IiLGE9by5hc3luY0l0ZXJhdG9yfHwiQEBhc3luY0l0ZXJhdG9yIixzPW8udG9TdHJpbmdUYWd8fCJAQHRvU3RyaW5nVGFnIjtmdW5jdGlvbiB1KHQsZSxuKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pLHRbZV19dHJ5e3Uoe30sIiIpfWNhdGNoKHQpe3U9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0W2VdPW59fWZ1bmN0aW9uIGModCxlLG4scil7dmFyIG89ZSYmZS5wcm90b3R5cGUgaW5zdGFuY2VvZiB2P2U6dixpPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpLGE9bmV3IE8ocnx8W10pO3JldHVybiBpLl9pbnZva2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWY7cmV0dXJuIGZ1bmN0aW9uKG8saSl7aWYocj09PWgpdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7aWYocj09PWQpe2lmKCJ0aHJvdyI9PT1vKXRocm93IGk7cmV0dXJuIEwoKX1mb3Iobi5tZXRob2Q9byxuLmFyZz1pOzspe3ZhciBhPW4uZGVsZWdhdGU7aWYoYSl7dmFyIHM9VChhLG4pO2lmKHMpe2lmKHM9PT1nKWNvbnRpbnVlO3JldHVybiBzfX1pZigibmV4dCI9PT1uLm1ldGhvZCluLnNlbnQ9bi5fc2VudD1uLmFyZztlbHNlIGlmKCJ0aHJvdyI9PT1uLm1ldGhvZCl7aWYocj09PWYpdGhyb3cgcj1kLG4uYXJnO24uZGlzcGF0Y2hFeGNlcHRpb24obi5hcmcpfWVsc2UicmV0dXJuIj09PW4ubWV0aG9kJiZuLmFicnVwdCgicmV0dXJuIixuLmFyZyk7cj1oO3ZhciB1PWwodCxlLG4pO2lmKCJub3JtYWwiPT09dS50eXBlKXtpZihyPW4uZG9uZT9kOnAsdS5hcmc9PT1nKWNvbnRpbnVlO3JldHVybnt2YWx1ZTp1LmFyZyxkb25lOm4uZG9uZX19InRocm93Ij09PXUudHlwZSYmKHI9ZCxuLm1ldGhvZD0idGhyb3ciLG4uYXJnPXUuYXJnKX19fSh0LG4sYSksaX1mdW5jdGlvbiBsKHQsZSxuKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOnQuY2FsbChlLG4pfX1jYXRjaCh0KXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzp0fX19dC53cmFwPWM7dmFyIGY9InN1c3BlbmRlZFN0YXJ0IixwPSJzdXNwZW5kZWRZaWVsZCIsaD0iZXhlY3V0aW5nIixkPSJjb21wbGV0ZWQiLGc9e307ZnVuY3Rpb24gdigpe31mdW5jdGlvbiB5KCl7fWZ1bmN0aW9uIG0oKXt9dmFyIGI9e307YltpXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt2YXIgeD1PYmplY3QuZ2V0UHJvdG90eXBlT2Ysdz14JiZ4KHgoQyhbXSkpKTt3JiZ3IT09biYmci5jYWxsKHcsaSkmJihiPXcpO3ZhciBrPW0ucHJvdG90eXBlPXYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYik7ZnVuY3Rpb24gUyh0KXtbIm5leHQiLCJ0aHJvdyIsInJldHVybiJdLmZvckVhY2goZnVuY3Rpb24oZSl7dSh0LGUsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ludm9rZShlLHQpfSl9KX1mdW5jdGlvbiBFKHQsZSl7dmFyIG47dGhpcy5faW52b2tlPWZ1bmN0aW9uKG8saSl7ZnVuY3Rpb24gYSgpe3JldHVybiBuZXcgZShmdW5jdGlvbihuLGEpeyFmdW5jdGlvbiBuKG8saSxhLHMpe3ZhciB1PWwodFtvXSx0LGkpO2lmKCJ0aHJvdyIhPT11LnR5cGUpe3ZhciBjPXUuYXJnLGY9Yy52YWx1ZTtyZXR1cm4gZiYmIm9iamVjdCI9PXR5cGVvZiBmJiZyLmNhbGwoZiwiX19hd2FpdCIpP2UucmVzb2x2ZShmLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odCl7bigibmV4dCIsdCxhLHMpfSxmdW5jdGlvbih0KXtuKCJ0aHJvdyIsdCxhLHMpfSk6ZS5yZXNvbHZlKGYpLnRoZW4oZnVuY3Rpb24odCl7Yy52YWx1ZT10LGEoYyl9LGZ1bmN0aW9uKHQpe3JldHVybiBuKCJ0aHJvdyIsdCxhLHMpfSl9cyh1LmFyZyl9KG8saSxuLGEpfSl9cmV0dXJuIG49bj9uLnRoZW4oYSxhKTphKCl9fWZ1bmN0aW9uIFQodCxuKXt2YXIgcj10Lml0ZXJhdG9yW24ubWV0aG9kXTtpZihyPT09ZSl7aWYobi5kZWxlZ2F0ZT1udWxsLCJ0aHJvdyI9PT1uLm1ldGhvZCl7aWYodC5pdGVyYXRvci5yZXR1cm4mJihuLm1ldGhvZD0icmV0dXJuIixuLmFyZz1lLFQodCxuKSwidGhyb3ciPT09bi5tZXRob2QpKXJldHVybiBnO24ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9bmV3IFR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZCIpfXJldHVybiBnfXZhciBvPWwocix0Lml0ZXJhdG9yLG4uYXJnKTtpZigidGhyb3ciPT09by50eXBlKXJldHVybiBuLm1ldGhvZD0idGhyb3ciLG4uYXJnPW8uYXJnLG4uZGVsZWdhdGU9bnVsbCxnO3ZhciBpPW8uYXJnO3JldHVybiBpP2kuZG9uZT8oblt0LnJlc3VsdE5hbWVdPWkudmFsdWUsbi5uZXh0PXQubmV4dExvYywicmV0dXJuIiE9PW4ubWV0aG9kJiYobi5tZXRob2Q9Im5leHQiLG4uYXJnPWUpLG4uZGVsZWdhdGU9bnVsbCxnKTppOihuLm1ldGhvZD0idGhyb3ciLG4uYXJnPW5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0Iiksbi5kZWxlZ2F0ZT1udWxsLGcpfWZ1bmN0aW9uIGoodCl7dmFyIGU9e3RyeUxvYzp0WzBdfTsxIGluIHQmJihlLmNhdGNoTG9jPXRbMV0pLDIgaW4gdCYmKGUuZmluYWxseUxvYz10WzJdLGUuYWZ0ZXJMb2M9dFszXSksdGhpcy50cnlFbnRyaWVzLnB1c2goZSl9ZnVuY3Rpb24gQSh0KXt2YXIgZT10LmNvbXBsZXRpb258fHt9O2UudHlwZT0ibm9ybWFsIixkZWxldGUgZS5hcmcsdC5jb21wbGV0aW9uPWV9ZnVuY3Rpb24gTyh0KXt0aGlzLnRyeUVudHJpZXM9W3t0cnlMb2M6InJvb3QifV0sdC5mb3JFYWNoKGosdGhpcyksdGhpcy5yZXNldCghMCl9ZnVuY3Rpb24gQyh0KXtpZih0KXt2YXIgbj10W2ldO2lmKG4pcmV0dXJuIG4uY2FsbCh0KTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5uZXh0KXJldHVybiB0O2lmKCFpc05hTih0Lmxlbmd0aCkpe3ZhciBvPS0xLGE9ZnVuY3Rpb24gbigpe2Zvcig7KytvPHQubGVuZ3RoOylpZihyLmNhbGwodCxvKSlyZXR1cm4gbi52YWx1ZT10W29dLG4uZG9uZT0hMSxuO3JldHVybiBuLnZhbHVlPWUsbi5kb25lPSEwLG59O3JldHVybiBhLm5leHQ9YX19cmV0dXJue25leHQ6TH19ZnVuY3Rpb24gTCgpe3JldHVybnt2YWx1ZTplLGRvbmU6ITB9fXJldHVybiB5LnByb3RvdHlwZT1rLmNvbnN0cnVjdG9yPW0sbS5jb25zdHJ1Y3Rvcj15LHkuZGlzcGxheU5hbWU9dShtLHMsIkdlbmVyYXRvckZ1bmN0aW9uIiksdC5pc0dlbmVyYXRvckZ1bmN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LmNvbnN0cnVjdG9yO3JldHVybiEhZSYmKGU9PT15fHwiR2VuZXJhdG9yRnVuY3Rpb24iPT09KGUuZGlzcGxheU5hbWV8fGUubmFtZSkpfSx0Lm1hcms9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxtKToodC5fX3Byb3RvX189bSx1KHQscywiR2VuZXJhdG9yRnVuY3Rpb24iKSksdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShrKSx0fSx0LmF3cmFwPWZ1bmN0aW9uKHQpe3JldHVybntfX2F3YWl0OnR9fSxTKEUucHJvdG90eXBlKSxFLnByb3RvdHlwZVthXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSx0LkFzeW5jSXRlcmF0b3I9RSx0LmFzeW5jPWZ1bmN0aW9uKGUsbixyLG8saSl7dm9pZCAwPT09aSYmKGk9UHJvbWlzZSk7dmFyIGE9bmV3IEUoYyhlLG4scixvKSxpKTtyZXR1cm4gdC5pc0dlbmVyYXRvckZ1bmN0aW9uKG4pP2E6YS5uZXh0KCkudGhlbihmdW5jdGlvbih0KXtyZXR1cm4gdC5kb25lP3QudmFsdWU6YS5uZXh0KCl9KX0sUyhrKSx1KGsscywiR2VuZXJhdG9yIiksa1tpXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxrLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgR2VuZXJhdG9yXSJ9LHQua2V5cz1mdW5jdGlvbih0KXt2YXIgZT1bXTtmb3IodmFyIG4gaW4gdCllLnB1c2gobik7cmV0dXJuIGUucmV2ZXJzZSgpLGZ1bmN0aW9uIG4oKXtmb3IoO2UubGVuZ3RoOyl7dmFyIHI9ZS5wb3AoKTtpZihyIGluIHQpcmV0dXJuIG4udmFsdWU9cixuLmRvbmU9ITEsbn1yZXR1cm4gbi5kb25lPSEwLG59fSx0LnZhbHVlcz1DLE8ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpPLHJlc2V0OmZ1bmN0aW9uKHQpe2lmKHRoaXMucHJldj0wLHRoaXMubmV4dD0wLHRoaXMuc2VudD10aGlzLl9zZW50PWUsdGhpcy5kb25lPSExLHRoaXMuZGVsZWdhdGU9bnVsbCx0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5hcmc9ZSx0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChBKSwhdClmb3IodmFyIG4gaW4gdGhpcykidCI9PT1uLmNoYXJBdCgwKSYmci5jYWxsKHRoaXMsbikmJiFpc05hTigrbi5zbGljZSgxKSkmJih0aGlzW25dPWUpfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5kb25lPSEwO3ZhciB0PXRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uO2lmKCJ0aHJvdyI9PT10LnR5cGUpdGhyb3cgdC5hcmc7cmV0dXJuIHRoaXMucnZhbH0sZGlzcGF0Y2hFeGNlcHRpb246ZnVuY3Rpb24odCl7aWYodGhpcy5kb25lKXRocm93IHQ7dmFyIG49dGhpcztmdW5jdGlvbiBvKHIsbyl7cmV0dXJuIHMudHlwZT0idGhyb3ciLHMuYXJnPXQsbi5uZXh0PXIsbyYmKG4ubWV0aG9kPSJuZXh0IixuLmFyZz1lKSwhIW99Zm9yKHZhciBpPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtpPj0wOy0taSl7dmFyIGE9dGhpcy50cnlFbnRyaWVzW2ldLHM9YS5jb21wbGV0aW9uO2lmKCJyb290Ij09PWEudHJ5TG9jKXJldHVybiBvKCJlbmQiKTtpZihhLnRyeUxvYzw9dGhpcy5wcmV2KXt2YXIgdT1yLmNhbGwoYSwiY2F0Y2hMb2MiKSxjPXIuY2FsbChhLCJmaW5hbGx5TG9jIik7aWYodSYmYyl7aWYodGhpcy5wcmV2PGEuY2F0Y2hMb2MpcmV0dXJuIG8oYS5jYXRjaExvYywhMCk7aWYodGhpcy5wcmV2PGEuZmluYWxseUxvYylyZXR1cm4gbyhhLmZpbmFsbHlMb2MpfWVsc2UgaWYodSl7aWYodGhpcy5wcmV2PGEuY2F0Y2hMb2MpcmV0dXJuIG8oYS5jYXRjaExvYywhMCl9ZWxzZXtpZighYyl0aHJvdyBuZXcgRXJyb3IoInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5Iik7aWYodGhpcy5wcmV2PGEuZmluYWxseUxvYylyZXR1cm4gbyhhLmZpbmFsbHlMb2MpfX19fSxhYnJ1cHQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO24+PTA7LS1uKXt2YXIgbz10aGlzLnRyeUVudHJpZXNbbl07aWYoby50cnlMb2M8PXRoaXMucHJldiYmci5jYWxsKG8sImZpbmFsbHlMb2MiKSYmdGhpcy5wcmV2PG8uZmluYWxseUxvYyl7dmFyIGk9bzticmVha319aSYmKCJicmVhayI9PT10fHwiY29udGludWUiPT09dCkmJmkudHJ5TG9jPD1lJiZlPD1pLmZpbmFsbHlMb2MmJihpPW51bGwpO3ZhciBhPWk/aS5jb21wbGV0aW9uOnt9O3JldHVybiBhLnR5cGU9dCxhLmFyZz1lLGk/KHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLm5leHQ9aS5maW5hbGx5TG9jLGcpOnRoaXMuY29tcGxldGUoYSl9LGNvbXBsZXRlOmZ1bmN0aW9uKHQsZSl7aWYoInRocm93Ij09PXQudHlwZSl0aHJvdyB0LmFyZztyZXR1cm4iYnJlYWsiPT09dC50eXBlfHwiY29udGludWUiPT09dC50eXBlP3RoaXMubmV4dD10LmFyZzoicmV0dXJuIj09PXQudHlwZT8odGhpcy5ydmFsPXRoaXMuYXJnPXQuYXJnLHRoaXMubWV0aG9kPSJyZXR1cm4iLHRoaXMubmV4dD0iZW5kIik6Im5vcm1hbCI9PT10LnR5cGUmJmUmJih0aGlzLm5leHQ9ZSksZ30sZmluaXNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7ZT49MDstLWUpe3ZhciBuPXRoaXMudHJ5RW50cmllc1tlXTtpZihuLmZpbmFsbHlMb2M9PT10KXJldHVybiB0aGlzLmNvbXBsZXRlKG4uY29tcGxldGlvbixuLmFmdGVyTG9jKSxBKG4pLGd9fSxjYXRjaDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2U+PTA7LS1lKXt2YXIgbj10aGlzLnRyeUVudHJpZXNbZV07aWYobi50cnlMb2M9PT10KXt2YXIgcj1uLmNvbXBsZXRpb247aWYoInRocm93Ij09PXIudHlwZSl7dmFyIG89ci5hcmc7QShuKX1yZXR1cm4gb319dGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHQiKX0sZGVsZWdhdGVZaWVsZDpmdW5jdGlvbih0LG4scil7cmV0dXJuIHRoaXMuZGVsZWdhdGU9e2l0ZXJhdG9yOkModCkscmVzdWx0TmFtZTpuLG5leHRMb2M6cn0sIm5leHQiPT09dGhpcy5tZXRob2QmJih0aGlzLmFyZz1lKSxnfX0sdH0odC5leHBvcnRzKTt0cnl7cmVnZW5lcmF0b3JSdW50aW1lPXJ9Y2F0Y2godCl7RnVuY3Rpb24oInIiLCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByIikocil9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQ5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjUwKSxvPUZ1bmN0aW9uLnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5iaW5kO3JldHVybiB0PT09b3x8dCBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZlPT09by5iaW5kP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDI1MSk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIkZ1bmN0aW9uIikuYmluZH0sZnVuY3Rpb24odCxlLG4pe24oMCkoe3RhcmdldDoiRnVuY3Rpb24iLHByb3RvOiEwfSx7YmluZDpuKDkxKX0pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjUzKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDExNiksbigyNTkpLG4oMjYwKSxuKDI2MSksbigyNjIpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByLG8saSxhLHM9bigwKSx1PW4oMjcpLGM9big0KSxsPW4oMSksZj1uKDExNykscD1uKDM1KSxoPW4oMTE4KSxkPW4oMjgpLGc9bigyNTUpLHY9big2KSx5PW4oMjIpLG09bigxMTkpLGI9bigyNikseD1uKDU5KSx3PW4oMTEzKSxrPW4oMTIwKSxTPW4oMTIxKS5zZXQsRT1uKDI1NiksVD1uKDEyMiksaj1uKDI1NyksQT1uKDUyKSxPPW4oNjApLEM9big3OSksTD1uKDQ5KSxSPW4oODcpLFA9bigyKSgic3BlY2llcyIpLE49IlByb21pc2UiLEk9TC5nZXQsRD1MLnNldCxfPUwuZ2V0dGVyRm9yKE4pLE09ZixVPWMuVHlwZUVycm9yLEI9Yy5kb2N1bWVudCxxPWMucHJvY2VzcyxGPWMuZmV0Y2gsSD1xJiZxLnZlcnNpb25zLHo9SCYmSC52OHx8IiIsVz1BLmYsJD1XLFk9InByb2Nlc3MiPT1iKHEpLFY9ISEoQiYmQi5jcmVhdGVFdmVudCYmYy5kaXNwYXRjaEV2ZW50KSxHPVIoTixmdW5jdGlvbigpe3ZhciB0PU0ucmVzb2x2ZSgxKSxlPWZ1bmN0aW9uKCl7fSxuPSh0LmNvbnN0cnVjdG9yPXt9KVtQXT1mdW5jdGlvbih0KXt0KGUsZSl9O3JldHVybiEoKFl8fCJmdW5jdGlvbiI9PXR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQpJiYoIXV8fHQuZmluYWxseSkmJnQudGhlbihlKWluc3RhbmNlb2YgbiYmMCE9PXouaW5kZXhPZigiNi42IikmJi0xPT09Qy5pbmRleE9mKCJDaHJvbWUvNjYiKSl9KSxLPUd8fCF3KGZ1bmN0aW9uKHQpe00uYWxsKHQpLmNhdGNoKGZ1bmN0aW9uKCl7fSl9KSxYPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiEoIXYodCl8fCJmdW5jdGlvbiIhPXR5cGVvZihlPXQudGhlbikpJiZlfSxKPWZ1bmN0aW9uKHQsZSxuKXtpZighZS5ub3RpZmllZCl7ZS5ub3RpZmllZD0hMDt2YXIgcj1lLnJlYWN0aW9ucztFKGZ1bmN0aW9uKCl7Zm9yKHZhciBvPWUudmFsdWUsaT0xPT1lLnN0YXRlLGE9MDtyLmxlbmd0aD5hOyl7dmFyIHMsdSxjLGw9clthKytdLGY9aT9sLm9rOmwuZmFpbCxwPWwucmVzb2x2ZSxoPWwucmVqZWN0LGQ9bC5kb21haW47dHJ5e2Y/KGl8fCgyPT09ZS5yZWplY3Rpb24mJmV0KHQsZSksZS5yZWplY3Rpb249MSksITA9PT1mP3M9bzooZCYmZC5lbnRlcigpLHM9ZihvKSxkJiYoZC5leGl0KCksYz0hMCkpLHM9PT1sLnByb21pc2U/aChVKCJQcm9taXNlLWNoYWluIGN5Y2xlIikpOih1PVgocykpP3UuY2FsbChzLHAsaCk6cChzKSk6aChvKX1jYXRjaCh0KXtkJiYhYyYmZC5leGl0KCksaCh0KX19ZS5yZWFjdGlvbnM9W10sZS5ub3RpZmllZD0hMSxuJiYhZS5yZWplY3Rpb24mJloodCxlKX0pfX0sUT1mdW5jdGlvbih0LGUsbil7dmFyIHIsbztWPygocj1CLmNyZWF0ZUV2ZW50KCJFdmVudCIpKS5wcm9taXNlPWUsci5yZWFzb249bixyLmluaXRFdmVudCh0LCExLCEwKSxjLmRpc3BhdGNoRXZlbnQocikpOnI9e3Byb21pc2U6ZSxyZWFzb246bn0sKG89Y1sib24iK3RdKT9vKHIpOiJ1bmhhbmRsZWRyZWplY3Rpb24iPT09dCYmaigiVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIixuKX0sWj1mdW5jdGlvbih0LGUpe1MuY2FsbChjLGZ1bmN0aW9uKCl7dmFyIG4scj1lLnZhbHVlO2lmKHR0KGUpJiYobj1PKGZ1bmN0aW9uKCl7WT9xLmVtaXQoInVuaGFuZGxlZFJlamVjdGlvbiIscix0KTpRKCJ1bmhhbmRsZWRyZWplY3Rpb24iLHQscil9KSxlLnJlamVjdGlvbj1ZfHx0dChlKT8yOjEsbi5lcnJvcikpdGhyb3cgbi52YWx1ZX0pfSx0dD1mdW5jdGlvbih0KXtyZXR1cm4gMSE9PXQucmVqZWN0aW9uJiYhdC5wYXJlbnR9LGV0PWZ1bmN0aW9uKHQsZSl7Uy5jYWxsKGMsZnVuY3Rpb24oKXtZP3EuZW1pdCgicmVqZWN0aW9uSGFuZGxlZCIsdCk6USgicmVqZWN0aW9uaGFuZGxlZCIsdCxlLnZhbHVlKX0pfSxudD1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gZnVuY3Rpb24obyl7dChlLG4sbyxyKX19LHJ0PWZ1bmN0aW9uKHQsZSxuLHIpe2UuZG9uZXx8KGUuZG9uZT0hMCxyJiYoZT1yKSxlLnZhbHVlPW4sZS5zdGF0ZT0yLEoodCxlLCEwKSl9LG90PWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCFlLmRvbmUpe2UuZG9uZT0hMCxyJiYoZT1yKTt0cnl7aWYodD09PW4pdGhyb3cgVSgiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGYiKTt2YXIgbz1YKG4pO28/RShmdW5jdGlvbigpe3ZhciByPXtkb25lOiExfTt0cnl7by5jYWxsKG4sbnQob3QsdCxyLGUpLG50KHJ0LHQscixlKSl9Y2F0Y2gobil7cnQodCxyLG4sZSl9fSk6KGUudmFsdWU9bixlLnN0YXRlPTEsSih0LGUsITEpKX1jYXRjaChuKXtydCh0LHtkb25lOiExfSxuLGUpfX19O0cmJihNPWZ1bmN0aW9uKHQpe20odGhpcyxNLE4pLHkodCksci5jYWxsKHRoaXMpO3ZhciBlPUkodGhpcyk7dHJ5e3QobnQob3QsdGhpcyxlKSxudChydCx0aGlzLGUpKX1jYXRjaCh0KXtydCh0aGlzLGUsdCl9fSwocj1mdW5jdGlvbih0KXtEKHRoaXMse3R5cGU6Tixkb25lOiExLG5vdGlmaWVkOiExLHBhcmVudDohMSxyZWFjdGlvbnM6W10scmVqZWN0aW9uOiExLHN0YXRlOjAsdmFsdWU6dm9pZCAwfSl9KS5wcm90b3R5cGU9aChNLnByb3RvdHlwZSx7dGhlbjpmdW5jdGlvbih0LGUpe3ZhciBuPV8odGhpcykscj1XKGsodGhpcyxNKSk7cmV0dXJuIHIub2s9ImZ1bmN0aW9uIiE9dHlwZW9mIHR8fHQsci5mYWlsPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLHIuZG9tYWluPVk/cS5kb21haW46dm9pZCAwLG4ucGFyZW50PSEwLG4ucmVhY3Rpb25zLnB1c2gociksMCE9bi5zdGF0ZSYmSih0aGlzLG4sITEpLHIucHJvbWlzZX0sY2F0Y2g6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudGhlbih2b2lkIDAsdCl9fSksbz1mdW5jdGlvbigpe3ZhciB0PW5ldyByLGU9SSh0KTt0aGlzLnByb21pc2U9dCx0aGlzLnJlc29sdmU9bnQob3QsdCxlKSx0aGlzLnJlamVjdD1udChydCx0LGUpfSxBLmY9Vz1mdW5jdGlvbih0KXtyZXR1cm4gdD09PU18fHQ9PT1pP25ldyBvKHQpOiQodCl9LHV8fCJmdW5jdGlvbiIhPXR5cGVvZiBmfHwoYT1mLnByb3RvdHlwZS50aGVuLHAoZi5wcm90b3R5cGUsInRoZW4iLGZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gbmV3IE0oZnVuY3Rpb24odCxlKXthLmNhbGwobix0LGUpfSkudGhlbih0LGUpfSksImZ1bmN0aW9uIj09dHlwZW9mIEYmJnMoe2dsb2JhbDohMCxlbnVtZXJhYmxlOiEwLGZvcmNlZDohMH0se2ZldGNoOmZ1bmN0aW9uKHQpe3JldHVybiBUKE0sRi5hcHBseShjLGFyZ3VtZW50cykpfX0pKSkscyh7Z2xvYmFsOiEwLHdyYXA6ITAsZm9yY2VkOkd9LHtQcm9taXNlOk19KSxkKE0sTiwhMSwhMCksZyhOKSxpPWwuUHJvbWlzZSxzKHt0YXJnZXQ6TixzdGF0OiEwLGZvcmNlZDpHfSx7cmVqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPVcodGhpcyk7cmV0dXJuIGUucmVqZWN0LmNhbGwodm9pZCAwLHQpLGUucHJvbWlzZX19KSxzKHt0YXJnZXQ6TixzdGF0OiEwLGZvcmNlZDp1fHxHfSx7cmVzb2x2ZTpmdW5jdGlvbih0KXtyZXR1cm4gVCh1JiZ0aGlzPT09aT9NOnRoaXMsdCl9fSkscyh7dGFyZ2V0Ok4sc3RhdDohMCxmb3JjZWQ6S30se2FsbDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49VyhlKSxyPW4ucmVzb2x2ZSxvPW4ucmVqZWN0LGk9TyhmdW5jdGlvbigpe3ZhciBuPXkoZS5yZXNvbHZlKSxpPVtdLGE9MCxzPTE7eCh0LGZ1bmN0aW9uKHQpe3ZhciB1PWErKyxjPSExO2kucHVzaCh2b2lkIDApLHMrKyxuLmNhbGwoZSx0KS50aGVuKGZ1bmN0aW9uKHQpe2N8fChjPSEwLGlbdV09dCwtLXN8fHIoaSkpfSxvKX0pLC0tc3x8cihpKX0pO3JldHVybiBpLmVycm9yJiZvKGkudmFsdWUpLG4ucHJvbWlzZX0scmFjZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49VyhlKSxyPW4ucmVqZWN0LG89TyhmdW5jdGlvbigpe3ZhciBvPXkoZS5yZXNvbHZlKTt4KHQsZnVuY3Rpb24odCl7by5jYWxsKGUsdCkudGhlbihuLnJlc29sdmUscil9KX0pO3JldHVybiBvLmVycm9yJiZyKG8udmFsdWUpLG4ucHJvbWlzZX19KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMyKSxvPW4oMjMpLGk9bigyKSxhPW4oMTMpLHM9aSgic3BlY2llcyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1yKHQpLG49by5mO2EmJmUmJiFlW3NdJiZuKGUscyx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzfX0pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhLHMsdSxjLGw9big0KSxmPW4oNDQpLmYscD1uKDI2KSxoPW4oMTIxKS5zZXQsZD1uKDc5KSxnPWwuTXV0YXRpb25PYnNlcnZlcnx8bC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyLHY9bC5wcm9jZXNzLHk9bC5Qcm9taXNlLG09InByb2Nlc3MiPT1wKHYpLGI9ZihsLCJxdWV1ZU1pY3JvdGFzayIpLHg9YiYmYi52YWx1ZTt4fHwocj1mdW5jdGlvbigpe3ZhciB0LGU7Zm9yKG0mJih0PXYuZG9tYWluKSYmdC5leGl0KCk7bzspe2U9by5mbixvPW8ubmV4dDt0cnl7ZSgpfWNhdGNoKHQpe3Rocm93IG8/YSgpOmk9dm9pZCAwLHR9fWk9dm9pZCAwLHQmJnQuZW50ZXIoKX0sbT9hPWZ1bmN0aW9uKCl7di5uZXh0VGljayhyKX06ZyYmIS8oaXBob25lfGlwb2R8aXBhZCkuKmFwcGxld2Via2l0L2kudGVzdChkKT8ocz0hMCx1PWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSxuZXcgZyhyKS5vYnNlcnZlKHUse2NoYXJhY3RlckRhdGE6ITB9KSxhPWZ1bmN0aW9uKCl7dS5kYXRhPXM9IXN9KTp5JiZ5LnJlc29sdmU/KGM9eS5yZXNvbHZlKHZvaWQgMCksYT1mdW5jdGlvbigpe2MudGhlbihyKX0pOmE9ZnVuY3Rpb24oKXtoLmNhbGwobCxyKX0pLHQuZXhwb3J0cz14fHxmdW5jdGlvbih0KXt2YXIgZT17Zm46dCxuZXh0OnZvaWQgMH07aSYmKGkubmV4dD1lKSxvfHwobz1lLGEoKSksaT1lfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49ci5jb25zb2xlO24mJm4uZXJyb3ImJigxPT09YXJndW1lbnRzLmxlbmd0aD9uLmVycm9yKHQpOm4uZXJyb3IodCxlKSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDI3KSxpPW4oMTE3KSxhPW4oMzIpLHM9bigxMjApLHU9bigxMjIpLGM9bigzNSk7cih7dGFyZ2V0OiJQcm9taXNlIixwcm90bzohMCxyZWFsOiEwfSx7ZmluYWxseTpmdW5jdGlvbih0KXt2YXIgZT1zKHRoaXMsYSgiUHJvbWlzZSIpKSxuPSJmdW5jdGlvbiI9PXR5cGVvZiB0O3JldHVybiB0aGlzLnRoZW4obj9mdW5jdGlvbihuKXtyZXR1cm4gdShlLHQoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBufSl9OnQsbj9mdW5jdGlvbihuKXtyZXR1cm4gdShlLHQoKSkudGhlbihmdW5jdGlvbigpe3Rocm93IG59KX06dCl9fSksb3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGl8fGkucHJvdG90eXBlLmZpbmFsbHl8fGMoaS5wcm90b3R5cGUsImZpbmFsbHkiLGEoIlByb21pc2UiKS5wcm90b3R5cGUuZmluYWxseSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big0OCksaT1uKDc0KSxhPW4oNDYpLHM9bigzMCksdT1uKDU5KSxjPW4oMTcpLGw9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKCEobiBpbnN0YW5jZW9mIGwpKXJldHVybiBuZXcgbCh0LGUpO2kmJihuPWkobmV3IEVycm9yKGUpLG8obikpKTt2YXIgcj1bXTtyZXR1cm4gdSh0LHIucHVzaCxyKSxjKG4sImVycm9ycyIsciksdm9pZCAwIT09ZSYmYyhuLCJtZXNzYWdlIixTdHJpbmcoZSkpLG59O2wucHJvdG90eXBlPWEoRXJyb3IucHJvdG90eXBlLHtjb25zdHJ1Y3RvcjpzKDUsbCksbmFtZTpzKDUsIkFnZ3JlZ2F0ZUVycm9yIil9KSxyKHtnbG9iYWw6ITB9LHtBZ2dyZWdhdGVFcnJvcjpsfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDEyMyl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNTIpLGk9big2MCk7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7dHJ5OmZ1bmN0aW9uKHQpe3ZhciBlPW8uZih0aGlzKSxuPWkodCk7cmV0dXJuKG4uZXJyb3I/ZS5yZWplY3Q6ZS5yZXNvbHZlKShuLnZhbHVlKSxlLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMjIpLGk9bigzMiksYT1uKDUyKSxzPW4oNjApLHU9big1OSk7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7YW55OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hLmYoZSkscj1uLnJlc29sdmUsYz1uLnJlamVjdCxsPXMoZnVuY3Rpb24oKXt2YXIgbj1vKGUucmVzb2x2ZSksYT1bXSxzPTAsbD0xLGY9ITE7dSh0LGZ1bmN0aW9uKHQpe3ZhciBvPXMrKyx1PSExO2EucHVzaCh2b2lkIDApLGwrKyxuLmNhbGwoZSx0KS50aGVuKGZ1bmN0aW9uKHQpe3V8fGZ8fChmPSEwLHIodCkpfSxmdW5jdGlvbih0KXt1fHxmfHwodT0hMCxhW29dPXQsLS1sfHxjKG5ldyhpKCJBZ2dyZWdhdGVFcnJvciIpKShhLCJObyBvbmUgcHJvbWlzZSByZXNvbHZlZCIpKSl9KX0pLC0tbHx8YyhuZXcoaSgiQWdncmVnYXRlRXJyb3IiKSkoYSwiTm8gb25lIHByb21pc2UgcmVzb2x2ZWQiKSl9KTtyZXR1cm4gbC5lcnJvciYmYyhsLnZhbHVlKSxuLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTYpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24oZSxuLHIpe3JldHVybiBuJiZ0KGUucHJvdG90eXBlLG4pLHImJnQoZSxyKSxlfX0oKSxvPWZ1bmN0aW9uKHQpe2lmKHQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgZT17fTtpZihudWxsIT10KWZvcih2YXIgbiBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pJiYoZVtuXT10W25dKTtyZXR1cm4gZS5kZWZhdWx0PXQsZX0obigyNjUpKSxpPXAobigyNjYpKSxhPXAobigyNjcpKSxzPXAobigyNjgpKSx1PXAobigyNjkpKSxjPXAobigyNzApKSxsPXAobigyNzEpKSxmPXAobigyNzIpKTtmdW5jdGlvbiBwKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX12YXIgaD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9OyFmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLHQpLHRoaXMudHlwZT0ibGFuZ3VhZ2VEZXRlY3RvciIsdGhpcy5kZXRlY3RvcnM9e30sdGhpcy5pbml0KGUsbil9cmV0dXJuIHIodCxbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9O3RoaXMuc2VydmljZXM9dCx0aGlzLm9wdGlvbnM9by5kZWZhdWx0cyhlLHRoaXMub3B0aW9uc3x8e30se29yZGVyOlsicXVlcnlzdHJpbmciLCJjb29raWUiLCJsb2NhbFN0b3JhZ2UiLCJuYXZpZ2F0b3IiLCJodG1sVGFnIl0sbG9va3VwUXVlcnlzdHJpbmc6ImxuZyIsbG9va3VwQ29va2llOiJpMThuZXh0Iixsb29rdXBMb2NhbFN0b3JhZ2U6ImkxOG5leHRMbmciLGNhY2hlczpbImxvY2FsU3RvcmFnZSJdLGV4Y2x1ZGVDYWNoZUZvcjpbImNpbW9kZSJdfSksdGhpcy5vcHRpb25zLmxvb2t1cEZyb21VcmxJbmRleCYmKHRoaXMub3B0aW9ucy5sb29rdXBGcm9tUGF0aEluZGV4PXRoaXMub3B0aW9ucy5sb29rdXBGcm9tVXJsSW5kZXgpLHRoaXMuaTE4bk9wdGlvbnM9bix0aGlzLmFkZERldGVjdG9yKGkuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihhLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3Iocy5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKHUuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihjLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3IobC5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKGYuZGVmYXVsdCl9fSx7a2V5OiJhZGREZXRlY3RvciIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZXRlY3RvcnNbdC5uYW1lXT10fX0se2tleToiZGV0ZWN0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzO3R8fCh0PXRoaXMub3B0aW9ucy5vcmRlcik7dmFyIG49W107dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKGUuZGV0ZWN0b3JzW3RdKXt2YXIgcj1lLmRldGVjdG9yc1t0XS5sb29rdXAoZS5vcHRpb25zKTtyJiYic3RyaW5nIj09dHlwZW9mIHImJihyPVtyXSksciYmKG49bi5jb25jYXQocikpfX0pO3ZhciByPXZvaWQgMDtpZihuLmZvckVhY2goZnVuY3Rpb24odCl7aWYoIXIpe3ZhciBuPWUuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5mb3JtYXRMYW5ndWFnZUNvZGUodCk7ZS5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmlzV2hpdGVsaXN0ZWQobikmJihyPW4pfX0pLCFyKXt2YXIgbz10aGlzLmkxOG5PcHRpb25zLmZhbGxiYWNrTG5nOyJzdHJpbmciPT10eXBlb2YgbyYmKG89W29dKSxvfHwobz1bXSkscj0iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShvKT9vWzBdOm9bMF18fG8uZGVmYXVsdCYmby5kZWZhdWx0WzBdfXJldHVybiByfX0se2tleToiY2FjaGVVc2VyTGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztlfHwoZT10aGlzLm9wdGlvbnMuY2FjaGVzKSxlJiYodGhpcy5vcHRpb25zLmV4Y2x1ZGVDYWNoZUZvciYmdGhpcy5vcHRpb25zLmV4Y2x1ZGVDYWNoZUZvci5pbmRleE9mKHQpPi0xfHxlLmZvckVhY2goZnVuY3Rpb24oZSl7bi5kZXRlY3RvcnNbZV0mJm4uZGV0ZWN0b3JzW2VdLmNhY2hlVXNlckxhbmd1YWdlKHQsbi5vcHRpb25zKX0pKX19XSksdH0oKTtoLnR5cGU9Imxhbmd1YWdlRGV0ZWN0b3IiLGUuZGVmYXVsdD1ofSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHRzPWZ1bmN0aW9uKHQpe3JldHVybiBvLmNhbGwoaS5jYWxsKGFyZ3VtZW50cywxKSxmdW5jdGlvbihlKXtpZihlKWZvcih2YXIgbiBpbiBlKXZvaWQgMD09PXRbbl0mJih0W25dPWVbbl0pfSksdH0sZS5leHRlbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG8uY2FsbChpLmNhbGwoYXJndW1lbnRzLDEpLGZ1bmN0aW9uKGUpe2lmKGUpZm9yKHZhciBuIGluIGUpdFtuXT1lW25dfSksdH07dmFyIHI9W10sbz1yLmZvckVhY2gsaT1yLnNsaWNlfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1mdW5jdGlvbih0LGUsbixyKXt2YXIgbz12b2lkIDA7aWYobil7dmFyIGk9bmV3IERhdGU7aS5zZXRUaW1lKGkuZ2V0VGltZSgpKzYwKm4qMWUzKSxvPSI7IGV4cGlyZXM9IitpLnRvR01UU3RyaW5nKCl9ZWxzZSBvPSIiO3I9cj8iZG9tYWluPSIrcisiOyI6IiIsZG9jdW1lbnQuY29va2llPXQrIj0iK2UrbysiOyIrcisicGF0aD0vIn0sbz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dCsiPSIsbj1kb2N1bWVudC5jb29raWUuc3BsaXQoIjsiKSxyPTA7cjxuLmxlbmd0aDtyKyspe2Zvcih2YXIgbz1uW3JdOyIgIj09PW8uY2hhckF0KDApOylvPW8uc3Vic3RyaW5nKDEsby5sZW5ndGgpO2lmKDA9PT1vLmluZGV4T2YoZSkpcmV0dXJuIG8uc3Vic3RyaW5nKGUubGVuZ3RoLG8ubGVuZ3RoKX1yZXR1cm4gbnVsbH07ZS5kZWZhdWx0PXtuYW1lOiJjb29raWUiLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYodC5sb29rdXBDb29raWUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBuPW8odC5sb29rdXBDb29raWUpO24mJihlPW4pfXJldHVybiBlfSxjYWNoZVVzZXJMYW5ndWFnZTpmdW5jdGlvbih0LGUpe2UubG9va3VwQ29va2llJiYidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZyKGUubG9va3VwQ29va2llLHQsZS5jb29raWVNaW51dGVzLGUuY29va2llRG9tYWluKX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6InF1ZXJ5c3RyaW5nIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KWZvcih2YXIgbj13aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKS5zcGxpdCgiJiIpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXS5pbmRleE9mKCI9Iik7aWYobz4wKW5bcl0uc3Vic3RyaW5nKDAsbyk9PT10Lmxvb2t1cFF1ZXJ5c3RyaW5nJiYoZT1uW3JdLnN1YnN0cmluZyhvKzEpKX1yZXR1cm4gZX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj12b2lkIDA7dHJ5e3I9InVuZGVmaW5lZCIhPT13aW5kb3cmJm51bGwhPT13aW5kb3cubG9jYWxTdG9yYWdlO3dpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiaTE4bmV4dC50cmFuc2xhdGUuYm9vIiwiZm9vIiksd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJpMThuZXh0LnRyYW5zbGF0ZS5ib28iKX1jYXRjaCh0KXtyPSExfWUuZGVmYXVsdD17bmFtZToibG9jYWxTdG9yYWdlIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwO2lmKHQubG9va3VwTG9jYWxTdG9yYWdlJiZyKXt2YXIgbj13aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odC5sb29rdXBMb2NhbFN0b3JhZ2UpO24mJihlPW4pfXJldHVybiBlfSxjYWNoZVVzZXJMYW5ndWFnZTpmdW5jdGlvbih0LGUpe2UubG9va3VwTG9jYWxTdG9yYWdlJiZyJiZ3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oZS5sb29rdXBMb2NhbFN0b3JhZ2UsdCl9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXtuYW1lOiJuYXZpZ2F0b3IiLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT1bXTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvcil7aWYobmF2aWdhdG9yLmxhbmd1YWdlcylmb3IodmFyIG49MDtuPG5hdmlnYXRvci5sYW5ndWFnZXMubGVuZ3RoO24rKyllLnB1c2gobmF2aWdhdG9yLmxhbmd1YWdlc1tuXSk7bmF2aWdhdG9yLnVzZXJMYW5ndWFnZSYmZS5wdXNoKG5hdmlnYXRvci51c2VyTGFuZ3VhZ2UpLG5hdmlnYXRvci5sYW5ndWFnZSYmZS5wdXNoKG5hdmlnYXRvci5sYW5ndWFnZSl9cmV0dXJuIGUubGVuZ3RoPjA/ZTp2b2lkIDB9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXtuYW1lOiJodG1sVGFnIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwLG49dC5odG1sVGFnfHwoInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudD9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ6bnVsbCk7cmV0dXJuIG4mJiJmdW5jdGlvbiI9PXR5cGVvZiBuLmdldEF0dHJpYnV0ZSYmKGU9bi5nZXRBdHRyaWJ1dGUoImxhbmciKSksZX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6InBhdGgiLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cpe3ZhciBuPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5tYXRjaCgvXC8oW2EtekEtWi1dKikvZyk7aWYobiBpbnN0YW5jZW9mIEFycmF5KWlmKCJudW1iZXIiPT10eXBlb2YgdC5sb29rdXBGcm9tUGF0aEluZGV4KXtpZigic3RyaW5nIiE9dHlwZW9mIG5bdC5sb29rdXBGcm9tUGF0aEluZGV4XSlyZXR1cm47ZT1uW3QubG9va3VwRnJvbVBhdGhJbmRleF0ucmVwbGFjZSgiLyIsIiIpfWVsc2UgZT1uWzBdLnJlcGxhY2UoIi8iLCIiKX1yZXR1cm4gZX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6InN1YmRvbWFpbiIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyl7dmFyIG49d2luZG93LmxvY2F0aW9uLmhyZWYubWF0Y2goLyg/Omh0dHBbc10qXDpcL1wvKSooLio/KVwuKD89W15cL10qXC4uezIsNX0pL2dpKTtuIGluc3RhbmNlb2YgQXJyYXkmJihlPSJudW1iZXIiPT10eXBlb2YgdC5sb29rdXBGcm9tU3ViZG9tYWluSW5kZXg/blt0Lmxvb2t1cEZyb21TdWJkb21haW5JbmRleF0ucmVwbGFjZSgiaHR0cDovLyIsIiIpLnJlcGxhY2UoImh0dHBzOi8vIiwiIikucmVwbGFjZSgiLiIsIiIpOm5bMF0ucmVwbGFjZSgiaHR0cDovLyIsIiIpLnJlcGxhY2UoImh0dHBzOi8vIiwiIikucmVwbGFjZSgiLiIsIiIpKX1yZXR1cm4gZX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNzQpLG89bigxMjQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihyKHQpKXJldHVybiBvKHQpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI3NSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMDkpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMjUpLG89bigyNzgpLGk9bigxMDIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZih2b2lkIDAhPT1pJiZvKE9iamVjdCh0KSkpcmV0dXJuIHIodCl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTEwKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI3OSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDUwKSxuKDM0KSx0LmV4cG9ydHM9bigyODApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3Niksbz1uKDIpLGk9bigyOSksYT1vKCJpdGVyYXRvciIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1PYmplY3QodCk7cmV0dXJuIHZvaWQgMCE9PWVbYV18fCJAQGl0ZXJhdG9yImluIGV8fGkuaGFzT3duUHJvcGVydHkocihlKSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMjUpLG89bigyODIpLGk9bigxMjQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gaSh0LGUpO3ZhciBhPW8obj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTtyZXR1cm4iT2JqZWN0Ij09PWEmJnQuY29uc3RydWN0b3ImJihhPXQuY29uc3RydWN0b3IubmFtZSksIk1hcCI9PT1hfHwiU2V0Ij09PWE/cih0KToiQXJndW1lbnRzIj09PWF8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KGEpP2kodCxlKTp2b2lkIDB9fX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI4Myl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTQpfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI4Nil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI4Nyksbz1uKDI4OSksaT1BcnJheS5wcm90b3R5cGUsYT1TdHJpbmcucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmluY2x1ZGVzO3JldHVybiB0PT09aXx8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09aS5pbmNsdWRlcz9yOiJzdHJpbmciPT10eXBlb2YgdHx8dD09PWF8fHQgaW5zdGFuY2VvZiBTdHJpbmcmJmU9PT1hLmluY2x1ZGVzP286ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDI4OCk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIkFycmF5IikuaW5jbHVkZXN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNjcpLmluY2x1ZGVzLGk9big3Nyk7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITB9LHtpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLGkoImluY2x1ZGVzIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDI5MCk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIlN0cmluZyIpLmluY2x1ZGVzfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDI5MSksaT1uKDQ1KTtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOiFuKDI5MykoImluY2x1ZGVzIil9LHtpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4hIX5TdHJpbmcoaSh0aGlzKSkuaW5kZXhPZihvKHQpLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjkyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYocih0KSl0aHJvdyBUeXBlRXJyb3IoIlRoZSBtZXRob2QgZG9lc24ndCBhY2NlcHQgcmVndWxhciBleHByZXNzaW9ucyIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNiksbz1uKDI2KSxpPW4oMikoIm1hdGNoIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiByKHQpJiYodm9pZCAwIT09KGU9dFtpXSk/ISFlOiJSZWdFeHAiPT1vKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIpKCJtYXRjaCIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT0vLi87dHJ5eyIvLi8iW3RdKGUpfWNhdGNoKG4pe3RyeXtyZXR1cm4gZVtyXT0hMSwiLy4vIlt0XShlKX1jYXRjaCh0KXt9fXJldHVybiExfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24odCl7Ci8qIQogKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci4KICoKICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+CiAqIEBsaWNlbnNlICBNSVQKICovCnZhciByPW4oMjk1KSxvPW4oMjk2KSxpPW4oMjk3KTtmdW5jdGlvbiBhKCl7cmV0dXJuIHUuVFlQRURfQVJSQVlfU1VQUE9SVD8yMTQ3NDgzNjQ3OjEwNzM3NDE4MjN9ZnVuY3Rpb24gcyh0LGUpe2lmKGEoKTxlKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiB1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9bmV3IFVpbnQ4QXJyYXkoZSkpLl9fcHJvdG9fXz11LnByb3RvdHlwZToobnVsbD09PXQmJih0PW5ldyB1KGUpKSx0Lmxlbmd0aD1lKSx0fWZ1bmN0aW9uIHUodCxlLG4pe2lmKCEodS5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgdSkpcmV0dXJuIG5ldyB1KHQsZSxuKTtpZigibnVtYmVyIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIGYodGhpcyx0KX1yZXR1cm4gYyh0aGlzLHQsZSxuKX1mdW5jdGlvbiBjKHQsZSxuLHIpe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2Z1bmN0aW9uKHQsZSxuLHIpe2lmKGUuYnl0ZUxlbmd0aCxuPDB8fGUuYnl0ZUxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzIik7aWYoZS5ieXRlTGVuZ3RoPG4rKHJ8fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCInbGVuZ3RoJyBpcyBvdXQgb2YgYm91bmRzIik7ZT12b2lkIDA9PT1uJiZ2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KGUpOnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkoZSxuKTpuZXcgVWludDhBcnJheShlLG4scik7dS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PWUpLl9fcHJvdG9fXz11LnByb3RvdHlwZTp0PXAodCxlKTtyZXR1cm4gdH0odCxlLG4scik6InN0cmluZyI9PXR5cGVvZiBlP2Z1bmN0aW9uKHQsZSxuKXsic3RyaW5nIj09dHlwZW9mIG4mJiIiIT09bnx8KG49InV0ZjgiKTtpZighdS5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJlbmNvZGluZyIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpO3ZhciByPTB8ZChlLG4pLG89KHQ9cyh0LHIpKS53cml0ZShlLG4pO28hPT1yJiYodD10LnNsaWNlKDAsbykpO3JldHVybiB0fSh0LGUsbik6ZnVuY3Rpb24odCxlKXtpZih1LmlzQnVmZmVyKGUpKXt2YXIgbj0wfGgoZS5sZW5ndGgpO3JldHVybiAwPT09KHQ9cyh0LG4pKS5sZW5ndGg/dDooZS5jb3B5KHQsMCwwLG4pLHQpfWlmKGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gZSlyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIGUubGVuZ3RofHwocj1lLmxlbmd0aCkhPXI/cyh0LDApOnAodCxlKTtpZigiQnVmZmVyIj09PWUudHlwZSYmaShlLmRhdGEpKXJldHVybiBwKHQsZS5kYXRhKX12YXIgcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KHQsZSl9ZnVuY3Rpb24gbCh0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIGYodCxlKXtpZihsKGUpLHQ9cyh0LGU8MD8wOjB8aChlKSksIXUuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIG49MDtuPGU7KytuKXRbbl09MDtyZXR1cm4gdH1mdW5jdGlvbiBwKHQsZSl7dmFyIG49ZS5sZW5ndGg8MD8wOjB8aChlLmxlbmd0aCk7dD1zKHQsbik7Zm9yKHZhciByPTA7cjxuO3IrPTEpdFtyXT0yNTUmZVtyXTtyZXR1cm4gdH1mdW5jdGlvbiBoKHQpe2lmKHQ+PWEoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIrYSgpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8dH1mdW5jdGlvbiBkKHQsZSl7aWYodS5pc0J1ZmZlcih0KSlyZXR1cm4gdC5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gdC5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgdCYmKHQ9IiIrdCk7dmFyIG49dC5sZW5ndGg7aWYoMD09PW4pcmV0dXJuIDA7Zm9yKHZhciByPSExOzspc3dpdGNoKGUpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIG47Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gRih0KS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKm47Y2FzZSJoZXgiOnJldHVybiBuPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIEgodCkubGVuZ3RoO2RlZmF1bHQ6aWYocilyZXR1cm4gRih0KS5sZW5ndGg7ZT0oIiIrZSkudG9Mb3dlckNhc2UoKSxyPSEwfX1mdW5jdGlvbiBnKHQsZSxuKXt2YXIgcj0hMTtpZigodm9pZCAwPT09ZXx8ZTwwKSYmKGU9MCksZT50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09bnx8bj50aGlzLmxlbmd0aCkmJihuPXRoaXMubGVuZ3RoKSxuPD0wKXJldHVybiIiO2lmKChuPj4+PTApPD0oZT4+Pj0wKSlyZXR1cm4iIjtmb3IodHx8KHQ9InV0ZjgiKTs7KXN3aXRjaCh0KXtjYXNlImhleCI6cmV0dXJuIEwodGhpcyxlLG4pO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIGoodGhpcyxlLG4pO2Nhc2UiYXNjaWkiOnJldHVybiBPKHRoaXMsZSxuKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBDKHRoaXMsZSxuKTtjYXNlImJhc2U2NCI6cmV0dXJuIFQodGhpcyxlLG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gUih0aGlzLGUsbik7ZGVmYXVsdDppZihyKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7dD0odCsiIikudG9Mb3dlckNhc2UoKSxyPSEwfX1mdW5jdGlvbiB2KHQsZSxuKXt2YXIgcj10W2VdO3RbZV09dFtuXSx0W25dPXJ9ZnVuY3Rpb24geSh0LGUsbixyLG8pe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIG4/KHI9bixuPTApOm4+MjE0NzQ4MzY0Nz9uPTIxNDc0ODM2NDc6bjwtMjE0NzQ4MzY0OCYmKG49LTIxNDc0ODM2NDgpLG49K24saXNOYU4obikmJihuPW8/MDp0Lmxlbmd0aC0xKSxuPDAmJihuPXQubGVuZ3RoK24pLG4+PXQubGVuZ3RoKXtpZihvKXJldHVybi0xO249dC5sZW5ndGgtMX1lbHNlIGlmKG48MCl7aWYoIW8pcmV0dXJuLTE7bj0wfWlmKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9dS5mcm9tKGUscikpLHUuaXNCdWZmZXIoZSkpcmV0dXJuIDA9PT1lLmxlbmd0aD8tMTptKHQsZSxuLHIsbyk7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBlJj0yNTUsdS5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9vP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0LGUsbik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbCh0LGUsbik6bSh0LFtlXSxuLHIsbyk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gbSh0LGUsbixyLG8pe3ZhciBpLGE9MSxzPXQubGVuZ3RoLHU9ZS5sZW5ndGg7aWYodm9pZCAwIT09ciYmKCJ1Y3MyIj09PShyPVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PXJ8fCJ1dGYxNmxlIj09PXJ8fCJ1dGYtMTZsZSI9PT1yKSl7aWYodC5sZW5ndGg8Mnx8ZS5sZW5ndGg8MilyZXR1cm4tMTthPTIscy89Mix1Lz0yLG4vPTJ9ZnVuY3Rpb24gYyh0LGUpe3JldHVybiAxPT09YT90W2VdOnQucmVhZFVJbnQxNkJFKGUqYSl9aWYobyl7dmFyIGw9LTE7Zm9yKGk9bjtpPHM7aSsrKWlmKGModCxpKT09PWMoZSwtMT09PWw/MDppLWwpKXtpZigtMT09PWwmJihsPWkpLGktbCsxPT09dSlyZXR1cm4gbCphfWVsc2UtMSE9PWwmJihpLT1pLWwpLGw9LTF9ZWxzZSBmb3Iobit1PnMmJihuPXMtdSksaT1uO2k+PTA7aS0tKXtmb3IodmFyIGY9ITAscD0wO3A8dTtwKyspaWYoYyh0LGkrcCkhPT1jKGUscCkpe2Y9ITE7YnJlYWt9aWYoZilyZXR1cm4gaX1yZXR1cm4tMX1mdW5jdGlvbiBiKHQsZSxuLHIpe249TnVtYmVyKG4pfHwwO3ZhciBvPXQubGVuZ3RoLW47cj8ocj1OdW1iZXIocikpPm8mJihyPW8pOnI9bzt2YXIgaT1lLmxlbmd0aDtpZihpJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7cj5pLzImJihyPWkvMik7Zm9yKHZhciBhPTA7YTxyOysrYSl7dmFyIHM9cGFyc2VJbnQoZS5zdWJzdHIoMiphLDIpLDE2KTtpZihpc05hTihzKSlyZXR1cm4gYTt0W24rYV09c31yZXR1cm4gYX1mdW5jdGlvbiB4KHQsZSxuLHIpe3JldHVybiB6KEYoZSx0Lmxlbmd0aC1uKSx0LG4scil9ZnVuY3Rpb24gdyh0LGUsbixyKXtyZXR1cm4geihmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wO248dC5sZW5ndGg7KytuKWUucHVzaCgyNTUmdC5jaGFyQ29kZUF0KG4pKTtyZXR1cm4gZX0oZSksdCxuLHIpfWZ1bmN0aW9uIGsodCxlLG4scil7cmV0dXJuIHcodCxlLG4scil9ZnVuY3Rpb24gUyh0LGUsbixyKXtyZXR1cm4geihIKGUpLHQsbixyKX1mdW5jdGlvbiBFKHQsZSxuLHIpe3JldHVybiB6KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHIsbyxpPVtdLGE9MDthPHQubGVuZ3RoJiYhKChlLT0yKTwwKTsrK2Epbj10LmNoYXJDb2RlQXQoYSkscj1uPj44LG89biUyNTYsaS5wdXNoKG8pLGkucHVzaChyKTtyZXR1cm4gaX0oZSx0Lmxlbmd0aC1uKSx0LG4scil9ZnVuY3Rpb24gVCh0LGUsbil7cmV0dXJuIDA9PT1lJiZuPT09dC5sZW5ndGg/ci5mcm9tQnl0ZUFycmF5KHQpOnIuZnJvbUJ5dGVBcnJheSh0LnNsaWNlKGUsbikpfWZ1bmN0aW9uIGoodCxlLG4pe249TWF0aC5taW4odC5sZW5ndGgsbik7Zm9yKHZhciByPVtdLG89ZTtvPG47KXt2YXIgaSxhLHMsdSxjPXRbb10sbD1udWxsLGY9Yz4yMzk/NDpjPjIyMz8zOmM+MTkxPzI6MTtpZihvK2Y8PW4pc3dpdGNoKGYpe2Nhc2UgMTpjPDEyOCYmKGw9Yyk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYoaT10W28rMV0pKSYmKHU9KDMxJmMpPDw2fDYzJmkpPjEyNyYmKGw9dSk7YnJlYWs7Y2FzZSAzOmk9dFtvKzFdLGE9dFtvKzJdLDEyOD09KDE5MiZpKSYmMTI4PT0oMTkyJmEpJiYodT0oMTUmYyk8PDEyfCg2MyZpKTw8Nnw2MyZhKT4yMDQ3JiYodTw1NTI5Nnx8dT41NzM0MykmJihsPXUpO2JyZWFrO2Nhc2UgNDppPXRbbysxXSxhPXRbbysyXSxzPXRbbyszXSwxMjg9PSgxOTImaSkmJjEyOD09KDE5MiZhKSYmMTI4PT0oMTkyJnMpJiYodT0oMTUmYyk8PDE4fCg2MyZpKTw8MTJ8KDYzJmEpPDw2fDYzJnMpPjY1NTM1JiZ1PDExMTQxMTImJihsPXUpfW51bGw9PT1sPyhsPTY1NTMzLGY9MSk6bD42NTUzNSYmKGwtPTY1NTM2LHIucHVzaChsPj4+MTAmMTAyM3w1NTI5NiksbD01NjMyMHwxMDIzJmwpLHIucHVzaChsKSxvKz1mfXJldHVybiBmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aDtpZihlPD1BKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0KTt2YXIgbj0iIixyPTA7Zm9yKDtyPGU7KW4rPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQuc2xpY2UocixyKz1BKSk7cmV0dXJuIG59KHIpfWUuQnVmZmVyPXUsZS5TbG93QnVmZmVyPWZ1bmN0aW9uKHQpeyt0IT10JiYodD0wKTtyZXR1cm4gdS5hbGxvYygrdCl9LGUuSU5TUEVDVF9NQVhfQllURVM9NTAsdS5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMCE9PXQuVFlQRURfQVJSQVlfU1VQUE9SVD90LlRZUEVEX0FSUkFZX1NVUFBPUlQ6ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9bmV3IFVpbnQ4QXJyYXkoMSk7cmV0dXJuIHQuX19wcm90b19fPXtfX3Byb3RvX186VWludDhBcnJheS5wcm90b3R5cGUsZm9vOmZ1bmN0aW9uKCl7cmV0dXJuIDQyfX0sNDI9PT10LmZvbygpJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zdWJhcnJheSYmMD09PXQuc3ViYXJyYXkoMSwxKS5ieXRlTGVuZ3RofWNhdGNoKHQpe3JldHVybiExfX0oKSxlLmtNYXhMZW5ndGg9YSgpLHUucG9vbFNpemU9ODE5Mix1Ll9hdWdtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fXz11LnByb3RvdHlwZSx0fSx1LmZyb209ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjKG51bGwsdCxlLG4pfSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQmJih1LnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsdS5fX3Byb3RvX189VWludDhBcnJheSwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnNwZWNpZXMmJnVbU3ltYm9sLnNwZWNpZXNdPT09dSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHUsU3ltYm9sLnNwZWNpZXMse3ZhbHVlOm51bGwsY29uZmlndXJhYmxlOiEwfSkpLHUuYWxsb2M9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gbChlKSxlPD0wP3ModCxlKTp2b2lkIDAhPT1uPyJzdHJpbmciPT10eXBlb2Ygcj9zKHQsZSkuZmlsbChuLHIpOnModCxlKS5maWxsKG4pOnModCxlKX0obnVsbCx0LGUsbil9LHUuYWxsb2NVbnNhZmU9ZnVuY3Rpb24odCl7cmV0dXJuIGYobnVsbCx0KX0sdS5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24odCl7cmV0dXJuIGYobnVsbCx0KX0sdS5pc0J1ZmZlcj1mdW5jdGlvbih0KXtyZXR1cm4hKG51bGw9PXR8fCF0Ll9pc0J1ZmZlcil9LHUuY29tcGFyZT1mdW5jdGlvbih0LGUpe2lmKCF1LmlzQnVmZmVyKHQpfHwhdS5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYodD09PWUpcmV0dXJuIDA7Zm9yKHZhciBuPXQubGVuZ3RoLHI9ZS5sZW5ndGgsbz0wLGk9TWF0aC5taW4obixyKTtvPGk7KytvKWlmKHRbb10hPT1lW29dKXtuPXRbb10scj1lW29dO2JyZWFrfXJldHVybiBuPHI/LTE6cjxuPzE6MH0sdS5pc0VuY29kaW5nPWZ1bmN0aW9uKHQpe3N3aXRjaChTdHJpbmcodCkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSx1LmNvbmNhdD1mdW5jdGlvbih0LGUpe2lmKCFpKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHUuYWxsb2MoMCk7dmFyIG47aWYodm9pZCAwPT09ZSlmb3IoZT0wLG49MDtuPHQubGVuZ3RoOysrbillKz10W25dLmxlbmd0aDt2YXIgcj11LmFsbG9jVW5zYWZlKGUpLG89MDtmb3Iobj0wO248dC5sZW5ndGg7KytuKXt2YXIgYT10W25dO2lmKCF1LmlzQnVmZmVyKGEpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTthLmNvcHkocixvKSxvKz1hLmxlbmd0aH1yZXR1cm4gcn0sdS5ieXRlTGVuZ3RoPWQsdS5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLHUucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9Mil2KHRoaXMsZSxlKzEpO3JldHVybiB0aGlzfSx1LnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTQpdih0aGlzLGUsZSszKSx2KHRoaXMsZSsxLGUrMik7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9OCl2KHRoaXMsZSxlKzcpLHYodGhpcyxlKzEsZSs2KSx2KHRoaXMsZSsyLGUrNSksdih0aGlzLGUrMyxlKzQpO3JldHVybiB0aGlzfSx1LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT10PyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoP2oodGhpcywwLHQpOmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx1LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7aWYoIXUuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09dHx8MD09PXUuY29tcGFyZSh0aGlzLHQpfSx1LnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9IiIsbj1lLklOU1BFQ1RfTUFYX0JZVEVTO3JldHVybiB0aGlzLmxlbmd0aD4wJiYodD10aGlzLnRvU3RyaW5nKCJoZXgiLDAsbikubWF0Y2goLy57Mn0vZykuam9pbigiICIpLHRoaXMubGVuZ3RoPm4mJih0Kz0iIC4uLiAiKSksIjxCdWZmZXIgIit0KyI+In0sdS5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUsbixyLG8pe2lmKCF1LmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1uJiYobj10P3QubGVuZ3RoOjApLHZvaWQgMD09PXImJihyPTApLHZvaWQgMD09PW8mJihvPXRoaXMubGVuZ3RoKSxlPDB8fG4+dC5sZW5ndGh8fHI8MHx8bz50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocj49byYmZT49bilyZXR1cm4gMDtpZihyPj1vKXJldHVybi0xO2lmKGU+PW4pcmV0dXJuIDE7aWYodGhpcz09PXQpcmV0dXJuIDA7Zm9yKHZhciBpPShvPj4+PTApLShyPj4+PTApLGE9KG4+Pj49MCktKGU+Pj49MCkscz1NYXRoLm1pbihpLGEpLGM9dGhpcy5zbGljZShyLG8pLGw9dC5zbGljZShlLG4pLGY9MDtmPHM7KytmKWlmKGNbZl0hPT1sW2ZdKXtpPWNbZl0sYT1sW2ZdO2JyZWFrfXJldHVybiBpPGE/LTE6YTxpPzE6MH0sdS5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24odCxlLG4pe3JldHVybi0xIT09dGhpcy5pbmRleE9mKHQsZSxuKX0sdS5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkodGhpcyx0LGUsbiwhMCl9LHUucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geSh0aGlzLHQsZSxuLCExKX0sdS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLG4scil7aWYodm9pZCAwPT09ZSlyPSJ1dGY4IixuPXRoaXMubGVuZ3RoLGU9MDtlbHNlIGlmKHZvaWQgMD09PW4mJiJzdHJpbmciPT10eXBlb2YgZSlyPWUsbj10aGlzLmxlbmd0aCxlPTA7ZWxzZXtpZighaXNGaW5pdGUoZSkpdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIpO2V8PTAsaXNGaW5pdGUobik/KG58PTAsdm9pZCAwPT09ciYmKHI9InV0ZjgiKSk6KHI9bixuPXZvaWQgMCl9dmFyIG89dGhpcy5sZW5ndGgtZTtpZigodm9pZCAwPT09bnx8bj5vKSYmKG49byksdC5sZW5ndGg+MCYmKG48MHx8ZTwwKXx8ZT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiKTtyfHwocj0idXRmOCIpO2Zvcih2YXIgaT0hMTs7KXN3aXRjaChyKXtjYXNlImhleCI6cmV0dXJuIGIodGhpcyx0LGUsbik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4geCh0aGlzLHQsZSxuKTtjYXNlImFzY2lpIjpyZXR1cm4gdyh0aGlzLHQsZSxuKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBrKHRoaXMsdCxlLG4pO2Nhc2UiYmFzZTY0IjpyZXR1cm4gUyh0aGlzLHQsZSxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIEUodGhpcyx0LGUsbik7ZGVmYXVsdDppZihpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrcik7cj0oIiIrcikudG9Mb3dlckNhc2UoKSxpPSEwfX0sdS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTt2YXIgQT00MDk2O2Z1bmN0aW9uIE8odCxlLG4pe3ZhciByPSIiO249TWF0aC5taW4odC5sZW5ndGgsbik7Zm9yKHZhciBvPWU7bzxuOysrbylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZ0W29dKTtyZXR1cm4gcn1mdW5jdGlvbiBDKHQsZSxuKXt2YXIgcj0iIjtuPU1hdGgubWluKHQubGVuZ3RoLG4pO2Zvcih2YXIgbz1lO288bjsrK28pcis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W29dKTtyZXR1cm4gcn1mdW5jdGlvbiBMKHQsZSxuKXt2YXIgcj10Lmxlbmd0aDsoIWV8fGU8MCkmJihlPTApLCghbnx8bjwwfHxuPnIpJiYobj1yKTtmb3IodmFyIG89IiIsaT1lO2k8bjsrK2kpbys9cSh0W2ldKTtyZXR1cm4gb31mdW5jdGlvbiBSKHQsZSxuKXtmb3IodmFyIHI9dC5zbGljZShlLG4pLG89IiIsaT0wO2k8ci5sZW5ndGg7aSs9MilvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJbaV0rMjU2KnJbaSsxXSk7cmV0dXJuIG99ZnVuY3Rpb24gUCh0LGUsbil7aWYodCUxIT0wfHx0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKHQrZT5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gTih0LGUsbixyLG8saSl7aWYoIXUuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKGU+b3x8ZTxpKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihuK3I+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEkodCxlLG4scil7ZTwwJiYoZT02NTUzNStlKzEpO2Zvcih2YXIgbz0wLGk9TWF0aC5taW4odC5sZW5ndGgtbiwyKTtvPGk7KytvKXRbbitvXT0oZSYyNTU8PDgqKHI/bzoxLW8pKT4+PjgqKHI/bzoxLW8pfWZ1bmN0aW9uIEQodCxlLG4scil7ZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSk7Zm9yKHZhciBvPTAsaT1NYXRoLm1pbih0Lmxlbmd0aC1uLDQpO288aTsrK28pdFtuK29dPWU+Pj44KihyP286My1vKSYyNTV9ZnVuY3Rpb24gXyh0LGUsbixyLG8saSl7aWYobityPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIE0odCxlLG4scixpKXtyZXR1cm4gaXx8Xyh0LDAsbiw0KSxvLndyaXRlKHQsZSxuLHIsMjMsNCksbis0fWZ1bmN0aW9uIFUodCxlLG4scixpKXtyZXR1cm4gaXx8Xyh0LDAsbiw4KSxvLndyaXRlKHQsZSxuLHIsNTIsOCksbis4fXUucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj10aGlzLmxlbmd0aDtpZigodD1+fnQpPDA/KHQrPXIpPDAmJih0PTApOnQ+ciYmKHQ9ciksKGU9dm9pZCAwPT09ZT9yOn5+ZSk8MD8oZSs9cik8MCYmKGU9MCk6ZT5yJiYoZT1yKSxlPHQmJihlPXQpLHUuVFlQRURfQVJSQVlfU1VQUE9SVCkobj10aGlzLnN1YmFycmF5KHQsZSkpLl9fcHJvdG9fXz11LnByb3RvdHlwZTtlbHNle3ZhciBvPWUtdDtuPW5ldyB1KG8sdm9pZCAwKTtmb3IodmFyIGk9MDtpPG87KytpKW5baV09dGhpc1tpK3RdfXJldHVybiBufSx1LnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8UCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW3RdLG89MSxpPTA7KytpPGUmJihvKj0yNTYpOylyKz10aGlzW3QraV0qbztyZXR1cm4gcn0sdS5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFAodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1t0Ky0tZV0sbz0xO2U+MCYmKG8qPTI1Nik7KXIrPXRoaXNbdCstLWVdKm87cmV0dXJuIHJ9LHUucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsMSx0aGlzLmxlbmd0aCksdGhpc1t0XX0sdS5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OH0sdS5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdPDw4fHRoaXNbdCsxXX0sdS5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw0LHRoaXMubGVuZ3RoKSwodGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNikrMTY3NzcyMTYqdGhpc1t0KzNdfSx1LnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbdF0rKHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXSl9LHUucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFAodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1t0XSxvPTEsaT0wOysraTxlJiYobyo9MjU2KTspcis9dGhpc1t0K2ldKm87cmV0dXJuIHI+PShvKj0xMjgpJiYoci09TWF0aC5wb3coMiw4KmUpKSxyfSx1LnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24odCxlLG4pe3R8PTAsZXw9MCxufHxQKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPWUsbz0xLGk9dGhpc1t0Ky0tcl07cj4wJiYobyo9MjU2KTspaSs9dGhpc1t0Ky0tcl0qbztyZXR1cm4gaT49KG8qPTEyOCkmJihpLT1NYXRoLnBvdygyLDgqZSkpLGl9LHUucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1t0XT8tMSooMjU1LXRoaXNbdF0rMSk6dGhpc1t0XX0sdS5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24odCxlKXtlfHxQKHQsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1t0XXx0aGlzW3QrMV08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LHUucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7ZXx8UCh0LDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbdCsxXXx0aGlzW3RdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSx1LnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNnx0aGlzW3QrM108PDI0fSx1LnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XTw8MjR8dGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdfSx1LnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsdCwhMCwyMyw0KX0sdS5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDQsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLHQsITEsMjMsNCl9LHUucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsOCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsdCwhMCw1Miw4KX0sdS5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw4LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyx0LCExLDUyLDgpfSx1LnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbih0LGUsbixyKXsodD0rdCxlfD0wLG58PTAscil8fE4odGhpcyx0LGUsbixNYXRoLnBvdygyLDgqbiktMSwwKTt2YXIgbz0xLGk9MDtmb3IodGhpc1tlXT0yNTUmdDsrK2k8biYmKG8qPTI1Nik7KXRoaXNbZStpXT10L28mMjU1O3JldHVybiBlK259LHUucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKHQsZSxuLHIpeyh0PSt0LGV8PTAsbnw9MCxyKXx8Tih0aGlzLHQsZSxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciBvPW4tMSxpPTE7Zm9yKHRoaXNbZStvXT0yNTUmdDstLW8+PTAmJihpKj0yNTYpOyl0aGlzW2Urb109dC9pJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMSwyNTUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0aGlzW2VdPTI1NSZ0LGUrMX0sdS5wcm90b3R5cGUud3JpdGVVSW50MTZMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDIsNjU1MzUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6SSh0aGlzLHQsZSwhMCksZSsyfSx1LnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMiw2NTUzNSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTpJKHRoaXMsdCxlLCExKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2UrM109dD4+PjI0LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZV09MjU1JnQpOkQodGhpcyx0LGUsITApLGUrNH0sdS5wcm90b3R5cGUud3JpdGVVSW50MzJCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6RCh0aGlzLHQsZSwhMSksZSs0fSx1LnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9K3QsZXw9MCwhcil7dmFyIG89TWF0aC5wb3coMiw4Km4tMSk7Tih0aGlzLHQsZSxuLG8tMSwtbyl9dmFyIGk9MCxhPTEscz0wO2Zvcih0aGlzW2VdPTI1NSZ0OysraTxuJiYoYSo9MjU2KTspdDwwJiYwPT09cyYmMCE9PXRoaXNbZStpLTFdJiYocz0xKSx0aGlzW2UraV09KHQvYT4+MCktcyYyNTU7cmV0dXJuIGUrbn0sdS5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbih0LGUsbixyKXtpZih0PSt0LGV8PTAsIXIpe3ZhciBvPU1hdGgucG93KDIsOCpuLTEpO04odGhpcyx0LGUsbixvLTEsLW8pfXZhciBpPW4tMSxhPTEscz0wO2Zvcih0aGlzW2UraV09MjU1JnQ7LS1pPj0wJiYoYSo9MjU2KTspdDwwJiYwPT09cyYmMCE9PXRoaXNbZStpKzFdJiYocz0xKSx0aGlzW2UraV09KHQvYT4+MCktcyYyNTU7cmV0dXJuIGUrbn0sdS5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMSwxMjcsLTEyOCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0PDAmJih0PTI1NSt0KzEpLHRoaXNbZV09MjU1JnQsZSsxfSx1LnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6SSh0aGlzLHQsZSwhMCksZSsyfSx1LnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6SSh0aGlzLHQsZSwhMSksZSsyfSx1LnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrM109dD4+PjI0KTpEKHRoaXMsdCxlLCEwKSxlKzR9LHUucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksdDwwJiYodD00Mjk0OTY3Mjk1K3QrMSksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOkQodGhpcyx0LGUsITEpLGUrNH0sdS5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTSh0aGlzLHQsZSwhMCxuKX0sdS5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTSh0aGlzLHQsZSwhMSxuKX0sdS5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIFUodGhpcyx0LGUsITAsbil9LHUucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBVKHRoaXMsdCxlLCExLG4pfSx1LnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKHQsZSxuLHIpe2lmKG58fChuPTApLHJ8fDA9PT1yfHwocj10aGlzLmxlbmd0aCksZT49dC5sZW5ndGgmJihlPXQubGVuZ3RoKSxlfHwoZT0wKSxyPjAmJnI8biYmKHI9bikscj09PW4pcmV0dXJuIDA7aWYoMD09PXQubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwfHxuPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTtyPnRoaXMubGVuZ3RoJiYocj10aGlzLmxlbmd0aCksdC5sZW5ndGgtZTxyLW4mJihyPXQubGVuZ3RoLWUrbik7dmFyIG8saT1yLW47aWYodGhpcz09PXQmJm48ZSYmZTxyKWZvcihvPWktMTtvPj0wOy0tbyl0W28rZV09dGhpc1tvK25dO2Vsc2UgaWYoaTwxZTN8fCF1LlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKG89MDtvPGk7KytvKXRbbytlXT10aGlzW28rbl07ZWxzZSBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbCh0LHRoaXMuc3ViYXJyYXkobixuK2kpLGUpO3JldHVybiBpfSx1LnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlPyhyPWUsZT0wLG49dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgbiYmKHI9bixuPXRoaXMubGVuZ3RoKSwxPT09dC5sZW5ndGgpe3ZhciBvPXQuY2hhckNvZGVBdCgwKTtvPDI1NiYmKHQ9byl9aWYodm9pZCAwIT09ciYmInN0cmluZyIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIHImJiF1LmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKX1lbHNlIm51bWJlciI9PXR5cGVvZiB0JiYodCY9MjU1KTtpZihlPDB8fHRoaXMubGVuZ3RoPGV8fHRoaXMubGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpO2lmKG48PWUpcmV0dXJuIHRoaXM7dmFyIGk7aWYoZT4+Pj0wLG49dm9pZCAwPT09bj90aGlzLmxlbmd0aDpuPj4+MCx0fHwodD0wKSwibnVtYmVyIj09dHlwZW9mIHQpZm9yKGk9ZTtpPG47KytpKXRoaXNbaV09dDtlbHNle3ZhciBhPXUuaXNCdWZmZXIodCk/dDpGKG5ldyB1KHQscikudG9TdHJpbmcoKSkscz1hLmxlbmd0aDtmb3IoaT0wO2k8bi1lOysraSl0aGlzW2krZV09YVtpJXNdfXJldHVybiB0aGlzfTt2YXIgQj0vW14rXC8wLTlBLVphLXotX10vZztmdW5jdGlvbiBxKHQpe3JldHVybiB0PDE2PyIwIit0LnRvU3RyaW5nKDE2KTp0LnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBGKHQsZSl7dmFyIG47ZT1lfHwxLzA7Zm9yKHZhciByPXQubGVuZ3RoLG89bnVsbCxpPVtdLGE9MDthPHI7KythKXtpZigobj10LmNoYXJDb2RlQXQoYSkpPjU1Mjk1JiZuPDU3MzQ0KXtpZighbyl7aWYobj41NjMxOSl7KGUtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKGErMT09PXIpeyhlLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1vPW47Y29udGludWV9aWYobjw1NjMyMCl7KGUtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpLG89bjtjb250aW51ZX1uPTY1NTM2KyhvLTU1Mjk2PDwxMHxuLTU2MzIwKX1lbHNlIG8mJihlLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtpZihvPW51bGwsbjwxMjgpe2lmKChlLT0xKTwwKWJyZWFrO2kucHVzaChuKX1lbHNlIGlmKG48MjA0OCl7aWYoKGUtPTIpPDApYnJlYWs7aS5wdXNoKG4+PjZ8MTkyLDYzJm58MTI4KX1lbHNlIGlmKG48NjU1MzYpe2lmKChlLT0zKTwwKWJyZWFrO2kucHVzaChuPj4xMnwyMjQsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfWVsc2V7aWYoIShuPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKGUtPTQpPDApYnJlYWs7aS5wdXNoKG4+PjE4fDI0MCxuPj4xMiY2M3wxMjgsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfX1yZXR1cm4gaX1mdW5jdGlvbiBIKHQpe3JldHVybiByLnRvQnl0ZUFycmF5KGZ1bmN0aW9uKHQpe2lmKCh0PWZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0/dC50cmltKCk6dC5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9KHQpLnJlcGxhY2UoQiwiIikpLmxlbmd0aDwyKXJldHVybiIiO2Zvcig7dC5sZW5ndGglNCE9MDspdCs9Ij0iO3JldHVybiB0fSh0KSl9ZnVuY3Rpb24geih0LGUsbixyKXtmb3IodmFyIG89MDtvPHImJiEobytuPj1lLmxlbmd0aHx8bz49dC5sZW5ndGgpOysrbyllW28rbl09dFtvXTtyZXR1cm4gb319KS5jYWxsKHRoaXMsbig4NSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2UuYnl0ZUxlbmd0aD1mdW5jdGlvbih0KXt2YXIgZT1jKHQpLG49ZVswXSxyPWVbMV07cmV0dXJuIDMqKG4rcikvNC1yfSxlLnRvQnl0ZUFycmF5PWZ1bmN0aW9uKHQpe3ZhciBlLG4scj1jKHQpLGE9clswXSxzPXJbMV0sdT1uZXcgaShmdW5jdGlvbih0LGUsbil7cmV0dXJuIDMqKGUrbikvNC1ufSgwLGEscykpLGw9MCxmPXM+MD9hLTQ6YTtmb3Iobj0wO248ZjtuKz00KWU9b1t0LmNoYXJDb2RlQXQobildPDwxOHxvW3QuY2hhckNvZGVBdChuKzEpXTw8MTJ8b1t0LmNoYXJDb2RlQXQobisyKV08PDZ8b1t0LmNoYXJDb2RlQXQobiszKV0sdVtsKytdPWU+PjE2JjI1NSx1W2wrK109ZT4+OCYyNTUsdVtsKytdPTI1NSZlOzI9PT1zJiYoZT1vW3QuY2hhckNvZGVBdChuKV08PDJ8b1t0LmNoYXJDb2RlQXQobisxKV0+PjQsdVtsKytdPTI1NSZlKTsxPT09cyYmKGU9b1t0LmNoYXJDb2RlQXQobildPDwxMHxvW3QuY2hhckNvZGVBdChuKzEpXTw8NHxvW3QuY2hhckNvZGVBdChuKzIpXT4+Mix1W2wrK109ZT4+OCYyNTUsdVtsKytdPTI1NSZlKTtyZXR1cm4gdX0sZS5mcm9tQnl0ZUFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPXQubGVuZ3RoLG89biUzLGk9W10sYT0wLHM9bi1vO2E8czthKz0xNjM4MylpLnB1c2gobCh0LGEsYSsxNjM4Mz5zP3M6YSsxNjM4MykpOzE9PT1vPyhlPXRbbi0xXSxpLnB1c2gocltlPj4yXStyW2U8PDQmNjNdKyI9PSIpKToyPT09byYmKGU9KHRbbi0yXTw8OCkrdFtuLTFdLGkucHVzaChyW2U+PjEwXStyW2U+PjQmNjNdK3JbZTw8MiY2M10rIj0iKSk7cmV0dXJuIGkuam9pbigiIil9O2Zvcih2YXIgcj1bXSxvPVtdLGk9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksYT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIscz0wLHU9YS5sZW5ndGg7czx1OysrcylyW3NdPWFbc10sb1thLmNoYXJDb2RlQXQocyldPXM7ZnVuY3Rpb24gYyh0KXt2YXIgZT10Lmxlbmd0aDtpZihlJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTt2YXIgbj10LmluZGV4T2YoIj0iKTtyZXR1cm4tMT09PW4mJihuPWUpLFtuLG49PT1lPzA6NC1uJTRdfWZ1bmN0aW9uIGwodCxlLG4pe2Zvcih2YXIgbyxpLGE9W10scz1lO3M8bjtzKz0zKW89KHRbc108PDE2JjE2NzExNjgwKSsodFtzKzFdPDw4JjY1MjgwKSsoMjU1JnRbcysyXSksYS5wdXNoKHJbKGk9byk+PjE4JjYzXStyW2k+PjEyJjYzXStyW2k+PjYmNjNdK3JbNjMmaV0pO3JldHVybiBhLmpvaW4oIiIpfW9bIi0iLmNoYXJDb2RlQXQoMCldPTYyLG9bIl8iLmNoYXJDb2RlQXQoMCldPTYzfSxmdW5jdGlvbih0LGUpe2UucmVhZD1mdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpLGEscz04Km8tci0xLHU9KDE8PHMpLTEsYz11Pj4xLGw9LTcsZj1uP28tMTowLHA9bj8tMToxLGg9dFtlK2ZdO2ZvcihmKz1wLGk9aCYoMTw8LWwpLTEsaD4+PS1sLGwrPXM7bD4wO2k9MjU2KmkrdFtlK2ZdLGYrPXAsbC09OCk7Zm9yKGE9aSYoMTw8LWwpLTEsaT4+PS1sLGwrPXI7bD4wO2E9MjU2KmErdFtlK2ZdLGYrPXAsbC09OCk7aWYoMD09PWkpaT0xLWM7ZWxzZXtpZihpPT09dSlyZXR1cm4gYT9OYU46MS8wKihoPy0xOjEpO2ErPU1hdGgucG93KDIsciksaS09Y31yZXR1cm4oaD8tMToxKSphKk1hdGgucG93KDIsaS1yKX0sZS53cml0ZT1mdW5jdGlvbih0LGUsbixyLG8saSl7dmFyIGEscyx1LGM9OCppLW8tMSxsPSgxPDxjKS0xLGY9bD4+MSxwPTIzPT09bz9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsaD1yPzA6aS0xLGQ9cj8xOi0xLGc9ZTwwfHwwPT09ZSYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhzPWlzTmFOKGUpPzE6MCxhPWwpOihhPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKHU9TWF0aC5wb3coMiwtYSkpPDEmJihhLS0sdSo9MiksKGUrPWErZj49MT9wL3U6cCpNYXRoLnBvdygyLDEtZikpKnU+PTImJihhKyssdS89MiksYStmPj1sPyhzPTAsYT1sKTphK2Y+PTE/KHM9KGUqdS0xKSpNYXRoLnBvdygyLG8pLGErPWYpOihzPWUqTWF0aC5wb3coMixmLTEpKk1hdGgucG93KDIsbyksYT0wKSk7bz49ODt0W24raF09MjU1JnMsaCs9ZCxzLz0yNTYsby09OCk7Zm9yKGE9YTw8b3xzLGMrPW87Yz4wO3RbbitoXT0yNTUmYSxoKz1kLGEvPTI1NixjLT04KTt0W24raC1kXXw9MTI4Kmd9fSxmdW5jdGlvbih0LGUpe3ZhciBuPXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1uLmNhbGwodCl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjk5KX0sZnVuY3Rpb24odCxlLG4pe24oMzAwKTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLlVSTFNlYXJjaFBhcmFtc30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuKDEwMSk7dmFyIHI9bigwKSxvPW4oMzAxKSxpPW4oMzUpLGE9bigxMTgpLHM9bigyOCksdT1uKDk5KSxjPW4oNDkpLGw9bigxMTkpLGY9bigxNCkscD1uKDMxKSxoPW4oMTEpLGQ9big2KSxnPW4oMTA4KSx2PW4oNTEpLHk9bigyKSgiaXRlcmF0b3IiKSxtPWMuc2V0LGI9Yy5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtcyIpLHg9Yy5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yIiksdz0vXCsvZyxrPUFycmF5KDQpLFM9ZnVuY3Rpb24odCl7cmV0dXJuIGtbdC0xXXx8KGtbdC0xXT1SZWdFeHAoIigoPzolW1xcZGEtZl17Mn0peyIrdCsifSkiLCJnaSIpKX0sRT1mdW5jdGlvbih0KXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0KX1jYXRjaChlKXtyZXR1cm4gdH19LFQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKHcsIiAiKSxuPTQ7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZSl9Y2F0Y2godCl7Zm9yKDtuOyllPWUucmVwbGFjZShTKG4tLSksRSk7cmV0dXJuIGV9fSxqPS9bIScoKX5dfCUyMC9nLEE9eyIhIjoiJTIxIiwiJyI6IiUyNyIsIigiOiIlMjgiLCIpIjoiJTI5IiwifiI6IiU3RSIsIiUyMCI6IisifSxPPWZ1bmN0aW9uKHQpe3JldHVybiBBW3RdfSxDPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQodCkucmVwbGFjZShqLE8pfSxMPWZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IodmFyIG4scixvPWUuc3BsaXQoIiYiKSxpPTA7aTxvLmxlbmd0aDspKG49b1tpKytdKS5sZW5ndGgmJihyPW4uc3BsaXQoIj0iKSx0LnB1c2goe2tleTpUKHIuc2hpZnQoKSksdmFsdWU6VChyLmpvaW4oIj0iKSl9KSl9LFI9ZnVuY3Rpb24odCl7dGhpcy5lbnRyaWVzLmxlbmd0aD0wLEwodGhpcy5lbnRyaWVzLHQpfSxQPWZ1bmN0aW9uKHQsZSl7aWYodDxlKXRocm93IFR5cGVFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMiKX0sTj11KGZ1bmN0aW9uKHQsZSl7bSh0aGlzLHt0eXBlOiJVUkxTZWFyY2hQYXJhbXNJdGVyYXRvciIsaXRlcmF0b3I6ZyhiKHQpLmVudHJpZXMpLGtpbmQ6ZX0pfSwiSXRlcmF0b3IiLGZ1bmN0aW9uKCl7dmFyIHQ9eCh0aGlzKSxlPXQua2luZCxuPXQuaXRlcmF0b3IubmV4dCgpLHI9bi52YWx1ZTtyZXR1cm4gbi5kb25lfHwobi52YWx1ZT0ia2V5cyI9PT1lP3Iua2V5OiJ2YWx1ZXMiPT09ZT9yLnZhbHVlOltyLmtleSxyLnZhbHVlXSksbn0pLEk9ZnVuY3Rpb24oKXtsKHRoaXMsSSwiVVJMU2VhcmNoUGFyYW1zIik7dmFyIHQsZSxuLHIsbyxpLGEscz1hcmd1bWVudHMubGVuZ3RoPjA/YXJndW1lbnRzWzBdOnZvaWQgMCx1PXRoaXMsYz1bXTtpZihtKHUse3R5cGU6IlVSTFNlYXJjaFBhcmFtcyIsZW50cmllczpjLHVwZGF0ZVVSTDpmdW5jdGlvbigpe30sdXBkYXRlU2VhcmNoUGFyYW1zOlJ9KSx2b2lkIDAhPT1zKWlmKGQocykpaWYoImZ1bmN0aW9uIj09dHlwZW9mKHQ9dihzKSkpZm9yKGU9dC5jYWxsKHMpOyEobj1lLm5leHQoKSkuZG9uZTspe2lmKChvPShyPWcoaChuLnZhbHVlKSkpLm5leHQoKSkuZG9uZXx8KGk9ci5uZXh0KCkpLmRvbmV8fCFyLm5leHQoKS5kb25lKXRocm93IFR5cGVFcnJvcigiRXhwZWN0ZWQgc2VxdWVuY2Ugd2l0aCBsZW5ndGggMiIpO2MucHVzaCh7a2V5Om8udmFsdWUrIiIsdmFsdWU6aS52YWx1ZSsiIn0pfWVsc2UgZm9yKGEgaW4gcylmKHMsYSkmJmMucHVzaCh7a2V5OmEsdmFsdWU6c1thXSsiIn0pO2Vsc2UgTChjLCJzdHJpbmciPT10eXBlb2Ygcz8iPyI9PT1zLmNoYXJBdCgwKT9zLnNsaWNlKDEpOnM6cysiIil9LEQ9SS5wcm90b3R5cGU7YShELHthcHBlbmQ6ZnVuY3Rpb24odCxlKXtQKGFyZ3VtZW50cy5sZW5ndGgsMik7dmFyIG49Yih0aGlzKTtuLmVudHJpZXMucHVzaCh7a2V5OnQrIiIsdmFsdWU6ZSsiIn0pLG4udXBkYXRlVVJMKCl9LGRlbGV0ZTpmdW5jdGlvbih0KXtQKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPWIodGhpcyksbj1lLmVudHJpZXMscj10KyIiLG89MDtvPG4ubGVuZ3RoOyluW29dLmtleT09PXI/bi5zcGxpY2UobywxKTpvKys7ZS51cGRhdGVVUkwoKX0sZ2V0OmZ1bmN0aW9uKHQpe1AoYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIGU9Yih0aGlzKS5lbnRyaWVzLG49dCsiIixyPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5rZXk9PT1uKXJldHVybiBlW3JdLnZhbHVlO3JldHVybiBudWxsfSxnZXRBbGw6ZnVuY3Rpb24odCl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9W10sbz0wO288ZS5sZW5ndGg7bysrKWVbb10ua2V5PT09biYmci5wdXNoKGVbb10udmFsdWUpO3JldHVybiByfSxoYXM6ZnVuY3Rpb24odCl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9MDtyPGUubGVuZ3RoOylpZihlW3IrK10ua2V5PT09bilyZXR1cm4hMDtyZXR1cm4hMX0sc2V0OmZ1bmN0aW9uKHQsZSl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgbixyPWIodGhpcyksbz1yLmVudHJpZXMsaT0hMSxhPXQrIiIscz1lKyIiLHU9MDt1PG8ubGVuZ3RoO3UrKykobj1vW3VdKS5rZXk9PT1hJiYoaT9vLnNwbGljZSh1LS0sMSk6KGk9ITAsbi52YWx1ZT1zKSk7aXx8by5wdXNoKHtrZXk6YSx2YWx1ZTpzfSksci51cGRhdGVVUkwoKX0sc29ydDpmdW5jdGlvbigpe3ZhciB0LGUsbixyPWIodGhpcyksbz1yLmVudHJpZXMsaT1vLnNsaWNlKCk7Zm9yKG8ubGVuZ3RoPTAsbj0wO248aS5sZW5ndGg7bisrKXtmb3IodD1pW25dLGU9MDtlPG47ZSsrKWlmKG9bZV0ua2V5PnQua2V5KXtvLnNwbGljZShlLDAsdCk7YnJlYWt9ZT09PW4mJm8ucHVzaCh0KX1yLnVwZGF0ZVVSTCgpfSxmb3JFYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPWIodGhpcykuZW50cmllcyxyPXAodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKSxvPTA7bzxuLmxlbmd0aDspcigoZT1uW28rK10pLnZhbHVlLGUua2V5LHRoaXMpfSxrZXlzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsImtleXMiKX0sdmFsdWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsInZhbHVlcyIpfSxlbnRyaWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsImVudHJpZXMiKX19LHtlbnVtZXJhYmxlOiEwfSksaShELHksRC5lbnRyaWVzKSxpKEQsInRvU3RyaW5nIixmdW5jdGlvbigpe2Zvcih2YXIgdCxlPWIodGhpcykuZW50cmllcyxuPVtdLHI9MDtyPGUubGVuZ3RoOyl0PWVbcisrXSxuLnB1c2goQyh0LmtleSkrIj0iK0ModC52YWx1ZSkpO3JldHVybiBuLmpvaW4oIiYiKX0se2VudW1lcmFibGU6ITB9KSxzKEksIlVSTFNlYXJjaFBhcmFtcyIpLHIoe2dsb2JhbDohMCxmb3JjZWQ6IW99LHtVUkxTZWFyY2hQYXJhbXM6SX0pLHQuZXhwb3J0cz17VVJMU2VhcmNoUGFyYW1zOkksZ2V0U3RhdGU6Yn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89bigyKSxpPW4oMjcpLGE9bygiaXRlcmF0b3IiKTt0LmV4cG9ydHM9IXIoZnVuY3Rpb24oKXt2YXIgdD1uZXcgVVJMKCJiP2U9MSIsImh0dHA6Ly9hIiksZT10LnNlYXJjaFBhcmFtcztyZXR1cm4gdC5wYXRobmFtZT0iYyUyMGQiLGkmJiF0LnRvSlNPTnx8IWUuc29ydHx8Imh0dHA6Ly9hL2MlMjBkP2U9MSIhPT10LmhyZWZ8fCIxIiE9PWUuZ2V0KCJlIil8fCJhPTEiIT09U3RyaW5nKG5ldyBVUkxTZWFyY2hQYXJhbXMoIj9hPTEiKSl8fCFlW2FdfHwiYSIhPT1uZXcgVVJMKCJodHRwczovL2FAYiIpLnVzZXJuYW1lfHwiYiIhPT1uZXcgVVJMU2VhcmNoUGFyYW1zKG5ldyBVUkxTZWFyY2hQYXJhbXMoImE9YiIpKS5nZXQoImEiKXx8InhuLS1lMWF5YmMiIT09bmV3IFVSTCgiaHR0cDovL9GC0LXRgdGCIikuaG9zdHx8IiMlRDAlQjEiIT09bmV3IFVSTCgiaHR0cDovL2Ej0LEiKS5oYXNofSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5yKGUpO3ZhciByPW4oOCksbz1uLm4ociksaT1uKDYxKSxhPW4ubihpKSxzPW4oOSksdT1uLm4ocyksYz1uKDIwKSxsPW4ubihjKSxmPW4oNykscD1uLm4oZiksaD1uKDEyKSxkPW4ubihoKSxnPW4oMTI2KSx2PW4ubihnKSx5PW4oMTkpLG09bi5uKHkpLGI9bigzNikseD1uLm4oYiksdz1uKDE1KSxrPW4ubih3KSxTPW4oMTApLEU9bi5uKFMpLFQ9KG4oMTYpLG4oODApKSxqPW4ubihUKTtmdW5jdGlvbiBBKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLG49aigpKHQucmVwbGFjZSgvW14wLTldL2dpLCIiKSwxMCk7cmV0dXJuIG58fGV9ZnVuY3Rpb24gTyh0KXt2YXIgZT0iIixuPXQuY29udGVudHMoKTtpZihuLmxlbmd0aD4wKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cis9MSl7dmFyIG89bi5nZXQocik7Mz09PW8ubm9kZVR5cGUmJm8uZGF0YSYmKGUrPW8uZGF0YSl9cmV0dXJuIGV9ZnVuY3Rpb24gQyh0LGUpe2lmKCFlKXRocm93IG5ldyBFcnJvcigic2VsZWN0b3IgcmVxdWlyZWQiKTtyZXR1cm4gdChlKS5sZW5ndGg+MCYmImltZyI9PT10KGUpLnByb3AoInRhZ05hbWUiKS50b0xvd2VyQ2FzZSgpP3QoZSkuYXR0cigiYWx0Iil8fCIiOnQoZSkudGV4dCgpLnJlcGxhY2UoL1xuLywiIil9ZnVuY3Rpb24gTCh0LGUpe2lmKCFlKXRocm93IG5ldyBFcnJvcigic2VsZWN0b3IgcmVxdWlyZWQiKTt2YXIgbj0iIjtpZih0KGUpLmxlbmd0aD4wKXt2YXIgcj10KGUpLnByb3AoInRhZ05hbWUiKS50b0xvd2VyQ2FzZSgpO249ImlucHV0Ij09PXI/dChlKS52YWwoKToibWV0YSI9PT1yP3QoZSkuYXR0cigiY29udGVudCIpfHwiIjpPKHQoZSkpfXJldHVybiBuPW4ucmVwbGFjZSgvW14wLTldL2csIiIpLGooKShuLDEwKX12YXIgUj1uKDM3KSxQPW4ubihSKSxOPW4oMzgpLEk9bi5uKE4pLEQ9bigzOSksXz1uLm4oRCksTT1uKDQwKSxVPW4ubihNKSxCPW4oNDEpLHE9bi5uKEIpLEY9big0MiksSD1uLm4oRiksej1uKDYyKSxXPW4ubih6KTtmdW5jdGlvbiAkKHQsZSl7dmFyIG47aWYodm9pZCAwPT09VS5hfHxudWxsPT1fKCkodCkpe2lmKEkoKSh0KXx8KG49ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBZKHQsZSk7dmFyIHI9SCgpKG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKS5jYWxsKG4sOCwtMSk7Ik9iamVjdCI9PT1yJiZ0LmNvbnN0cnVjdG9yJiYocj10LmNvbnN0cnVjdG9yLm5hbWUpO2lmKCJNYXAiPT09cnx8IlNldCI9PT1yKXJldHVybiBxKCkodCk7aWYoIkFyZ3VtZW50cyI9PT1yfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChyKSlyZXR1cm4gWSh0LGUpfSh0KSl8fGUmJnQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpe24mJih0PW4pO3ZhciByPTAsbz1mdW5jdGlvbigpe307cmV0dXJue3M6byxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKHQpe3Rocm93IHR9LGY6b319dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfXZhciBpLGE9ITAscz0hMTtyZXR1cm57czpmdW5jdGlvbigpe249UCgpKHQpfSxuOmZ1bmN0aW9uKCl7dmFyIHQ9bi5uZXh0KCk7cmV0dXJuIGE9dC5kb25lLHR9LGU6ZnVuY3Rpb24odCl7cz0hMCxpPXR9LGY6ZnVuY3Rpb24oKXt0cnl7YXx8bnVsbD09bi5yZXR1cm58fG4ucmV0dXJuKCl9ZmluYWxseXtpZihzKXRocm93IGl9fX19ZnVuY3Rpb24gWSh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIFYodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJTS1XjgYzkuI3mraPjgafjgZkiKTtpZigwPT09VygpKHQpLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlNLVemgheebruaVsOOBjOS4jeato+OBp+OBmSIpfXZhciBHPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgbj1lLiQscj1lLm5hbWUsbz1lLnByaWNlO3AoKSh0aGlzLHQpLHRoaXMuJD1uLHRoaXMubmFtZVNlbGVjdG9yPXJ8fCIiLHRoaXMucHJpY2VTZWxlY3Rvcj1vfHwiIn1yZXR1cm4gZCgpKHQsW3trZXk6ImdldFB1cmNoYXNhYmxlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4hMH19LHtrZXk6ImV4ZWN1dGUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZSxuLHI9ITA7dHJ5e3JldHVybiB0PXRoaXMuZ2V0SXRlbSgpLGU9dGhpcy5nZXRTa3VSb3dzKHQpLHI9dGhpcy5nZXRQdXJjaGFzYWJsZSh7aXRlbTp0LHNrdVJvd3M6ZX0pLGZ1bmN0aW9uKHQpe3ZhciBlPXQuaXRlbSxuPXQuc2t1Um93cztpZighZSl0aHJvdyBuZXcgRXJyb3IoIuOCouOCpOODhuODoOOBjOS4jeato+OBp+OBmSIpO2lmKCFlLm5hbWUpdGhyb3cgbmV3IEVycm9yKCLjgqLjgqTjg4bjg6DlkI3liY3jgYzkuI3mraPjgafjgZkiKTtpZighKG4mJjAhPT1uLmxlbmd0aHx8ZS5wcmljZSkpdGhyb3cgbmV3IEVycm9yKCLjgqLjgqTjg4bjg6Dph5HpoY3jgYzkuI3mraPjgafjgZkiKTtpZihuKXt2YXIgcixvPSQobik7dHJ5e2ZvcihvLnMoKTshKHI9by5uKCkpLmRvbmU7KXtWKHIudmFsdWUpfX1jYXRjaCh0KXtvLmUodCl9ZmluYWxseXtvLmYoKX19fSh7aXRlbTp0LHNrdVJvd3M6ZX0pLHtpdGVtOnQsc2t1Um93czplLHB1cmNoYXNhYmxlOnJ9fWNhdGNoKHQpe249dH12YXIgbz17cHVyY2hhc2FibGU6cn07cmV0dXJuIHQmJihvLml0ZW09dCksZSYmKG8uc2t1Um93cz1lKSxuJiYoby5lcnJvcj1uKSxvfX0se2tleToiZ2V0SXRlbSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD17bmFtZToiIixwcmljZTowfTt0aGlzLm5hbWVTZWxlY3Rvcj90Lm5hbWU9dGhpcy5nZXRJdGVtTmFtZShDKHRoaXMuJCx0aGlzLm5hbWVTZWxlY3RvcikpOnQubmFtZT10aGlzLmdldEl0ZW1OYW1lKCksdGhpcy5wcmljZVNlbGVjdG9yP3QucHJpY2U9dGhpcy5nZXRJdGVtUHJpY2UoTCh0aGlzLiQsdGhpcy5wcmljZVNlbGVjdG9yKSk6dC5wcmljZT10aGlzLmdldEl0ZW1QcmljZSgpO3ZhciBlPXRoaXMuZ2V0SXRlbUNvZGUoKTtyZXR1cm4gZSYmKHQuY29kZT1lKSx0fX0se2tleToiZ2V0SXRlbU5hbWUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiIiO3JldHVybiB0aGlzLm5hbWVTZWxlY3Rvcj9DKHRoaXMuJCx0aGlzLm5hbWVTZWxlY3Rvcik6dH19LHtrZXk6ImdldEl0ZW1QcmljZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MDtyZXR1cm4gdGhpcy5wcmljZVNlbGVjdG9yP0wodGhpcy4kLHRoaXMucHJpY2VTZWxlY3Rvcik6dH19LHtrZXk6ImdldEl0ZW1Db2RlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiIifX0se2tleToiZ2V0U2t1Um93cyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuW119fV0pLHR9KCksSz1uKDEyNyksWD1uLm4oSyksSj1uKDEyOCk7ZnVuY3Rpb24gUSgpe3JldHVybiB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlcyYmd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx3aW5kb3cubmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZX12YXIgWj1uKDEyOSksdHQ9bi5uKFopLGV0PW4oMTMwKSxudD1uLm4oZXQpLHJ0PW4oNTMpLG90PW4ubihydCksaXQ9InppZ3phZyI7dmFyIGF0PW4oMjUpLHN0PSJ1c2FnZSIsdXQ9InppZ3phZy1mbG93LWNvbnRyb2xsZWQiO2Z1bmN0aW9uIGN0KHQsZSl7d2luZG93LiQmJmZ1bmN0aW9uKG4pe3ZhciByPW4odCk7aWYociYmci5sZW5ndGg+MClmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rPTEpe3ZhciBpPXIuZ2V0KG8pO2kuaGFzQXR0cmlidXRlKHV0KXx8KCJjbGljayI9PT1lP2kub25jbGljaz1udWxsOiJzdWJtaXQiPT09ZSYmKGkub25zdWJtaXQ9bnVsbCksIm9mZiJpbiBuKGkpP24oaSkub2ZmKGUpOiJ1bmJpbmQiaW4gbihpKSYmbihpKS51bmJpbmQoZSkpfX0od2luZG93LiQpfXZhciBsdD17cHJlc2VydmVPcmlnaW5hbEV2ZW50OiExLGRpc2FibGVQb2ludGVyRXZlbnQ6ITEsZGlzYWJsZVJlcG9ydDohMX07dmFyIGZ0PXtkaXNhYmxlUmVwb3J0OiExfTtmdW5jdGlvbiBwdCh0KXt2YXIgZT1udCgpKGZ1bmN0aW9uKCl7dmFyIG4scixvPXdpbmRvdy56aWd6YWc7ImRlYWN0aXZhdGVkIj09PShuPXN0LHI9d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGl0KSxKU09OLnBhcnNlKHI/ZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IocikpOiJ7fSIpW25dKXx8by5pc0RlbmllZHx8KHQoKSxjbGVhckludGVydmFsKGUpKX0sNTAwKX1mdW5jdGlvbiBodCh0LGUpe3ZhciBuPXdpbmRvdy56aWd6YWc7dHQoKShmdW5jdGlvbigpey9DaHJvbWUvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpJiYwPT09dChlKS5sZW5ndGgmJm4mJiJpdGVtIj09PW4uZGlzY292ZXJ5U3RhdHVzJiZhdC5hLmVycm9yKCIiLmNvbmNhdChlLCI6IOOCouOCpOODhuODoOODmuODvOOCuOOBp+ipsuW9k+OBmeOCi+ODleODreODvOWItuW+oeeUqOOBruimgee0oOOBjOimi+OBpOOBi+OCiuOBvuOBm+OCkyIpKX0sNWUzKX12YXIgZHQ9e29uQ2hhbmdlc1JlYWR5OmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpbImphIl07Qm9vbGVhbihFKCkoZSkuY2FsbChlLGZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybi0xIT09WCgpKGU9USgpKS5jYWxsKGUsdCl9KSl8fHB0KGZ1bmN0aW9uKCl7dChKKX0pfSxvdmVycmlkZUNsaWNrRXZlbnQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpsdDtpZigocj1vdCgpKG90KCkoe30sbHQpLHIpKS5kaXNhYmxlUmVwb3J0fHxodCh0LGUpLHIuZGlzYWJsZVBvaW50ZXJFdmVudCl7aWYod2luZG93LmRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKHV0KSlyZXR1cm47dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtvLmlubmVySFRNTD0iXG4gICAgIi5jb25jYXQoZSwiIHtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH0iKTt2YXIgaT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHQiKTtyZXR1cm4gaSYmaS5wYXJlbnROb2RlJiZpLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG8saSksdChkb2N1bWVudCkub24oImNsaWNrIixmdW5jdGlvbihyKXtyLnRhcmdldCYmdChyLnRhcmdldCkuY2xvc2VzdCh0KGUpLnBhcmVudCgpKS5sZW5ndGg+MCYmbihyKX0pLHZvaWQgd2luZG93LmRvY3VtZW50LmJvZHkuc2V0QXR0cmlidXRlKHV0LCIxIil9ci5wcmVzZXJ2ZU9yaWdpbmFsRXZlbnR8fGN0KGUsImNsaWNrIik7Zm9yKHZhciBhPXQoZSkscz0wO3M8YS5sZW5ndGg7cys9MSl7dmFyIHU9YS5nZXQocyk7dS5oYXNBdHRyaWJ1dGUodXQpfHwodS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24odCl7ci5wcmVzZXJ2ZU9yaWdpbmFsRXZlbnR8fCh0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSksbih0KX0sITApLHUuc2V0QXR0cmlidXRlKHV0LCIxIikpfX0sb3ZlcnJpZGVTdWJtaXRFdmVudDpmdW5jdGlvbih0LGUsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOmZ0OyhyPW90KCkob3QoKSh7fSxmdCkscikpLmRpc2FibGVSZXBvcnR8fGh0KHQsZSksY3QoZSwic3VibWl0Iik7dmFyIG89dChlKTtpZihvJiZvLmxlbmd0aD4wKWZvcih2YXIgaT0wO2k8by5sZW5ndGg7aSs9MSl7dmFyIGE9by5nZXQoaSk7YS5oYXNBdHRyaWJ1dGUodXQpfHwodChhKS5vbigic3VibWl0IixuKSxhLnNldEF0dHJpYnV0ZSh1dCwiMSIpKX19LHVuYmluZE9yaWdpbmFsSlF1ZXJ5RXZlbnRzOmN0fTt2YXIgZ3Q9big4MSksdnQ9bi5uKGd0KSx5dD1uKDEzMSksbXQ9bi5uKHl0KSxidD1uKDEzMikseHQ9bi5uKGJ0KSx3dD1uKDgyKSxrdD1uLm4od3QpO2Z1bmN0aW9uIFN0KHQpe3JldHVybihTdD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIEV0KHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH1mdW5jdGlvbiBUdCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/T2JqZWN0KGFyZ3VtZW50c1tlXSk6e30scj1PYmplY3Qua2V5cyhuKTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKHI9ci5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxyLmZvckVhY2goZnVuY3Rpb24oZSl7RXQodCxlLG5bZV0pfSl9cmV0dXJuIHR9ZnVuY3Rpb24ganQodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBBdCh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIE90KHQsZSxuKXtyZXR1cm4gZSYmQXQodC5wcm90b3R5cGUsZSksbiYmQXQodCxuKSx0fWZ1bmN0aW9uIEN0KHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBMdCh0LGUpe3JldHVybiFlfHwib2JqZWN0IiE9PVN0KGUpJiYiZnVuY3Rpb24iIT10eXBlb2YgZT9DdCh0KTplfWZ1bmN0aW9uIFJ0KHQpe3JldHVybihSdD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gUHQodCxlKXtyZXR1cm4oUHQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9KSh0LGUpfWZ1bmN0aW9uIE50KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJlB0KHQsZSl9dmFyIEl0PXt0eXBlOiJsb2dnZXIiLGxvZzpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgibG9nIix0KX0sd2FybjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgid2FybiIsdCl9LGVycm9yOmZ1bmN0aW9uKHQpe3RoaXMub3V0cHV0KCJlcnJvciIsdCl9LG91dHB1dDpmdW5jdGlvbih0LGUpe2NvbnNvbGUmJmNvbnNvbGVbdF0mJmNvbnNvbGVbdF0uYXBwbHkoY29uc29sZSxlKX19LER0PW5ldyhmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2p0KHRoaXMsdCksdGhpcy5pbml0KGUsbil9cmV0dXJuIE90KHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTt0aGlzLnByZWZpeD1lLnByZWZpeHx8ImkxOG5leHQ6Iix0aGlzLmxvZ2dlcj10fHxJdCx0aGlzLm9wdGlvbnM9ZSx0aGlzLmRlYnVnPWUuZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZWJ1Zz10fX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuZm9yd2FyZChlLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gciYmIXRoaXMuZGVidWc/bnVsbDooInN0cmluZyI9PXR5cGVvZiB0WzBdJiYodFswXT0iIi5jb25jYXQobikuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KHRbMF0pKSx0aGlzLmxvZ2dlcltlXSh0KSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdCh0aGlzLmxvZ2dlcixUdCh7fSx7cHJlZml4OiIiLmNvbmNhdCh0aGlzLnByZWZpeCwiOiIpLmNvbmNhdChlLCI6Iil9LHRoaXMub3B0aW9ucykpfX1dKSx0fSgpKSxfdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtqdCh0aGlzLHQpLHRoaXMub2JzZXJ2ZXJzPXt9fXJldHVybiBPdCh0LFt7a2V5OiJvbiIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiB0LnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbih0KXtuLm9ic2VydmVyc1t0XT1uLm9ic2VydmVyc1t0XXx8W10sbi5vYnNlcnZlcnNbdF0ucHVzaChlKX0pLHRoaXN9fSx7a2V5OiJvZmYiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5vYnNlcnZlcnNbdF0mJihlP3RoaXMub2JzZXJ2ZXJzW3RdPXRoaXMub2JzZXJ2ZXJzW3RdLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdCE9PWV9KTpkZWxldGUgdGhpcy5vYnNlcnZlcnNbdF0pfX0se2tleToiZW1pdCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZT4xP2UtMTowKSxyPTE7cjxlO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2lmKHRoaXMub2JzZXJ2ZXJzW3RdKXt2YXIgbz1bXS5jb25jYXQodGhpcy5vYnNlcnZlcnNbdF0pO28uZm9yRWFjaChmdW5jdGlvbih0KXt0LmFwcGx5KHZvaWQgMCxuKX0pfWlmKHRoaXMub2JzZXJ2ZXJzWyIqIl0pe3ZhciBpPVtdLmNvbmNhdCh0aGlzLm9ic2VydmVyc1siKiJdKTtpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hcHBseShlLFt0XS5jb25jYXQobikpfSl9fX1dKSx0fSgpO2Z1bmN0aW9uIE10KCl7dmFyIHQsZSxuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4scil7dD1uLGU9cn0pO3JldHVybiBuLnJlc29sdmU9dCxuLnJlamVjdD1lLG59ZnVuY3Rpb24gVXQodCl7cmV0dXJuIG51bGw9PXQ/IiI6IiIrdH1mdW5jdGlvbiBCdCh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mdW5jdGlvbiBvKCl7cmV0dXJuIXR8fCJzdHJpbmciPT10eXBlb2YgdH1mb3IodmFyIGk9InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7aS5sZW5ndGg+MTspe2lmKG8oKSlyZXR1cm57fTt2YXIgYT1yKGkuc2hpZnQoKSk7IXRbYV0mJm4mJih0W2FdPW5ldyBuKSx0PXRbYV19cmV0dXJuIG8oKT97fTp7b2JqOnQsazpyKGkuc2hpZnQoKSl9fWZ1bmN0aW9uIHF0KHQsZSxuKXt2YXIgcj1CdCh0LGUsT2JqZWN0KTtyLm9ialtyLmtdPW59ZnVuY3Rpb24gRnQodCxlKXt2YXIgbj1CdCh0LGUpLHI9bi5vYmosbz1uLms7aWYocilyZXR1cm4gcltvXX1mdW5jdGlvbiBIdCh0LGUsbil7dmFyIHI9RnQodCxuKTtyZXR1cm4gdm9pZCAwIT09cj9yOkZ0KGUsbil9ZnVuY3Rpb24genQodCxlLG4pe2Zvcih2YXIgciBpbiBlKSJfX3Byb3RvX18iIT09ciYmImNvbnN0cnVjdG9yIiE9PXImJihyIGluIHQ/InN0cmluZyI9PXR5cGVvZiB0W3JdfHx0W3JdaW5zdGFuY2VvZiBTdHJpbmd8fCJzdHJpbmciPT10eXBlb2YgZVtyXXx8ZVtyXWluc3RhbmNlb2YgU3RyaW5nP24mJih0W3JdPWVbcl0pOnp0KHRbcl0sZVtyXSxuKTp0W3JdPWVbcl0pO3JldHVybiB0fWZ1bmN0aW9uIFd0KHQpe3JldHVybiB0LnJlcGxhY2UoL1tcLVxbXF1cL1x7XH1cKFwpXCpcK1w/XC5cXFxeXCRcfF0vZywiXFwkJiIpfXZhciAkdD17IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjMzk7IiwiLyI6IiYjeDJGOyJ9O2Z1bmN0aW9uIFl0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnJlcGxhY2UoL1smPD4iJ1wvXS9nLGZ1bmN0aW9uKHQpe3JldHVybiAkdFt0XX0pOnR9dmFyIFZ0PSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cubmF2aWdhdG9yJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCYmd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpPi0xLEd0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIG4scj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e25zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6InRyYW5zbGF0aW9uIn07cmV0dXJuIGp0KHRoaXMsZSksbj1MdCh0aGlzLFJ0KGUpLmNhbGwodGhpcykpLFZ0JiZfdC5jYWxsKEN0KG4pKSxuLmRhdGE9dHx8e30sbi5vcHRpb25zPXIsdm9pZCAwPT09bi5vcHRpb25zLmtleVNlcGFyYXRvciYmKG4ub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxufXJldHVybiBOdChlLF90KSxPdChlLFt7a2V5OiJhZGROYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMubnMuaW5kZXhPZih0KTwwJiZ0aGlzLm9wdGlvbnMubnMucHVzaCh0KX19LHtrZXk6InJlbW92ZU5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucy5ucy5pbmRleE9mKHQpO2U+LTEmJnRoaXMub3B0aW9ucy5ucy5zcGxpY2UoZSwxKX19LHtrZXk6ImdldFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9LG89dm9pZCAwIT09ci5rZXlTZXBhcmF0b3I/ci5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixpPVt0LGVdO3JldHVybiBuJiYic3RyaW5nIiE9dHlwZW9mIG4mJihpPWkuY29uY2F0KG4pKSxuJiYic3RyaW5nIj09dHlwZW9mIG4mJihpPWkuY29uY2F0KG8/bi5zcGxpdChvKTpuKSksdC5pbmRleE9mKCIuIik+LTEmJihpPXQuc3BsaXQoIi4iKSksRnQodGhpcy5kYXRhLGkpfX0se2tleToiYWRkUmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTp7c2lsZW50OiExfSxpPXRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3I7dm9pZCAwPT09aSYmKGk9Ii4iKTt2YXIgYT1bdCxlXTtuJiYoYT1hLmNvbmNhdChpP24uc3BsaXQoaSk6bikpLHQuaW5kZXhPZigiLiIpPi0xJiYocj1lLGU9KGE9dC5zcGxpdCgiLiIpKVsxXSksdGhpcy5hZGROYW1lc3BhY2VzKGUpLHF0KHRoaXMuZGF0YSxhLHIpLG8uc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbixyKX19LHtrZXk6ImFkZFJlc291cmNlcyIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7c2lsZW50OiExfTtmb3IodmFyIG8gaW4gbikic3RyaW5nIiE9dHlwZW9mIG5bb10mJiJbb2JqZWN0IEFycmF5XSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG5bb10pfHx0aGlzLmFkZFJlc291cmNlKHQsZSxvLG5bb10se3NpbGVudDohMH0pO3Iuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbil9fSx7a2V5OiJhZGRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06e3NpbGVudDohMX0sYT1bdCxlXTt0LmluZGV4T2YoIi4iKT4tMSYmKHI9bixuPWUsZT0oYT10LnNwbGl0KCIuIikpWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoZSk7dmFyIHM9RnQodGhpcy5kYXRhLGEpfHx7fTtyP3p0KHMsbixvKTpzPVR0KHt9LHMsbikscXQodGhpcy5kYXRhLGEscyksaS5zaWxlbnR8fHRoaXMuZW1pdCgiYWRkZWQiLHQsZSxuKX19LHtrZXk6InJlbW92ZVJlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuaGFzUmVzb3VyY2VCdW5kbGUodCxlKSYmZGVsZXRlIHRoaXMuZGF0YVt0XVtlXSx0aGlzLnJlbW92ZU5hbWVzcGFjZXMoZSksdGhpcy5lbWl0KCJyZW1vdmVkIix0LGUpfX0se2tleToiaGFzUmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuZ2V0UmVzb3VyY2UodCxlKX19LHtrZXk6ImdldFJlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiBlfHwoZT10aGlzLm9wdGlvbnMuZGVmYXVsdE5TKSwidjEiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEk/VHQoe30se30sdGhpcy5nZXRSZXNvdXJjZSh0LGUpKTp0aGlzLmdldFJlc291cmNlKHQsZSl9fSx7a2V5OiJnZXREYXRhQnlMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YVt0XX19LHtrZXk6InRvSlNPTiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhfX1dKSxlfSgpLEt0PXtwcm9jZXNzb3JzOnt9LGFkZFBvc3RQcm9jZXNzb3I6ZnVuY3Rpb24odCl7dGhpcy5wcm9jZXNzb3JzW3QubmFtZV09dH0saGFuZGxlOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGk9dGhpcztyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2kucHJvY2Vzc29yc1t0XSYmKGU9aS5wcm9jZXNzb3JzW3RdLnByb2Nlc3MoZSxuLHIsbykpfSksZX19LFh0PXt9LEp0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIG4scixvLGksYT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307cmV0dXJuIGp0KHRoaXMsZSksbj1MdCh0aGlzLFJ0KGUpLmNhbGwodGhpcykpLFZ0JiZfdC5jYWxsKEN0KG4pKSxyPVsicmVzb3VyY2VTdG9yZSIsImxhbmd1YWdlVXRpbHMiLCJwbHVyYWxSZXNvbHZlciIsImludGVycG9sYXRvciIsImJhY2tlbmRDb25uZWN0b3IiLCJpMThuRm9ybWF0IiwidXRpbHMiXSxvPXQsaT1DdChuKSxyLmZvckVhY2goZnVuY3Rpb24odCl7b1t0XSYmKGlbdF09b1t0XSl9KSxuLm9wdGlvbnM9YSx2b2lkIDA9PT1uLm9wdGlvbnMua2V5U2VwYXJhdG9yJiYobi5vcHRpb25zLmtleVNlcGFyYXRvcj0iLiIpLG4ubG9nZ2VyPUR0LmNyZWF0ZSgidHJhbnNsYXRvciIpLG59cmV0dXJuIE50KGUsX3QpLE90KGUsW3trZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0KXt0JiYodGhpcy5sYW5ndWFnZT10KX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOntpbnRlcnBvbGF0aW9uOnt9fSxuPXRoaXMucmVzb2x2ZSh0LGUpO3JldHVybiBuJiZ2b2lkIDAhPT1uLnJlc319LHtrZXk6ImV4dHJhY3RGcm9tS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXZvaWQgMCE9PWUubnNTZXBhcmF0b3I/ZS5uc1NlcGFyYXRvcjp0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7dm9pZCAwPT09biYmKG49IjoiKTt2YXIgcj12b2lkIDAhPT1lLmtleVNlcGFyYXRvcj9lLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLG89ZS5uc3x8dGhpcy5vcHRpb25zLmRlZmF1bHROUztpZihuJiZ0LmluZGV4T2Yobik+LTEpe3ZhciBpPXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7aWYoaSYmaS5sZW5ndGg+MClyZXR1cm57a2V5OnQsbmFtZXNwYWNlczpvfTt2YXIgYT10LnNwbGl0KG4pOyhuIT09cnx8bj09PXImJnRoaXMub3B0aW9ucy5ucy5pbmRleE9mKGFbMF0pPi0xKSYmKG89YS5zaGlmdCgpKSx0PWEuam9pbihyKX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIG8mJihvPVtvXSkse2tleTp0LG5hbWVzcGFjZXM6b319fSx7a2V5OiJ0cmFuc2xhdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzO2lmKCJvYmplY3QiIT09U3QoZSkmJnRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlciYmKGU9dGhpcy5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKGFyZ3VtZW50cykpLGV8fChlPXt9KSxudWxsPT10KXJldHVybiIiO0FycmF5LmlzQXJyYXkodCl8fCh0PVtTdHJpbmcodCldKTt2YXIgbz12b2lkIDAhPT1lLmtleVNlcGFyYXRvcj9lLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLGk9dGhpcy5leHRyYWN0RnJvbUtleSh0W3QubGVuZ3RoLTFdLGUpLGE9aS5rZXkscz1pLm5hbWVzcGFjZXMsdT1zW3MubGVuZ3RoLTFdLGM9ZS5sbmd8fHRoaXMubGFuZ3VhZ2UsbD1lLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlfHx0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU7aWYoYyYmImNpbW9kZSI9PT1jLnRvTG93ZXJDYXNlKCkpe2lmKGwpe3ZhciBmPWUubnNTZXBhcmF0b3J8fHRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjtyZXR1cm4gdStmK2F9cmV0dXJuIGF9dmFyIHA9dGhpcy5yZXNvbHZlKHQsZSksaD1wJiZwLnJlcyxkPXAmJnAudXNlZEtleXx8YSxnPXAmJnAuZXhhY3RVc2VkS2V5fHxhLHY9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShoKSx5PVsiW29iamVjdCBOdW1iZXJdIiwiW29iamVjdCBGdW5jdGlvbl0iLCJbb2JqZWN0IFJlZ0V4cF0iXSxtPXZvaWQgMCE9PWUuam9pbkFycmF5cz9lLmpvaW5BcnJheXM6dGhpcy5vcHRpb25zLmpvaW5BcnJheXMsYj0hdGhpcy5pMThuRm9ybWF0fHx0aGlzLmkxOG5Gb3JtYXQuaGFuZGxlQXNPYmplY3QseD0ic3RyaW5nIiE9dHlwZW9mIGgmJiJib29sZWFuIiE9dHlwZW9mIGgmJiJudW1iZXIiIT10eXBlb2YgaDtpZihiJiZoJiZ4JiZ5LmluZGV4T2Yodik8MCYmKCJzdHJpbmciIT10eXBlb2YgbXx8IltvYmplY3QgQXJyYXldIiE9PXYpKXtpZighZS5yZXR1cm5PYmplY3RzJiYhdGhpcy5vcHRpb25zLnJldHVybk9iamVjdHMpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImFjY2Vzc2luZyBhbiBvYmplY3QgLSBidXQgcmV0dXJuT2JqZWN0cyBvcHRpb25zIGlzIG5vdCBlbmFibGVkISIpLHRoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXI/dGhpcy5vcHRpb25zLnJldHVybmVkT2JqZWN0SGFuZGxlcihkLGgsZSk6ImtleSAnIi5jb25jYXQoYSwiICgiKS5jb25jYXQodGhpcy5sYW5ndWFnZSwiKScgcmV0dXJuZWQgYW4gb2JqZWN0IGluc3RlYWQgb2Ygc3RyaW5nLiIpO2lmKG8pe3ZhciB3PSJbb2JqZWN0IEFycmF5XSI9PT12LGs9dz9bXTp7fSxTPXc/ZzpkO2Zvcih2YXIgRSBpbiBoKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoLEUpKXt2YXIgVD0iIi5jb25jYXQoUykuY29uY2F0KG8pLmNvbmNhdChFKTtrW0VdPXRoaXMudHJhbnNsYXRlKFQsVHQoe30sZSx7am9pbkFycmF5czohMSxuczpzfSkpLGtbRV09PT1UJiYoa1tFXT1oW0VdKX1oPWt9fWVsc2UgaWYoYiYmInN0cmluZyI9PXR5cGVvZiBtJiYiW29iamVjdCBBcnJheV0iPT09dikoaD1oLmpvaW4obSkpJiYoaD10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKGgsdCxlLG4pKTtlbHNle3ZhciBqPSExLEE9ITE7aWYoIXRoaXMuaXNWYWxpZExvb2t1cChoKSYmdm9pZCAwIT09ZS5kZWZhdWx0VmFsdWUpe2lmKGo9ITAsdm9pZCAwIT09ZS5jb3VudCl7dmFyIE89dGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgoYyxlLmNvdW50KTtoPWVbImRlZmF1bHRWYWx1ZSIuY29uY2F0KE8pXX1ofHwoaD1lLmRlZmF1bHRWYWx1ZSl9dGhpcy5pc1ZhbGlkTG9va3VwKGgpfHwoQT0hMCxoPWEpO3ZhciBDPWUuZGVmYXVsdFZhbHVlJiZlLmRlZmF1bHRWYWx1ZSE9PWgmJnRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO2lmKEF8fGp8fEMpe2lmKHRoaXMubG9nZ2VyLmxvZyhDPyJ1cGRhdGVLZXkiOiJtaXNzaW5nS2V5IixjLHUsYSxDP2UuZGVmYXVsdFZhbHVlOmgpLG8pe3ZhciBMPXRoaXMucmVzb2x2ZShhLFR0KHt9LGUse2tleVNlcGFyYXRvcjohMX0pKTtMJiZMLnJlcyYmdGhpcy5sb2dnZXIud2FybigiU2VlbXMgdGhlIGxvYWRlZCB0cmFuc2xhdGlvbnMgd2VyZSBpbiBmbGF0IEpTT04gZm9ybWF0IGluc3RlYWQgb2YgbmVzdGVkLiBFaXRoZXIgc2V0IGtleVNlcGFyYXRvcjogZmFsc2Ugb24gaW5pdCBvciBtYWtlIHN1cmUgeW91ciB0cmFuc2xhdGlvbnMgYXJlIHB1Ymxpc2hlZCBpbiBuZXN0ZWQgZm9ybWF0LiIpfXZhciBSPVtdLFA9dGhpcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGUubG5nfHx0aGlzLmxhbmd1YWdlKTtpZigiZmFsbGJhY2siPT09dGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nVG8mJlAmJlBbMF0pZm9yKHZhciBOPTA7TjxQLmxlbmd0aDtOKyspUi5wdXNoKFBbTl0pO2Vsc2UiYWxsIj09PXRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvP1I9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShlLmxuZ3x8dGhpcy5sYW5ndWFnZSk6Ui5wdXNoKGUubG5nfHx0aGlzLmxhbmd1YWdlKTt2YXIgST1mdW5jdGlvbih0LG4pe3Iub3B0aW9ucy5taXNzaW5nS2V5SGFuZGxlcj9yLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXIodCx1LG4sQz9lLmRlZmF1bHRWYWx1ZTpoLEMsZSk6ci5iYWNrZW5kQ29ubmVjdG9yJiZyLmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcmJnIuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyh0LHUsbixDP2UuZGVmYXVsdFZhbHVlOmgsQyxlKSxyLmVtaXQoIm1pc3NpbmdLZXkiLHQsdSxuLGgpfTtpZih0aGlzLm9wdGlvbnMuc2F2ZU1pc3Npbmcpe3ZhciBEPXZvaWQgMCE9PWUuY291bnQmJiJzdHJpbmciIT10eXBlb2YgZS5jb3VudDt0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzJiZEP1IuZm9yRWFjaChmdW5jdGlvbih0KXtyLnBsdXJhbFJlc29sdmVyLmdldFBsdXJhbEZvcm1zT2ZLZXkodCxhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBJKFt0XSxlKX0pfSk6SShSLGEpfX1oPXRoaXMuZXh0ZW5kVHJhbnNsYXRpb24oaCx0LGUscCxuKSxBJiZoPT09YSYmdGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvTWlzc2luZ0tleSYmKGg9IiIuY29uY2F0KHUsIjoiKS5jb25jYXQoYSkpLEEmJnRoaXMub3B0aW9ucy5wYXJzZU1pc3NpbmdLZXlIYW5kbGVyJiYoaD10aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcihoKSl9cmV0dXJuIGh9fSx7a2V5OiJleHRlbmRUcmFuc2xhdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT10aGlzO2lmKHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LnBhcnNlKXQ9dGhpcy5pMThuRm9ybWF0LnBhcnNlKHQsbixyLnVzZWRMbmcsci51c2VkTlMsci51c2VkS2V5LHtyZXNvbHZlZDpyfSk7ZWxzZSBpZighbi5za2lwSW50ZXJwb2xhdGlvbil7bi5pbnRlcnBvbGF0aW9uJiZ0aGlzLmludGVycG9sYXRvci5pbml0KFR0KHt9LG4se2ludGVycG9sYXRpb246VHQoe30sdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24sbi5pbnRlcnBvbGF0aW9uKX0pKTt2YXIgYSxzPW4uaW50ZXJwb2xhdGlvbiYmbi5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlc3x8dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzO2lmKHMpe3ZhciB1PXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7YT11JiZ1Lmxlbmd0aH12YXIgYz1uLnJlcGxhY2UmJiJzdHJpbmciIT10eXBlb2Ygbi5yZXBsYWNlP24ucmVwbGFjZTpuO2lmKHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMmJihjPVR0KHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMsYykpLHQ9dGhpcy5pbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUodCxjLG4ubG5nfHx0aGlzLmxhbmd1YWdlLG4pLHMpe3ZhciBsPXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7YTwobCYmbC5sZW5ndGgpJiYobi5uZXN0PSExKX0hMSE9PW4ubmVzdCYmKHQ9dGhpcy5pbnRlcnBvbGF0b3IubmVzdCh0LGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkodCksYT0wO2E8dDthKyspclthXT1hcmd1bWVudHNbYV07cmV0dXJuIG8mJm9bMF09PT1yWzBdJiYhbi5jb250ZXh0PyhpLmxvZ2dlci53YXJuKCJJdCBzZWVtcyB5b3UgYXJlIG5lc3RpbmcgcmVjdXJzaXZlbHkga2V5OiAiLmNvbmNhdChyWzBdLCIgaW4ga2V5OiAiKS5jb25jYXQoZVswXSkpLG51bGwpOmkudHJhbnNsYXRlLmFwcGx5KGksci5jb25jYXQoW2VdKSl9LG4pKSxuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCl9dmFyIGY9bi5wb3N0UHJvY2Vzc3x8dGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzLHA9InN0cmluZyI9PXR5cGVvZiBmP1tmXTpmO3JldHVybiBudWxsIT10JiZwJiZwLmxlbmd0aCYmITEhPT1uLmFwcGx5UG9zdFByb2Nlc3NvciYmKHQ9S3QuaGFuZGxlKHAsdCxlLHRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzUGFzc1Jlc29sdmVkP1R0KHtpMThuUmVzb2x2ZWQ6cn0sbik6bix0aGlzKSksdH19LHtrZXk6InJlc29sdmUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYT10aGlzLHM9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSx0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoIWEuaXNWYWxpZExvb2t1cChlKSl7dmFyIHU9YS5leHRyYWN0RnJvbUtleSh0LHMpLGM9dS5rZXk7bj1jO3ZhciBsPXUubmFtZXNwYWNlczthLm9wdGlvbnMuZmFsbGJhY2tOUyYmKGw9bC5jb25jYXQoYS5vcHRpb25zLmZhbGxiYWNrTlMpKTt2YXIgZj12b2lkIDAhPT1zLmNvdW50JiYic3RyaW5nIiE9dHlwZW9mIHMuY291bnQscD12b2lkIDAhPT1zLmNvbnRleHQmJiJzdHJpbmciPT10eXBlb2Ygcy5jb250ZXh0JiYiIiE9PXMuY29udGV4dCxoPXMubG5ncz9zLmxuZ3M6YS5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShzLmxuZ3x8YS5sYW5ndWFnZSxzLmZhbGxiYWNrTG5nKTtsLmZvckVhY2goZnVuY3Rpb24odCl7YS5pc1ZhbGlkTG9va3VwKGUpfHwoaT10LCFYdFsiIi5jb25jYXQoaFswXSwiLSIpLmNvbmNhdCh0KV0mJmEudXRpbHMmJmEudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlJiYhYS51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UoaSkmJihYdFsiIi5jb25jYXQoaFswXSwiLSIpLmNvbmNhdCh0KV09ITAsYS5sb2dnZXIud2Fybigna2V5ICInLmNvbmNhdChuLCciIGZvciBsYW5ndWFnZXMgIicpLmNvbmNhdChoLmpvaW4oIiwgIiksJyIgd29uXCd0IGdldCByZXNvbHZlZCBhcyBuYW1lc3BhY2UgIicpLmNvbmNhdChpLCciIHdhcyBub3QgeWV0IGxvYWRlZCcpLCJUaGlzIG1lYW5zIHNvbWV0aGluZyBJUyBXUk9ORyBpbiB5b3VyIHNldHVwLiBZb3UgYWNjZXNzIHRoZSB0IGZ1bmN0aW9uIGJlZm9yZSBpMThuZXh0LmluaXQgLyBpMThuZXh0LmxvYWROYW1lc3BhY2UgLyBpMThuZXh0LmNoYW5nZUxhbmd1YWdlIHdhcyBkb25lLiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgb3IgUHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBhY2Nlc3NpbmcgaXQhISEiKSksaC5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lmKCFhLmlzVmFsaWRMb29rdXAoZSkpe289bjt2YXIgaSx1LGw9YyxoPVtsXTtpZihhLmkxOG5Gb3JtYXQmJmEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKWEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKGgsYyxuLHQscyk7ZWxzZSBmJiYoaT1hLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeChuLHMuY291bnQpKSxmJiZwJiZoLnB1c2gobCtpKSxwJiZoLnB1c2gobCs9IiIuY29uY2F0KGEub3B0aW9ucy5jb250ZXh0U2VwYXJhdG9yKS5jb25jYXQocy5jb250ZXh0KSksZiYmaC5wdXNoKGwrPWkpO2Zvcig7dT1oLnBvcCgpOylhLmlzVmFsaWRMb29rdXAoZSl8fChyPXUsZT1hLmdldFJlc291cmNlKG4sdCx1LHMpKX19KSl9KX19KSx7cmVzOmUsdXNlZEtleTpuLGV4YWN0VXNlZEtleTpyLHVzZWRMbmc6byx1c2VkTlM6aX19fSx7a2V5OiJpc1ZhbGlkTG9va3VwIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4hKHZvaWQgMD09PXR8fCF0aGlzLm9wdGlvbnMucmV0dXJuTnVsbCYmbnVsbD09PXR8fCF0aGlzLm9wdGlvbnMucmV0dXJuRW1wdHlTdHJpbmcmJiIiPT09dCl9fSx7a2V5OiJnZXRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTtyZXR1cm4gdGhpcy5pMThuRm9ybWF0JiZ0aGlzLmkxOG5Gb3JtYXQuZ2V0UmVzb3VyY2U/dGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlKHQsZSxuLHIpOnRoaXMucmVzb3VyY2VTdG9yZS5nZXRSZXNvdXJjZSh0LGUsbixyKX19XSksZX0oKTtmdW5jdGlvbiBRdCh0KXtyZXR1cm4gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfXZhciBadD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7anQodGhpcyx0KSx0aGlzLm9wdGlvbnM9ZSx0aGlzLndoaXRlbGlzdD10aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5nc3x8ITEsdGhpcy5zdXBwb3J0ZWRMbmdzPXRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHwhMSx0aGlzLmxvZ2dlcj1EdC5jcmVhdGUoImxhbmd1YWdlVXRpbHMiKX1yZXR1cm4gT3QodCxbe2tleToiZ2V0U2NyaXB0UGFydEZyb21Db2RlIix2YWx1ZTpmdW5jdGlvbih0KXtpZighdHx8dC5pbmRleE9mKCItIik8MClyZXR1cm4gbnVsbDt2YXIgZT10LnNwbGl0KCItIik7cmV0dXJuIDI9PT1lLmxlbmd0aD9udWxsOihlLnBvcCgpLCJ4Ij09PWVbZS5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKT9udWxsOnRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGUuam9pbigiLSIpKSl9fSx7a2V5OiJnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIHQ7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlWzBdKX19LHtrZXk6ImZvcm1hdExhbmd1YWdlQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiZ0LmluZGV4T2YoIi0iKT4tMSl7dmFyIGU9WyJoYW5zIiwiaGFudCIsImxhdG4iLCJjeXJsIiwiY2FucyIsIm1vbmciLCJhcmFiIl0sbj10LnNwbGl0KCItIik7cmV0dXJuIHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc/bj1uLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50b0xvd2VyQ2FzZSgpfSk6Mj09PW4ubGVuZ3RoPyhuWzBdPW5bMF0udG9Mb3dlckNhc2UoKSxuWzFdPW5bMV0udG9VcHBlckNhc2UoKSxlLmluZGV4T2YoblsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKG5bMV09UXQoblsxXS50b0xvd2VyQ2FzZSgpKSkpOjM9PT1uLmxlbmd0aCYmKG5bMF09blswXS50b0xvd2VyQ2FzZSgpLDI9PT1uWzFdLmxlbmd0aCYmKG5bMV09blsxXS50b1VwcGVyQ2FzZSgpKSwic2duIiE9PW5bMF0mJjI9PT1uWzJdLmxlbmd0aCYmKG5bMl09blsyXS50b1VwcGVyQ2FzZSgpKSxlLmluZGV4T2YoblsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKG5bMV09UXQoblsxXS50b0xvd2VyQ2FzZSgpKSksZS5pbmRleE9mKG5bMl0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzJdPVF0KG5bMl0udG9Mb3dlckNhc2UoKSkpKSxuLmpvaW4oIi0iKX1yZXR1cm4gdGhpcy5vcHRpb25zLmNsZWFuQ29kZXx8dGhpcy5vcHRpb25zLmxvd2VyQ2FzZUxuZz90LnRvTG93ZXJDYXNlKCk6dH19LHtrZXk6ImlzV2hpdGVsaXN0ZWQiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvZ2dlci5kZXByZWNhdGUoImxhbmd1YWdlVXRpbHMuaXNXaGl0ZWxpc3RlZCIsJ2Z1bmN0aW9uICJpc1doaXRlbGlzdGVkIiB3aWxsIGJlIHJlbmFtZWQgdG8gImlzU3VwcG9ydGVkQ29kZSIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSBpdFwncyB1c2FnZSBhc2FwLicpLHRoaXMuaXNTdXBwb3J0ZWRDb2RlKHQpfX0se2tleToiaXNTdXBwb3J0ZWRDb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4oImxhbmd1YWdlT25seSI9PT10aGlzLm9wdGlvbnMubG9hZHx8dGhpcy5vcHRpb25zLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncykmJih0PXRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCkpLCF0aGlzLnN1cHBvcnRlZExuZ3N8fCF0aGlzLnN1cHBvcnRlZExuZ3MubGVuZ3RofHx0aGlzLnN1cHBvcnRlZExuZ3MuaW5kZXhPZih0KT4tMX19LHtrZXk6ImdldEJlc3RNYXRjaEZyb21Db2RlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzO3JldHVybiB0Pyh0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoIWUpe3ZhciByPW4uZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpO24ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzJiYhbi5pc1N1cHBvcnRlZENvZGUocil8fChlPXIpfX0pLCFlJiZ0aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncyYmdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCFlKXt2YXIgcj1uLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpO2lmKG4uaXNTdXBwb3J0ZWRDb2RlKHIpKXJldHVybiBlPXI7ZT1uLm9wdGlvbnMuc3VwcG9ydGVkTG5ncy5maW5kKGZ1bmN0aW9uKHQpe2lmKDA9PT10LmluZGV4T2YocikpcmV0dXJuIHR9KX19KSxlfHwoZT10aGlzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKVswXSksZSk6bnVsbH19LHtrZXk6ImdldEZhbGxiYWNrQ29kZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuW107aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQoZSkpLCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSwiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseSh0KSlyZXR1cm4gdDtpZighZSlyZXR1cm4gdC5kZWZhdWx0fHxbXTt2YXIgbj10W2VdO3JldHVybiBufHwobj10W3RoaXMuZ2V0U2NyaXB0UGFydEZyb21Db2RlKGUpXSksbnx8KG49dFt0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlKV0pLG58fChuPXRbdGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShlKV0pLG58fChuPXQuZGVmYXVsdCksbnx8W119fSx7a2V5OiJ0b1Jlc29sdmVIaWVyYXJjaHkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPXRoaXMuZ2V0RmFsbGJhY2tDb2RlcyhlfHx0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmd8fFtdLHQpLG89W10saT1mdW5jdGlvbih0KXt0JiYobi5pc1N1cHBvcnRlZENvZGUodCk/by5wdXNoKHQpOm4ubG9nZ2VyLndhcm4oInJlamVjdGluZyBsYW5ndWFnZSBjb2RlIG5vdCBmb3VuZCBpbiBzdXBwb3J0ZWRMbmdzOiAiLmNvbmNhdCh0KSkpfTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJnQuaW5kZXhPZigiLSIpPi0xPygibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiZpKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSwibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiYiY3VycmVudE9ubHkiIT09dGhpcy5vcHRpb25zLmxvYWQmJmkodGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUodCkpLCJjdXJyZW50T25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmaSh0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKSk6InN0cmluZyI9PXR5cGVvZiB0JiZpKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSxyLmZvckVhY2goZnVuY3Rpb24odCl7by5pbmRleE9mKHQpPDAmJmkobi5mb3JtYXRMYW5ndWFnZUNvZGUodCkpfSksb319XSksdH0oKSx0ZT1be2xuZ3M6WyJhY2giLCJhayIsImFtIiwiYXJuIiwiYnIiLCJmaWwiLCJndW4iLCJsbiIsIm1mZSIsIm1nIiwibWkiLCJvYyIsInB0IiwicHQtQlIiLCJ0ZyIsInRpIiwidHIiLCJ1eiIsIndhIl0sbnI6WzEsMl0sZmM6MX0se2xuZ3M6WyJhZiIsImFuIiwiYXN0IiwiYXoiLCJiZyIsImJuIiwiY2EiLCJkYSIsImRlIiwiZGV2IiwiZWwiLCJlbiIsImVvIiwiZXMiLCJldCIsImV1IiwiZmkiLCJmbyIsImZ1ciIsImZ5IiwiZ2wiLCJndSIsImhhIiwiaGkiLCJodSIsImh5IiwiaWEiLCJpdCIsImtuIiwia3UiLCJsYiIsIm1haSIsIm1sIiwibW4iLCJtciIsIm5haCIsIm5hcCIsIm5iIiwibmUiLCJubCIsIm5uIiwibm8iLCJuc28iLCJwYSIsInBhcCIsInBtcyIsInBzIiwicHQtUFQiLCJybSIsInNjbyIsInNlIiwic2kiLCJzbyIsInNvbiIsInNxIiwic3YiLCJzdyIsInRhIiwidGUiLCJ0ayIsInVyIiwieW8iXSxucjpbMSwyXSxmYzoyfSx7bG5nczpbImF5IiwiYm8iLCJjZ2ciLCJmYSIsImh0IiwiaWQiLCJqYSIsImpibyIsImthIiwia2siLCJrbSIsImtvIiwia3kiLCJsbyIsIm1zIiwic2FoIiwic3UiLCJ0aCIsInR0IiwidWciLCJ2aSIsIndvIiwiemgiXSxucjpbMV0sZmM6M30se2xuZ3M6WyJiZSIsImJzIiwiY25yIiwiZHoiLCJociIsInJ1Iiwic3IiLCJ1ayJdLG5yOlsxLDIsNV0sZmM6NH0se2xuZ3M6WyJhciJdLG5yOlswLDEsMiwzLDExLDEwMF0sZmM6NX0se2xuZ3M6WyJjcyIsInNrIl0sbnI6WzEsMiw1XSxmYzo2fSx7bG5nczpbImNzYiIsInBsIl0sbnI6WzEsMiw1XSxmYzo3fSx7bG5nczpbImN5Il0sbnI6WzEsMiwzLDhdLGZjOjh9LHtsbmdzOlsiZnIiXSxucjpbMSwyXSxmYzo5fSx7bG5nczpbImdhIl0sbnI6WzEsMiwzLDcsMTFdLGZjOjEwfSx7bG5nczpbImdkIl0sbnI6WzEsMiwzLDIwXSxmYzoxMX0se2xuZ3M6WyJpcyJdLG5yOlsxLDJdLGZjOjEyfSx7bG5nczpbImp2Il0sbnI6WzAsMV0sZmM6MTN9LHtsbmdzOlsia3ciXSxucjpbMSwyLDMsNF0sZmM6MTR9LHtsbmdzOlsibHQiXSxucjpbMSwyLDEwXSxmYzoxNX0se2xuZ3M6WyJsdiJdLG5yOlsxLDIsMF0sZmM6MTZ9LHtsbmdzOlsibWsiXSxucjpbMSwyXSxmYzoxN30se2xuZ3M6WyJtbmsiXSxucjpbMCwxLDJdLGZjOjE4fSx7bG5nczpbIm10Il0sbnI6WzEsMiwxMSwyMF0sZmM6MTl9LHtsbmdzOlsib3IiXSxucjpbMiwxXSxmYzoyfSx7bG5nczpbInJvIl0sbnI6WzEsMiwyMF0sZmM6MjB9LHtsbmdzOlsic2wiXSxucjpbNSwxLDIsM10sZmM6MjF9LHtsbmdzOlsiaGUiLCJpdyJdLG5yOlsxLDIsMjAsMjFdLGZjOjIyfV0sZWU9ezE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PjEpfSwyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMSE9dCl9LDM6ZnVuY3Rpb24odCl7cmV0dXJuIDB9LDQ6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwPT0xJiZ0JTEwMCE9MTE/MDp0JTEwPj0yJiZ0JTEwPD00JiYodCUxMDA8MTB8fHQlMTAwPj0yMCk/MToyKX0sNTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDA9PXQ/MDoxPT10PzE6Mj09dD8yOnQlMTAwPj0zJiZ0JTEwMDw9MTA/Mzp0JTEwMD49MTE/NDo1KX0sNjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDp0Pj0yJiZ0PD00PzE6Mil9LDc6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6dCUxMD49MiYmdCUxMDw9NCYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDg6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOjghPXQmJjExIT10PzI6Myl9LDk6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0Pj0yKX0sMTA6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOnQ8Nz8yOnQ8MTE/Mzo0KX0sMTE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10fHwxMT09dD8wOjI9PXR8fDEyPT10PzE6dD4yJiZ0PDIwPzI6Myl9LDEyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMCE9MXx8dCUxMDA9PTExKX0sMTM6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwIT09dCl9LDE0OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjI9PXQ/MTozPT10PzI6Myl9LDE1OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6dCUxMD49MiYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDE2OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6MCE9PXQ/MToyKX0sMTc6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10fHx0JTEwPT0xJiZ0JTEwMCE9MTE/MDoxKX0sMTg6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwPT10PzA6MT09dD8xOjIpfSwxOTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDowPT10fHx0JTEwMD4xJiZ0JTEwMDwxMT8xOnQlMTAwPjEwJiZ0JTEwMDwyMD8yOjMpfSwyMDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDowPT10fHx0JTEwMD4wJiZ0JTEwMDwyMD8xOjIpfSwyMTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTAwPT0xPzE6dCUxMDA9PTI/Mjp0JTEwMD09M3x8dCUxMDA9PTQ/MzowKX0sMjI6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOih0PDB8fHQ+MTApJiZ0JTEwPT0wPzI6Myl9fTt2YXIgbmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2p0KHRoaXMsdCksdGhpcy5sYW5ndWFnZVV0aWxzPWUsdGhpcy5vcHRpb25zPXIsdGhpcy5sb2dnZXI9RHQuY3JlYXRlKCJwbHVyYWxSZXNvbHZlciIpLHRoaXMucnVsZXM9KG49e30sdGUuZm9yRWFjaChmdW5jdGlvbih0KXt0LmxuZ3MuZm9yRWFjaChmdW5jdGlvbihlKXtuW2VdPXtudW1iZXJzOnQubnIscGx1cmFsczplZVt0LmZjXX19KX0pLG4pfXJldHVybiBPdCh0LFt7a2V5OiJhZGRSdWxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMucnVsZXNbdF09ZX19LHtrZXk6ImdldFJ1bGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJ1bGVzW3RdfHx0aGlzLnJ1bGVzW3RoaXMubGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KV19fSx7a2V5OiJuZWVkc1BsdXJhbCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRSdWxlKHQpO3JldHVybiBlJiZlLm51bWJlcnMubGVuZ3RoPjF9fSx7a2V5OiJnZXRQbHVyYWxGb3Jtc09mS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1bXSxvPXRoaXMuZ2V0UnVsZSh0KTtyZXR1cm4gbz8oby5udW1iZXJzLmZvckVhY2goZnVuY3Rpb24obyl7dmFyIGk9bi5nZXRTdWZmaXgodCxvKTtyLnB1c2goIiIuY29uY2F0KGUpLmNvbmNhdChpKSl9KSxyKTpyfX0se2tleToiZ2V0U3VmZml4Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLmdldFJ1bGUodCk7aWYocil7dmFyIG89ci5ub0Ficz9yLnBsdXJhbHMoZSk6ci5wbHVyYWxzKE1hdGguYWJzKGUpKSxpPXIubnVtYmVyc1tvXTt0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXgmJjI9PT1yLm51bWJlcnMubGVuZ3RoJiYxPT09ci5udW1iZXJzWzBdJiYoMj09PWk/aT0icGx1cmFsIjoxPT09aSYmKGk9IiIpKTt2YXIgYT1mdW5jdGlvbigpe3JldHVybiBuLm9wdGlvbnMucHJlcGVuZCYmaS50b1N0cmluZygpP24ub3B0aW9ucy5wcmVwZW5kK2kudG9TdHJpbmcoKTppLnRvU3RyaW5nKCl9O3JldHVybiJ2MSI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/MT09PWk/IiI6Im51bWJlciI9PXR5cGVvZiBpPyJfcGx1cmFsXyIuY29uY2F0KGkudG9TdHJpbmcoKSk6YSgpOiJ2MiI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/YSgpOnRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmMj09PXIubnVtYmVycy5sZW5ndGgmJjE9PT1yLm51bWJlcnNbMF0/YSgpOnRoaXMub3B0aW9ucy5wcmVwZW5kJiZvLnRvU3RyaW5nKCk/dGhpcy5vcHRpb25zLnByZXBlbmQrby50b1N0cmluZygpOm8udG9TdHJpbmcoKX1yZXR1cm4gdGhpcy5sb2dnZXIud2Fybigibm8gcGx1cmFsIHJ1bGUgZm91bmQgZm9yOiAiLmNvbmNhdCh0KSksIiJ9fV0pLHR9KCkscmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O2p0KHRoaXMsdCksdGhpcy5sb2dnZXI9RHQuY3JlYXRlKCJpbnRlcnBvbGF0b3IiKSx0aGlzLm9wdGlvbnM9ZSx0aGlzLmZvcm1hdD1lLmludGVycG9sYXRpb24mJmUuaW50ZXJwb2xhdGlvbi5mb3JtYXR8fGZ1bmN0aW9uKHQpe3JldHVybiB0fSx0aGlzLmluaXQoZSl9cmV0dXJuIE90KHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3QuaW50ZXJwb2xhdGlvbnx8KHQuaW50ZXJwb2xhdGlvbj17ZXNjYXBlVmFsdWU6ITB9KTt2YXIgZT10LmludGVycG9sYXRpb247dGhpcy5lc2NhcGU9dm9pZCAwIT09ZS5lc2NhcGU/ZS5lc2NhcGU6WXQsdGhpcy5lc2NhcGVWYWx1ZT12b2lkIDA9PT1lLmVzY2FwZVZhbHVlfHxlLmVzY2FwZVZhbHVlLHRoaXMudXNlUmF3VmFsdWVUb0VzY2FwZT12b2lkIDAhPT1lLnVzZVJhd1ZhbHVlVG9Fc2NhcGUmJmUudXNlUmF3VmFsdWVUb0VzY2FwZSx0aGlzLnByZWZpeD1lLnByZWZpeD9XdChlLnByZWZpeCk6ZS5wcmVmaXhFc2NhcGVkfHwie3siLHRoaXMuc3VmZml4PWUuc3VmZml4P1d0KGUuc3VmZml4KTplLnN1ZmZpeEVzY2FwZWR8fCJ9fSIsdGhpcy5mb3JtYXRTZXBhcmF0b3I9ZS5mb3JtYXRTZXBhcmF0b3I/ZS5mb3JtYXRTZXBhcmF0b3I6ZS5mb3JtYXRTZXBhcmF0b3J8fCIsIix0aGlzLnVuZXNjYXBlUHJlZml4PWUudW5lc2NhcGVTdWZmaXg/IiI6ZS51bmVzY2FwZVByZWZpeHx8Ii0iLHRoaXMudW5lc2NhcGVTdWZmaXg9dGhpcy51bmVzY2FwZVByZWZpeD8iIjplLnVuZXNjYXBlU3VmZml4fHwiIix0aGlzLm5lc3RpbmdQcmVmaXg9ZS5uZXN0aW5nUHJlZml4P1d0KGUubmVzdGluZ1ByZWZpeCk6ZS5uZXN0aW5nUHJlZml4RXNjYXBlZHx8V3QoIiR0KCIpLHRoaXMubmVzdGluZ1N1ZmZpeD1lLm5lc3RpbmdTdWZmaXg/V3QoZS5uZXN0aW5nU3VmZml4KTplLm5lc3RpbmdTdWZmaXhFc2NhcGVkfHxXdCgiKSIpLHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I9ZS5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcj9lLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOmUubmVzdGluZ09wdGlvbnNTZXBhcmF0b3J8fCIsIix0aGlzLm1heFJlcGxhY2VzPWUubWF4UmVwbGFjZXM/ZS5tYXhSZXBsYWNlczoxZTMsdGhpcy5hbHdheXNGb3JtYXQ9dm9pZCAwIT09ZS5hbHdheXNGb3JtYXQmJmUuYWx3YXlzRm9ybWF0LHRoaXMucmVzZXRSZWdFeHAoKX19LHtrZXk6InJlc2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmdGhpcy5pbml0KHRoaXMub3B0aW9ucyl9fSx7a2V5OiJyZXNldFJlZ0V4cCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0iIi5jb25jYXQodGhpcy5wcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cD1uZXcgUmVnRXhwKHQsImciKTt2YXIgZT0iIi5jb25jYXQodGhpcy5wcmVmaXgpLmNvbmNhdCh0aGlzLnVuZXNjYXBlUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLnVuZXNjYXBlU3VmZml4KS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwVW5lc2NhcGU9bmV3IFJlZ0V4cChlLCJnIik7dmFyIG49IiIuY29uY2F0KHRoaXMubmVzdGluZ1ByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5uZXN0aW5nU3VmZml4KTt0aGlzLm5lc3RpbmdSZWdleHA9bmV3IFJlZ0V4cChuLCJnIil9fSx7a2V5OiJpbnRlcnBvbGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhLHM9dGhpcyx1PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24mJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXN8fHt9O2Z1bmN0aW9uIGModCl7cmV0dXJuIHQucmVwbGFjZSgvXCQvZywiJCQkJCIpfXZhciBsPWZ1bmN0aW9uKHQpe2lmKHQuaW5kZXhPZihzLmZvcm1hdFNlcGFyYXRvcik8MCl7dmFyIG89SHQoZSx1LHQpO3JldHVybiBzLmFsd2F5c0Zvcm1hdD9zLmZvcm1hdChvLHZvaWQgMCxuKTpvfXZhciBpPXQuc3BsaXQocy5mb3JtYXRTZXBhcmF0b3IpLGE9aS5zaGlmdCgpLnRyaW0oKSxjPWkuam9pbihzLmZvcm1hdFNlcGFyYXRvcikudHJpbSgpO3JldHVybiBzLmZvcm1hdChIdChlLHUsYSksYyxuLHIpfTt0aGlzLnJlc2V0UmVnRXhwKCk7dmFyIGY9ciYmci5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXJ8fHRoaXMub3B0aW9ucy5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIscD1yJiZyLmludGVycG9sYXRpb24mJnIuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXN8fHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcztyZXR1cm5be3JlZ2V4OnRoaXMucmVnZXhwVW5lc2NhcGUsc2FmZVZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBjKHQpfX0se3JlZ2V4OnRoaXMucmVnZXhwLHNhZmVWYWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gcy5lc2NhcGVWYWx1ZT9jKHMuZXNjYXBlKHQpKTpjKHQpfX1dLmZvckVhY2goZnVuY3Rpb24oZSl7Zm9yKGE9MDtvPWUucmVnZXguZXhlYyh0KTspe2lmKHZvaWQgMD09PShpPWwob1sxXS50cmltKCkpKSlpZigiZnVuY3Rpb24iPT10eXBlb2YgZil7dmFyIG49Zih0LG8scik7aT0ic3RyaW5nIj09dHlwZW9mIG4/bjoiIn1lbHNle2lmKHApe2k9b1swXTtjb250aW51ZX1zLmxvZ2dlci53YXJuKCJtaXNzZWQgdG8gcGFzcyBpbiB2YXJpYWJsZSAiLmNvbmNhdChvWzFdLCIgZm9yIGludGVycG9sYXRpbmcgIikuY29uY2F0KHQpKSxpPSIifWVsc2Uic3RyaW5nIj09dHlwZW9mIGl8fHMudXNlUmF3VmFsdWVUb0VzY2FwZXx8KGk9VXQoaSkpO2lmKHQ9dC5yZXBsYWNlKG9bMF0sZS5zYWZlVmFsdWUoaSkpLGUucmVnZXgubGFzdEluZGV4PTAsKythPj1zLm1heFJlcGxhY2VzKWJyZWFrfX0pLHR9fSx7a2V5OiJuZXN0Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbz10aGlzLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGE9VHQoe30saSk7ZnVuY3Rpb24gcyh0LGUpe3ZhciBuPXRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I7aWYodC5pbmRleE9mKG4pPDApcmV0dXJuIHQ7dmFyIHI9dC5zcGxpdChuZXcgUmVnRXhwKCIiLmNvbmNhdChuLCJbIF0qeyIpKSksbz0ieyIuY29uY2F0KHJbMV0pO3Q9clswXSxvPShvPXRoaXMuaW50ZXJwb2xhdGUobyxhKSkucmVwbGFjZSgvJy9nLCciJyk7dHJ5e2E9SlNPTi5wYXJzZShvKSxlJiYoYT1UdCh7fSxlLGEpKX1jYXRjaChlKXtyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiZmFpbGVkIHBhcnNpbmcgb3B0aW9ucyBzdHJpbmcgaW4gbmVzdGluZyBmb3Iga2V5ICIuY29uY2F0KHQpLGUpLCIiLmNvbmNhdCh0KS5jb25jYXQobikuY29uY2F0KG8pfXJldHVybiBkZWxldGUgYS5kZWZhdWx0VmFsdWUsdH1mb3IoYS5hcHBseVBvc3RQcm9jZXNzb3I9ITEsZGVsZXRlIGEuZGVmYXVsdFZhbHVlO249dGhpcy5uZXN0aW5nUmVnZXhwLmV4ZWModCk7KXt2YXIgdT1bXSxjPSExO2lmKG5bMF0uaW5jbHVkZXModGhpcy5mb3JtYXRTZXBhcmF0b3IpJiYhL3suKn0vLnRlc3QoblsxXSkpe3ZhciBsPW5bMV0uc3BsaXQodGhpcy5mb3JtYXRTZXBhcmF0b3IpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCl9KTtuWzFdPWwuc2hpZnQoKSx1PWwsYz0hMH1pZigocj1lKHMuY2FsbCh0aGlzLG5bMV0udHJpbSgpLGEpLGEpKSYmblswXT09PXQmJiJzdHJpbmciIT10eXBlb2YgcilyZXR1cm4gcjsic3RyaW5nIiE9dHlwZW9mIHImJihyPVV0KHIpKSxyfHwodGhpcy5sb2dnZXIud2FybigibWlzc2VkIHRvIHJlc29sdmUgIi5jb25jYXQoblsxXSwiIGZvciBuZXN0aW5nICIpLmNvbmNhdCh0KSkscj0iIiksYyYmKHI9dS5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gby5mb3JtYXQodCxlLGkubG5nLGkpfSxyLnRyaW0oKSkpLHQ9dC5yZXBsYWNlKG5bMF0sciksdGhpcy5yZWdleHAubGFzdEluZGV4PTB9cmV0dXJuIHR9fV0pLHR9KCk7dmFyIG9lPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxuLHIpe3ZhciBvLGk9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9O3JldHVybiBqdCh0aGlzLGUpLG89THQodGhpcyxSdChlKS5jYWxsKHRoaXMpKSxWdCYmX3QuY2FsbChDdChvKSksby5iYWNrZW5kPXQsby5zdG9yZT1uLG8uc2VydmljZXM9cixvLmxhbmd1YWdlVXRpbHM9ci5sYW5ndWFnZVV0aWxzLG8ub3B0aW9ucz1pLG8ubG9nZ2VyPUR0LmNyZWF0ZSgiYmFja2VuZENvbm5lY3RvciIpLG8uc3RhdGU9e30sby5xdWV1ZT1bXSxvLmJhY2tlbmQmJm8uYmFja2VuZC5pbml0JiZvLmJhY2tlbmQuaW5pdChyLGkuYmFja2VuZCxpKSxvfXJldHVybiBOdChlLF90KSxPdChlLFt7a2V5OiJxdWV1ZUxvYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPXRoaXMsaT1bXSxhPVtdLHM9W10sdT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciByPSEwO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgcz0iIi5jb25jYXQodCwifCIpLmNvbmNhdChlKTshbi5yZWxvYWQmJm8uc3RvcmUuaGFzUmVzb3VyY2VCdW5kbGUodCxlKT9vLnN0YXRlW3NdPTI6by5zdGF0ZVtzXTwwfHwoMT09PW8uc3RhdGVbc10/YS5pbmRleE9mKHMpPDAmJmEucHVzaChzKTooby5zdGF0ZVtzXT0xLHI9ITEsYS5pbmRleE9mKHMpPDAmJmEucHVzaChzKSxpLmluZGV4T2Yocyk8MCYmaS5wdXNoKHMpLHUuaW5kZXhPZihlKTwwJiZ1LnB1c2goZSkpKX0pLHJ8fHMucHVzaCh0KX0pLChpLmxlbmd0aHx8YS5sZW5ndGgpJiZ0aGlzLnF1ZXVlLnB1c2goe3BlbmRpbmc6YSxsb2FkZWQ6e30sZXJyb3JzOltdLGNhbGxiYWNrOnJ9KSx7dG9Mb2FkOmkscGVuZGluZzphLHRvTG9hZExhbmd1YWdlczpzLHRvTG9hZE5hbWVzcGFjZXM6dX19fSx7a2V5OiJsb2FkZWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LnNwbGl0KCJ8Iiksbz1yWzBdLGk9clsxXTtlJiZ0aGlzLmVtaXQoImZhaWxlZExvYWRpbmciLG8saSxlKSxuJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlQnVuZGxlKG8saSxuKSx0aGlzLnN0YXRlW3RdPWU/LTE6Mjt2YXIgYT17fTt0aGlzLnF1ZXVlLmZvckVhY2goZnVuY3Rpb24obil7IWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPUJ0KHQsZSxPYmplY3QpLGk9by5vYmosYT1vLms7aVthXT1pW2FdfHxbXSxyJiYoaVthXT1pW2FdLmNvbmNhdChuKSkscnx8aVthXS5wdXNoKG4pfShuLmxvYWRlZCxbb10saSksZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5pbmRleE9mKGUpOy0xIT09bjspdC5zcGxpY2UobiwxKSxuPXQuaW5kZXhPZihlKX0obi5wZW5kaW5nLHQpLGUmJm4uZXJyb3JzLnB1c2goZSksMCE9PW4ucGVuZGluZy5sZW5ndGh8fG4uZG9uZXx8KE9iamVjdC5rZXlzKG4ubG9hZGVkKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2FbdF18fChhW3RdPVtdKSxuLmxvYWRlZFt0XS5sZW5ndGgmJm4ubG9hZGVkW3RdLmZvckVhY2goZnVuY3Rpb24oZSl7YVt0XS5pbmRleE9mKGUpPDAmJmFbdF0ucHVzaChlKX0pfSksbi5kb25lPSEwLG4uZXJyb3JzLmxlbmd0aD9uLmNhbGxiYWNrKG4uZXJyb3JzKTpuLmNhbGxiYWNrKCkpfSksdGhpcy5lbWl0KCJsb2FkZWQiLGEpLHRoaXMucXVldWU9dGhpcy5xdWV1ZS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIXQuZG9uZX0pfX0se2tleToicmVhZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106MCxpPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTozNTAsYT1hcmd1bWVudHMubGVuZ3RoPjU/YXJndW1lbnRzWzVdOnZvaWQgMDtyZXR1cm4gdC5sZW5ndGg/dGhpcy5iYWNrZW5kW25dKHQsZSxmdW5jdGlvbihzLHUpe3MmJnUmJm88NT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5yZWFkLmNhbGwocix0LGUsbixvKzEsMippLGEpfSxpKTphKHMsdSl9KTphKG51bGwse30pfX0se2tleToicHJlcGFyZUxvYWRpbmciLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fSxvPWFyZ3VtZW50cy5sZW5ndGg+Mz9hcmd1bWVudHNbM106dm9pZCAwO2lmKCF0aGlzLmJhY2tlbmQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oIk5vIGJhY2tlbmQgd2FzIGFkZGVkIHZpYSBpMThuZXh0LnVzZS4gV2lsbCBub3QgbG9hZCByZXNvdXJjZXMuIiksbyYmbygpOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeSh0KSksInN0cmluZyI9PXR5cGVvZiBlJiYoZT1bZV0pO3ZhciBpPXRoaXMucXVldWVMb2FkKHQsZSxyLG8pO2lmKCFpLnRvTG9hZC5sZW5ndGgpcmV0dXJuIGkucGVuZGluZy5sZW5ndGh8fG8oKSxudWxsO2kudG9Mb2FkLmZvckVhY2goZnVuY3Rpb24odCl7bi5sb2FkT25lKHQpfSl9fSx7a2V5OiJsb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dGhpcy5wcmVwYXJlTG9hZGluZyh0LGUse30sbil9fSx7a2V5OiJyZWxvYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt0aGlzLnByZXBhcmVMb2FkaW5nKHQsZSx7cmVsb2FkOiEwfSxuKX19LHtrZXk6ImxvYWRPbmUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06IiIscj10LnNwbGl0KCJ8Iiksbz1yWzBdLGk9clsxXTt0aGlzLnJlYWQobyxpLCJyZWFkIix2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKHIsYSl7ciYmZS5sb2dnZXIud2FybigiIi5jb25jYXQobiwibG9hZGluZyBuYW1lc3BhY2UgIikuY29uY2F0KGksIiBmb3IgbGFuZ3VhZ2UgIikuY29uY2F0KG8sIiBmYWlsZWQiKSxyKSwhciYmYSYmZS5sb2dnZXIubG9nKCIiLmNvbmNhdChuLCJsb2FkZWQgbmFtZXNwYWNlICIpLmNvbmNhdChpLCIgZm9yIGxhbmd1YWdlICIpLmNvbmNhdChvKSxhKSxlLmxvYWRlZCh0LHIsYSl9KX19LHtrZXk6InNhdmVNaXNzaW5nIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XTp7fTt0aGlzLnNlcnZpY2VzLnV0aWxzJiZ0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSYmIXRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKGUpP3RoaXMubG9nZ2VyLndhcm4oJ2RpZCBub3Qgc2F2ZSBrZXkgIicuY29uY2F0KG4sJyIgYXMgdGhlIG5hbWVzcGFjZSAiJykuY29uY2F0KGUsJyIgd2FzIG5vdCB5ZXQgbG9hZGVkJyksIlRoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhISIpOm51bGwhPW4mJiIiIT09biYmKHRoaXMuYmFja2VuZCYmdGhpcy5iYWNrZW5kLmNyZWF0ZSYmdGhpcy5iYWNrZW5kLmNyZWF0ZSh0LGUsbixyLG51bGwsVHQoe30saSx7aXNVcGRhdGU6b30pKSx0JiZ0WzBdJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlKHRbMF0sZSxuLHIpKX19XSksZX0oKTtmdW5jdGlvbiBpZSgpe3JldHVybntkZWJ1ZzohMSxpbml0SW1tZWRpYXRlOiEwLG5zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6WyJ0cmFuc2xhdGlvbiJdLGZhbGxiYWNrTG5nOlsiZGV2Il0sZmFsbGJhY2tOUzohMSx3aGl0ZWxpc3Q6ITEsbm9uRXhwbGljaXRXaGl0ZWxpc3Q6ITEsc3VwcG9ydGVkTG5nczohMSxub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6ITEsbG9hZDoiYWxsIixwcmVsb2FkOiExLHNpbXBsaWZ5UGx1cmFsU3VmZml4OiEwLGtleVNlcGFyYXRvcjoiLiIsbnNTZXBhcmF0b3I6IjoiLHBsdXJhbFNlcGFyYXRvcjoiXyIsY29udGV4dFNlcGFyYXRvcjoiXyIscGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6ITEsc2F2ZU1pc3Npbmc6ITEsdXBkYXRlTWlzc2luZzohMSxzYXZlTWlzc2luZ1RvOiJmYWxsYmFjayIsc2F2ZU1pc3NpbmdQbHVyYWxzOiEwLG1pc3NpbmdLZXlIYW5kbGVyOiExLG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjohMSxwb3N0UHJvY2VzczohMSxwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDohMSxyZXR1cm5OdWxsOiEwLHJldHVybkVtcHR5U3RyaW5nOiEwLHJldHVybk9iamVjdHM6ITEsam9pbkFycmF5czohMSxyZXR1cm5lZE9iamVjdEhhbmRsZXI6ITEscGFyc2VNaXNzaW5nS2V5SGFuZGxlcjohMSxhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6ITEsYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6ITEsb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGU9e307aWYoIm9iamVjdCI9PT1TdCh0WzFdKSYmKGU9dFsxXSksInN0cmluZyI9PXR5cGVvZiB0WzFdJiYoZS5kZWZhdWx0VmFsdWU9dFsxXSksInN0cmluZyI9PXR5cGVvZiB0WzJdJiYoZS50RGVzY3JpcHRpb249dFsyXSksIm9iamVjdCI9PT1TdCh0WzJdKXx8Im9iamVjdCI9PT1TdCh0WzNdKSl7dmFyIG49dFszXXx8dFsyXTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09blt0XX0pfXJldHVybiBlfSxpbnRlcnBvbGF0aW9uOntlc2NhcGVWYWx1ZTohMCxmb3JtYXQ6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHR9LHByZWZpeDoie3siLHN1ZmZpeDoifX0iLGZvcm1hdFNlcGFyYXRvcjoiLCIsdW5lc2NhcGVQcmVmaXg6Ii0iLG5lc3RpbmdQcmVmaXg6IiR0KCIsbmVzdGluZ1N1ZmZpeDoiKSIsbmVzdGluZ09wdGlvbnNTZXBhcmF0b3I6IiwiLG1heFJlcGxhY2VzOjFlMyxza2lwT25WYXJpYWJsZXM6ITF9fX1mdW5jdGlvbiBhZSh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQubnMmJih0Lm5zPVt0Lm5zXSksInN0cmluZyI9PXR5cGVvZiB0LmZhbGxiYWNrTG5nJiYodC5mYWxsYmFja0xuZz1bdC5mYWxsYmFja0xuZ10pLCJzdHJpbmciPT10eXBlb2YgdC5mYWxsYmFja05TJiYodC5mYWxsYmFja05TPVt0LmZhbGxiYWNrTlNdKSx0LndoaXRlbGlzdCYmKHQud2hpdGVsaXN0JiZ0LndoaXRlbGlzdC5pbmRleE9mKCJjaW1vZGUiKTwwJiYodC53aGl0ZWxpc3Q9dC53aGl0ZWxpc3QuY29uY2F0KFsiY2ltb2RlIl0pKSx0LnN1cHBvcnRlZExuZ3M9dC53aGl0ZWxpc3QpLHQubm9uRXhwbGljaXRXaGl0ZWxpc3QmJih0Lm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncz10Lm5vbkV4cGxpY2l0V2hpdGVsaXN0KSx0LnN1cHBvcnRlZExuZ3MmJnQuc3VwcG9ydGVkTG5ncy5pbmRleE9mKCJjaW1vZGUiKTwwJiYodC5zdXBwb3J0ZWRMbmdzPXQuc3VwcG9ydGVkTG5ncy5jb25jYXQoWyJjaW1vZGUiXSkpLHR9ZnVuY3Rpb24gc2UoKXt9dmFyIHVlPW5ldyhmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIHQsbj1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30scj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtpZihqdCh0aGlzLGUpLHQ9THQodGhpcyxSdChlKS5jYWxsKHRoaXMpKSxWdCYmX3QuY2FsbChDdCh0KSksdC5vcHRpb25zPWFlKG4pLHQuc2VydmljZXM9e30sdC5sb2dnZXI9RHQsdC5tb2R1bGVzPXtleHRlcm5hbDpbXX0sciYmIXQuaXNJbml0aWFsaXplZCYmIW4uaXNDbG9uZSl7aWYoIXQub3B0aW9ucy5pbml0SW1tZWRpYXRlKXJldHVybiB0LmluaXQobixyKSxMdCh0LEN0KHQpKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5pbml0KG4scil9LDApfXJldHVybiB0fXJldHVybiBOdChlLF90KSxPdChlLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sbj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtmdW5jdGlvbiByKHQpe3JldHVybiB0PyJmdW5jdGlvbiI9PXR5cGVvZiB0P25ldyB0OnQ6bnVsbH1pZigiZnVuY3Rpb24iPT10eXBlb2YgZSYmKG49ZSxlPXt9KSxlLndoaXRlbGlzdCYmIWUuc3VwcG9ydGVkTG5ncyYmdGhpcy5sb2dnZXIuZGVwcmVjYXRlKCJ3aGl0ZWxpc3QiLCdvcHRpb24gIndoaXRlbGlzdCIgd2lsbCBiZSByZW5hbWVkIHRvICJzdXBwb3J0ZWRMbmdzIiBpbiB0aGUgbmV4dCBtYWpvciAtIHBsZWFzZSBtYWtlIHN1cmUgdG8gcmVuYW1lIHRoaXMgb3B0aW9uIGFzYXAuJyksZS5ub25FeHBsaWNpdFdoaXRlbGlzdCYmIWUubm9uRXhwbGljaXRTdXBwb3J0ZWRMbmdzJiZ0aGlzLmxvZ2dlci5kZXByZWNhdGUoIndoaXRlbGlzdCIsJ29wdGlvbnMgIm5vbkV4cGxpY2l0V2hpdGVsaXN0IiB3aWxsIGJlIHJlbmFtZWQgdG8gIm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncyIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSB0aGlzIG9wdGlvbiBhc2FwLicpLHRoaXMub3B0aW9ucz1UdCh7fSxpZSgpLHRoaXMub3B0aW9ucyxhZShlKSksdGhpcy5mb3JtYXQ9dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0LG58fChuPXNlKSwhdGhpcy5vcHRpb25zLmlzQ2xvbmUpe3RoaXMubW9kdWxlcy5sb2dnZXI/RHQuaW5pdChyKHRoaXMubW9kdWxlcy5sb2dnZXIpLHRoaXMub3B0aW9ucyk6RHQuaW5pdChudWxsLHRoaXMub3B0aW9ucyk7dmFyIG89bmV3IFp0KHRoaXMub3B0aW9ucyk7dGhpcy5zdG9yZT1uZXcgR3QodGhpcy5vcHRpb25zLnJlc291cmNlcyx0aGlzLm9wdGlvbnMpO3ZhciBpPXRoaXMuc2VydmljZXM7aS5sb2dnZXI9RHQsaS5yZXNvdXJjZVN0b3JlPXRoaXMuc3RvcmUsaS5sYW5ndWFnZVV0aWxzPW8saS5wbHVyYWxSZXNvbHZlcj1uZXcgbmUobyx7cHJlcGVuZDp0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLGNvbXBhdGliaWxpdHlKU09OOnRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTixzaW1wbGlmeVBsdXJhbFN1ZmZpeDp0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXh9KSxpLmludGVycG9sYXRvcj1uZXcgcmUodGhpcy5vcHRpb25zKSxpLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6dGhpcy5oYXNMb2FkZWROYW1lc3BhY2UuYmluZCh0aGlzKX0saS5iYWNrZW5kQ29ubmVjdG9yPW5ldyBvZShyKHRoaXMubW9kdWxlcy5iYWNrZW5kKSxpLnJlc291cmNlU3RvcmUsaSx0aGlzLm9wdGlvbnMpLGkuYmFja2VuZENvbm5lY3Rvci5vbigiKiIsZnVuY3Rpb24oZSl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobj4xP24tMTowKSxvPTE7bzxuO28rKylyW28tMV09YXJndW1lbnRzW29dO3QuZW1pdC5hcHBseSh0LFtlXS5jb25jYXQocikpfSksdGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3ImJihpLmxhbmd1YWdlRGV0ZWN0b3I9cih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3RvciksaS5sYW5ndWFnZURldGVjdG9yLmluaXQoaSx0aGlzLm9wdGlvbnMuZGV0ZWN0aW9uLHRoaXMub3B0aW9ucykpLHRoaXMubW9kdWxlcy5pMThuRm9ybWF0JiYoaS5pMThuRm9ybWF0PXIodGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQpLGkuaTE4bkZvcm1hdC5pbml0JiZpLmkxOG5Gb3JtYXQuaW5pdCh0aGlzKSksdGhpcy50cmFuc2xhdG9yPW5ldyBKdCh0aGlzLnNlcnZpY2VzLHRoaXMub3B0aW9ucyksdGhpcy50cmFuc2xhdG9yLm9uKCIqIixmdW5jdGlvbihlKXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLG89MTtvPG47bysrKXJbby0xXT1hcmd1bWVudHNbb107dC5lbWl0LmFwcGx5KHQsW2VdLmNvbmNhdChyKSl9KSx0aGlzLm1vZHVsZXMuZXh0ZXJuYWwuZm9yRWFjaChmdW5jdGlvbihlKXtlLmluaXQmJmUuaW5pdCh0KX0pfXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8dGhpcy5vcHRpb25zLmxuZ3x8dGhpcy5sb2dnZXIud2FybigiaW5pdDogbm8gbGFuZ3VhZ2VEZXRlY3RvciBpcyB1c2VkIGFuZCBubyBsbmcgaXMgZGVmaW5lZCIpO3ZhciBhPVsiZ2V0UmVzb3VyY2UiLCJoYXNSZXNvdXJjZUJ1bmRsZSIsImdldFJlc291cmNlQnVuZGxlIiwiZ2V0RGF0YUJ5TGFuZ3VhZ2UiXTthLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT1mdW5jdGlvbigpe3ZhciBuO3JldHVybihuPXQuc3RvcmUpW2VdLmFwcGx5KG4sYXJndW1lbnRzKX19KTt2YXIgcz1bImFkZFJlc291cmNlIiwiYWRkUmVzb3VyY2VzIiwiYWRkUmVzb3VyY2VCdW5kbGUiLCJyZW1vdmVSZXNvdXJjZUJ1bmRsZSJdO3MuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWZ1bmN0aW9uKCl7dmFyIG47cmV0dXJuKG49dC5zdG9yZSlbZV0uYXBwbHkobixhcmd1bWVudHMpLHR9fSk7dmFyIHU9TXQoKSxjPWZ1bmN0aW9uKCl7dC5jaGFuZ2VMYW5ndWFnZSh0Lm9wdGlvbnMubG5nLGZ1bmN0aW9uKGUscil7dC5pc0luaXRpYWxpemVkPSEwLHQub3B0aW9ucy5pc0Nsb25lfHx0LmxvZ2dlci5sb2coImluaXRpYWxpemVkIix0Lm9wdGlvbnMpLHQuZW1pdCgiaW5pdGlhbGl6ZWQiLHQub3B0aW9ucyksdS5yZXNvbHZlKHIpLG4oZSxyKX0pfTtyZXR1cm4gdGhpcy5vcHRpb25zLnJlc291cmNlc3x8IXRoaXMub3B0aW9ucy5pbml0SW1tZWRpYXRlP2MoKTpzZXRUaW1lb3V0KGMsMCksdX19LHtrZXk6ImxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06c2Uscj1uLG89InN0cmluZyI9PXR5cGVvZiB0P3Q6dGhpcy5sYW5ndWFnZTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHI9dCksIXRoaXMub3B0aW9ucy5yZXNvdXJjZXN8fHRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlcyl7aWYobyYmImNpbW9kZSI9PT1vLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHIoKTt2YXIgaT1bXSxhPWZ1bmN0aW9uKHQpe3QmJmUuc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkodCkuZm9yRWFjaChmdW5jdGlvbih0KXtpLmluZGV4T2YodCk8MCYmaS5wdXNoKHQpfSl9O2lmKG8pYShvKTtlbHNle3ZhciBzPXRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7cy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBhKHQpfSl9dGhpcy5vcHRpb25zLnByZWxvYWQmJnRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGEodCl9KSx0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IubG9hZChpLHRoaXMub3B0aW9ucy5ucyxyKX1lbHNlIHIobnVsbCl9fSx7a2V5OiJyZWxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1NdCgpO3JldHVybiB0fHwodD10aGlzLmxhbmd1YWdlcyksZXx8KGU9dGhpcy5vcHRpb25zLm5zKSxufHwobj1zZSksdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnJlbG9hZCh0LGUsZnVuY3Rpb24odCl7ci5yZXNvbHZlKCksbih0KX0pLHJ9fSx7a2V5OiJ1c2UiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGFuIHVuZGVmaW5lZCBtb2R1bGUhIFBsZWFzZSBjaGVjayB0aGUgb2JqZWN0IHlvdSBhcmUgcGFzc2luZyB0byBpMThuZXh0LnVzZSgpIik7aWYoIXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoIllvdSBhcmUgcGFzc2luZyBhIHdyb25nIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCkiKTtyZXR1cm4iYmFja2VuZCI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMuYmFja2VuZD10KSwoImxvZ2dlciI9PT10LnR5cGV8fHQubG9nJiZ0Lndhcm4mJnQuZXJyb3IpJiYodGhpcy5tb2R1bGVzLmxvZ2dlcj10KSwibGFuZ3VhZ2VEZXRlY3RvciI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3Rvcj10KSwiaTE4bkZvcm1hdCI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdD10KSwicG9zdFByb2Nlc3NvciI9PT10LnR5cGUmJkt0LmFkZFBvc3RQcm9jZXNzb3IodCksIjNyZFBhcnR5Ij09PXQudHlwZSYmdGhpcy5tb2R1bGVzLmV4dGVybmFsLnB1c2godCksdGhpc319LHtrZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7dGhpcy5pc0xhbmd1YWdlQ2hhbmdpbmdUbz10O3ZhciByPU10KCk7dGhpcy5lbWl0KCJsYW5ndWFnZUNoYW5naW5nIix0KTt2YXIgbz1mdW5jdGlvbih0KXt2YXIgbz0ic3RyaW5nIj09dHlwZW9mIHQ/dDpuLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0QmVzdE1hdGNoRnJvbUNvZGVzKHQpO28mJihuLmxhbmd1YWdlfHwobi5sYW5ndWFnZT1vLG4ubGFuZ3VhZ2VzPW4uc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobykpLG4udHJhbnNsYXRvci5sYW5ndWFnZXx8bi50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKG8pLG4uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmbi5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmNhY2hlVXNlckxhbmd1YWdlKG8pKSxuLmxvYWRSZXNvdXJjZXMobyxmdW5jdGlvbih0KXshZnVuY3Rpb24odCxvKXtvPyhuLmxhbmd1YWdlPW8sbi5sYW5ndWFnZXM9bi5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShvKSxuLnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2Uobyksbi5pc0xhbmd1YWdlQ2hhbmdpbmdUbz12b2lkIDAsbi5lbWl0KCJsYW5ndWFnZUNoYW5nZWQiLG8pLG4ubG9nZ2VyLmxvZygibGFuZ3VhZ2VDaGFuZ2VkIixvKSk6bi5pc0xhbmd1YWdlQ2hhbmdpbmdUbz12b2lkIDAsci5yZXNvbHZlKGZ1bmN0aW9uKCl7cmV0dXJuIG4udC5hcHBseShuLGFyZ3VtZW50cyl9KSxlJiZlKHQsZnVuY3Rpb24oKXtyZXR1cm4gbi50LmFwcGx5KG4sYXJndW1lbnRzKX0pfSh0LG8pfSl9O3JldHVybiB0fHwhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yfHx0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuYXN5bmM/IXQmJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jP3RoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3Qobyk6byh0KTpvKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoKSkscn19LHtrZXk6ImdldEZpeGVkVCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9ZnVuY3Rpb24gdChlLHIpe3ZhciBvO2lmKCJvYmplY3QiIT09U3Qocikpe2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KGk+Mj9pLTI6MCkscz0yO3M8aTtzKyspYVtzLTJdPWFyZ3VtZW50c1tzXTtvPW4ub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihbZSxyXS5jb25jYXQoYSkpfWVsc2Ugbz1UdCh7fSxyKTtyZXR1cm4gby5sbmc9by5sbmd8fHQubG5nLG8ubG5ncz1vLmxuZ3N8fHQubG5ncyxvLm5zPW8ubnN8fHQubnMsbi50KGUsbyl9O3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9yLmxuZz10OnIubG5ncz10LHIubnM9ZSxyfX0se2tleToidCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYodD10aGlzLnRyYW5zbGF0b3IpLnRyYW5zbGF0ZS5hcHBseSh0LGFyZ3VtZW50cyl9fSx7a2V5OiJleGlzdHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMudHJhbnNsYXRvciYmKHQ9dGhpcy50cmFuc2xhdG9yKS5leGlzdHMuYXBwbHkodCxhcmd1bWVudHMpfX0se2tleToic2V0RGVmYXVsdE5hbWVzcGFjZSIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLmRlZmF1bHROUz10fX0se2tleToiaGFzTG9hZGVkTmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCF0aGlzLmlzSW5pdGlhbGl6ZWQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bmV4dCB3YXMgbm90IGluaXRpYWxpemVkIix0aGlzLmxhbmd1YWdlcyksITE7aWYoIXRoaXMubGFuZ3VhZ2VzfHwhdGhpcy5sYW5ndWFnZXMubGVuZ3RoKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG4ubGFuZ3VhZ2VzIHdlcmUgdW5kZWZpbmVkIG9yIGVtcHR5Iix0aGlzLmxhbmd1YWdlcyksITE7dmFyIHI9dGhpcy5sYW5ndWFnZXNbMF0sbz0hIXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGk9dGhpcy5sYW5ndWFnZXNbdGhpcy5sYW5ndWFnZXMubGVuZ3RoLTFdO2lmKCJjaW1vZGUiPT09ci50b0xvd2VyQ2FzZSgpKXJldHVybiEwO3ZhciBhPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnN0YXRlWyIiLmNvbmNhdCh0LCJ8IikuY29uY2F0KG4pXTtyZXR1cm4tMT09PXJ8fDI9PT1yfTtpZihuLnByZWNoZWNrKXt2YXIgcz1uLnByZWNoZWNrKHRoaXMsYSk7aWYodm9pZCAwIT09cylyZXR1cm4gc31yZXR1cm4hIXRoaXMuaGFzUmVzb3VyY2VCdW5kbGUocix0KXx8KCF0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IuYmFja2VuZHx8ISghYShyLHQpfHxvJiYhYShpLHQpKSl9fSx7a2V5OiJsb2FkTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9TXQoKTtyZXR1cm4gdGhpcy5vcHRpb25zLm5zPygic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe24ub3B0aW9ucy5ucy5pbmRleE9mKHQpPDAmJm4ub3B0aW9ucy5ucy5wdXNoKHQpfSksdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uKHQpe3IucmVzb2x2ZSgpLGUmJmUodCl9KSxyKTooZSYmZSgpLFByb21pc2UucmVzb2x2ZSgpKX19LHtrZXk6ImxvYWRMYW5ndWFnZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49TXQoKTsic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSk7dmFyIHI9dGhpcy5vcHRpb25zLnByZWxvYWR8fFtdLG89dC5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHIuaW5kZXhPZih0KTwwfSk7cmV0dXJuIG8ubGVuZ3RoPyh0aGlzLm9wdGlvbnMucHJlbG9hZD1yLmNvbmNhdChvKSx0aGlzLmxvYWRSZXNvdXJjZXMoZnVuY3Rpb24odCl7bi5yZXNvbHZlKCksZSYmZSh0KX0pLG4pOihlJiZlKCksUHJvbWlzZS5yZXNvbHZlKCkpfX0se2tleToiZGlyIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0fHwodD10aGlzLmxhbmd1YWdlcyYmdGhpcy5sYW5ndWFnZXMubGVuZ3RoPjA/dGhpcy5sYW5ndWFnZXNbMF06dGhpcy5sYW5ndWFnZSksIXQpcmV0dXJuInJ0bCI7cmV0dXJuWyJhciIsInNodSIsInNxciIsInNzaCIsInhhYSIsInloZCIsInl1ZCIsImFhbyIsImFiaCIsImFidiIsImFjbSIsImFjcSIsImFjdyIsImFjeCIsImFjeSIsImFkZiIsImFkcyIsImFlYiIsImFlYyIsImFmYiIsImFqcCIsImFwYyIsImFwZCIsImFyYiIsImFycSIsImFycyIsImFyeSIsImFyeiIsImF1eiIsImF2bCIsImF5aCIsImF5bCIsImF5biIsImF5cCIsImJieiIsInBnYSIsImhlIiwiaXciLCJwcyIsInBidCIsInBidSIsInBzdCIsInBycCIsInByZCIsInVnIiwidXIiLCJ5ZGQiLCJ5ZHMiLCJ5aWgiLCJqaSIsInlpIiwiaGJvIiwibWVuIiwieG1uIiwiZmEiLCJqcHIiLCJwZW8iLCJwZXMiLCJwcnMiLCJkdiIsInNhbSJdLmluZGV4T2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKT49MD8icnRsIjoibHRyIn19LHtrZXk6ImNyZWF0ZUluc3RhbmNlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwO3JldHVybiBuZXcgZSh0LG4pfX0se2tleToiY2xvbmVJbnN0YW5jZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnNlLG89VHQoe30sdGhpcy5vcHRpb25zLG4se2lzQ2xvbmU6ITB9KSxpPW5ldyBlKG8pLGE9WyJzdG9yZSIsInNlcnZpY2VzIiwibGFuZ3VhZ2UiXTtyZXR1cm4gYS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lbZV09dFtlXX0pLGkuc2VydmljZXM9VHQoe30sdGhpcy5zZXJ2aWNlcyksaS5zZXJ2aWNlcy51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOmkuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQoaSl9LGkudHJhbnNsYXRvcj1uZXcgSnQoaS5zZXJ2aWNlcyxpLm9wdGlvbnMpLGkudHJhbnNsYXRvci5vbigiKiIsZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZT4xP2UtMTowKSxyPTE7cjxlO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2kuZW1pdC5hcHBseShpLFt0XS5jb25jYXQobikpfSksaS5pbml0KG8sciksaS50cmFuc2xhdG9yLm9wdGlvbnM9aS5vcHRpb25zLGkudHJhbnNsYXRvci5iYWNrZW5kQ29ubmVjdG9yLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6aS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChpKX0saX19XSksZX0oKSksY2U9bigxMzMpLGxlPW4ubihjZSk7ZnVuY3Rpb24gZmUodCxlLG4pe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fWZ1bmN0aW9uIHBlKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e30scj1PYmplY3Qua2V5cyhuKTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKHI9ci5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxyLmZvckVhY2goZnVuY3Rpb24oZSl7ZmUodCxlLG5bZV0pfSl9cmV0dXJuIHR9ZnVuY3Rpb24gaGUodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiBkZSh0LGUsbil7dmFyIHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxpPWFyZ3VtZW50cyxhPWZ1bmN0aW9uKCl7cj1udWxsLG58fHQuYXBwbHkobyxpKX0scz1uJiYhcjtjbGVhclRpbWVvdXQocikscj1zZXRUaW1lb3V0KGEsZSkscyYmdC5hcHBseShvLGkpfX1mdW5jdGlvbiBnZSh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mb3IodmFyIG89InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7by5sZW5ndGg+MTspe2lmKCF0KXJldHVybnt9O3ZhciBpPXIoby5zaGlmdCgpKTshdFtpXSYmbiYmKHRbaV09bmV3IG4pLHQ9dFtpXX1yZXR1cm4gdD97b2JqOnQsazpyKG8uc2hpZnQoKSl9Ont9fWZ1bmN0aW9uIHZlKHQsZSxuKXt2YXIgcj1nZSh0LGUsT2JqZWN0KTtyLm9ialtyLmtdPW59ZnVuY3Rpb24geWUodCxlKXt2YXIgbj1nZSh0LGUpLHI9bi5vYmosbz1uLms7aWYocilyZXR1cm4gcltvXX12YXIgbWU9bmV3IFJlZ0V4cCgie3soLis/KX19IiwiZyIpO2Z1bmN0aW9uIGJlKHQsZSxuKXt2YXIgcixvLGk7Zm9yKDtyPW1lLmV4ZWModCk7KSJzdHJpbmciIT10eXBlb2Yobz1yWzFdLnRyaW0oKSkmJihvPW51bGw9PShpPW8pPyIiOiIiK2kpLG98fChvPSIiKSxvPW8ucmVwbGFjZSgvXCQvZywiJCQkJCIpLHQ9dC5yZXBsYWNlKHJbMF0sZVtvXXx8byksbWUubGFzdEluZGV4PTA7cmV0dXJuIHR9ZnVuY3Rpb24geGUodCxlLG4scixvKXt0cnl7dmFyIGk9bmV3KFhNTEh0dHBSZXF1ZXN0fHxBY3RpdmVYT2JqZWN0KSgiTVNYTUwyLlhNTEhUVFAuMy4wIik7aS5vcGVuKHI/IlBPU1QiOiJHRVQiLHQsMSksZS5jcm9zc0RvbWFpbnx8aS5zZXRSZXF1ZXN0SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwiWE1MSHR0cFJlcXVlc3QiKSxlLmF1dGhvcml6ZSYmZS5hcGlLZXkmJmkuc2V0UmVxdWVzdEhlYWRlcigiQXV0aG9yaXphdGlvbiIsZS5hcGlLZXkpLChyfHxlLnNldENvbnRlbnRUeXBlSlNPTikmJmkuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24vanNvbiIpLGkub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aS5yZWFkeVN0YXRlPjMmJm4mJm4oaS5yZXNwb25zZVRleHQsaSl9LGkuc2VuZChKU09OLnN0cmluZ2lmeShyKSl9Y2F0Y2godCl7d2luZG93LmNvbnNvbGUmJmNvbnNvbGUubG9nKHQpfX12YXIgd2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbixyKXshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyx0KSxlJiZlLnByb2plY3RJZD90aGlzLmluaXQobnVsbCxlLHt9LG4pOnRoaXMuaW5pdChudWxsLG4se30sciksdGhpcy50eXBlPSJiYWNrZW5kIn12YXIgZSxuLHI7cmV0dXJuIGU9dCwobj1be2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxyPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwLG89YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDA7dGhpcy5vcHRpb25zPXBlKHt9LHtsb2FkUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLHByaXZhdGVQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vcHJpdmF0ZS97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319IixwdWxsUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3B1bGwve3twcm9qZWN0SWR9fS97e3ZlcnNpb259fS97e2xuZ319L3t7bnN9fSIsZ2V0TGFuZ3VhZ2VzUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL2xhbmd1YWdlcy97e3Byb2plY3RJZH19IixhZGRQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vbWlzc2luZy97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319Iix1cGRhdGVQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vdXBkYXRlL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLHJlZmVyZW5jZUxuZzoiZW4iLGNyb3NzRG9tYWluOiEwLHNldENvbnRlbnRUeXBlSlNPTjohMSx2ZXJzaW9uOiJsYXRlc3QiLHB1bGw6ITEscHJpdmF0ZTohMSx3aGl0ZWxpc3RUaHJlc2hvbGQ6LjksZmFpbExvYWRpbmdPbkVtcHR5SlNPTjohMSxhbGxvd2VkQWRkT3JVcGRhdGVIb3N0czpbImxvY2FsaG9zdCJdfSx0aGlzLm9wdGlvbnMsbiksdGhpcy5zZXJ2aWNlcz10LHRoaXMub3B0aW9ucy5wdWxsJiZjb25zb2xlLndhcm4oImRlcHJlY2F0ZWQ6IHB1bGwgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBhbmQgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggbG9jaXplIHByaXZhdGUgdmVyc2lvbnMiKTt2YXIgaT13aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtpPyh0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkPXRoaXMub3B0aW9ucy5hbGxvd2VkQWRkT3JVcGRhdGVIb3N0cy5pbmRleE9mKGkpPi0xLHIuc2F2ZU1pc3NpbmcmJiF0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkJiZ0JiZ0LmxvZ2dlciYmdC5sb2dnZXIud2FybignbG9jaXplLWJhY2tlbmQ6IHdpbGwgbm90IHNhdmUgbWlzc2luZ3MgYmVjYXVzZSB0aGUgaG9zdCAiJy5jb25jYXQoaSwnIiB3YXMgbm90IGluIHRoZSBsaXN0IG9mIGFsbG93ZWRBZGRPclVwZGF0ZUhvc3RzOiAnKS5jb25jYXQodGhpcy5vcHRpb25zLmFsbG93ZWRBZGRPclVwZGF0ZUhvc3RzLmpvaW4oIiwgIiksIiAobWF0Y2hlcyBuZWVkIHRvIGJlIGV4YWN0KS4iKSkpOnRoaXMuaXNBZGRPclVwZGF0ZUFsbG93ZWQ9ITAsImZ1bmN0aW9uIj09dHlwZW9mIG8mJnRoaXMuZ2V0T3B0aW9ucyhmdW5jdGlvbih0LHIpe2lmKHQpcmV0dXJuIG8odCk7ZS5vcHRpb25zLnJlZmVyZW5jZUxuZz1uLnJlZmVyZW5jZUxuZ3x8ci5yZWZlcmVuY2VMbmd8fGUub3B0aW9ucy5yZWZlcmVuY2VMbmcsbyhudWxsLHIpfSksdGhpcy5xdWV1ZWRXcml0ZXM9e30sdGhpcy5kZWJvdW5jZWRQcm9jZXNzPWRlKHRoaXMucHJvY2VzcywxZTQpfX0se2tleToiZ2V0TGFuZ3VhZ2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1iZSh0aGlzLm9wdGlvbnMuZ2V0TGFuZ3VhZ2VzUGF0aCx7cHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWR9KTt0aGlzLmxvYWRVcmwoZSx7fSx0KX19LHtrZXk6ImdldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5nZXRMYW5ndWFnZXMoZnVuY3Rpb24obixyKXtpZihuKXJldHVybiB0KG4pO3ZhciBvPU9iamVjdC5rZXlzKHIpO2lmKCFvLmxlbmd0aClyZXR1cm4gdChuZXcgRXJyb3IoIndhcyB1bmFibGUgdG8gbG9hZCBsYW5ndWFnZXMgdmlhIEFQSSIpKTt2YXIgaT1vLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiByW2VdLmlzUmVmZXJlbmNlTGFuZ3VhZ2UmJih0PWUpLHR9LCIiKSxhPW8ucmVkdWNlKGZ1bmN0aW9uKHQsbil7dmFyIG89cltuXTtyZXR1cm4gby50cmFuc2xhdGVkW2Uub3B0aW9ucy52ZXJzaW9uXSYmby50cmFuc2xhdGVkW2Uub3B0aW9ucy52ZXJzaW9uXT49ZS5vcHRpb25zLndoaXRlbGlzdFRocmVzaG9sZCYmdC5wdXNoKG4pLHR9LFtdKSxzPW8ucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaW5kZXhPZigiLSIpPi0xfHx0fSwhMSk7dChudWxsLHtmYWxsYmFja0xuZzppLHJlZmVyZW5jZUxuZzppLHdoaXRlbGlzdDphLGxvYWQ6cz8iYWxsIjoibGFuZ3VhZ2VPbmx5In0pfSl9fSx7a2V5OiJyZWFkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHIsbz17fTt0aGlzLm9wdGlvbnMucHJpdmF0ZT8ocj1iZSh0aGlzLm9wdGlvbnMucHJpdmF0ZVBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLG89e2F1dGhvcml6ZTohMH0pOnRoaXMub3B0aW9ucy5wdWxsPyhyPWJlKHRoaXMub3B0aW9ucy5wdWxsUGF0aCx7bG5nOnQsbnM6ZSxwcm9qZWN0SWQ6dGhpcy5vcHRpb25zLnByb2plY3RJZCx2ZXJzaW9uOnRoaXMub3B0aW9ucy52ZXJzaW9ufSksbz17YXV0aG9yaXplOiEwfSk6cj1iZSh0aGlzLm9wdGlvbnMubG9hZFBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLHRoaXMubG9hZFVybChyLG8sbil9fSx7a2V5OiJsb2FkVXJsIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpczt4ZSh0LHBlKHt9LHRoaXMub3B0aW9ucyxlKSxmdW5jdGlvbihlLG8pe2lmKG8uc3RhdHVzPj01MDAmJm8uc3RhdHVzPDYwMClyZXR1cm4gbigiZmFpbGVkIGxvYWRpbmcgIit0LCEwKTtpZihvLnN0YXR1cz49NDAwJiZvLnN0YXR1czw1MDApcmV0dXJuIG4oImZhaWxlZCBsb2FkaW5nICIrdCwhMSk7dmFyIGksYTt0cnl7aT1KU09OLnBhcnNlKGUpfWNhdGNoKGUpe2E9ImZhaWxlZCBwYXJzaW5nICIrdCsiIHRvIGpzb24ifXJldHVybiBhP24oYSwhMSk6ci5vcHRpb25zLmZhaWxMb2FkaW5nT25FbXB0eUpTT04mJiFPYmplY3Qua2V5cyhpKS5sZW5ndGg/bigibG9hZGVkIHJlc3VsdCBlbXB0eSBmb3IgIit0LCExKTp2b2lkIG4obnVsbCxpKX0pfX0se2tleToiY3JlYXRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8saSl7dmFyIGE9dGhpcztpZihvfHwobz1mdW5jdGlvbigpe30pLCF0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkKXJldHVybiBvKCJob3N0IGlzIG5vdCBhbGxvd2VkIHRvIGNyZWF0ZSBrZXkuIik7InN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0PT09YS5vcHRpb25zLnJlZmVyZW5jZUxuZ30pLmxlbmd0aDwxJiZ0aGlzLnNlcnZpY2VzJiZ0aGlzLnNlcnZpY2VzLmxvZ2dlciYmdGhpcy5zZXJ2aWNlcy5sb2dnZXIud2FybignbG9jaXplLWJhY2tlbmQ6IHdpbGwgbm90IHNhdmUgbWlzc2luZ3MgYmVjYXVzZSB0aGUgcmVmZXJlbmNlIGxhbmd1YWdlICInLmNvbmNhdCh0aGlzLm9wdGlvbnMucmVmZXJlbmNlTG5nLCciIHdhcyBub3QgaW4gdGhlIGxpc3Qgb2YgdG8gc2F2ZSBsYW5ndWFnZXM6ICcpLmNvbmNhdCh0LmpvaW4oIiwgIiksIiAob3BlbiB5b3VyIHNpdGUgaW4gdGhlIHJlZmVyZW5jZSBsYW5ndWFnZSB0byBzYXZlIG1pc3NpbmdzKS4iKSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Q9PT1hLm9wdGlvbnMucmVmZXJlbmNlTG5nJiZhLnF1ZXVlLmNhbGwoYSxhLm9wdGlvbnMucmVmZXJlbmNlTG5nLGUsbixyLG8saSl9KX19LHtrZXk6InVwZGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvLGkpe3ZhciBhPXRoaXM7aWYob3x8KG89ZnVuY3Rpb24oKXt9KSwhdGhpcy5pc0FkZE9yVXBkYXRlQWxsb3dlZClyZXR1cm4gbygiaG9zdCBpcyBub3QgYWxsb3dlZCB0byB1cGRhdGUga2V5LiIpO2l8fChpPXt9KSwic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksaS5pc1VwZGF0ZT0hMCx0LmZvckVhY2goZnVuY3Rpb24odCl7dD09PWEub3B0aW9ucy5yZWZlcmVuY2VMbmcmJmEucXVldWUuY2FsbChhLGEub3B0aW9ucy5yZWZlcmVuY2VMbmcsZSxuLHIsbyxpKX0pfX0se2tleToid3JpdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZigheWUodGhpcy5xdWV1ZWRXcml0ZXMsWyJsb2NrcyIsdCxlXSkpe3ZhciByPWJlKHRoaXMub3B0aW9ucy5hZGRQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxvPWJlKHRoaXMub3B0aW9ucy51cGRhdGVQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxpPXllKHRoaXMucXVldWVkV3JpdGVzLFt0LGVdKTtpZih2ZSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSxbXSksaS5sZW5ndGgpe3ZlKHRoaXMucXVldWVkV3JpdGVzLFsibG9ja3MiLHQsZV0sITApO3ZhciBhPSExLHM9ITEsdT17fSxjPXt9O2kuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT10Lm9wdGlvbnMmJnQub3B0aW9ucy50RGVzY3JpcHRpb24/e3ZhbHVlOnQuZmFsbGJhY2tWYWx1ZXx8IiIsY29udGV4dDp7dGV4dDp0Lm9wdGlvbnMudERlc2NyaXB0aW9ufX06dC5mYWxsYmFja1ZhbHVlfHwiIjt0Lm9wdGlvbnMmJnQub3B0aW9ucy5pc1VwZGF0ZT8oc3x8KHM9ITApLGNbdC5rZXldPWUpOihhfHwoYT0hMCksdVt0LmtleV09ZSl9KTt2YXIgbD0wO2EmJmwrKyxzJiZsKys7dmFyIGY9ZnVuY3Rpb24oKXstLWx8fCh2ZShuLnF1ZXVlZFdyaXRlcyxbImxvY2tzIix0LGVdLCExKSxpLmZvckVhY2goZnVuY3Rpb24odCl7dC5jYWxsYmFjayYmdC5jYWxsYmFjaygpfSksbi5kZWJvdW5jZWRQcm9jZXNzKHQsZSkpfTtsfHxmKCksYSYmeGUocixwZSh7fSx7YXV0aG9yaXplOiEwfSx0aGlzLm9wdGlvbnMpLGZ1bmN0aW9uKHQsZSl7ZigpfSx1KSxzJiZ4ZShvLHBlKHt9LHthdXRob3JpemU6ITB9LHRoaXMub3B0aW9ucyksZnVuY3Rpb24odCxlKXtmKCl9LGMpfX19fSx7a2V5OiJwcm9jZXNzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7T2JqZWN0LmtleXModGhpcy5xdWV1ZWRXcml0ZXMpLmZvckVhY2goZnVuY3Rpb24oZSl7ImxvY2tzIiE9PWUmJk9iamVjdC5rZXlzKHQucXVldWVkV3JpdGVzW2VdKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3QucXVldWVkV3JpdGVzW2VdW25dLmxlbmd0aCYmdC53cml0ZShlLG4pfSl9KX19LHtrZXk6InF1ZXVlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8saSl7IWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPWdlKHQsZSxPYmplY3QpLGk9by5vYmosYT1vLms7aVthXT1pW2FdfHxbXSxyJiYoaVthXT1pW2FdLmNvbmNhdChuKSkscnx8aVthXS5wdXNoKG4pfSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSx7a2V5Om4sZmFsbGJhY2tWYWx1ZTpyfHwiIixjYWxsYmFjazpvLG9wdGlvbnM6aX0pLHRoaXMuZGVib3VuY2VkUHJvY2VzcygpfX1dKSYmaGUoZS5wcm90b3R5cGUsbiksciYmaGUoZSxyKSx0fSgpO3dlLnR5cGU9ImJhY2tlbmQiO3ZhciBrZT13ZSxTZT1uKDQzKTtmdW5jdGlvbiBFZSgpe3JldHVybihFZT14dCgpKHZ0LmEubWFyayhmdW5jdGlvbiB0KGUpe3JldHVybiB2dC5hLndyYXAoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLG5ldyBrdC5hKGZ1bmN0aW9uKHQpe3VlLmNoYW5nZUxhbmd1YWdlKGUsZnVuY3Rpb24oKXt0KHZvaWQgMCl9KX0pKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19LHQpfSkpKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gVGUoKXt2YXIgdDtyZXR1cm4gbXQoKSh0PXVlLnQpLmNhbGwodCx1ZSl9dmFyIGplPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBrdC5hKGZ1bmN0aW9uKHQsZSl7dWUudXNlKG5ldyBsZS5hKG51bGwse29yZGVyOlsibmF2aWdhdG9yIl19KSkudXNlKGtlKS5pbml0KHtmYWxsYmFja0xuZzoiZW4iLG5zOlsiZGVmYXVsdCJdLGRlZmF1bHROUzoiZGVmYXVsdCIsYmFja2VuZDp7cHJvamVjdElkOlNlLmxvY2l6ZS5wcm9kdWN0SWQsdmVyc2lvbjpTZS5sb2NpemUudmVyc2lvbixhcGlLZXk6U2UubG9jaXplLmFwaUtleSxyZWZlcmVuY2VMbmc6ImVuIn19LGZ1bmN0aW9uKG4scil7cmV0dXJuIG4/ZShuKTp0KHIpfSl9KX0sY2hhbmdlTGFuZ3VhZ2U6ZnVuY3Rpb24odCl7cmV0dXJuIEVlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZ2V0TGFuZ3VhZ2U6ZnVuY3Rpb24oKXtyZXR1cm4gdWUubGFuZ3VhZ2V9LGdldFQ6VGV9LEFlPW4oODMpLE9lPW4ubihBZSksQ2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPWUuZGF0YTtwKCkodGhpcyx0KSx0aGlzLmRhdGE9bn1yZXR1cm4gZCgpKHQsbnVsbCxbe2tleToiY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj0xO3I8ZS5sZW5ndGg7cis9MSl7Zm9yKHZhciBvPXt9LGk9MDtpPHQubGVuZ3RoO2krPTEpb1t0W2ldXT1lW3JdW2ldO24ucHVzaChvKX1yZXR1cm4gbn19LHtrZXk6InNwbGl0Q291bnRyaWVzIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdD8iIj09PXR8fCIsIj09PXQ/W106dC5zcGxpdCgiLCIpOltdfX0se2tleToibm9ybWFsaXplUmF3RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj0wLG89VygpKHQpO3I8by5sZW5ndGg7cisrKXt2YXIgaSxhPXRbb1tyXV07YS5zaGlmdCgpLG49dSgpKGk9W10pLmNhbGwoaSxPZSgpKG4pLE9lKCkoYSkpfXJldHVybiBuLnVuc2hpZnQoZSkse2RhdGE6bn19fV0pLHR9KCk7ZnVuY3Rpb24gTGUodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFvLmEpcmV0dXJuITE7aWYoby5hLnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKCkoRGF0ZSxbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1rKCkodCk7aWYoZSl7dmFyIGk9aygpKHRoaXMpLmNvbnN0cnVjdG9yO249bygpKHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4geCgpKHRoaXMsbil9fXZhciBSZT17YnlVcmw6e25hbWU6ImJ5VXJsIixjb2x1bW5zOlsidXJsIiwiY291bnRyaWVzIl19LGJ5SXRlbU5hbWU6e25hbWU6ImJ5SXRlbU5hbWUiLGNvbHVtbnM6WyJpdGVtTmFtZSIsImNvdW50cmllcyJdfSxieUl0ZW1Db2RlOntuYW1lOiJieUl0ZW1Db2RlIixjb2x1bW5zOlsiaXRlbUNvZGUiLCJjb3VudHJpZXMiXX0sYnlDYXRlZ29yeTp7bmFtZToiYnlDYXRlZ29yeSIsY29sdW1uczpbImNhdGVnb3J5IiwiY291bnRyaWVzIl19LGJ5SXRlbURlc2NyaXB0aW9uOntuYW1lOiJieUl0ZW1EZXNjcmlwdGlvbiIsY29sdW1uczpbInRleHQiLCJjb3VudHJpZXMiXX19LFBlPWZ1bmN0aW9uKHQpe20oKShuLHQpO3ZhciBlPUxlKG4pO2Z1bmN0aW9uIG4odCl7dmFyIHI7cmV0dXJuIHAoKSh0aGlzLG4pLChyPWUuY2FsbCh0aGlzLHQpKS5kYXRhPXQuZGF0YSxyLnNoZWV0VHlwZT10LnNoZWV0VHlwZXx8UmUscn1yZXR1cm4gZCgpKG4sW3trZXk6ImJ5VXJsIix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieVVybClyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieVVybDtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9Q2UuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBsKCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57dXJsOmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXtpZighdGhpcy5zaGVldFR5cGUuYnlJdGVtTmFtZSlyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieUl0ZW1OYW1lO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1DZS5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIGwoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybntpdGVtTmFtZTplW3QuY29sdW1uc1swXV0sY291bnRyaWVzOkNlLnNwbGl0Q291bnRyaWVzKG4pLGlzQWxsOiJBTEwiPT09bn19KX19LHtrZXk6ImJ5SXRlbUNvZGUiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbUNvZGUpcmV0dXJuW107dmFyIHQ9dGhpcy5zaGVldFR5cGUuYnlJdGVtQ29kZTtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9Q2UuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBsKCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57aXRlbUNvZGU6ZVt0LmNvbHVtbnNbMF1dLGNvdW50cmllczpDZS5zcGxpdENvdW50cmllcyhuKSxpc0FsbDoiQUxMIj09PW59fSl9fSx7a2V5OiJieUNhdGVnb3J5Iix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieUNhdGVnb3J5KXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5Q2F0ZWdvcnk7aWYoIXRoaXMuZGF0YVt0Lm5hbWVdKXJldHVybltdO3ZhciBlPUNlLmNvbnZlcnRHb29nbGVTcHJlYWRzaGVldEFwaVJhd0RhdGEodC5jb2x1bW5zLHRoaXMuZGF0YVt0Lm5hbWVdKTtyZXR1cm4gbCgpKGUpLmNhbGwoZSxmdW5jdGlvbihlKXt2YXIgbj1lW3QuY29sdW1uc1sxXV07cmV0dXJue2NhdGVnb3J5OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtRGVzY3JpcHRpb24iLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uKXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1DZS5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIGwoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybnt0ZXh0OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiZXhlY3V0ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZXhjbHVzaW9uOntieVVybDp0aGlzLmJ5VXJsKCksYnlJdGVtTmFtZTp0aGlzLmJ5SXRlbU5hbWUoKSxieUl0ZW1Db2RlOnRoaXMuYnlJdGVtQ29kZSgpLGJ5Q2F0ZWdvcnk6dGhpcy5ieUNhdGVnb3J5KCksYnlJdGVtRGVzY3JpcHRpb246dGhpcy5ieUl0ZW1EZXNjcmlwdGlvbigpfX19fV0pLG59KENlKSxOZT1uKDYzKSxJZT1uLm4oTmUpLERlPW4oODQpO2Z1bmN0aW9uIF9lKHQsZSl7dmFyIG47aWYodm9pZCAwPT09VS5hfHxudWxsPT1fKCkodCkpe2lmKEkoKSh0KXx8KG49ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBNZSh0LGUpO3ZhciByPUgoKShuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkuY2FsbChuLDgsLTEpOyJPYmplY3QiPT09ciYmdC5jb25zdHJ1Y3RvciYmKHI9dC5jb25zdHJ1Y3Rvci5uYW1lKTtpZigiTWFwIj09PXJ8fCJTZXQiPT09cilyZXR1cm4gcSgpKHQpO2lmKCJBcmd1bWVudHMiPT09cnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QocikpcmV0dXJuIE1lKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxvPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpvLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjpvfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGksYT0hMCxzPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1QKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYT10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtzPSEwLGk9dH0sZjpmdW5jdGlvbigpe3RyeXthfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKHMpdGhyb3cgaX19fX1mdW5jdGlvbiBNZSh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIFVlKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhby5hKXJldHVybiExO2lmKG8uYS5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobygpKERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9aygpKHQpO2lmKGUpe3ZhciBpPWsoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPW8oKShyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHgoKSh0aGlzLG4pfX12YXIgQmU9ZnVuY3Rpb24odCl7bSgpKG4sdCk7dmFyIGU9VWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBwKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gZCgpKG4sW3trZXk6ImV4Y2x1ZGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxyKXt2YXIgbyxpLGEscz0hMSxjPXRoaXMubG9jYXRpb24uY291bnRyeSxsPV9lKHQpO3RyeXtmb3IobC5zKCk7IShvPWwubigpKS5kb25lOyl7dmFyIGY9by52YWx1ZTtpZihyKGYpKXtzPW4ubWF0Y2hDb3VudHJ5KGYsYyk7YnJlYWt9fX1jYXRjaCh0KXtsLmUodCl9ZmluYWxseXtsLmYoKX1yZXR1cm4gcz8oYXQuYS5kZWJ1Zyh1KCkoaT0iRVhDTFVERUQgQlkgU1BSRUFEU0hFRVQ6ICIuY29uY2F0KGUsIiwgIikpLmNhbGwoaSxjKSkse2NvZGU6IkVYQ0xVREVEX0JZX0JMQUNLTElTVCIsbWVzc2FnZTp1KCkoYT0iIi5jb25jYXQoZSwiLCAiKSkuY2FsbChhLGMsIiDjgavoqbLlvZPjgZfjgZ/jgZ/jgoHpmaTlpJYiKSxwYXJhbXM6e3ZhbHVlOmUsY291bnRyeTpjfX0pOkRlLmF9fV0sW3trZXk6Im1hdGNoQ291bnRyeSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4hKCF0LmlzQWxsJiYwIT09dC5jb3VudHJpZXMubGVuZ3RoKXx8SWUoKShuPXQuY291bnRyaWVzKS5jYWxsKG4sZSl9fV0pLG59KERlLmIpO2Z1bmN0aW9uIHFlKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhby5hKXJldHVybiExO2lmKG8uYS5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobygpKERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9aygpKHQpO2lmKGUpe3ZhciBpPWsoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPW8oKShyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHgoKSh0aGlzLG4pfX12YXIgRmU9d2luZG93LnppZ3phZyxIZT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJidG4tbmF2IikubGVuZ3RoPjAsemU9L1wvaXRlbVwvXGQrLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtkdC5vbkNoYW5nZXNSZWFkeShmdW5jdGlvbih0KXsvdG93ZXJcLmpwXC8vLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiYoSGU/KHplJiYoZHQub3ZlcnJpZGVDbGlja0V2ZW50KHQsIi5pdGVtLWluZm8tbWFpbiAubWFpbi1jYXJ0aW4tYnRuLCAjRmxvYXRpbmdDYXJ0SW4gLm1haW4tY2FydGluLWJ0biIsZnVuY3Rpb24oKXtGZS5wYWdlVG8oIml0ZW0iKX0pLHQoJ1tpZCo9IlJlbGF0aW9uR3JvdXBJdGVtc18iXScpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwiLmNhcnRpbi1idG4ucmVsZWFzZWQtYnRuIixmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG4scj10KGUudGFyZ2V0KTtpZihyLmNsb3Nlc3QoIi5yZWxhdGlvbi1ncm91cC1pdGVtLXJvdyIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShuPXIuY2xvc2VzdCgiLnJlbGF0aW9uLWdyb3VwLWl0ZW0tcm93IikpLmNhbGwobiwiLml0ZW0taW5mby1ibG9jayA+IGEiKS5hdHRyKCJocmVmIil8fCIifX0pKSxkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwnYVtocmVmJD0iL2VjL1Nob3BwaW5nQmFnL0l0ZW1MaXN0Il0nLGZ1bmN0aW9uKCl7RmUucGFnZVRvKCJjYXJ0Iil9KSx0KCIuYm94LnNlY3Rpb24sIC50ZXh0LWhvbGRlciIpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwnYVtocmVmKj0iYWN0aW9uPWNhcnRpbiJdJyxmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG49dChlLnRhcmdldCk7aWYobi5jbG9zZXN0KCIuZXZlbi1pdGVtIikubGVuZ3RoPjApe3ZhciByPW4uY2xvc2VzdCgiLmV2ZW4taXRlbSIpO0UoKShyKS5jYWxsKHIsIi5zdWItdGl0bGUiKS5sZW5ndGg+MD93aW5kb3cubG9jYXRpb24uaHJlZj1FKCkocikuY2FsbChyLCIuc3ViLXRpdGxlID4gYSIpLmF0dHIoImhyZWYiKXx8IiI6RSgpKHIpLmNhbGwociwiLndyYXBwLXRleHQiKS5sZW5ndGg+MCYmKHdpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShyKS5jYWxsKHIsIi53cmFwcC10ZXh0IGE6Zmlyc3Qtb2YtdHlwZSIpLmF0dHIoImhyZWYiKXx8IiIpfX19KSk6KHplJiYoZHQub3ZlcnJpZGVDbGlja0V2ZW50KHQsIi5wcmljZS1pbmZvLW1haW4gLmNhcnRpbi1hcmVhLW5vd29uc2FsZSwgLnByaWNlLWluZm8tbWFpbiAuY2FydGluLWFyZWEtcmVzZXJ2ZSIsZnVuY3Rpb24oKXtGZS5wYWdlVG8oIml0ZW0iKX0pLHQoJ1tpZCo9IlJlbGF0aW9uR3JvdXBJdGVtc18iXScpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwiLmNhcnRpbi1idG4ucmVsZWFzZWQtYnRuIixmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG4scj10KGUudGFyZ2V0KTtpZihyLmNsb3Nlc3QoIi5yZWxhdGlvbi1ncm91cC1pdGVtLXJvdyIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShuPXIuY2xvc2VzdCgiLml0ZW0tYmxvY2siKSkuY2FsbChuLCIuaXRlbS1pbmZvLWJsb2NrID4gYSIpLmF0dHIoImhyZWYiKXx8IiJ9fSkpLGR0Lm92ZXJyaWRlQ2xpY2tFdmVudCh0LCdhW2hyZWYkPSIvZWMvU2hvcHBpbmdCYWcvSXRlbUxpc3QiXScsZnVuY3Rpb24oKXtGZS5wYWdlVG8oImNhcnQiKX0pLHQoIi50b3BNb2R1bGVCb3gsIC5hcnRpc3RNYWluT25lQ29sdW1uLCAuc2VhcmNoTGlzdFRhYmxlIikubGVuZ3RoPjAmJmR0Lm92ZXJyaWRlQ2xpY2tFdmVudCh0LCdhW2hyZWYqPSJhY3Rpb249Y2FydGluIl0nLGZ1bmN0aW9uKGUpe2lmKGUudGFyZ2V0KXt2YXIgbixyPXQoZS50YXJnZXQpO2lmKHIuY2xvc2VzdCgiLmZlYXR1cmVJdGVtQ2FydFdyYXAwMSIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShuPXIuY2xvc2VzdCgiLmZlYXR1cmVJdGVtQ2FydFdyYXAwMSIpKS5jYWxsKG4sIi5uYW1lOmZpcnN0LW9mLXR5cGUgPiBhIikuYXR0cigiaHJlZiIpfHwiIjtlbHNlIGlmKHIuY2xvc2VzdCgiLmFydGlzdFNlY3Rpb25MaW5lMDEiKS5sZW5ndGg+MCl7dmFyIG87d2luZG93LmxvY2F0aW9uLmhyZWY9RSgpKG89ci5jbG9zZXN0KCJsaSIpKS5jYWxsKG8sIi50aXRsZSA+IGEiKS5hdHRyKCJocmVmIil8fCIifWVsc2UgaWYoci5jbG9zZXN0KCIuaW5NZGwtZmVhdHVyZUl0ZW1DZWxsLCAuZGlzY29ncmFwaHlMaW5ldXBUYWJsZTAxIikubGVuZ3RoPjApe3ZhciBpO3dpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShpPXIuY2xvc2VzdCgiLmluTWRsLWZlYXR1cmVJdGVtQ2VsbCwgLmRpc2NvZ3JhcGh5TGluZXVwVGFibGUwMSIpKS5jYWxsKGksIi50aXRsZSA+IGEiKS5hdHRyKCJocmVmIil8fCIifWVsc2UgaWYoci5jbG9zZXN0KCIuZmVhdHVyZUl0ZW1PdGhlckxpc3QwMSIpLmxlbmd0aD4wKXt2YXIgYTt3aW5kb3cubG9jYXRpb24uaHJlZj1FKCkoYT1yLmNsb3Nlc3QoImxpIikpLmNhbGwoYSwiLmltZyA+IHAgPiBhIikuYXR0cigiaHJlZiIpfHwiIn1lbHNlIGlmKHIuY2xvc2VzdCgiLmluTWRsLWF0Y2xJdGVtUm93IikubGVuZ3RoPjApe3ZhciBzO3dpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShzPXIuY2xvc2VzdCgibGkiKSkuY2FsbChzLCIudGl0bGUgPiBhIikuYXR0cigiaHJlZiIpfHwiIn19fSx7ZGlzYWJsZVBvaW50ZXJFdmVudDohMH0pKSl9KTt2YXIgV2U9ZnVuY3Rpb24odCl7bSgpKG4sdCk7dmFyIGU9cWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBwKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gZCgpKG4sW3trZXk6ImdldEl0ZW0iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZSxyPXRoaXMsbz12KCkoaygpKG4ucHJvdG90eXBlKSwiZ2V0SXRlbSIsdGhpcykuY2FsbCh0aGlzKTtIZT9vLmltYWdlcz1sKCkodD10aGlzLiQoIiNqYWNrZXRQaG90b1N3aXBlciAubWFpbi1qYWNrZXQgaW1nIikuZ2V0KCkpLmNhbGwodCxmdW5jdGlvbih0KXtyZXR1cm4gci4kKHQpLmF0dHIoInNyYyIpfHwiIn0pOm8uaW1hZ2VzPWwoKShlPXRoaXMuJCgiI21haW4taW1hZ2UiKS5nZXQoKSkuY2FsbChlLGZ1bmN0aW9uKHQpe3JldHVybiByLiQodCkuYXR0cigic3JjIil8fCIifSk7cmV0dXJuIG99fSx7a2V5OiJnZXRJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IiI7cmV0dXJuIHRoaXMuJCgiI1ByaXZpbGVnZUFyZWEiKS5sZW5ndGg+MD90KyLvvIjnibnlhbjjgYLjgorvvIkiOnR9fSx7a2V5OiJnZXRJdGVtUHJpY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjAsZT10LG49dGhpcy4kKCIuc2FsZS1wcmljZS12YWx1ZSIpLHI9dGhpcy4kKCIubXVsdGlidXktcHJpY2UtbGFiZWwiKS50ZXh0KCk7cmV0dXJuIG4ubGVuZ3RoPjAmJigv44G+44Go44KB44Gm44Kq44OV5L6h5qC8Ly50ZXN0KHIpfHwoZT1BKG4udGV4dCgpKSkpLGV9fSx7a2V5OiJnZXRQdXJjaGFzYWJsZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIDAhPT10aGlzLiQoJy5jYXJ0aW4tYXJlYS1ub3dvbnNhbGVbb25jbGljayo9IkNhcnRJbiJdLCAuY2FydGluLWFyZWEtcmVzZXJ2ZVtvbmNsaWNrKj0iQ2FydEluIl0nKS5sZW5ndGh8fChhdC5hLmRlYnVnKCLjgqvjg7zjg4jjg5zjgr/jg7PjgYznhKHjgYTjgZ/jgoHjgIHos7zlhaXkuI3lj68iKSwhMSl9fV0pLG59KEcpLCRlPWZ1bmN0aW9uKHQpe20oKShuLHQpO3ZhciBlPXFlKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gcCgpKHRoaXMsbiksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIG59KFdlKSxZZT1mdW5jdGlvbih0KXttKCkobix0KTt2YXIgZT1xZShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIHAoKSh0aGlzLG4pLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBufShXZSksVmU9ZnVuY3Rpb24odCl7bSgpKG4sdCk7dmFyIGU9cWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBwKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gbn0oQmUpO0ZlLmRpc2NvdmVyeShmdW5jdGlvbih0KXt2YXIgZT10LmNhbGxiYWNrLG49dC5sb2NhdGlvbjshZnVuY3Rpb24odCxlKXt2YXIgbj13aW5kb3cuemlnemFnO24mJm4udXRpbHMuZmV0Y2hIdG1sKHQsZSl9KGZ1bmN0aW9uKHQpe3RyeXtpZighemUpcmV0dXJuIGUoKTt2YXIgcixvPW5ldyBQZSh7ZGF0YTpGZS5zaG9wRGF0YXx8e319KS5leGVjdXRlKCk7aWYoSGUpe3I9bmV3ICRlKHskOnQsbmFtZToiLml0ZW0tamFja2V0LXRpdGxlIC5wcm9kdWN0LXRpdGxlIixwcmljZToiLml0ZW0taW5mbyAucHJpY2UtdmFsdWUifSkuZXhlY3V0ZSgpfWVsc2V7cj1uZXcgWWUoeyQ6dCxuYW1lOiIuaXRlbS1pbmZvIC5wcm9kdWN0LXRpdGxlIixwcmljZToiLnByaWNlLWluZm8tbWFpbiAucHJpY2UtdmFsdWUifSkuZXhlY3V0ZSgpfXZhciBpPW5ldyBWZSh7bG9jYXRpb246bixzY3JhcGVyUmVzdWx0OnIsZGF0YTpvLmV4Y2x1c2lvbn0pLmV4ZWN1dGUoKTtyZXR1cm4gZShudWxsLHtpdGVtOnIuaXRlbSxza3VSb3dzOnIuc2t1Um93cyxleGNsdXNpb246aX0pfWNhdGNoKHQpe3JldHVybiBlKHQpfX0pfSk7dmFyIEdlPW5ldyBEYXRlKCJUaHUgTWFyIDQgMjAyMSAwMDowMDowMCBHTVQrMDgwMCIpLEtlPW5ldyBEYXRlKCJXZWQgTWFyIDE3IDIwMjEgMjM6NTk6NTkgR01UKzA4MDAiKSxYZT1uZXcgRGF0ZSxKZT1Cb29sZWFuKEZlLmxvY2F0aW9uJiYiQ04iPT09RmUubG9jYXRpb24uY291bnRyeSk7aWYoWGUuZ2V0VGltZSgpPj1HZS5nZXRUaW1lKCkmJlhlLmdldFRpbWUoKTw9S2UuZ2V0VGltZSgpJiZKZSl7aWYoRmUubm90aWNlTW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG49VGUoKTtyZXR1cm57anVtYm90cm9uOntodG1sOnUoKSh0PXUoKShlPSJcbiAgPGRpdiBzdHlsZT0nbWFyZ2luOiA2cHggMCAwICFpbXBvcnRhbnQ7Jz5cbiAgPGRpdj5cbiAgPHNwYW4gc3R5bGU9J21hcmdpbjogMzRweCAwIDAgIWltcG9ydGFudDsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsnPjxpbWcgc3JjPSdodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL3Rvd2VyX2pwL25vdGljZU1vZGFsX2xvZ28ucG5nJyBhbHQ9J1dvcmxkU2hvcHBpbmfDl1RPV0VSIFJFQ09SRFMnIHN0eWxlPSdtYXgtd2lkdGg6IDQwMHB4ICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Jz48L3NwYW4+XG4gIDxoMSBzdHlsZT0nZm9udC1zaXplOiAyLjlyZW0gIWltcG9ydGFudDsnPiIuY29uY2F0KG4oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDEiKSwiPC9oMT5cbiAgPGgyIHN0eWxlPSdmb250LXNpemU6IDEuNHJlbSAhaW1wb3J0YW50Oyc+IikpLmNhbGwoZSxuKCJjb21tb24ubm90aWNlTW9kYWwuanVtYm90cm9uLmgyIiksIjwvaDI+XG4gIDxpbWcgc3JjPSdodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL2NvbW1vbi9hbGlwYXlfY2FtcGFpZ25fMjAyMTAzMDQucG5nJyBzdHlsZT0nd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgbWF4LXdpZHRoOiA1MDBweCAhaW1wb3J0YW50Oyc+XG4gIDxhIHN0eWxlPSd0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7JyBocmVmPSdodHRwczovL3Rvd2VyLmpwL3NpdGUvaG93dG8vZm9yaW50ZXJuYXRpb25hbGN1c3RvbWVyJz5cbiAgPHNwYW4gc3R5bGU9J2Rpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgICBmb250LXNpemU6IDEuNnJlbSAhaW1wb3J0YW50O1xuICAgICAgbWFyZ2luOiAxcmVtIGF1dG8gIWltcG9ydGFudDtcbiAgICAgIHBhZGRpbmc6IDFyZW0gIWltcG9ydGFudDtcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkICFpbXBvcnRhbnQ7XG4gICAgICBtYXgtd2lkdGg6IDUwMHB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXI6IHNvbGlkICNmZmNhMDAgIWltcG9ydGFudDtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmNhMDAgIWltcG9ydGFudDtcbiAgICAgIGNvbG9yOiAjMDAwMDAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LG4oInRvd2VyX2pwLm5vdGljZU1vZGFsLmp1bWJvdHJvbi50ZXh0IiksIjwvc3Bhbj5cbiAgPC9hPlxuICA8L2Rpdj5cbiAgPC9kaXY+XG4gICIpfX19KSx6ZSlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuaXRlbS1pbmZvLW1haW4gLnN0b2NrLXN0YXR1cyIpLmxlbmd0aD4wJiYi44GK5Y+W44KK5a+E44GbIj09PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pdGVtLWluZm8tbWFpbiAuc3RvY2stc3RhdHVzIilbMF0udGV4dENvbnRlbnQ/RmUuaXRlbU1vZGFsKGZ1bmN0aW9uKCl7dmFyIHQsZT1UZSgpO3JldHVybntib3R0b206e2h0bWw6dSgpKHQ9IlxuICA8ZGl2IHN0eWxlPSdtYXJnaW46IC0xMHB4IDAgLThweCAhaW1wb3J0YW50Oyc+XG4gIDxwIHN0eWxlPSdjb2xvcjogcmVkICFpbXBvcnRhbnQ7XG4gICAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkICFpbXBvcnRhbnQ7XG4gICAgICBsaW5lLWhlaWdodDogMSAhaW1wb3J0YW50O1xuICAgICAgbWFyZ2luOiAwLjRlbSAwICFpbXBvcnRhbnQ7Jz4iLmNvbmNhdChlKCJ0b3dlcl9qcC5pdGVtLmJvdHRvbS50aXRsZSIpLCI8L3A+XG4gIDxwIHN0eWxlPSdmb250LXNpemU6IDExcHggIWltcG9ydGFudDtcbiAgICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZSAhaW1wb3J0YW50O1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMiAhaW1wb3J0YW50O1xuICAgICAgcGFkZGluZy1ib3R0b206IDAuMmVtICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LGUoInRvd2VyX2pwLml0ZW0uYm90dG9tLnRleHQiKSwiPC9wPlxuICA8L2Rpdj5cbiAgPGltZyBzcmM9J2h0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvY29tbW9uL2FsaXBheV9jYW1wYWlnbl8yMDIxMDMwNC5wbmcnIHN0eWxlPSd3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBtYXJnaW4tYm90dG9tOiAtMTVweCAhaW1wb3J0YW50Oyc+XG4gICIpfX19KTpGZS5pdGVtTW9kYWwoZnVuY3Rpb24oKXtyZXR1cm57Ym90dG9tOntodG1sOiJcbiAgICAgIDxpbWcgc3JjPSdodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL2NvbW1vbi9hbGlwYXlfY2FtcGFpZ25fMjAyMTAzMDQucG5nJyBzdHlsZT0nd2lkdGg6IDEwMCUgIWltcG9ydGFudDsnPlxuICAgICAgIn19fSk7RmUubGF1bmNoKGZ1bmN0aW9uKCl7dmFyIHQ9IXNlc3Npb25TdG9yYWdlLmdldEl0ZW0oIlNUT1JBR0VfS0VZX3JhZ3RhZ19qcCIpO3JldHVybiBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCJTVE9SQUdFX0tFWV9yYWd0YWdfanAiLGEoKSghMCkpLHQ/Im5vdGljZSI6bnVsbH0pfWVsc2V7aWYoRmUubm90aWNlTW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG49VGUoKTtyZXR1cm57anVtYm90cm9uOntodG1sOnUoKSh0PXUoKShlPSJcbjxkaXYgc3R5bGU9J21hcmdpbjogNnB4IDAgMCAhaW1wb3J0YW50Oyc+XG48ZGl2PlxuPHNwYW4gc3R5bGU9J21hcmdpbjogMzRweCAwIDAgIWltcG9ydGFudDsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsnPjxpbWcgc3JjPSdodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL3Rvd2VyX2pwL25vdGljZU1vZGFsX2xvZ28ucG5nJyBhbHQ9J1dvcmxkU2hvcHBpbmfDl1RPV0VSIFJFQ09SRFMnIHN0eWxlPSdtYXgtd2lkdGg6IDQwMHB4ICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Jz48L3NwYW4+XG48aDEgc3R5bGU9J2ZvbnQtc2l6ZTogMi45cmVtICFpbXBvcnRhbnQ7Jz4iLmNvbmNhdChuKCJjb21tb24ubm90aWNlTW9kYWwuanVtYm90cm9uLmgxIiksIjwvaDE+XG48aDIgc3R5bGU9J2ZvbnQtc2l6ZTogMS40cmVtICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbChlLG4oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDIiKSwiPC9oMj5cbjxhIHN0eWxlPSd0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7JyBocmVmPSdodHRwczovL3Rvd2VyLmpwL3NpdGUvaG93dG8vZm9yaW50ZXJuYXRpb25hbGN1c3RvbWVyJz5cbjxzcGFuIHN0eWxlPSdkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogMS42cmVtICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luOiAxcmVtIGF1dG8gIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiAxcmVtICFpbXBvcnRhbnQ7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICBtYXgtd2lkdGg6IDUwMHB4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiBzb2xpZCAjZmZjYTAwICFpbXBvcnRhbnQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiAjMDAwMDAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LG4oInRvd2VyX2pwLm5vdGljZU1vZGFsLmp1bWJvdHJvbi50ZXh0IiksIjwvc3Bhbj5cbjwvYT5cbjwvZGl2PlxuPC9kaXY+XG4iKX19fSksRmUuY2FydE1vZGFsKGZ1bmN0aW9uKCl7dmFyIHQsZSxuLHI9VGUoKTtyZXR1cm57Ym90dG9tOntodG1sOnUoKSh0PXUoKShlPXUoKShuPSJcbjxkaXYgc3R5bGU9J2xpbmUtaGVpZ2h0OiAxLjMgIWltcG9ydGFudDsnPlxuPHAgc3R5bGU9J2NvbG9yOiByZWQgIWltcG9ydGFudDtmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7bWFyZ2luOiAwICFpbXBvcnRhbnQ7Jz4iLmNvbmNhdChyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS50ZXh0MS5hbGVydCIpLCI8L3A+XG48dWwgc3R5bGU9J21hcmdpbjogMC40ZW0gMCAhaW1wb3J0YW50Oyc+XG48bGkgc3R5bGU9J2ZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDtwYWRkaW5nOiAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbChuLHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLmxpbmUxIiksIjwvbGk+XG48bGkgc3R5bGU9J2ZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDtwYWRkaW5nOiAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbChlLHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLmxpbmUyIiksIjwvbGk+XG48L3VsPlxuPHAgc3R5bGU9J2NvbG9yOiByZWQgIWltcG9ydGFudDtmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7bWFyZ2luOiAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLnRleHQyLmFsZXJ0IiksIiA8L3A+XG48L2Rpdj5cbiIpfX19KSx6ZSlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuaXRlbS1pbmZvLW1haW4gLnN0b2NrLXN0YXR1cyIpLmxlbmd0aD4wJiYi44GK5Y+W44KK5a+E44GbIj09PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pdGVtLWluZm8tbWFpbiAuc3RvY2stc3RhdHVzIilbMF0udGV4dENvbnRlbnQmJkZlLml0ZW1Nb2RhbChmdW5jdGlvbigpe3ZhciB0LGU9VGUoKTtyZXR1cm57Ym90dG9tOntodG1sOnUoKSh0PSJcbjxkaXY+XG48cCBzdHlsZT0nY29sb3I6IHJlZCAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkICFpbXBvcnRhbnQ7XG4gICAgbGluZS1oZWlnaHQ6IDEgIWltcG9ydGFudDtcbiAgICBtYXJnaW46IDAuNGVtIDAgIWltcG9ydGFudDsnPiIuY29uY2F0KGUoInRvd2VyX2pwLml0ZW0uYm90dG9tLnRpdGxlIiksIjwvcD5cbjxwIHN0eWxlPSdmb250LXNpemU6IDExcHggIWltcG9ydGFudDtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLWxpbmUgIWltcG9ydGFudDtcbiAgICBsaW5lLWhlaWdodDogMS4yICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDAuMmVtICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LGUoInRvd2VyX2pwLml0ZW0uYm90dG9tLnRleHQiKSwiPC9wPlxuPC9kaXY+XG4iKX19fSl9L3Rvd2Vyc2hpYnV5YVwuanBcL2twb3AvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpPyhGZS5sYXVuY2goZnVuY3Rpb24oKXtyZXR1cm4iYmFubmVyLWhpZGRlbiJ9KSxGZS5iYW5uZXIoZnVuY3Rpb24oKXtyZXR1cm57aGlkZGVuOntodG1sOidcbjxhIGhyZWY9Imh0dHBzOi8vYml0Lmx5LzJZVWxLVGQiPlxuPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogIzY0NjU2NyAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDRweCA0cHggMCAhaW1wb3J0YW50O1xuICAgIHRleHQtYWxpZ246IGNlbnRlciAhaW1wb3J0YW50O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50O1xuICAgIGJvdHRvbTogMCAhaW1wb3J0YW50O1xuICAgIHJpZ2h0OiAxMHB4ICFpbXBvcnRhbnQ7XG4gICAgbGVmdDogYXV0byAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwcHggMTBweCAwIDAgIWltcG9ydGFudDsiPlxuICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgd2lkdGg6IDUwcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiA2cHggN3B4IDVweCA3cHggIWltcG9ydGFudDtcbiAgICBib3JkZXItcmFkaXVzOiA2cHggNnB4IDAgMCAhaW1wb3J0YW50OyI+XG4gICAgPGltZyBzcmM9Imh0dHBzOi8vY2hlY2tvdXQtc3RhdGljLndvcmxkc2hvcHBpbmcuanAvaW1hZ2VzL2NvbW1vbi9iYW5uZXJfaGlkZGVuX2ljb25fZW4uc3ZnIiBhbHQ9Ikdsb2JhbCBTaGlwcGluZyIgc3R5bGU9IndpZHRoOiA1MnB4ICFpbXBvcnRhbnQ7Ij5cbiAgICA8L3NwYW4+XG48L2Rpdj5cbjwvYT5cbid9fX0pKTovKHRvd2Vyc2hpYnV5YVwuanApLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKSYmKEZlLmxhdW5jaChmdW5jdGlvbigpe3JldHVybiJiYW5uZXItaGlkZGVuIn0pLEZlLmJhbm5lcihmdW5jdGlvbigpe3JldHVybntoaWRkZW46e2h0bWw6J1xuPGEgaHJlZj0iaHR0cHM6Ly9iaXQubHkvM2dMdTR1QSI+XG48ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiAjNjQ2NTY3ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNHB4IDRweCAwICFpbXBvcnRhbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7XG4gICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gICAgYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgcmlnaHQ6IDEwcHggIWltcG9ydGFudDtcbiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogMTBweCAxMHB4IDAgMCAhaW1wb3J0YW50OyI+XG4gICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDZweCA3cHggNXB4IDdweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICA8aW1nIHNyYz0iaHR0cHM6Ly9jaGVja291dC1zdGF0aWMud29ybGRzaG9wcGluZy5qcC9pbWFnZXMvY29tbW9uL2Jhbm5lcl9oaWRkZW5faWNvbl9lbi5zdmciIGFsdD0iR2xvYmFsIFNoaXBwaW5nIiBzdHlsZT0id2lkdGg6IDUycHggIWltcG9ydGFudDsiPlxuICAgIDwvc3Bhbj5cbjwvZGl2PlxuPC9hPlxuJ319fSkpLC8obWlraWtpXC50b2t5b1wuanBcLykvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiYoRmUubGF1bmNoKGZ1bmN0aW9uKCl7cmV0dXJuImJhbm5lci1oaWRkZW4ifSksRmUuYmFubmVyKGZ1bmN0aW9uKCl7cmV0dXJue2hpZGRlbjp7aHRtbDonXG48YSBocmVmPSJodHRwczovL2JpdC5seS8zMUlOejJMIj5cbjxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICM2NDY1NjcgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiA0cHggNHB4ICFpbXBvcnRhbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7XG4gICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gICAgYm90dG9tOiAxMzBweCAhaW1wb3J0YW50O1xuICAgIHJpZ2h0OiAtMjNweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwcHggMCAwIDEwcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwICFpbXBvcnRhbnQ7Ij5cbiAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogd2hpdGUgIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIHdpZHRoOiA1MHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNnB4IDIwcHggNnB4IDdweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDZweCAwIDAgNnB4ICFpbXBvcnRhbnQ7Ij5cbiAgICA8aW1nIHNyYz0iaHR0cHM6Ly9jaGVja291dC1zdGF0aWMud29ybGRzaG9wcGluZy5qcC9pbWFnZXMvY29tbW9uL2Jhbm5lcl9oaWRkZW5faWNvbl9lbi5zdmciIGFsdD0iR2xvYmFsIFNoaXBwaW5nIiBzdHlsZT0id2lkdGg6IDUycHggIWltcG9ydGFudDsgYm9yZGVyLXJhZGl1czogNnB4IDAgMCA2cHggIWltcG9ydGFudDsiPlxuICAgIDwvc3Bhbj5cbjwvZGl2PlxuPC9hPlxuJ319fSkpLC8odG93ZXJcLmpwXC98dG93ZXJzaGlidXlhXC5qcFwvfG1pa2lraVwudG9reW9cLmpwXC8pLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKSYmamUuaW5pdGlhbGl6ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gRmUucnVuKCl9KX1dKTt9
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
13.32.21.90
, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- server-13-32-21-90.fra56.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- 8c733cea3cf1c19c77be990ec11e77ad2ec87d11ce45e5463c669a6e1d7b1e11
|
GET
H2
|
200
|
sodar2.js
Show response
tpc.googlesyndication.com/sodar/
|
17 KB
7 KB
|
33ms
13ms
|
Script
text/javascript |
2a00:1450:4001:828::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20210303/r20190131/show_ads_impl_with_ama_fy2019.js?client=ca-pub-6762391202596396&plah=mikiki.tokyo.jp&amaexp=1
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:828::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- d9cebb89ed3e16a74386f743f3fc12fe98cb4fc5c11f03af5febdf1141ca6a39
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
runner.html
Show response
tpc.googlesyndication.com/sodar/sodar2/221/
Frame 28E6
|
12 KB
5 KB
|
27ms
13ms
|
Document
text/html |
2a00:1450:4001:828::2001
GOOGLE
|
|
|
GET
H2
|
200
|
combo
Show response
penta.a.one.impact-ad.jp/ul_cb/
Redirect Chain
-
https://penta.a.one.impact-ad.jp/combo?oid=1ce48bb6b1384539&dd_rft=k&dd_jsonp=a1tracker.cb._10&fu=4cd00445-4b43-4538-aa7f-0783a0f63a3d&src=https%3A%2F%2Fmikiki.tokyo.jp%2F&l=en-us&sr=1600x1200&vp=1...
-
https://penta.a.one.impact-ad.jp/ul_cb/combo?oid=1ce48bb6b1384539&dd_rft=k&dd_jsonp=a1tracker.cb._10&fu=4cd00445-4b43-4538-aa7f-0783a0f63a3d&src=https%3A%2F%2Fmikiki.tokyo.jp%2F&l=en-us&sr=1600x120...
|
1 KB
995 B
|
296ms
295ms
|
Script
text/javascript |
107.178.248.96
GOOGLE
|
|
General
- Full URL
- https://penta.a.one.impact-ad.jp/ul_cb/combo?oid=1ce48bb6b1384539&dd_rft=k&dd_jsonp=a1tracker.cb._10&fu=4cd00445-4b43-4538-aa7f-0783a0f63a3d&src=https%3A%2F%2Fmikiki.tokyo.jp%2F&l=en-us&sr=1600x1200&vp=1600x1200&cd=24-bit&tgsrc=a1common&dsc=Mikiki%E3%81%AF%E3%80%81%E3%82%82%E3%81%A3%E3%81%A8%E8%81%B4%E3%81%8D%E3%81%9F%E3%81%84%E3%80%81%E7%9F%A5%E3%82%8A%E3%81%9F%E3%81%84%E3%80%81%E6%A5%BD%E3%81%97%E3%81%BF%E3%81%9F%E3%81%84%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%B8%E3%83%83%E3%82%AF%E3%83%BB%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%83%BB%E3%82%B5%E3%82%A4%E3%83%88%E3%81%A7%E3%81%99&dt=Mikiki%20-%20music%20review%20site
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
107.178.248.96
Kansas City, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- 96.248.178.107.bc.googleusercontent.com
- Software
-
nginx /
- Resource Hash
- f543bee39dc60d9260e15ac903264941f9b6a3efa3fa8ad2aa6546eedcc39cd8
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; |
|
GET
H2
|
200
|
/
Show response
googleads.g.doubleclick.net/pagead/viewthroughconversion/875187971/
|
2 KB
1 KB
|
18ms
18ms
|
Script
text/javascript |
2a00:1450:4001:802::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/viewthroughconversion/875187971/?random=1615234976007&cv=9&fst=1615234976007&num=1&guid=ON&resp=GooglemKTybQhCsO&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&sendb=1&ig=1&frm=0&url=https%3A%2F%2Fmikiki.tokyo.jp%2F&tiba=Mikiki%20-%20music%20review%20site&hn=www.googleadservices.com&async=1&rfmt=3&fmt=4
- Requested by
- Host: www.googleadservices.com
URL: https://www.googleadservices.com/pagead/conversion_async.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:802::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 20177fa171e87e19fba647e06f8450470adbacb0609bb119c00137c21e84aae2
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
Q9MKgAIr8xj9wBMLW1buCS1LNKSoLAVOfjIlinQ2UMU.js
Show response
pagead2.googlesyndication.com/bg/
Frame 28E6
|
14 KB
6 KB
|
8ms
7ms
|
Script
text/javascript |
2a00:1450:4001:827::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/bg/Q9MKgAIr8xj9wBMLW1buCS1LNKSoLAVOfjIlinQ2UMU.js
- Requested by
- Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2/221/runner.html
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:827::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 43d30a80022bf318fdc0130b5b56ee092d4b34a4a82c054e7e32258a743650c5
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
/
www.google.com/pagead/1p-user-list/875187971/
|
42 B
108 B
|
36ms
35ms
|
Image
image/gif |
2a00:1450:4001:82a::2004
GOOGLE
|
|
General
- Full URL
- https://www.google.com/pagead/1p-user-list/875187971/?random=1615234976007&cv=9&fst=1615233600000&num=1&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&sendb=1&frm=0&url=https%3A%2F%2Fmikiki.tokyo.jp%2F&tiba=Mikiki%20-%20music%20review%20site&async=1&fmt=3&is_vtc=1&random=1987234370&resp=GooglemKTybQhCsO&rmt_tld=0&ipr=y
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:82a::2004
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
Content-Security-Policy |
script-src 'none'; object-src 'none' |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
/
www.google.de/pagead/1p-user-list/875187971/
|
42 B
108 B
|
20ms
20ms
|
Image
image/gif |
2a00:1450:4001:809::2003
GOOGLE
|
|
General
- Full URL
- https://www.google.de/pagead/1p-user-list/875187971/?random=1615234976007&cv=9&fst=1615233600000&num=1&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&sendb=1&frm=0&url=https%3A%2F%2Fmikiki.tokyo.jp%2F&tiba=Mikiki%20-%20music%20review%20site&async=1&fmt=3&is_vtc=1&random=1987234370&resp=GooglemKTybQhCsO&rmt_tld=1&ipr=y
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
Content-Security-Policy |
script-src 'none'; object-src 'none' |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
|
0
46 B
|
44ms
43ms
|
Image
image/gif |
2a00:1450:4001:827::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=221&t=2&li=gda_r20210303&jk=1284100185698243&bg=!i4iliMvNAAWsVXnBrDsAKQB2-DxaFcSk8orldS3BMu482CGvbd8pn--wYy1C2RbFfxq0mwSAtQZ4AgAAAGhSAAAABmgBBwoA-vIdDKdDrZekgte_1mL4bAlwwib32lC8THOPMjAFMhDYsoeK5IHiJPCzeLyGZ_tjQay0srQxE1Hr2GuPY3mK-WAkXImID7JWZoMqw6CqlT2xr7m5qghStftzGDkRxslywKK1vKqt72OlaJfZCGzLgOi-guC02Hu6YUjyOGu69tyHHZhvCnf11VsIXG2JjM-_hWSlrAqhEJ0Aci0YGRWTLeizwgp5M8DRHruqzsMHuLUf7Swu4ITe1dFzM0gShDWa7zssoviq5KjBbuDQZYAjHHP-SFpaDzsZlOD60pvM9i190Q3R3NI2G2EhLTgTbQlzz8jZLcB8ZYiRmiqZAhSuxCGa5QoKuyC6XDwJCy-8G8aeOHUktekZ1xRKXlBPHp2ugdRHEwEswmkx1BWOgEC_m3ZzP67r0WJwTeCn_WsKLQXDkNS_nwlReq9ioYlkopsjBRf9WiU_tEuJ8SKi7gGL3UD841MA6lZMhNm3KHeHl9XINhrm21BhzCSD1-QHFj5c6Eu3SGwsJ5JiUP0hd3qsfx9dYOqHZt7HywX1cr2KRs28jqpCdwhdf0yDTskirnh_mfB1nCoeWI2Z8HOJ4NFEoRzLdXZzwcd6tfl4B2H01fNMivTwkG7oiI27ucU_u_83z80VF6Qhg4LdJe4RCEhainTQpP04sMrhi14705QPqTeFzngXbgZLC9KMqrNduuUHUnB-D6Cxk6HRmzrxKtjsTtBWbKqgHToQrQeK7zijXVVBAZuCIsar3FvY9LPbRFpg4Xq6lO-2G6rkMZ6UGntXYCpr8ZK6lGkU5BzQ46zbqNA4HvRsu6Dw741vxdcOyj7i3HiUx0zvLPD06qWon_MJhqg29mS-R83Ay06vDyI9NMBglN0t5rCD3VZcRzga8l44hdD2O0hL44Mf2W6G2HA3_HR25bhNCph_tPtTWhxgsiN3lR_wfb6QsTzzcKMUUUG-aPB36oc2c64uWfIzcUADnFBtidqvvG_lqEAGugje4BSpEezhpQLEvV0iBD6CH0yqNCgBzmtvbFTGXZrkxG3pRu49
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:827::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
OPTIONS
H2
|
200
|
report
checkout-api.worldshopping.jp/v1/
Frame
|
0
0
|
1065ms
1065ms
|
Preflight
application/json |
143.204.209.77
AMAZON-02
|
|
|
POST
H2
|
200
|
report
Show response
checkout-api.worldshopping.jp/v1/
|
2 B
444 B
|
842ms
841ms
|
XHR
application/json |
143.204.209.77
AMAZON-02
|
|
|
GET
H2
|
200
|
pb.html
Show response
img.ak.impact-ad.jp/ut/
Frame 9985
|
648 B
516 B
|
24ms
24ms
|
Document
text/html |
151.101.13.19
FASTLY
|
|
|
GET
H/1.1
|
200
OK
|
external_pageviews
Show response
in.treasuredata.com/js/v3/event/prod_indival_dmp/
|
89 B
515 B
|
479ms
118ms
|
Script
application/javascript |
52.203.66.2
AMAZON-AES
|
|
General
- Full URL
- https://in.treasuredata.com/js/v3/event/prod_indival_dmp/external_pageviews?api_key=9422%2F7c9a1a3fb7fe0414b5eccb6f829f7c7a939a6041&modified=1615234976636&data=eyJhb25laWQiOiIyNDllNjdjZi1kNjkwLTRiZjQtODk2MS0wYjQxOWYxMWFkZjciLCJhb25lX3NlZ21lbnRpZHMiOltdLCJ0ZF9nbG9iYWxfaWQiOiJ0ZF9nbG9iYWxfaWQiLCJ0ZF92ZXJzaW9uIjoiMS44LjQiLCJ0ZF9jbGllbnRfaWQiOiJhZDBiYjUzNy1kYmEyLTQzMTEtYjY3Ni00YzgyYWE2N2FjZTQiLCJ0ZF9jaGFyc2V0IjoidXRmLTgiLCJ0ZF9sYW5ndWFnZSI6ImVuLXVzIiwidGRfY29sb3IiOiIyNC1iaXQiLCJ0ZF9zY3JlZW4iOiIxNjAweDEyMDAiLCJ0ZF92aWV3cG9ydCI6IjE2MDB4MTIwMCIsInRkX3RpdGxlIjoiTWlraWtpIC0gbXVzaWMgcmV2aWV3IHNpdGUiLCJ0ZF91cmwiOiJodHRwczovL21pa2lraS50b2t5by5qcC8iLCJ0ZF91c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg5LjAuNDM4OS43MiBTYWZhcmkvNTM3LjM2IiwidGRfcGxhdGZvcm0iOiJMaW51eCB4ODZfNjQiLCJ0ZF9ob3N0IjoibWlraWtpLnRva3lvLmpwIiwidGRfcGF0aCI6Ii8iLCJ0ZF9yZWZlcnJlciI6IiIsInRkX2lwIjoidGRfaXAiLCJ0ZF9icm93c2VyIjoidGRfYnJvd3NlciIsInRkX2Jyb3dzZXJfdmVyc2lvbiI6InRkX2Jyb3dzZXJfdmVyc2lvbiIsInRkX29zIjoidGRfb3MiLCJ0ZF9vc192ZXJzaW9uIjoidGRfb3NfdmVyc2lvbiJ9&callback=TreasureJSONPCallback0
- Requested by
- Host: cdn.treasuredata.com
URL: https://cdn.treasuredata.com/sdk/1.8.4/td.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.203.66.2
Ashburn, United States,
ASN14618
(AMAZON-AES, US),
- Reverse DNS
- ec2-52-203-66-2.compute-1.amazonaws.com
- Software
-
/
- Resource Hash
- 3aa9f235c06f8205b4b91091c02bbb8c8a23b12fafa257f68aecc4be22e8b7c0
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000 |
|
GET
H2
|
200
|
/
aw.dw.impact-ad.jp/c/map/
Frame 9985
Redirect Chain
-
https://cm.g.doubleclick.net/pixel?google_nid=audienceone_dmp&google_cm&google_sc&oid=1ce48bb6b1384539&sp=ddp
-
https://aw.dw.impact-ad.jp/c/map/?cid=CAESEBUc7hoJyJ01sVcDAl2_sSE&google_cver=1&oid=1ce48bb6b1384539&sp=ddp
|
43 B
264 B
|
267ms
253ms
|
Image
image/gif |
35.186.254.217
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
demconf.jpg
dpm.demdex.net/
Frame 9985
Redirect Chain
-
https://dpm.demdex.net/ibs:dpid=47438?dpuuid=249e67cf-d690-4bf4-8961-0b419f11adf7&redir=https%3A%2F%2Faw.dw.impact-ad.jp%2Fc%2Fmap%2F%3Fcid%3D%24%7BDD_UUID%7D%26sp%3Daam%26oid%3D1ce48bb6b1384539
-
https://dpm.demdex.net/demconf.jpg?et:ibs%7cdata:dpid=47438
|
42 B
929 B
|
48ms
48ms
|
Image
image/gif |
63.33.120.132
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
tdsync
in.treasuredata.com/postback/v3/event/aoneweb/
Frame 9985
|
35 B
448 B
|
476ms
120ms
|
Image
image/gif |
52.203.66.2
AMAZON-AES
|
|
|
GET
H2
|
200
|
/
aw.dw.impact-ad.jp/c/map/
Frame 9985
Redirect Chain
-
https://match.adsrvr.org/track/cmf/generic?ttd_pid=vxg9yvd&ttd_tpi=1
-
https://match.adsrvr.org/track/cmb/generic?ttd_pid=vxg9yvd&ttd_tpi=1
-
https://aw.dw.impact-ad.jp/c/map/?sp=ttd&oid=207d81ffda0cc019&cid=4b72918e-f9de-48f5-9d93-744d641f9ab3
|
43 B
203 B
|
253ms
253ms
|
Image
image/gif |
35.186.254.217
GOOGLE
|
|
|
GET
H/1.1
|
200
|
cs
yjtag.yahoo.co.jp/
Frame 9985
Redirect Chain
-
https://yjtag.yahoo.co.jp/csx?tp=khADDtf
-
https://aw.dw.impact-ad.jp/c/u/?gdpr=1&oid=207d81ffda0cc019&rdr=https%3A%2F%2Fyjtag.yahoo.co.jp%2Fcs%3Fbtt%3D8NV2nuCzcH3ylcKZwz03GfPqu68Ee9LaRqzTgzPRPro%26tp%3DkhADDtf%26uid%3D%7BAONEID%7D
-
https://yjtag.yahoo.co.jp/cs?btt=8NV2nuCzcH3ylcKZwz03GfPqu68Ee9LaRqzTgzPRPro&tp=khADDtf&uid=249e67cf-d690-4bf4-8961-0b419f11adf7
|
35 B
958 B
|
290ms
289ms
|
Image
image/gif |
183.79.113.119
YAHOO-JP-AS-AP Ya...
|
|
|
GET
H2
|
200
|
adsct
analytics.twitter.com/i/
Frame 9985
|
43 B
312 B
|
138ms
137ms
|
Image
image/gif |
104.244.42.131
TWITTER
|
|
General
- Full URL
- https://analytics.twitter.com/i/adsct?p_user_id=249e67cf-d690-4bf4-8961-0b419f11adf7&p_id=981
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.42.131
, United States,
ASN13414
(TWITTER, US),
- Reverse DNS
- Software
-
tsa_o /
- Resource Hash
- ac8778041fdb7f2e08ceb574c9a766247ea26f1a7d90fa854c4efcf4b361a957
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=631138519 |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
SAMEORIGIN |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
/
aw.dw.impact-ad.jp/c/map/
Frame 9985
Redirect Chain
-
https://gum.criteo.com/sync?c=333&r=1&u=https%3A%2F%2Faw.dw.impact-ad.jp%2Fc%2Fmap%2F%3Fsp%3Dcro%26oid%3D207d81ffda0cc019%26cid%3D%40USERID%40
-
https://aw.dw.impact-ad.jp/c/map/?sp=cro&oid=207d81ffda0cc019&cid=
|
43 B
203 B
|
320ms
254ms
|
Image
image/gif |
35.186.254.217
GOOGLE
|
|
|